subject-setting.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <template>
  2. <basic-container>
  3. <avue-crud
  4. v-model="form"
  5. :option="option"
  6. :data="data"
  7. :table-loading="loading"
  8. ref="crud"
  9. @search-change="searchChange"
  10. @search-reset="searchReset"
  11. @row-save="rowSave"
  12. @row-update="rowUpdate"
  13. >
  14. <template slot="menuLeft">
  15. <el-button
  16. type="warning"
  17. size="small"
  18. plain
  19. icon="el-icon-download"
  20. @click="handleExport"
  21. >
  22. 导出
  23. </el-button>
  24. </template>
  25. <template slot="icon" slot-scope="scope">
  26. <i :class="scope.row.icon" style="font-size: 24px"></i>
  27. </template>
  28. <template slot="menu" slot-scope="{ row, size, type }">
  29. <el-button v-if="row.level === 3" :size="size" :type="type" icon="el-icon-plus" @click="handleAdd(row)">
  30. 新增子级
  31. </el-button>
  32. <el-button v-if="row.type === 0" :size="size" :type="type" icon="el-icon-edit" @click="handleEdit(row)">
  33. 编辑
  34. </el-button>
  35. <el-button v-if="row.type === 0" :size="size" :type="type" icon="el-icon-delete" @click="rowDel(row)">
  36. 删除
  37. </el-button>
  38. </template>
  39. <template slot="body">
  40. <h3 class="page-title">{{ tag.label }}</h3>
  41. </template>
  42. </avue-crud>
  43. </basic-container>
  44. </template>
  45. <script>
  46. import { getList, add, update, remove } from "@/api/basicResource/subjectSetting";
  47. import {exportBloByPost} from "@/api/common";
  48. import {getToken} from "@/util/auth";
  49. import {downloadXls} from "@/util/util";
  50. import { mapGetters } from "vuex";
  51. export default {
  52. data() {
  53. return {
  54. loading: false,
  55. parentId: undefined,
  56. form: {},
  57. data: [],
  58. query: {},
  59. option: {
  60. height: "auto",
  61. calcHeight: 30,
  62. tip: false,
  63. searchShow: true,
  64. searchMenuSpan: 6,
  65. index: true,
  66. border: true,
  67. searchLabelWidth: 140,
  68. labelWidth: 160,
  69. menuWidth: 130,
  70. dialogClickModal: false,
  71. dialogWidth: 500,
  72. dialogType: "drawer",
  73. rowKey: "id",
  74. rowParentKey: "parentId",
  75. defaultExpandAll: true,
  76. tree: true,
  77. addBtn: false,
  78. editBtn: false,
  79. delBtn: false,
  80. refreshBtn: false,
  81. gridBtn: false,
  82. columnBtn: false,
  83. searchShowBtn: false,
  84. column: [
  85. {
  86. label: "上级科目",
  87. prop: "parentId",
  88. type: "tree",
  89. dicData: [],
  90. span: 24,
  91. hide: true,
  92. disabled: true,
  93. props: {
  94. value: "id",
  95. label: "name"
  96. },
  97. rules: [
  98. {
  99. required: false,
  100. message: "请选择上级菜单",
  101. trigger: "click"
  102. }
  103. ]
  104. },
  105. {
  106. label: "科目名称",
  107. prop: "name",
  108. type: "input",
  109. span: 24,
  110. minWidth: 160,
  111. search: true,
  112. showOverflowTooltip: true,
  113. rules: [
  114. {
  115. required: true,
  116. message: "请输入科目名称",
  117. trigger: "blur",
  118. },
  119. ],
  120. },
  121. {
  122. label: "科目代码",
  123. prop: "code",
  124. type: "input",
  125. span: 24,
  126. search: true,
  127. width: 120,
  128. align: 'center',
  129. display: false,
  130. showOverflowTooltip: true,
  131. rules: [
  132. {
  133. required: true,
  134. message: "请输入科目代码",
  135. trigger: "blur",
  136. },
  137. ],
  138. },
  139. {
  140. label: "会计科目",
  141. prop: "accSubject",
  142. type: "textarea",
  143. span: 24,
  144. minWidth: 160,
  145. display: false,
  146. showOverflowTooltip: true,
  147. },
  148. {
  149. label: "高新研发费用科目",
  150. prop: "rdSubject",
  151. type: "textarea",
  152. span: 24,
  153. minWidth: 160,
  154. display: false,
  155. showOverflowTooltip: true,
  156. },
  157. {
  158. label: "高新研发费用科目",
  159. prop: "rdSubjectEnable",
  160. type: "radio",
  161. dicData:[{
  162. label: '是',
  163. value: 1
  164. },{
  165. label: '否',
  166. value: 0
  167. }],
  168. hide: true,
  169. span: 24,
  170. showOverflowTooltip: true,
  171. },
  172. {
  173. label: "加计扣除研发费用科目",
  174. prop: "adSubjectEnable",
  175. type: "radio",
  176. dicData:[{
  177. label: '是',
  178. value: 1
  179. },{
  180. label: '否',
  181. value: 0
  182. }],
  183. hide: true,
  184. span: 24,
  185. showOverflowTooltip: true,
  186. },
  187. {
  188. label: "加计扣除研发费用科目",
  189. prop: "adSubject",
  190. type: "textarea",
  191. span: 24,
  192. minWidth: 160,
  193. display: false,
  194. showOverflowTooltip: true,
  195. },
  196. {
  197. label: "辅助核算",
  198. prop: "fzhs",
  199. span: 24,
  200. width: 100,
  201. display: false,
  202. showOverflowTooltip: true,
  203. },
  204. ],
  205. },
  206. };
  207. },
  208. computed: {
  209. ...mapGetters(['tag'])
  210. },
  211. mounted() {
  212. this.loadData();
  213. this.getMenuData();
  214. },
  215. methods: {
  216. handleExport() {
  217. exportBloByPost(`/api/kd-scientific/subject/export?${this.website.tokenHeader}=${getToken()}`, this.query).then(res => {
  218. downloadXls(res.data, `${this.tag.label}.xlsx`);
  219. });
  220. },
  221. loopData(data, level, maxLevel) {
  222. level++;
  223. return data.map(item => {
  224. item.level = level;
  225. item.disabled = level === 4 ? true : false;
  226. item.hasChildren = item.children && item.children.length ? false : true;
  227. if (item.level === 4) {
  228. item.rdSubject = item.rdSubjectEnable === 1 ? item.accSubject : '';
  229. item.adSubject = item.adSubjectEnable === 1 ? item.accSubject : '';
  230. }
  231. if (maxLevel) {
  232. if (level >= maxLevel) {
  233. delete item.children;
  234. } else {
  235. this.loopData(item.children || [], level, maxLevel);
  236. }
  237. } else {
  238. this.loopData(item.children || [], level);
  239. }
  240. return item;
  241. });
  242. },
  243. getMenuData() {
  244. getList().then(res => {
  245. this.loading = false;
  246. if (res.data.code == 200) {
  247. const column = this.findObject(this.option.column, "parentId");
  248. column.dicData = this.loopData(JSON.parse(JSON.stringify(res.data.data)), 0, 3);
  249. }
  250. })
  251. },
  252. loadData(params) {
  253. this.loading = true;
  254. getList(params).then(res => {
  255. this.loading = false;
  256. if (res.data.code == 200) {
  257. this.data = this.loopData(res.data.data, 0);
  258. }
  259. })
  260. },
  261. searchReset() {
  262. this.query = {};
  263. this.parentId = 0;
  264. this.loadData();
  265. },
  266. searchChange(params, done) {
  267. this.query = params;
  268. this.parentId = '';
  269. this.loadData(params);
  270. done();
  271. },
  272. rowDel(row) {
  273. this.$confirm('确定将选择数据删除?', '提示', {
  274. confirmButtonText: '确定',
  275. cancelButtonText: '取消',
  276. type: 'warning'
  277. }).then(() => {
  278. remove(row.id).then(({ data }) => {
  279. if (data.code == 200) {
  280. this.$message.success("删除成功!");
  281. this.loadData();
  282. }
  283. });
  284. })
  285. },
  286. findParentNames(categories, childId, parentNames = []) {
  287. const child = categories.find(cat => cat.id == childId);
  288. if (!child || !child.parentId) {
  289. return parentNames;
  290. }
  291. const parent = categories.find(cat => cat.id == child.parentId);
  292. if (parent) {
  293. parentNames.unshift(parent.name); // 添加到数组开头保持顺序
  294. return this.findParentNames(categories, parent.id, parentNames);
  295. }
  296. return parentNames;
  297. },
  298. getFormData(row) {
  299. const params = { ...row };
  300. let parentNames = [];
  301. if (params.parentId) {
  302. let newList = [];
  303. const getAllList = data => {
  304. data.forEach(element => {
  305. newList.push(element);
  306. if (element.children && element.children.length) {
  307. getAllList(element.children)
  308. }
  309. });
  310. }
  311. getAllList(this.data);
  312. parentNames = this.findParentNames(newList, params.parentId);
  313. let currParent = newList.find(item => item.id == params.parentId);
  314. if (!!currParent) {
  315. parentNames.push(currParent.name);
  316. }
  317. }
  318. return { ...params, accSubject: parentNames.length ? `${parentNames.join('\\')}\\${params.name}` : params.name }
  319. },
  320. rowSave(row, done) {
  321. const params = this.getFormData(row);
  322. add(params).then(({ data }) => {
  323. done();
  324. if (data.code == 200) {
  325. this.$message.success("新增成功!");
  326. this.loadData();
  327. }
  328. }).catch(() => {
  329. done();
  330. })
  331. },
  332. handleEdit(row) {
  333. this.$refs.crud.rowEdit(row);
  334. },
  335. rowUpdate(row, index, done) {
  336. const params = this.getFormData(row);
  337. update(params).then(({ data }) => {
  338. done();
  339. if (data.code == 200) {
  340. this.$message.success("修改成功!");
  341. this.loadData();
  342. }
  343. }).catch(() => {
  344. done();
  345. })
  346. },
  347. handleAdd(row) {
  348. this.parentId = row.id;
  349. const column = this.findObject(this.option.column, "parentId");
  350. column.value = row.id;
  351. this.form.parentId = row.id;
  352. column.addDisabled = true;
  353. this.$refs.crud.rowAdd();
  354. },
  355. },
  356. };
  357. </script>