ic-evaluation-plan-form.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. <template>
  2. <div>
  3. <sd-webflow
  4. ref="flow"
  5. :removed-tabs="['sdRelatedDoc']"
  6. :validate-form="validForm"
  7. class="evaluationPlanForm"
  8. @actionBtnClick="actionBtnClick"
  9. @saveproject="saveproject"
  10. @afterDispatch="afterDispatch"
  11. >
  12. <template v-slot:form="{ model, fields }">
  13. <table>
  14. <tr>
  15. <td style="border: none">
  16. <audit-advanced-group
  17. :expand="planExpand"
  18. :expand-str="'planExpand'"
  19. :group-label="'基本信息'"
  20. tablestyle="''"
  21. @changedClick="changedClick"
  22. ></audit-advanced-group>
  23. </td>
  24. </tr>
  25. </table>
  26. <table v-show="planExpand">
  27. <tr v-show="initData(model)">
  28. <!-- ID -->
  29. <!-- <sd-form-item-td name="id" /> -->
  30. <!-- 随机ID -->
  31. <sd-form-item-td name="sourceId" />
  32. </tr>
  33. <tr>
  34. <!-- 计划年度 -->
  35. <sd-form-item-td name="year">
  36. <a-select v-if="sourceId === -1 ? true : false" v-model="model.year">
  37. <a-select-option v-for="year in yearArry" :key="year + ''">
  38. {{ year }}
  39. </a-select-option>
  40. </a-select>
  41. <span v-else>{{ model.year }}</span>
  42. </sd-form-item-td>
  43. <!-- 检查单位 -->
  44. <sd-form-item-td v-if="sourceId === -1 ? true : false" name="inspectUnitOpt" />
  45. <sd-form-item-td v-else name="inspectUnitOpt">
  46. <span>{{ model.inspectUnitName }}</span>
  47. </sd-form-item-td>
  48. </tr>
  49. <tr>
  50. <!-- 评价名称 -->
  51. <sd-form-item-td name="evaluationName" />
  52. <sd-form-item-td name="evaluationCode">
  53. <a-input
  54. v-model="model.evaluationCode"
  55. :disabled="true"
  56. placeholder="系统自动生成"
  57. ></a-input>
  58. </sd-form-item-td>
  59. </tr>
  60. <tr>
  61. <!-- 被评价单位 -->
  62. <sd-form-item-td name="evaluationUnitOpt">
  63. <!-- <audit-group-picker v-model="model.evaluationUnitOpt" /> -->
  64. <audit-group-picker
  65. v-model="model.evaluationUnitOpt"
  66. :root-node="{ code: 0, name: '内控机构', id: 0 }"
  67. :selectall="false"
  68. :top-node-text="'内控机构'"
  69. :treeparams="{
  70. moduleId: 'icMtxVersion',
  71. }"
  72. :single="true"
  73. />
  74. </sd-form-item-td>
  75. <!-- 评价方式 -->
  76. <sd-form-item-td name="evaluationMode" />
  77. </tr>
  78. <tr>
  79. <!-- 评价类型 -->
  80. <sd-form-item-td
  81. name="evaluationType"
  82. component="a-checkbox-group"
  83. :input-props="{ disabled: sourceId !== -1 }"
  84. />
  85. </tr>
  86. <tr class="evaluationPlanFormtr">
  87. <!-- 评价区间 -->
  88. <sd-form-item-td
  89. label="评价区间"
  90. :name="['evaluationStartTime', 'evaluationEndTime']"
  91. :input-props="{ disabled: sourceId !== -1 }"
  92. />
  93. <!-- 评价周期 -->
  94. <sd-form-item-td
  95. label="评价实施周期"
  96. :name="['evaluationImplementationStart', 'evaluationImplementationEnd']"
  97. />
  98. </tr>
  99. <tr>
  100. <!-- 内容描述 -->
  101. <sd-form-item-td name="evaluationDesc" :colspan="3">
  102. <a-textarea v-model="model.evaluationDesc" :rows="3" />
  103. </sd-form-item-td>
  104. </tr>
  105. <tr>
  106. <!-- 附件 -->
  107. <sd-form-item-td name="attachment" :colspan="3" />
  108. </tr>
  109. <tr>
  110. <!-- 创建人 -->
  111. <sd-form-item-td name="creatorName" />
  112. <!-- 创建日期 -->
  113. <sd-form-item-td name="creationTime" />
  114. </tr>
  115. </table>
  116. <table>
  117. <tr
  118. ><td :colspan="4">
  119. <sd-form-item name="icEvaluationPlanUnitList" :label="null">
  120. <template v-slot:read-and-edit="{ editable }">
  121. <audit-advanced-group
  122. :expand="FpdwExpand"
  123. :expand-str="'FpdwExpand'"
  124. :group-label="'分派单位'"
  125. @changedClick="changedClick"
  126. >
  127. <template>
  128. <template>
  129. <div :class="$style.wrapper">
  130. <div v-show="FpdwExpand && editable" :class="$style.btnselect">
  131. <a-button type="link" :class="$style.batchselect" @click="depSelect">
  132. <a-icon type="check-circle" :theme="'filled'" />选择
  133. </a-button>
  134. </div>
  135. </div>
  136. </template>
  137. <xm-child-table
  138. ref="tabaData"
  139. v-model="model.icEvaluationPlanUnitList"
  140. :class="$style.deptPlanChild"
  141. :label="null"
  142. :read-only="!editable"
  143. :addbuttonvisiable="false"
  144. :fields="
  145. [
  146. {
  147. caption: '序号',
  148. name: 'sortNum',
  149. dataType: 'number',
  150. },
  151. ].concat(Array.from(fields.icEvaluationPlanUnitList.attr.dync))
  152. "
  153. :columns="columns"
  154. :flagpage="true"
  155. >
  156. <template v-slot:contactsOpt="{ field, text, index, value }">
  157. <sd-user-picker
  158. v-model="value[index].contactsOpt1"
  159. :single="true"
  160. :read-only="!editable"
  161. />
  162. </template>
  163. <template v-slot:unitOpt="{ field, text, index, value }">
  164. <audit-group-picker
  165. v-model="value[index].unitOpt1"
  166. :root-node="{ code: 0, name: '内控机构', id: 0 }"
  167. :selectall="false"
  168. :top-node-text="'内控机构'"
  169. :treeparams="{
  170. moduleId: 'icEvaluationPlan',
  171. }"
  172. :single="true"
  173. :read-only="!editable"
  174. />
  175. </template>
  176. </xm-child-table>
  177. </template>
  178. </audit-advanced-group>
  179. </template>
  180. </sd-form-item>
  181. </td>
  182. </tr>
  183. </table>
  184. <!-- 选择人员组件 -->
  185. <div v-show="false">
  186. <audit-group-picker
  187. ref="depSelect"
  188. v-model="unitOpt"
  189. :single="false"
  190. :read-only="false"
  191. :root-node="{ code: 0, name: '内控机构', id: 0 }"
  192. :selectall="false"
  193. :top-node-text="'内控机构'"
  194. :treeparams="{
  195. moduleId: 'icMtxVersion',
  196. }"
  197. @change="depChange"
  198. />
  199. </div>
  200. </template>
  201. </sd-webflow>
  202. </div>
  203. </template>
  204. <script>
  205. import { Modal } from 'ant-design-vue'
  206. import axios from '@/common/services/axios-instance'
  207. import { getUserInfo } from '@/common/store-mixin'
  208. import auditGroupPicker from '@product/iam/components/picker/audit-group-picker.vue'
  209. import auditAdvancedGroup from '../../components/audit-advanced-group.vue'
  210. import auditAdvancedGroupMixins from '../../components/audit-advanced-group-mixins'
  211. import components from './_import-components/ic-evaluation-plan-form-import'
  212. // 修改主子表的首行title名
  213. export default {
  214. name: 'IcEvaluationPlanForm',
  215. metaInfo: {
  216. title: '审计计划信息',
  217. },
  218. components: {
  219. ...components,
  220. auditAdvancedGroup,
  221. auditGroupPicker,
  222. },
  223. mixins: [auditAdvancedGroupMixins],
  224. data() {
  225. return {
  226. rootNode: {},
  227. childTableKey: 0, // 刷新子表组件
  228. inited: true,
  229. planExpand: true,
  230. FpdwExpand: true,
  231. expand: true,
  232. planId: null,
  233. columns: [
  234. {
  235. title: '序号',
  236. dataIndex: 'sortNum',
  237. width: '50px',
  238. customRender: (text, record, index) => `${index + 1}`,
  239. },
  240. {
  241. dataIndex: 'unitName',
  242. title: '单位名称',
  243. width: '120px',
  244. sdHidden: true,
  245. },
  246. { dataIndex: 'unitOpt' },
  247. {
  248. title: '联系人',
  249. dataIndex: 'contactsName',
  250. sdHidden: true,
  251. },
  252. { dataIndex: 'contactsOpt', title: '联系人' },
  253. ],
  254. yearArry: [],
  255. expressions: [],
  256. externalUnitIds: [],
  257. isSave: true, // 是否有保存操作
  258. icEvaluationPlanUnitList: [],
  259. sourceId: -1,
  260. unitOpt: [],
  261. }
  262. },
  263. computed: {
  264. // 计算随机key
  265. randomId() {
  266. let randomNum = Math.random()
  267. while (randomNum === 0) {
  268. randomNum = Math.random()
  269. }
  270. const time = new Date().getTime()
  271. return time + Math.ceil(randomNum * 1000000000)
  272. },
  273. },
  274. mounted() {
  275. // 日期下拉框初始化
  276. this.initDateSelect()
  277. let userInfo = getUserInfo()
  278. const params = {
  279. orgId: userInfo.deptId,
  280. moduleId: 'icMtxVersion',
  281. }
  282. axios({
  283. url: 'api/xcoa-mobile/v1/iamorg/getCurrentUserGroup',
  284. method: 'get',
  285. }).then((res) => {
  286. userInfo = res.data
  287. params.orgId = res.data.id
  288. axios({
  289. url: 'api/xcoa-mobile/v1/iamorg/findIamOrgId',
  290. method: 'post',
  291. params,
  292. }).then((res) => {
  293. // this.id = res.data
  294. const deptCode = userInfo.id.toString()
  295. const deptName = userInfo.name
  296. this.rootNode = { code: deptCode, name: deptName, id: res.data }
  297. })
  298. })
  299. },
  300. methods: {
  301. childchange() {
  302. return new Promise((resolve, reject) => {
  303. var List = this.$refs.flow.getFieldValue('icEvaluationPlanUnitList')
  304. if (List !== undefined) {
  305. List.forEach((l) => {
  306. if (l.unitOpt1 !== undefined && l.unitOpt1.length > 0) {
  307. l.unitOpt1[0].type = 'Group'
  308. l.unitId = l.unitOpt1[0].code
  309. l.unitName = l.unitOpt1[0].name
  310. }
  311. l.unitOpt = JSON.stringify(l.unitOpt1)
  312. l.contactsOpt = JSON.stringify(l.contactsOpt1)
  313. if (l.contactsOpt1 !== undefined && l.contactsOpt1.length > 0) {
  314. l.contactsAccount = l.contactsOpt1[0].code
  315. l.contactsName = l.contactsOpt1[0].name
  316. }
  317. })
  318. this.$refs.flow.setFieldValue('icEvaluationPlanUnitList', List)
  319. }
  320. var opt = this.$refs.flow.getFieldValue('evaluationUnitOpt')
  321. if (opt !== undefined && opt.length > 0) {
  322. opt[0].type = 'Group'
  323. if (opt[0].props?.ORG_ID) {
  324. opt[0].code = opt[0].props.ORG_ID
  325. }
  326. this.$refs.flow.setFieldValue('evaluationUnitOpt', opt)
  327. }
  328. resolve(true)
  329. return true
  330. })
  331. },
  332. openchild() {
  333. var List = this.$refs.flow.getFieldValue('icEvaluationPlanUnitList')
  334. if (List !== undefined) {
  335. List.forEach((l) => {
  336. l.unitOpt1 = JSON.parse(l.unitOpt)
  337. l.contactsOpt1 = JSON.parse(l.contactsOpt)
  338. })
  339. }
  340. this.$refs.flow.setFieldValue('icEvaluationPlanUnitList', List)
  341. },
  342. depChange(val) {
  343. let List = this.$refs.flow.getFieldValue('icEvaluationPlanUnitList')
  344. const nList = []
  345. val.forEach((l, index) => {
  346. let flag = true
  347. if (List !== undefined && List.length > 0) {
  348. if (List.findIndex((i) => i.unitId === l.props.ORG_ID.toString()) > -1) {
  349. flag = false
  350. }
  351. }
  352. if (flag) {
  353. l.type = 'Group'
  354. if (l.props.ORG_ID) {
  355. l.code = l.props.ORG_ID.toString()
  356. }
  357. nList.push({
  358. id: null,
  359. unitName: l.name,
  360. unitId: l.code,
  361. unitOpt: JSON.stringify([l]),
  362. unitOpt1: [l],
  363. contactsOpt1: [],
  364. })
  365. }
  366. if (index === val.length - 1) {
  367. if (List === undefined) {
  368. List = []
  369. }
  370. List = List.concat(nList)
  371. this.$refs.flow.setFieldValue('icEvaluationPlanUnitList', List)
  372. }
  373. })
  374. // })
  375. },
  376. depSelect() {
  377. this.$refs.depSelect.openPicker()
  378. },
  379. // 保存操作,记录标识位
  380. saveproject(formdata) {
  381. this.isSave = true
  382. const selectedKeys = formdata.processFormData.processFormPropertyValues
  383. selectedKeys.forEach((item) => {
  384. if (item.name === 'evaluationCode') {
  385. this.$refs.flow.setFieldValue('evaluationCode', item.value)
  386. }
  387. })
  388. },
  389. /**
  390. * 提交后事件
  391. */
  392. afterDispatch() {
  393. // 提交也认为是保存
  394. // this.isSave = true
  395. },
  396. initData(model) {
  397. if (this.isSave) {
  398. if (this.$refs.flow) {
  399. if (this.$route.params?.id && this.$route.params?.id !== '0') {
  400. this.openchild()
  401. this.sourceId = this.$refs.flow?.getFieldValue('sourceId')
  402. } else {
  403. this.$refs.flow?.setFieldValue('sourceId', -1)
  404. const userInfo = getUserInfo()
  405. const unit = [
  406. {
  407. code: userInfo.deptId.toString(),
  408. id: userInfo.deptId,
  409. name: userInfo.deptName.indexOf('/')
  410. ? userInfo.deptName.split('/').pop()
  411. : userInfo.deptName,
  412. props: { code: userInfo.deptId.toString() },
  413. type: 'GROUP',
  414. },
  415. ]
  416. this.$refs.flow?.setFieldValue('inspectUnitOpt', unit)
  417. const nowYear = new Date().getFullYear()
  418. this.$refs.flow?.setFieldValue('year', nowYear + '')
  419. }
  420. if (this.$refs.flow?.getFieldValue('evaluationUnitOpt') === undefined) {
  421. this.$refs.flow.setFieldValue('evaluationUnitOpt', [])
  422. }
  423. this.isSave = false
  424. }
  425. }
  426. return false
  427. },
  428. // 日期下拉框初始化
  429. initDateSelect() {
  430. const nowYear = new Date().getFullYear()
  431. this.yearArry.push(nowYear)
  432. for (let i = 1; i < 6; i++) {
  433. this.yearArry.push(nowYear - i)
  434. }
  435. for (let i = 1; i < 11; i++) {
  436. this.yearArry.push(nowYear + i)
  437. }
  438. this.yearArry.sort()
  439. if (this.$refs.flow.getFieldValue('planYear') === undefined) {
  440. this.$refs.flow.setFieldValue('planYear', nowYear + '')
  441. }
  442. },
  443. validForm() {
  444. const child = this.$refs.flow.getFieldValue('icEvaluationPlanUnitList')
  445. if (child !== undefined && child.length !== 0) {
  446. let flag = true
  447. child.forEach((c) => {
  448. if (
  449. c.contactsOpt === '' ||
  450. c.contactsOpt === '[]' ||
  451. c.contactsOpt === null ||
  452. c.contactsOpt === undefined
  453. ) {
  454. flag = false
  455. }
  456. if (
  457. c.unitOpt === '' ||
  458. c.unitOpt === '[]' ||
  459. c.unitOpt === null ||
  460. c.unitOpt === undefined
  461. ) {
  462. flag = false
  463. }
  464. })
  465. if (flag) {
  466. return Promise.resolve(true)
  467. } else {
  468. Modal.warning({
  469. title: '提示',
  470. content: '请完善分派单位中的单位和人员信息!',
  471. })
  472. this.flag = false
  473. return Promise.resolve(false)
  474. }
  475. } else {
  476. return Promise.resolve(true)
  477. }
  478. },
  479. actionBtnClick(evt, btn) {
  480. this.childchange()
  481. if (btn.button.buttonId.indexOf('save') > -1) {
  482. evt.waitUntil(
  483. new Promise((resolve, reject) => {
  484. if (
  485. this.$refs.flow.getFieldValue('inspectUnitOpt') === undefined ||
  486. this.$refs.flow.getFieldValue('year') === undefined ||
  487. this.$refs.flow.getFieldValue('evaluationName') === undefined
  488. ) {
  489. this.$refs.flow.validateField('inspectUnitOpt').then((res) => {
  490. console.log(res)
  491. })
  492. this.$refs.flow.validateField('year').then((res) => {
  493. console.log(res)
  494. })
  495. this.$refs.flow.validateField('evaluationName').then((res) => {
  496. console.log(res)
  497. })
  498. evt.preventDefault()
  499. resolve()
  500. } else {
  501. resolve()
  502. }
  503. })
  504. )
  505. }
  506. },
  507. },
  508. }
  509. </script>
  510. <style module lang="scss">
  511. @use '@/common/design' as *;
  512. .btnselect {
  513. position: relative;
  514. top: 4px;
  515. float: right;
  516. .batchselect {
  517. z-index: 100;
  518. margin-right: 80px;
  519. }
  520. }
  521. :global(.evaluationPlanFormtr) {
  522. :global(.ant-input) {
  523. width: 150px;
  524. }
  525. }
  526. </style>