mtx-process-catalog.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. <template>
  2. <div :class="$style.wrapHeight">
  3. <div :class="$style.rowHeight">
  4. <mtx-process-catalog-tree
  5. ref="mtxProcessCatalogTree"
  6. show-line
  7. top-node-text="内控流程库"
  8. :is-select-dep="true"
  9. :draggable="true"
  10. :history="this.$route.query.history ? true : false"
  11. :hisv="this.$route.query.history ? this.$route.query.versionId : null"
  12. :hisorg="this.$route.query.history ? this.$route.query.orgId : null"
  13. :hisorgn="this.$route.query.history ? this.$route.query.orgName : null"
  14. @treeSelect="treeSelect"
  15. @depChanged="depChanged"
  16. ></mtx-process-catalog-tree>
  17. <div :class="$style.rightcard">
  18. <a-card>
  19. <sd-data-table-ex
  20. :key="key"
  21. ref="dataTable"
  22. :editnode="editnode"
  23. form-id="icMtxProcess"
  24. page-id="ic/process/icMtxProcess"
  25. :columns="columns1"
  26. :actions="actions"
  27. :search-fields="['prcName']"
  28. :filter-expressions="expressions"
  29. :show-selection="(item) => item.editAndDeleteAuth !== 0"
  30. :custom-delete-fun="deleteRows"
  31. @recordSaved="onRecordSaved"
  32. @formBtnClick="formBtnClick"
  33. >
  34. <template slot="prcName" slot-scope="text, record">
  35. <a
  36. v-if="record.editAndDeleteAuth !== 0"
  37. @click="
  38. () => {
  39. $refs.dataTable.showDetailModal(record.id, 'ic/process/icMtxProcess')
  40. }
  41. "
  42. >{{ text }}</a
  43. >
  44. <span v-else>{{ text }}</span>
  45. </template>
  46. <!-- 详情表单 -->
  47. <template
  48. v-slot:form="{ model, fields, pageId }"
  49. v-sd-watermark="waterMark"
  50. @saved="onSaved"
  51. >
  52. <!-- 一般字段直接写name即可 -->
  53. <a-form-model-item
  54. prop="prcCode"
  55. label="流程分类编号"
  56. :rules="[
  57. { validator: validator },
  58. {
  59. required: true,
  60. trigger: ['change', 'blur'],
  61. },
  62. ]"
  63. >
  64. <a-input v-model.trim="model.prcCode" />
  65. </a-form-model-item>
  66. <!-- <sd-form-item name="catalogCode" /> -->
  67. <sd-form-item name="prcName" />
  68. <sd-form-item name="prcDesc">
  69. <a-textarea v-model="model.prcDesc" :rows="3" />
  70. </sd-form-item>
  71. <sd-form-item name="isEnd" />
  72. <sd-form-item name="attachment"></sd-form-item>
  73. <!-- <sd-form-item name="attachment">
  74. <template v-slot:read-and-edit>
  75. <sd-attachment
  76. v-model="model.attachment"
  77. :group-id="JSON.parse(fields.attachment.value).value"
  78. />
  79. </template>
  80. </sd-form-item> -->
  81. <sd-form-item name="sortNum" />
  82. <sd-form-item
  83. :hidden="true"
  84. name="parentId"
  85. :input-props="{ defaultValue: parentId }"
  86. />
  87. <sd-form-item
  88. :hidden="true"
  89. name="auditOrgId"
  90. :input-props="{ defaultValue: auditOrgId }"
  91. />
  92. <sd-form-item
  93. :hidden="true"
  94. name="prcPath"
  95. :input-props="{ defaultValue: prcPath }"
  96. />
  97. <sd-form-item
  98. :hidden="true"
  99. name="mtxVersionId"
  100. :input-props="{ defaultValue: versionId }"
  101. />
  102. </template>
  103. </sd-data-table-ex>
  104. </a-card>
  105. </div>
  106. </div>
  107. </div>
  108. </template>
  109. <script>
  110. import { Modal, message } from 'ant-design-vue'
  111. import TableColumnTypes from '@/common/services/table-column-types'
  112. import systemManage from '@/system-manage/system-manage'
  113. import debounce from 'lodash.debounce'
  114. import axios from '@/common/services/axios-instance'
  115. import TableActionTypes from '@/common/services/table-action-types'
  116. import mtxProcessCatalogTree from './mtx-process-catalog-tree'
  117. import MtxProcessService from './mtx-process-service'
  118. import components from './_import-components/mtx-process-catalog-import'
  119. export default {
  120. name: 'MtxProcessCatalog',
  121. metaInfo: {
  122. title: '内控流程分类配置',
  123. },
  124. components: {
  125. ...components,
  126. mtxProcessCatalogTree,
  127. },
  128. data() {
  129. return {
  130. editnode: true, // 列表是否可以新建
  131. key: 0,
  132. waterMark: systemManage.getFormWaterMark(),
  133. treeData: [],
  134. columns1: [
  135. {
  136. dataIndex: 'id',
  137. sdHidden: true,
  138. },
  139. {
  140. dataIndex: 'parentId',
  141. sdHidden: true,
  142. },
  143. {
  144. title: '排序号',
  145. dataIndex: 'sortNum',
  146. defaultSortOrder: 'ascend',
  147. width: '100px',
  148. },
  149. {
  150. title: '分类编号',
  151. dataIndex: 'prcCode',
  152. },
  153. {
  154. title: '分类名称',
  155. dataIndex: 'prcName',
  156. scopedSlots: { customRender: 'prcName' },
  157. },
  158. {
  159. title: '创建时间',
  160. dataIndex: 'creationTime',
  161. sorter: true,
  162. sdRender: TableColumnTypes.date,
  163. },
  164. {
  165. title: '是否末级分类',
  166. dataIndex: 'isEnd',
  167. },
  168. ],
  169. actions: [
  170. {
  171. label: '新建',
  172. type: 'primary',
  173. callback: this.create,
  174. // permission: 'iamAuditMatters-create',
  175. permission: null,
  176. },
  177. {
  178. label: '删除',
  179. id: 'delete',
  180. // permission: 'iamAuditMatters-delete',
  181. permission: null,
  182. type: 'delete',
  183. callback: this.deleteRows,
  184. },
  185. ],
  186. expressions: [
  187. {
  188. dataType: 'long',
  189. name: 'parentId',
  190. op: 'eq',
  191. longValue: null,
  192. },
  193. {
  194. dataType: 'long',
  195. name: 'auditOrgId',
  196. op: 'eq',
  197. longValue: null,
  198. },
  199. {
  200. dataType: 'long',
  201. name: 'mtxVersionId',
  202. op: 'eq',
  203. longValue: null,
  204. },
  205. ],
  206. parentId: -1,
  207. auditOrgId: null,
  208. parentName: '业务类型',
  209. prcPath: null,
  210. isEnd: null,
  211. versionId: null,
  212. }
  213. },
  214. mounted() {
  215. this.versionId = this.$route.query.versionId
  216. },
  217. methods: {
  218. treeSelect(selectedKeys, info) {
  219. this.prcPath = null
  220. // 父级id
  221. if (info != null && info.selectedNodes[0]) {
  222. this.parentId = Number(info.selectedNodes[0].data.props.id)
  223. this.parentName = info.selectedNodes[0].data.props.text // 父级名称
  224. // this.orgId = Number(info.selectedNodes[0].data.props.id)
  225. this.editnode = info.selectedNodes[0].data.props.edit
  226. if (info.selectedNodes[0].data.props.props) {
  227. this.isEnd = info.selectedNodes[0].data.props.props.isEnd
  228. }
  229. // 判断父节点不为根节点
  230. // if (this.parentId !== this.$refs.mtxProcessCatalogTree.depvalue) {
  231. if (this.parentId !== -1) {
  232. if (info.selectedNodes[0].data.props.props.catalogPath) {
  233. this.prcPath = info.selectedNodes[0].data.props.props.catalogPath + ',' + this.parentId
  234. } else {
  235. this.prcPath = this.parentId
  236. }
  237. }
  238. } else {
  239. if (selectedKeys.id) {
  240. this.parentId = Number(selectedKeys.id)
  241. this.parentName = selectedKeys.text // 父级名称
  242. } else {
  243. this.parentId = -1
  244. }
  245. }
  246. // 如果是末级,则隐藏新建按钮
  247. this.expressions.forEach((item) => {
  248. if (item.name === 'parentId') {
  249. item.longValue = this.parentId
  250. }
  251. if (item.name === 'auditOrgId') {
  252. item.longValue = this.$refs.mtxProcessCatalogTree.depvalue
  253. }
  254. if (item.name === 'mtxVersionId') {
  255. item.longValue = this.$refs.mtxProcessCatalogTree.versionId
  256. }
  257. })
  258. this.expressions = [...this.expressions]
  259. this.auditOrgId = this.$refs.mtxProcessCatalogTree.depvalue
  260. },
  261. // 部门下拉框选择事件
  262. depChanged(value, info) {
  263. this.orgId = this.$refs.mtxProcessCatalogTree.depvalue
  264. },
  265. // 新建保存回调刷新树
  266. onRecordSaved() {
  267. this.$refs.mtxProcessCatalogTree.refreshNode(this.parentId)
  268. },
  269. // 删除回调
  270. onRecordsDeleted() {
  271. message.success('删除成功')
  272. this.$refs.mtxProcessCatalogTree.refreshNode(this.parentId)
  273. },
  274. formBtnClick(evt, btn, { form, recordId }) {
  275. if (btn.buttonId === 'save') {
  276. // 如果为末节点需要判断是否有子和子措施
  277. // 判断是否有下级
  278. if (form.$refs.form.getFieldValue('isEnd') === '1') {
  279. evt.preventDefault()
  280. MtxProcessService.CheckCategory([recordId]).then((res) => {
  281. if (!res) {
  282. Modal.info({
  283. content: '当前分类存在子类,无法变更为末级节点',
  284. })
  285. return false
  286. } else {
  287. form.$refs.form.save().then((res) => {
  288. message.success('保存成功')
  289. form.hide()
  290. this.$refs.mtxProcessCatalogTree.refreshNode(this.parentId)
  291. // this.$refs.dataTable.refreshNode(this.parentId)
  292. this.refresh()
  293. })
  294. }
  295. })
  296. }
  297. }
  298. },
  299. validator(rule, value, callback) {
  300. let id = -1
  301. if (this.$refs.dataTable.recordId) {
  302. id = this.$refs.dataTable.recordId
  303. }
  304. value = encodeURIComponent(value)
  305. const url =
  306. `api/xcoa-mobile/v1/icmtxprocess/check-category-code?catalogCode=${value}&parentId=${this.parentId}&id=` +
  307. id
  308. debounce(() => {
  309. axios.get(url).then((res) => {
  310. if (res.data) {
  311. callback()
  312. } else {
  313. callback('已存在分类编码,不可以重复')
  314. }
  315. })
  316. }, 500)()
  317. },
  318. deleteRows() {
  319. const ids = this.$refs.dataTable.getSelectedRowKeys()
  320. if (ids.length === 0) {
  321. Modal.info({
  322. content: '请选择需要删除的文件',
  323. })
  324. return
  325. }
  326. // 判断是否有下级
  327. MtxProcessService.deleteCheckCategory(ids).then((res) => {
  328. if (!res) {
  329. return new Promise((resolve) => {
  330. Modal.confirm({
  331. title: '您确定删除这项内容吗?',
  332. content: '该层级下有数据,是否全部删除?',
  333. okText: '删除',
  334. okType: 'danger',
  335. cancelText: '取消',
  336. onOk: () => {
  337. this.deleteCategory(ids, resolve)
  338. },
  339. onCancel: () => {
  340. resolve()
  341. },
  342. })
  343. })
  344. } else {
  345. this.deleteCategory(ids, null)
  346. }
  347. })
  348. },
  349. create() {
  350. if (this.parentId === 0) {
  351. message.error('请选择上级节点!')
  352. } else {
  353. if (this.isEnd !== '1') {
  354. this.$refs.dataTable.showDetailModal(null, 'ic/process/icMtxProcess')
  355. } else {
  356. message.error('末级分类下不可再新建分类')
  357. }
  358. }
  359. },
  360. deleteCategory(ids, resolve) {
  361. MtxProcessService.deleteCategory(ids)
  362. .then(() => {
  363. this.$refs.dataTable.clearSelection()
  364. this.onRecordsDeleted()
  365. this.refresh()
  366. })
  367. .finally(resolve)
  368. },
  369. refresh() {
  370. this.$refs.dataTable.refresh()
  371. },
  372. },
  373. }
  374. </script>
  375. <style module lang="scss">
  376. @use '@/common/design' as *;
  377. .wrap-height {
  378. height: 100%;
  379. .row-height {
  380. display: flex;
  381. flex: auto;
  382. height: 100%;
  383. .rightcard {
  384. flex: 1;
  385. width: calc(100% - 20%);
  386. height: 100%;
  387. }
  388. }
  389. }
  390. </style>