organization.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <template>
  2. <div class="relics-layout">
  3. <div class="relics-header">
  4. <div class="search">
  5. <el-form label-width="100px" inline>
  6. <el-form-item label="单位名称">
  7. <el-input v-model.trim="pageProps.orgName" clearable style="width: 250px" placeholder="请输入" />
  8. </el-form-item>
  9. <el-form-item label="类型">
  10. <el-select style="width: 250px" v-model="pageProps.type" clearable>
  11. <el-option :value="Number(key)" :label="type" v-for="(type, key) in OrganizationTypeDesc" />
  12. </el-select>
  13. </el-form-item>
  14. <el-form-item>
  15. <el-button type="primary" @click="refresh">查询</el-button>
  16. <el-button type="primary" plain @click="pageProps = { ...initProps }">
  17. 重置
  18. </el-button>
  19. <el-button v-if="!isNotSuper" type="primary" @click="addHandler">
  20. 新增单位
  21. </el-button>
  22. </el-form-item>
  23. </el-form>
  24. </div>
  25. </div>
  26. <div class="relics-content">
  27. <el-table default-expand-all row-key="orgId" :data="relicsArray" border>
  28. <el-table-column label="单位名称" prop="orgName"></el-table-column>
  29. <el-table-column label="类型" prop="type" v-slot:default="{ row }: { row: OrganizationType }">
  30. {{ row.type ? OrganizationTypeDesc[row.type] : "" }}
  31. </el-table-column>
  32. <el-table-column label="行政区划" v-slot:default="{ row }: { row: OrganizationType }">
  33. <template v-if="row.province">
  34. <template v-if="row.zx">
  35. {{ `${row.city || ''}${row.area || ''}` }}
  36. </template>
  37. <template v-else>
  38. {{ `${row.province || ''}${row.city || ''}${row.area || ''}` }}
  39. </template>
  40. </template>
  41. </el-table-column>
  42. <el-table-column label="单位账号" prop="userName"></el-table-column>
  43. <el-table-column label="单位联系人" prop="contact"></el-table-column>
  44. <el-table-column label="创建时间" prop="updateTime" v-slot:default="{ row }">
  45. {{ row.updateTime && row.updateTime.substr(0, 16) }}
  46. </el-table-column>
  47. <el-table-column label="创建人" prop="createByName"></el-table-column>
  48. <el-table-column label="操作" width="100px" fixed="right">
  49. <template #default="{ row }: { row: OrganizationType }">
  50. <el-button link type="primary" @click="editHandler(row)" size="small">
  51. 编辑
  52. </el-button>
  53. <el-button link type="danger" v-if="!isNotSuper" @click="delOrganization(row)" size="small">
  54. 删除
  55. </el-button>
  56. </template>
  57. </el-table-column>
  58. </el-table>
  59. </div>
  60. <div class="pag-layout">
  61. <el-pagination background layout="total, prev, pager, next, sizes, jumper" v-model:page-size="pageProps.pageSize"
  62. :page-sizes="[10, 20, 50, 100]" :total="total" @current-change="(data: number) => pageProps.pageNum = data"
  63. :current-page="pageProps.pageNum" />
  64. </div>
  65. </div>
  66. </template>
  67. <script lang="ts" setup>
  68. import { onActivated, ref, watch, computed } from "vue";
  69. import {
  70. getOrgListFetch,
  71. addOrgFetch,
  72. delOrgFetch,
  73. alterOrgFetch,
  74. PageProps,
  75. } from "@/request";
  76. import type { OrganizationType } from "@/request/organization";
  77. import { OrganizationTypeDesc } from "@/store/organization";
  78. import { organizationAdd, organizationEdit } from "./quisk";
  79. import { debounce } from "@/util";
  80. import { user } from "@/store/user";
  81. import { ElMessageBox } from "element-plus";
  82. import { openLoading, closeLoading } from "@/helper/loading";
  83. const initProps: PageProps<Partial<OrganizationType>> = {
  84. pageNum: 1,
  85. pageSize: 10,
  86. orgName: "",
  87. orgId: undefined,
  88. type: undefined,
  89. };
  90. const pageProps = ref({ ...initProps });
  91. const total = ref<number>(0);
  92. const relicsArray = ref<any[]>([]);
  93. const isNotSuper = computed(
  94. () =>
  95. user.value.roles.filter(
  96. (item) =>
  97. item.roleKey === "system_admin" || item.roleKey === "system_common"
  98. ).length > 0
  99. );
  100. // 1省级 2市级 3县级 4服务商
  101. const refresh = debounce(async () => {
  102. const data = await getOrgListFetch(pageProps.value);
  103. total.value = data.total;
  104. // console.log('parseTree', parseTree(data.records, 'orgId'))
  105. // relicsArray.value = data.records.length > 1 ? parseTree(data.records, 'orgId') : data.records
  106. relicsArray.value = [];
  107. setTimeout(() => {
  108. relicsArray.value = data.records;
  109. }, 200)
  110. });
  111. watch(pageProps, refresh, { deep: true, immediate: true });
  112. onActivated(refresh);
  113. const addHandler = async () => {
  114. await organizationAdd({ submit: addOrgFetch });
  115. await refresh();
  116. };
  117. const editHandler = async (org: OrganizationType) => {
  118. await organizationEdit({ org: org, submit: alterOrgFetch });
  119. await refresh();
  120. };
  121. const delOrganization = async (org: OrganizationType) => {
  122. console.log("org", org);
  123. const ok = await ElMessageBox.confirm("确定要删除吗", {
  124. type: "warning",
  125. });
  126. if (ok) {
  127. openLoading();
  128. await delOrgFetch({
  129. orgId: org.orgId,
  130. orgName: org.orgName,
  131. type: org.type,
  132. });
  133. await refresh();
  134. closeLoading();
  135. }
  136. };
  137. </script>
  138. <style scoped lang="scss">
  139. .relics-layout {
  140. height: 100%;
  141. overflow-y: auto;
  142. padding: 30px;
  143. }
  144. .pag-layout {
  145. margin-top: 20px;
  146. display: flex;
  147. justify-content: center;
  148. }
  149. .relics-header {
  150. display: flex;
  151. align-items: center;
  152. margin-bottom: 20px;
  153. .search {
  154. flex: 1;
  155. }
  156. .relics-oper {
  157. flex: 0 0 100px;
  158. text-align: right;
  159. }
  160. }
  161. </style>