index.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <template>
  2. <div class="pageIndexClass">
  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="id" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
  13. default-expand-all>
  14. <el-table-column prop="subjectsName" label="名称" />
  15. <el-table-column prop="calculateItemName" label="核算项目名称" />
  16. <el-table-column prop="remark" label="备注" />
  17. <el-table-column prop="sort" label="排序" width="100" />
  18. <el-table-column label="创建时间" align="left" prop="createTime" width="160">
  19. </el-table-column>
  20. <el-table-column label="操作" align="center" width="200">
  21. <template #default="{ row }">
  22. <el-button link type="primary" @click="getDtl(row)">修改</el-button>
  23. <el-button link type="primary" @click="openModal(row)">添加子项</el-button>
  24. <!-- <el-button link type="primary" @click="openRoomModal(row)">权限</el-button> -->
  25. <el-button link type="primary" @click="listDelete(row)">删除</el-button>
  26. <!-- v-if="checkIsTopData(row.parentId)" -->
  27. </template>
  28. </el-table-column>
  29. </el-table>
  30. </div>
  31. <el-dialog :title="modalType == 'add' ? '添加科目' : '编辑科目'" v-if="dialogVisible" v-model="dialogVisible" width="500" v-loading="loadingDialog">
  32. <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit">
  33. <!-- <template #parentId>
  34. <div style="width: 100%">
  35. <el-tree-select v-model="formData.data.parentId" :data="sourceList.data" :disabled="modalType=='edit'" check-strictly
  36. :render-after-expand="false" node-key="deptId" :props="defaultProps" style="width:100%" />
  37. </div>
  38. </template> -->
  39. <!-- <template #orderNum>
  40. <div style="width: 100%">
  41. <el-input-number v-model="formData.data.orderNum" placeholder="请输入排序" style="width: 100%" :precision="0" :controls="false" :min="0"
  42. :max="99999" />
  43. </div>
  44. </template> -->
  45. </byForm>
  46. <template #footer>
  47. <el-button @click="dialogVisible = false" size="default">取 消</el-button>
  48. <el-button type="primary" @click="submitForm()" size="default">确 定</el-button>
  49. </template>
  50. </el-dialog>
  51. <el-dialog title="权限配置" v-if="roomDialogVisible" v-model="roomDialogVisible" width="500" v-loading="loading">
  52. <el-tree :data="treeData" show-checkbox node-key="id" :default-checked-keys="checkTreeData" :props="defaultPropsOne" ref="tree"> </el-tree>
  53. <template #footer>
  54. <el-button @click="roomDialogVisible = false" size="default">取 消</el-button>
  55. <el-button type="primary" @click="submitTree()" size="default" :loading="submitLoading">确 定</el-button>
  56. </template>
  57. </el-dialog>
  58. </div>
  59. </template>
  60. <script setup>
  61. import { computed, ref, watch } from "vue";
  62. import byTable from "@/components/byTable/index";
  63. import { ElMessage, ElMessageBox } from "element-plus";
  64. import byForm from "@/components/byForm/index";
  65. import useUserStore from "@/store/modules/user";
  66. const { proxy } = getCurrentInstance();
  67. const defaultProps = {
  68. children: "children",
  69. label: "subjectsName",
  70. };
  71. const defaultPropsOne = {
  72. children: "children",
  73. label: "label",
  74. };
  75. const userList = ref([]);
  76. const paymentTypeData = ref([]);
  77. const typeList = ref([
  78. {
  79. label: "公司",
  80. value: 0,
  81. },
  82. // {
  83. // label: "业务中心",
  84. // value: 1,
  85. // },
  86. {
  87. label: "科目",
  88. value: 2,
  89. },
  90. {
  91. label: "组",
  92. value: 3,
  93. },
  94. ]);
  95. const sourceList = ref({
  96. data: [],
  97. pagination: {
  98. total: 0,
  99. pageNum: 1,
  100. pageSize: 9999,
  101. keyword: "",
  102. tenantId: useUserStore().user.tenantId,
  103. },
  104. });
  105. const loading = ref(false);
  106. const config = computed(() => {
  107. return [];
  108. });
  109. const getDict = () => {
  110. // proxy
  111. // .get("/tenantUser/list", {
  112. // pageNum: 1,
  113. // pageSize: 10000,
  114. // tenantId: useUserStore().user.tenantId,
  115. // })
  116. // .then((res) => {
  117. // userList.value = res.rows.map((item) => {
  118. // return {
  119. // label: item.nickName,
  120. // value: item.userId,
  121. // };
  122. // });
  123. // });
  124. proxy.post("/paymentType/page", { pageNum: 1, pageSize: 999 }).then((res) => {
  125. paymentTypeData.value = res.rows.map((item) => {
  126. return {
  127. ...item,
  128. label: item.name,
  129. value: item.id,
  130. };
  131. });
  132. });
  133. };
  134. const deptAllData = ref([]);
  135. const getList = (req) => {
  136. sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
  137. loading.value = true;
  138. proxy
  139. .post("/accountSubjects/list", sourceList.value.pagination)
  140. .then((res) => {
  141. deptAllData.value = res;
  142. sourceList.value.data = proxy.handleTree(res, "id");
  143. setTimeout(() => {
  144. loading.value = false;
  145. }, 200);
  146. });
  147. };
  148. getDict();
  149. getList();
  150. const modalType = ref("add");
  151. const dialogVisible = ref(false);
  152. const loadingDialog = ref(false);
  153. const submit = ref(null);
  154. const formOption = reactive({
  155. inline: true,
  156. labelWidth: 110,
  157. itemWidth: 100,
  158. rules: [],
  159. });
  160. const formData = reactive({
  161. data: {},
  162. });
  163. const formConfig = computed(() => {
  164. return [
  165. // {
  166. // type: "slot",
  167. // prop: "parentId",
  168. // slotName: "parentId",
  169. // label: "上级科目",
  170. // },
  171. {
  172. type: "input",
  173. prop: "subjectsName",
  174. label: "名称",
  175. },
  176. {
  177. type: "input",
  178. prop: "subjectsCode",
  179. label: "代码",
  180. },
  181. // {
  182. // type: "select",
  183. // label: "收付款类型",
  184. // prop: "paymentTypeId",
  185. // itemWidth: 100,
  186. // data: paymentTypeData.value,
  187. // // clearable: true,
  188. // fn: (val) => {},
  189. // },
  190. {
  191. type: "input",
  192. prop: "calculateItemName",
  193. label: "核算项目名称",
  194. },
  195. // {
  196. // type: "slot",
  197. // prop: "orderNum",
  198. // slotName: "orderNum",
  199. // label: "科目排序",
  200. // },
  201. {
  202. type: "number",
  203. prop: "sort",
  204. label: "排序",
  205. precision: 0,
  206. min: 0,
  207. controls: false,
  208. // itemWidth: 50,
  209. disabled: false,
  210. },
  211. {
  212. type: "input",
  213. itemType: "textarea",
  214. prop: "remark",
  215. label: "备注",
  216. },
  217. ];
  218. });
  219. const rules = ref({
  220. subjectsName: [{ required: true, message: "请输入名称", trigger: "blur" }],
  221. subjectsCode: [{ required: true, message: "请输入代码", trigger: "blur" }],
  222. sort: [{ required: true, message: "请输入科目排序", trigger: "blur" }],
  223. paymentTypeId: [
  224. { required: true, message: "请选择收费款类型", trigger: "change" },
  225. ],
  226. });
  227. const disabledType = ref(false);
  228. const openModal = (row) => {
  229. disabledType.value = false;
  230. modalType.value = "add";
  231. formData.data = {
  232. parentId: "",
  233. };
  234. if (row && row.id) {
  235. formData.data.parentId = row.id;
  236. }
  237. loadingDialog.value = false;
  238. dialogVisible.value = true;
  239. };
  240. const submitForm = () => {
  241. submit.value.handleSubmit(() => {
  242. loadingDialog.value = true;
  243. proxy
  244. .post("/accountSubjects/" + modalType.value, formData.data)
  245. .then(() => {
  246. proxy.msgTip("操作成功", 1);
  247. dialogVisible.value = false;
  248. getList();
  249. });
  250. });
  251. };
  252. const listDelete = (row) => {
  253. proxy
  254. .msgConfirm()
  255. .then((res) => {
  256. proxy
  257. .post("/accountSubjects/delete", {
  258. id: row.id,
  259. })
  260. .then((res) => {
  261. proxy.msgTip("操作成功", 1);
  262. getList();
  263. });
  264. })
  265. .catch((err) => {});
  266. };
  267. const isTopData = ref(false);
  268. const checkIsTopData = (parentId) => {
  269. return deptAllData.value.some((x) => x.id == parentId);
  270. };
  271. const getDtl = (row) => {
  272. formData.data = proxy.deepClone(row);
  273. modalType.value = "edit";
  274. dialogVisible.value = true;
  275. };
  276. const tree = ref(null);
  277. const roomDialogVisible = ref(false);
  278. const treeData = ref([]);
  279. const checkTreeData = ref([]);
  280. const rowTenantId = ref("");
  281. const getSubset = (list, data) => {
  282. for (let i = 0; i < list.length; i++) {
  283. if (list[i].children && list[i].children.length > 0) {
  284. getSubset(list[i].children, data);
  285. } else {
  286. data.push(list[i].id);
  287. }
  288. }
  289. return data;
  290. };
  291. const openRoomModal = (row) => {
  292. if (row.parentId == "0") {
  293. rowTenantId.value = row.tenantId;
  294. } else {
  295. rowTenantId.value = row.deptId;
  296. }
  297. proxy
  298. .get("/tenantInfo/roleMenuTreeSelect/" + rowTenantId.value)
  299. .then((res) => {
  300. if (res.code == 200) {
  301. treeData.value = res.menus;
  302. let data = getSubset(res.menus, []);
  303. checkTreeData.value = res.checkedKeys.filter((item) => {
  304. return data.some((i) => item == i);
  305. });
  306. roomDialogVisible.value = true;
  307. }
  308. });
  309. };
  310. const noRepeat = (arr) => {
  311. var newArr = [...new Set(arr)];
  312. return newArr;
  313. };
  314. const submitTree = () => {
  315. let data = noRepeat(
  316. tree.value.getHalfCheckedKeys().concat(tree.value.getCheckedKeys())
  317. );
  318. if (data.length == 0) {
  319. ElMessage({
  320. message: "请至少选择一个菜单",
  321. type: "error",
  322. });
  323. return;
  324. }
  325. proxy
  326. .post("/tenantInfo/bindingMenu", {
  327. tenantId: rowTenantId.value,
  328. menuIdList: data,
  329. })
  330. .then((res) => {
  331. ElMessage({
  332. message: "保存成功",
  333. type: "success",
  334. });
  335. roomDialogVisible.value = false;
  336. });
  337. };
  338. </script>
  339. <style lang="scss" scoped>
  340. .tenant {
  341. padding: 20px;
  342. }
  343. </style>