index.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. <div class="tenant">
  3. <byTable :hideTable="true" :hidePagination="true" :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="false"
  4. highlight-current-row :action-list="[
  5. {
  6. text: '添加机构',
  7. action: () => openModal(),
  8. },
  9. ]" @get-list="getList">
  10. </byTable>
  11. <div style="padding: 0 20px 20px 20px; background-color: white">
  12. <el-table v-loading="loading" :data="sourceList.data" row-key="deptId" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
  13. default-expand-all>
  14. <el-table-column prop="deptName" label="机构名称" min-width="260" />
  15. <el-table-column prop="type" label="机构类型" width="100">
  16. <template #default="{ row }">
  17. <span>{{ dictValueLabel(row.type, typeList) }} </span>
  18. </template>
  19. </el-table-column>
  20. <el-table-column prop="orderNum" label="排序" width="100" />
  21. <el-table-column label="创建时间" align="center" prop="createTime" width="200">
  22. <template #default="{ row }">
  23. <span>{{ row.createTime }}</span>
  24. </template>
  25. </el-table-column>
  26. <el-table-column label="操作" align="center" width="180">
  27. <template #default="{ row }">
  28. <el-button link type="primary" @click="getDtl(row)">修改</el-button>
  29. <el-button link type="primary" @click="openModal(row.deptId)">添加子项</el-button>
  30. <el-button v-if="row.parentId != 0" link type="primary" @click="listDelete(row)">删除</el-button>
  31. </template>
  32. </el-table-column>
  33. </el-table>
  34. </div>
  35. <el-dialog :title="modalType == 'add' ? '添加机构' : '编辑机构'" v-if="dialogVisible" v-model="dialogVisible" width="500" v-loading="loadingDialog">
  36. <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit">
  37. <template #parentId>
  38. <div style="width: 100%">
  39. <el-tree-select v-model="formData.data.parentId" :data="sourceList.data" check-strictly :render-after-expand="false" node-key="deptId"
  40. :props="defaultProps" style="width:100%" />
  41. </div>
  42. </template>
  43. <template #orderNum>
  44. <div style="width: 100%">
  45. <el-input-number v-model="formData.data.orderNum" placeholder="请输入排序" style="width: 100%" :precision="0" :controls="false" :min="0"
  46. :max="99999" />
  47. </div>
  48. </template>
  49. </byForm>
  50. <template #footer>
  51. <el-button @click="dialogVisible = false" size="large">取 消</el-button>
  52. <el-button type="primary" @click="submitForm()" size="large">确 定</el-button>
  53. </template>
  54. </el-dialog>
  55. </div>
  56. </template>
  57. <script setup>
  58. import { computed, ref, watch } from "vue";
  59. import byTable from "@/components/byTable/index";
  60. import { ElMessage, ElMessageBox } from "element-plus";
  61. import byForm from "@/components/byForm/index";
  62. import useUserStore from "@/store/modules/user";
  63. const { proxy } = getCurrentInstance();
  64. const defaultProps = {
  65. children: "children",
  66. label: "deptName",
  67. };
  68. const userList = ref([]);
  69. const typeList = ref([
  70. {
  71. label: "公司",
  72. value: 0,
  73. },
  74. {
  75. label: "业务中心",
  76. value: 1,
  77. },
  78. {
  79. label: "部门",
  80. value: 2,
  81. },
  82. {
  83. label: "组",
  84. value: 3,
  85. },
  86. ]);
  87. const sourceList = ref({
  88. data: [],
  89. pagination: {
  90. total: 0,
  91. pageNum: 1,
  92. pageSize: 9999,
  93. keyword: "",
  94. tenantId: useUserStore().user.tenantId,
  95. },
  96. });
  97. const loading = ref(false);
  98. const config = computed(() => {
  99. return [];
  100. });
  101. const getDict = () => {
  102. proxy
  103. .get("/tenantUser/list", {
  104. pageNum: 1,
  105. pageSize: 10000,
  106. tenantId: useUserStore().user.tenantId,
  107. })
  108. .then((res) => {
  109. userList.value = res.rows.map((item) => {
  110. return {
  111. label: item.nickName,
  112. value: item.userId,
  113. };
  114. });
  115. });
  116. };
  117. const getList = async (req) => {
  118. if (req) {
  119. req.deptName = req.keyword;
  120. }
  121. sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
  122. loading.value = true;
  123. proxy.get("/tenantDept/list", sourceList.value.pagination).then((res) => {
  124. sourceList.value.data = proxy.handleTree(res.data, "deptId");
  125. console.log(sourceList.value.data);
  126. setTimeout(() => {
  127. loading.value = false;
  128. }, 200);
  129. });
  130. };
  131. // getDict();
  132. getList();
  133. const modalType = ref("add");
  134. const dialogVisible = ref(false);
  135. const loadingDialog = ref(false);
  136. const submit = ref(null);
  137. const formOption = reactive({
  138. inline: true,
  139. labelWidth: 100,
  140. itemWidth: 100,
  141. rules: [],
  142. });
  143. const formData = reactive({
  144. data: {},
  145. });
  146. const formConfig = computed(() => {
  147. return [
  148. {
  149. type: "slot",
  150. prop: "parentId",
  151. slotName: "parentId",
  152. label: "上级机构",
  153. },
  154. {
  155. type: "input",
  156. prop: "deptName",
  157. label: "机构名称",
  158. },
  159. {
  160. type: "select",
  161. prop: "type",
  162. label: "机构类型",
  163. data: typeList.value,
  164. style: {
  165. width: "100%",
  166. },
  167. },
  168. // {
  169. // type: "select",
  170. // prop: "leaderId",
  171. // label: "负责人",
  172. // data: userList.value,
  173. // clearable: true,
  174. // itemWidth: 50,
  175. // },
  176. // {
  177. // type: "select",
  178. // prop: "directorId",
  179. // label: "总监",
  180. // data: userList.value,
  181. // clearable: true,
  182. // itemWidth: 50,
  183. // },
  184. {
  185. type: "slot",
  186. prop: "orderNum",
  187. slotName: "orderNum",
  188. label: "部门排序",
  189. },
  190. ];
  191. });
  192. const rules = ref({
  193. parentId: [{ required: true, message: "请选择上级机构", trigger: "change" }],
  194. deptName: [{ required: true, message: "请输入机构名称", trigger: "blur" }],
  195. type: [{ required: true, message: "请选择机构类型", trigger: "change" }],
  196. orderNum: [{ required: true, message: "请输入部门排序", trigger: "blur" }],
  197. });
  198. const openModal = (val) => {
  199. modalType.value = "add";
  200. formData.data = {
  201. parentId: val || "",
  202. tenantId: useUserStore().user.tenantId,
  203. };
  204. loadingDialog.value = false;
  205. dialogVisible.value = true;
  206. };
  207. const submitForm = () => {
  208. submit.value.handleSubmit(() => {
  209. loadingDialog.value = true;
  210. formData.data.leaderId = formData.data.leaderId
  211. ? formData.data.leaderId
  212. : "-1";
  213. formData.data.directorId = formData.data.directorId
  214. ? formData.data.directorId
  215. : "-1";
  216. const method = modalType.value == "add" ? "POST" : "PUT";
  217. if (!formData.data.parentId) formData.data.parentId = 0;
  218. proxy.post("/tenantDept", formData.data, method).then(() => {
  219. ElMessage({
  220. message: modalType.value == "add" ? "添加成功" : "编辑成功",
  221. type: "success",
  222. });
  223. dialogVisible.value = false;
  224. getList();
  225. });
  226. });
  227. };
  228. const listDelete = (row) => {
  229. ElMessageBox.confirm("此操作将永久删除该数据, 是否继续?", "提示", {
  230. confirmButtonText: "确定",
  231. cancelButtonText: "取消",
  232. type: "warning",
  233. }).then(() => {
  234. proxy.post("/tenantDept/" + row.deptId, {}, "delete").then((res) => {
  235. ElMessage({
  236. message: "删除成功",
  237. type: "success",
  238. });
  239. getList();
  240. });
  241. });
  242. };
  243. const getDtl = (row) => {
  244. formData.data = proxy.deepClone(row);
  245. modalType.value = "edit";
  246. formData.data.leaderId =
  247. formData.data.leaderId == "-1" ? "" : formData.data.leaderId;
  248. formData.data.directorId =
  249. formData.data.directorId == "-1" ? "" : formData.data.directorId;
  250. dialogVisible.value = true;
  251. setTimeout(() => {
  252. formData.data.type = row.type;
  253. }, 0);
  254. };
  255. </script>
  256. <style lang="scss" scoped>
  257. .tenant {
  258. padding: 20px;
  259. }
  260. ::v-deep(.el-input-number .el-input__inner) {
  261. text-align: left;
  262. }
  263. </style>