audit-project-start-form.vue 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136
  1. <template>
  2. <sd-detail-form
  3. ref="form"
  4. v-sd-watermark="waterMark"
  5. page-id="audit/project/iamAuditProject"
  6. form-id="iamAuditProject"
  7. :record-id="this.$route.query.record ? parseInt(this.$route.query.record) : null"
  8. :class="[$style.form, $style.projectstartform]"
  9. @close="close(true)"
  10. @saved="saved"
  11. @sdFormReady="
  12. () => {
  13. this.initData()
  14. }
  15. "
  16. >
  17. <template v-slot="{ model, fields }">
  18. <table>
  19. <tr>
  20. <td
  21. colspan="4"
  22. style="
  23. height: 60px;
  24. padding-right: 5px;
  25. padding-left: 5px;
  26. line-height: 60px;
  27. border: none;
  28. "
  29. >
  30. <a-steps direction="horizontal" :current="progressJd" size="small">
  31. <a-step>
  32. <template slot="title">
  33. <span>完善项目信息</span>
  34. </template>
  35. </a-step>
  36. <a-step>
  37. <template slot="title">
  38. <span>指定项目成员</span>
  39. </template>
  40. </a-step>
  41. <a-step>
  42. <template slot="title">
  43. <span>启动成功</span>
  44. </template>
  45. </a-step>
  46. </a-steps>
  47. </td>
  48. </tr>
  49. </table>
  50. <table v-show="projectStep === '1'">
  51. <tr>
  52. <td style="padding-left: 5px; border: none">
  53. <audit-advanced-group
  54. :expand="projectinfoExpand"
  55. :expand-str="'projectinfoExpand'"
  56. :group-label="'项目信息'"
  57. tablestyle="''"
  58. @changedClick="changedClick"
  59. ></audit-advanced-group>
  60. </td>
  61. </tr>
  62. </table>
  63. <table v-show="projectinfoExpand && projectStep === '1'">
  64. <tr>
  65. <sd-form-item-td name="projectTitle" />
  66. <sd-form-item-td name="auditType">
  67. <span>{{ fields.auditType.attr.displayValue }}</span>
  68. </sd-form-item-td>
  69. </tr>
  70. <tr class="projectstartform">
  71. <sd-form-item-td name="projectPrincipalId">
  72. <sd-user-picker
  73. v-model="dataobj.projectPrincipalId"
  74. :single="true"
  75. @change="(evt) => handleChange(model, evt, 'projectPrincipalId', 1)"
  76. />
  77. </sd-form-item-td>
  78. <sd-form-item-td name="projectCode">
  79. <span>{{ model.projectCode }}</span>
  80. </sd-form-item-td>
  81. </tr>
  82. <tr>
  83. <sd-form-item-td name="auditedUnitIds" :colspan="3">
  84. <sd-group-picker
  85. v-model="dataobj.auditedUnitIds"
  86. @change="(evt) => handleChange(model, evt, 'auditedUnitIds', 3)"
  87. />
  88. </sd-form-item-td>
  89. <!-- <sd-form-item-td name="auditBasis" /> -->
  90. </tr>
  91. <tr>
  92. <sd-form-item-td name="auditMode" />
  93. <sd-form-item-td
  94. v-if="model.auditType === '03' || model.auditType === '04'"
  95. name="auditedUser"
  96. ></sd-form-item-td>
  97. </tr>
  98. <tr>
  99. <sd-form-item-td v-if="model.auditMode === '02'" name="externalUnitIds" :colspan="3">
  100. <AuditGroupPicker
  101. v-model="model.externalUnitIds"
  102. :read-only="false"
  103. :selectclick="showselectexternal"
  104. />
  105. </sd-form-item-td>
  106. </tr>
  107. <tr>
  108. <sd-form-item-td name="projectContent" :colspan="3">
  109. <a-textarea v-model="model.projectContent" :rows="3" />
  110. </sd-form-item-td>
  111. </tr>
  112. <tr>
  113. <sd-form-item-td name="whetherFinance" hidden="true" />
  114. <sd-form-item-td name="whetherOverseas" hidden="true" />
  115. </tr>
  116. <tr class="bklabeloverflow">
  117. <sd-form-item-td name="whetherAuditCoverage" />
  118. </tr>
  119. <tr>
  120. <sd-form-item-td name="planStartTime" @change="timeChange" />
  121. <sd-form-item-td name="planEndTime" @change="timeChange" />
  122. </tr>
  123. <tr>
  124. <sd-form-item-td name="planDays"></sd-form-item-td>
  125. </tr>
  126. <tr>
  127. <sd-form-item-td name="groupLeaderId" :colspan="3">
  128. <sd-user-picker
  129. v-model="dataobj.groupLeaderId"
  130. read-only
  131. :single="true"
  132. @change="(evt) => handleChange(model, evt, 'groupLeaderId', 2)"
  133. />
  134. </sd-form-item-td>
  135. <!-- <sd-form-item-td name="projectSource" component="a-select"></sd-form-item-td> -->
  136. </tr>
  137. <tr>
  138. <sd-form-item-td name="exPersonnelNum" hidden="true">
  139. <a-input-number v-model="model.exPersonnelNum" style="width: 100%"></a-input-number>
  140. </sd-form-item-td>
  141. <sd-form-item-td name="predictedCost" hidden="true">
  142. <a-input-number
  143. v-model="model.predictedCost"
  144. :min="0"
  145. :precision="2"
  146. style="width: 100%"
  147. ></a-input-number>
  148. </sd-form-item-td>
  149. </tr>
  150. <tr>
  151. <sd-form-item-td name="auditProcess">
  152. <sd-select v-model="model.auditProcess" :options="auditProcessOptions" />
  153. </sd-form-item-td>
  154. <sd-form-item-td name="linkmanIds" :label="'被审计单位联系人'">
  155. <sd-user-picker
  156. v-model="dataobj.linkmanIds"
  157. @change="(evt) => handleChange(model, evt, 'linkmanIds', 4)"
  158. />
  159. </sd-form-item-td>
  160. </tr>
  161. <tr class="bklabeloverflow">
  162. <sd-form-item-td
  163. :name="['auditperiodStart', 'auditperiodEnd']"
  164. :input-props="[{ placeholder: '开始' }, { placeholder: '结束' }]"
  165. :label="'审计期间'"
  166. />
  167. <sd-form-item-td name="auditAssets">
  168. <a-input-number
  169. v-model="model.auditAssets"
  170. :min="0"
  171. :precision="2"
  172. style="width: 100%"
  173. ></a-input-number>
  174. </sd-form-item-td>
  175. </tr>
  176. <!-- <tr>
  177. <sd-form-item-td name="overseas" />
  178. </tr> -->
  179. <tr>
  180. <sd-form-item-td name="auditDomains" hidden="true">
  181. <a-checkbox-group v-model="model.auditDomains">
  182. <a-checkbox
  183. v-for="(item, index) in fields.auditDomains.attr.selectListItem"
  184. :key="index"
  185. :value="item.value"
  186. >
  187. {{ item.label }}
  188. </a-checkbox>
  189. </a-checkbox-group>
  190. </sd-form-item-td>
  191. <sd-form-item-td name="readAuthorityIds" :label="'项目阅读权限范围'" />
  192. </tr>
  193. <tr>
  194. <sd-form-item-td name="attachment" :colspan="3">
  195. <template v-slot:read-and-edit="{ editable }">
  196. <sd-attachment
  197. :group-id="JSON.parse(fields.attachment.value).value"
  198. :read-only="!editable"
  199. ></sd-attachment>
  200. </template>
  201. </sd-form-item-td>
  202. </tr>
  203. <tr>
  204. <sd-form-item-td v-if="initParam(model)" name="projectRemarks" :colspan="3">
  205. <a-textarea v-model="model.projectRemarks" :rows="3" />
  206. </sd-form-item-td>
  207. </tr>
  208. </table>
  209. <table v-show="projectStep === '2'">
  210. <tr>
  211. <td style="padding-left: 5px; border: none">
  212. <audit-advanced-group
  213. :expand="projectmemberExpand"
  214. :expand-str="'projectmemberExpand'"
  215. :group-label="'项目成员'"
  216. tablestyle="''"
  217. @changedClick="changedClick"
  218. >
  219. </audit-advanced-group>
  220. </td>
  221. </tr>
  222. </table>
  223. <table v-show="projectmemberExpand && projectStep === '2'">
  224. <tr>
  225. <td :colspan="4" :class="$style.childTableTd">
  226. <a-spin :spinning="selectUserFlag">
  227. <sd-form-item name="iamProjectUserList" :label="null">
  228. <template v-slot:read-and-edit="{ editable }">
  229. <!-- 添加按钮,打开选人组件 -->
  230. <a-button type="link" :class="$style.addBtn" @click="openProjectUserSelect">
  231. <a-icon type="plus-circle" :theme="'filled'" />
  232. 添加
  233. </a-button>
  234. <xm-child-table
  235. v-show="projectmemberExpand"
  236. ref="tabaData"
  237. v-model="iamProjectUserList1"
  238. :addbuttonvisiable="false"
  239. :show-selection="showSelection"
  240. :class="$style.deptPlanChild"
  241. label=""
  242. :read-only="!editable"
  243. :fields="Array.from(fields.iamProjectUserList.attr.dync)"
  244. :columns="columns"
  245. :datachange="dataonload(model)"
  246. :dzcl="true"
  247. :fncheckdelete="fncheckdelete"
  248. :addfun="addfun"
  249. @change="fnchange"
  250. >
  251. <template v-slot:userId="{ field, text, index, value }">
  252. <span
  253. v-if="
  254. value[index]['userType'] === '04' || value[index]['userType'] === '05'
  255. "
  256. >{{ getDisplayVaule(field, text) }}</span
  257. >
  258. <sd-form-item
  259. v-else
  260. :name="field.name"
  261. :label="null"
  262. :input-props="{
  263. defaultValue:
  264. value[index][field.name] !== undefined
  265. ? JSON.parse(value[index][field.name])
  266. : '',
  267. }"
  268. @change="changep(index, field, value[index])"
  269. >
  270. </sd-form-item>
  271. </template>
  272. <template v-slot:joinStartTime="{ field, text, index, value }">
  273. <audit-project-input
  274. :ref="'sDate_' + index"
  275. :value="iamProjectUserList1[index].joinStartTime"
  276. lx="s"
  277. :field="field"
  278. :index="index"
  279. @change="setchange"
  280. />
  281. </template>
  282. <template v-slot:joinEndTime="{ field, text, index, value }">
  283. <audit-project-input
  284. :ref="'eDate_' + index"
  285. :value="iamProjectUserList1[index].joinEndTime"
  286. lx="t"
  287. :field="field"
  288. :index="index"
  289. @change="setchange"
  290. />
  291. </template>
  292. </xm-child-table>
  293. </template>
  294. </sd-form-item>
  295. </a-spin>
  296. </td>
  297. </tr>
  298. </table>
  299. <table v-show="projectStep === '3'" style="margin-top: 40px">
  300. <tr>
  301. <td style="height: 150px; padding-left: 5px; text-align: center; border: none">
  302. <sd-icon type="check-circle" :theme="'fill'" :class="$style.iconclass" />
  303. <div style="margin-top: 10px">启动成功</div>
  304. </td>
  305. </tr>
  306. </table>
  307. <table>
  308. <tr>
  309. <td style="margin-top: 20px; text-align: center; border: none">
  310. <span style="padding: 0 5px">
  311. <a-button
  312. v-if="projectStep === '1'"
  313. :loading="isSubmitting"
  314. type="primary"
  315. @click="fnstep('2')"
  316. >下一步</a-button
  317. >
  318. <a-button v-if="projectStep === '2'" :loading="isSubmitting1" @click="fnstep('1')"
  319. >上一步</a-button
  320. >
  321. </span>
  322. <span v-if="projectStep === '2'" style="padding: 0 5px">
  323. <a-button type="primary" :loading="isconfrimSubmitting" @click="fnconfirm"
  324. >确定</a-button
  325. >
  326. </span>
  327. <span v-if="projectStep !== '3'" style="padding: 0 5px">
  328. <a-button @click="close(true)">取消</a-button>
  329. </span>
  330. <span v-else style="padding: 0 5px">
  331. <a-button @click="close(true)">关闭</a-button>
  332. </span>
  333. </td>
  334. </tr>
  335. </table>
  336. <!-- 选择人员组件 -->
  337. <div v-show="false">
  338. <sd-user-picker
  339. ref="projectUserSelect"
  340. :single="false"
  341. :read-only="false"
  342. :required="true"
  343. @change="projectUserChange"
  344. />
  345. </div>
  346. <a-modal
  347. :visible="modalvisible"
  348. title="请选择"
  349. width="1200px"
  350. :body-style="{
  351. padding: 20,
  352. minHeight: '700px',
  353. }"
  354. :destroy-on-close="true"
  355. @ok="handleOk"
  356. @cancel="handleCancel"
  357. >
  358. <sd-data-table-ex
  359. ref="externalTable"
  360. check-type="checkbox"
  361. :filter-expressions="expressions"
  362. :columns="modalcolumns"
  363. form-id="iamExternalBase"
  364. page-id="audit/auditsource/extrnal/iamExternalBase"
  365. :search-fields="['name', 'code', 'address']"
  366. show-selection
  367. >
  368. </sd-data-table-ex>
  369. </a-modal>
  370. </template>
  371. </sd-detail-form>
  372. </template>
  373. <script>
  374. import moment from 'moment'
  375. import crossWindowWatcher from '@/common/services/cross-window-watcher'
  376. import { getComponentSpec } from '@/common/components/sd-form'
  377. import { Message, Modal, Select } from 'ant-design-vue'
  378. import systemManage from '@/system-manage/system-manage'
  379. import TableColumnTypes from '@/common/services/table-column-types'
  380. import debounce from 'lodash.debounce'
  381. import axios from '@/common/services/axios-instance'
  382. import logUtil from '@/common/services/log-util'
  383. import AuditGroupPicker from '../../components/picker/audit-group-picker.vue'
  384. import auditAdvancedGroup from '../../components/audit-advanced-group.vue'
  385. import auditAdvancedGroupMixins from '../../components/audit-advanced-group-mixins'
  386. import xmChildTableMixins from '../../components/xm-child-table-mixins'
  387. import auditProjectInput from './audit-project-input.vue'
  388. import components from './_import-components/audit-project-start-form-import'
  389. export default {
  390. name: 'AuditProjectStartForm',
  391. metaInfo: {
  392. title: '启动项目',
  393. },
  394. components: {
  395. ...components,
  396. auditAdvancedGroup,
  397. AuditGroupPicker,
  398. auditProjectInput,
  399. },
  400. mixins: [auditAdvancedGroupMixins, xmChildTableMixins],
  401. data() {
  402. return {
  403. selectUserFlag: false, // 选人之后的加载状态
  404. waterMark: systemManage.getFormWaterMark(),
  405. progressData: [{ title: '完善项目信息' }, { title: '指定项目组成员' }],
  406. progressJd: 0,
  407. progre: 50,
  408. projectinfoExpand: true,
  409. projectmemberExpand: true,
  410. projectStep: '1',
  411. auditDomainsOptions: [],
  412. columns: [
  413. {
  414. title: '序号',
  415. dataIndex: 'sortNum',
  416. width: '80px',
  417. customRender: (text, record, index) => `${index + 1}`,
  418. },
  419. {
  420. title: '姓名',
  421. dataIndex: 'userId',
  422. width: '150px',
  423. },
  424. {
  425. title: '姓名',
  426. dataIndex: 'userName',
  427. sdHidden: true,
  428. },
  429. {
  430. dataIndex: 'userAccount',
  431. sdHidden: true,
  432. },
  433. {
  434. title: '项目角色',
  435. dataIndex: 'userType',
  436. width: '150px',
  437. },
  438. // {
  439. // title: '人员类型',
  440. // dataIndex: 'userJob',
  441. // width: '150px',
  442. // },
  443. // {
  444. // title: '所属机构名称',
  445. // dataIndex: 'orgName',
  446. // width: '150px',
  447. // },
  448. {
  449. title: '参与开始日期',
  450. dataIndex: 'joinStartTime',
  451. sdRender: TableColumnTypes.date,
  452. width: '150px',
  453. },
  454. {
  455. title: '参与结束日期',
  456. dataIndex: 'joinEndTime',
  457. sdRender: TableColumnTypes.date,
  458. width: '150px',
  459. },
  460. {
  461. title: '任务说明',
  462. dataIndex: 'taskExplain',
  463. width: 'auto',
  464. },
  465. {
  466. title: '手机号码',
  467. dataIndex: 'phoneNumber',
  468. width: '13%',
  469. },
  470. {
  471. title: '邮箱',
  472. dataIndex: 'email',
  473. width: '18%',
  474. },
  475. {
  476. dataIndex: 'userScore',
  477. sdHidden: true,
  478. },
  479. {
  480. dataIndex: 'examineResult',
  481. sdHidden: true,
  482. },
  483. ],
  484. dataobjflag: false,
  485. flag: true,
  486. dataobj: {
  487. projectPrincipalId: [],
  488. groupLeaderId: [],
  489. auditedUnitIds: [],
  490. linkmanIds: [],
  491. },
  492. auditProcessOptions: [],
  493. iamProjectUserList1: [],
  494. iamProjectUserListflag: false,
  495. visible: false,
  496. isSubmitting: false,
  497. isSubmitting1: false,
  498. isconfrimSubmitting: false,
  499. modalvisible: false,
  500. modalcolumns: [
  501. {
  502. title: '序号',
  503. dataIndex: 'sortNumber',
  504. width: '20px',
  505. customRender: (text, record, index) => `${index + 1}`,
  506. },
  507. {
  508. dataIndex: 'id',
  509. sdHidden: true,
  510. },
  511. {
  512. title: '企业名称',
  513. dataIndex: 'name',
  514. width: '300px',
  515. },
  516. {
  517. title: '类型',
  518. dataIndex: 'category',
  519. width: '150px',
  520. },
  521. {
  522. title: '住所',
  523. dataIndex: 'address',
  524. width: '100px',
  525. },
  526. ],
  527. expressions: [],
  528. externalUnitIds: [],
  529. index: 0,
  530. }
  531. },
  532. mounted() {
  533. // 初始化数据字典信息
  534. this.initDictionaryInfo()
  535. var _this = this
  536. logUtil.$on('modifyLogCustomData', function (modifyLogData) {
  537. _this.modifyLogCustomData(modifyLogData)
  538. })
  539. },
  540. methods: {
  541. timeChange() {
  542. const start = this.$refs.form.getFieldValue('planStartTime')
  543. const end = this.$refs.form.getFieldValue('planEndTime')
  544. this.iamProjectUserList1.forEach((item, index) => {
  545. item.joinStartTime = moment(start).valueOf()
  546. item.joinEndTime = moment(end).valueOf()
  547. this.$refs['sDate_' + index].model = moment(start)
  548. this.$refs['eDate_' + index].model = moment(end)
  549. })
  550. if (start !== undefined && end !== undefined) {
  551. const planDays =
  552. (new Date(moment(end).format('YYYY/MM/DD')).getTime() -
  553. new Date(moment(start).format('YYYY/MM/DD')).getTime()) /
  554. 1000 /
  555. 60 /
  556. 60 /
  557. 24
  558. this.$refs.form.setFieldValue('planDays', planDays + 1)
  559. } else {
  560. this.$refs.form.setFieldValue('planDays', undefined)
  561. }
  562. this.$nextTick()
  563. },
  564. showSelection(record) {
  565. if ((record.userType === '04') | (record.userType === '05')) {
  566. return false
  567. }
  568. return true
  569. },
  570. setchange(value, field, index, lx) {
  571. this.$refs.tabaData.$refs[field.name + '_' + index][0].setFieldValue(field.name, value)
  572. this.iamProjectUserList1[index][field.name] = value
  573. if (lx === 's') {
  574. // 设置 开始时间
  575. this.$refs['eDate_' + index].time = value
  576. } else {
  577. this.$refs['sDate_' + index].time = value
  578. }
  579. },
  580. getDisplayVaule(field, text) {
  581. if (getComponentSpec(field).getDisplayValue) {
  582. if (typeof text !== 'undefined' && text !== null) {
  583. const value = getComponentSpec(field).parseBackendValue?.(text) || text
  584. return getComponentSpec(field).getDisplayValue(value)
  585. } else {
  586. return ''
  587. }
  588. }
  589. return text
  590. },
  591. changep(i, field, value) {
  592. const user = this.$refs.tabaData.$refs[field.name + '_' + i][0].getFieldValue(field.name)
  593. if (user.length > 0) {
  594. axios({
  595. url:
  596. 'api/xcoa-mobile/v1/iamuserbase/getUserBaseInfoByAccount?userAccount=' + user[0].code,
  597. method: 'get',
  598. }).then((res) => {
  599. if (res.data.userPhone === null) {
  600. value.phoneNumber = ''
  601. } else {
  602. value.phoneNumber = res.data.userPhone
  603. }
  604. if (res.data.userMail === null) {
  605. value.email = ''
  606. } else {
  607. value.email = res.data.userMail
  608. }
  609. value.userId = JSON.stringify(user)
  610. this.$refs.tabaData.$refs['phoneNumber_' + i][0].setFieldValue(
  611. 'phoneNumber',
  612. value.phoneNumber
  613. )
  614. this.$refs.tabaData.$refs['email_' + i][0].setFieldValue('email', value.email)
  615. })
  616. }
  617. },
  618. modifyLogCustomData(modifyLogData) {
  619. // 修改modifyLogData中的元素
  620. let childTableIndex
  621. modifyLogData.forEach((item, index) => {
  622. if (item.key === 'iamProjectUserList') {
  623. childTableIndex = index
  624. }
  625. })
  626. // 去掉子表的修改记录
  627. modifyLogData.splice(childTableIndex, 1)
  628. return modifyLogData
  629. },
  630. initDictionaryInfo() {
  631. // 获取审计流程下拉框信息
  632. const projectId = this.$route.query.record
  633. axios({
  634. url: 'api/xcoa-mobile/v1/iamauditproject/getProjectProcessList?projectId=' + projectId,
  635. method: 'get',
  636. }).then((res) => {
  637. if (res.status === 200) {
  638. this.auditProcessOptions = res.data
  639. }
  640. })
  641. },
  642. handleChange(model, event, field, i) {
  643. this.$refs.form.setFieldValue(field, this.dataobj[field])
  644. this.dataobj[field] = [...event]
  645. },
  646. initParam(model) {
  647. if (this.flag) {
  648. if (!this.dataobjflag) {
  649. this.setFeildvaluexm(model)
  650. }
  651. this.initExternalUnitIdsData(model)
  652. this.flag = false
  653. }
  654. return true
  655. },
  656. setFeildvaluexm(model) {
  657. const fields = [
  658. {
  659. name: 'projectPrincipalName',
  660. code: 'projectPrincipalAccount',
  661. field: 'projectPrincipalId',
  662. type: 'User',
  663. i: 1,
  664. },
  665. {
  666. name: 'groupLeaderName',
  667. code: 'groupLeaderAccount',
  668. field: 'groupLeaderId',
  669. type: 'User',
  670. i: 2,
  671. },
  672. {
  673. name: 'auditedUnitNames',
  674. code: 'auditedUnitCodes',
  675. field: 'auditedUnitIds',
  676. type: 'Dept',
  677. i: 3,
  678. },
  679. {
  680. name: 'linkmanName',
  681. code: 'linkmanCode',
  682. field: 'linkmanIds',
  683. type: 'User',
  684. i: 4,
  685. },
  686. ]
  687. fields.forEach((item) => {
  688. if (item.name !== '') {
  689. const name = model[item.name]
  690. const code = model[item.code]
  691. const id = model[item.field]
  692. if (name !== '' && name !== undefined) {
  693. if (name.indexOf(',') > 0) {
  694. const names = name.split(',')
  695. const codes = code.split(',')
  696. const obj = []
  697. for (var i = 0; i < names.length; i++) {
  698. obj.push({ code: codes[i], name: names[i], text: names[i], type: item.type })
  699. }
  700. this.dataobj[item.field] = obj
  701. this.dataobjflag = true
  702. } else {
  703. const obj = [{ code: code, name: name, text: name, type: item.type }]
  704. this.dataobj[item.field] = obj
  705. this.dataobjflag = true
  706. }
  707. }
  708. }
  709. })
  710. },
  711. validator(rule, value, callback) {
  712. debounce(() => {
  713. axios
  714. .get(
  715. `api/xcoa-mobile/v1/businesstype-manage/categories/check-code?categoryCode=${value}&id=${
  716. this.$refs.dataTable.getDetailModal().getFieldValue('id') || ''
  717. }`
  718. )
  719. .then((res) => {
  720. if (res?.data?.status === 'success') {
  721. callback()
  722. } else {
  723. callback('已存在分类编码,不可以重复')
  724. }
  725. })
  726. }, 500)()
  727. },
  728. close(flag) {
  729. crossWindowWatcher.notifyChange(this.$route.fullPath, flag)
  730. window.close()
  731. },
  732. saved() {
  733. Message.success('保存成功', 1).then((res) => {
  734. // this.close(true)
  735. this.progressJd = 2
  736. this.projectStep = '3'
  737. this.isconfrimSubmitting = false
  738. })
  739. },
  740. // 保存
  741. saveForm() {
  742. // 需要校验定义新增行是否还有editable
  743. this.$refs.form.setFieldValue('projectPrincipalId', this.dataobj.projectPrincipalId)
  744. this.$refs.form.setFieldValue('groupLeaderId', this.dataobj.groupLeaderId)
  745. this.$refs.form.setFieldValue('auditedUnitIds', this.dataobj.auditedUnitIds)
  746. this.$refs.form.setFieldValue('linkmanIds', this.dataobj.linkmanIds)
  747. if (this.projectStep === '2') {
  748. this.$refs.form.saveBtnClick().catch((res) => {
  749. this.isconfrimSubmitting = false
  750. })
  751. } else {
  752. this.$refs.form.saveBtnClick()
  753. }
  754. },
  755. // 序号赋值
  756. changeNum(data) {
  757. data.forEach((item, index) => {
  758. item.sortNum = index + 1
  759. })
  760. },
  761. fnstep(step) {
  762. if (step === '1') {
  763. this.isSubmitting1 = true
  764. this.$refs.tabaData.valid().then((res) => {
  765. // 校验动态子表
  766. if (res) {
  767. this.progressJd = 0
  768. this.progre = 50
  769. this.projectStep = step
  770. }
  771. this.isSubmitting1 = false
  772. })
  773. // .catch(() => {
  774. // this.isSubmitting1 = false
  775. // })
  776. } else {
  777. this.isSubmitting = true
  778. // 将高级字段赋值
  779. this.$refs.form.setFieldValue('projectPrincipalId', this.dataobj.projectPrincipalId)
  780. this.$refs.form.setFieldValue('groupLeaderId', this.dataobj.groupLeaderId)
  781. this.$refs.form.setFieldValue('auditedUnitIds', this.dataobj.auditedUnitIds)
  782. this.$refs.form.setFieldValue('linkmanIds', this.dataobj.linkmanIds)
  783. // 校验当前页面必填是否
  784. this.$refs.form
  785. .validateFields()
  786. .then((res) => {
  787. if (res) {
  788. this.progressJd = 1
  789. this.progre = 99
  790. this.projectStep = step
  791. this.isSubmitting = false
  792. setTimeout(() => {
  793. this.$refs.tabaData.fnsettablesize()
  794. }, 1000)
  795. }
  796. })
  797. .catch(() => {
  798. this.isSubmitting = false
  799. })
  800. }
  801. },
  802. addfun(data) {
  803. const sl = new Date(this.$refs.form.getFieldValue('planStartTime')).getTime()
  804. const el = new Date(this.$refs.form.getFieldValue('planEndTime')).getTime()
  805. data.joinStartTime = sl
  806. data.joinEndTime = el
  807. return data
  808. },
  809. dataonload(model) {
  810. // console.log(model, '数据--model')
  811. const projectPrincipalId = 'projectPrincipalId'
  812. const groupLeaderId = 'groupLeaderId'
  813. const fzr = this.dataobj[projectPrincipalId]
  814. const xmjl = this.dataobj[groupLeaderId]
  815. const sl = new Date(model.planStartTime).getTime()
  816. const el = new Date(model.planEndTime).getTime()
  817. let data = []
  818. // const data = this.$refs.form.getFieldValue('iamProjectUserList')
  819. if (this.iamProjectUserListflag) {
  820. data = this.iamProjectUserList1
  821. } else {
  822. data = model.iamProjectUserList
  823. this.iamProjectUserListflag = true
  824. }
  825. // 04 项目负责人 05 项目组长
  826. if (data === undefined) {
  827. const ndata = []
  828. if (fzr.length !== 0) {
  829. ndata.push({
  830. userId: JSON.stringify(fzr),
  831. userType: '04',
  832. joinStartTime: sl,
  833. joinEndTime: el,
  834. })
  835. }
  836. if (xmjl.length !== 0) {
  837. ndata.push({
  838. userId: JSON.stringify(xmjl),
  839. userType: '05',
  840. joinStartTime: sl,
  841. joinEndTime: el,
  842. })
  843. }
  844. this.iamProjectUserList1 = ndata
  845. } else {
  846. let flag = false
  847. let xmjlflag = false
  848. data.forEach((item) => {
  849. if (item.userType === '04') {
  850. flag = true
  851. if (fzr[0].text !== item.userName || item.userId === '[]') {
  852. item.userId = JSON.stringify(fzr)
  853. }
  854. } else if (item.userType === '05') {
  855. xmjlflag = true
  856. if (xmjl.length === 0) {
  857. data.splice(1, 1)
  858. } else {
  859. if (xmjl[0].text !== item.userName || item.userId === '[]') {
  860. item.userId = JSON.stringify(xmjl)
  861. }
  862. }
  863. }
  864. })
  865. if (!flag) {
  866. if (fzr.length !== 0) {
  867. data.splice(0, 0, {
  868. userId: JSON.stringify(fzr),
  869. userType: '04',
  870. joinStartTime: sl,
  871. joinEndTime: el,
  872. })
  873. }
  874. }
  875. if (!xmjlflag) {
  876. if (xmjl.length !== 0) {
  877. data.splice(1, 0, {
  878. userId: JSON.stringify(xmjl),
  879. userType: '05',
  880. joinStartTime: sl,
  881. joinEndTime: el,
  882. })
  883. }
  884. }
  885. this.iamProjectUserList1 = data
  886. // this.$refs.form.setFieldValue('iamProjectUserList', data)
  887. }
  888. console.log(model, '数据--莫德罗----2')
  889. },
  890. fnconfirm() {
  891. // 启动前需要校验 动态表格数据是否都已填写完毕
  892. this.isconfrimSubmitting = true
  893. this.$refs.tabaData.valid().then((res) => {
  894. // 校验动态子表
  895. if (res) {
  896. this.$refs.form.setFieldValue('itemStatus', '02')
  897. this.saveForm()
  898. } else {
  899. this.isconfrimSubmitting = false
  900. }
  901. })
  902. // .catch(() => {})
  903. },
  904. fncheckdelete(data, i) {
  905. if (typeof i === 'object') {
  906. let flag = true
  907. i.forEach((xh) => {
  908. if (data[xh].userType === '04' || data[xh].userType === '05') {
  909. flag = false
  910. }
  911. })
  912. if (flag) {
  913. return true
  914. } else {
  915. return false
  916. }
  917. } else {
  918. if (data[i].userType === '04' || data[i].userType === '05') {
  919. return false
  920. } else {
  921. return true
  922. }
  923. }
  924. },
  925. fnchange() {
  926. this.iamProjectUserList1.forEach((item) => {
  927. if (item.userId !== undefined) {
  928. const userid = JSON.parse(item.userId)
  929. item.userName = userid[0].text
  930. item.userAccount = userid[0].code
  931. }
  932. })
  933. this.$refs.form.setFieldValue('iamProjectUserList', this.iamProjectUserList1)
  934. },
  935. // 展示选择列表
  936. showselectexternal() {
  937. this.modalvisible = !this.modalvisible
  938. },
  939. // 弹出窗确认
  940. handleOk() {
  941. this.showselectexternal()
  942. // 获取别选择的行信息
  943. const selectInfo = this.$refs.externalTable.getSelectedRows()
  944. const list = []
  945. selectInfo.forEach((item) => {
  946. const obj = {
  947. title: item.name,
  948. id: item.id,
  949. code: item.id,
  950. name: item.name,
  951. text: item.name,
  952. type: 'Group',
  953. props: {},
  954. }
  955. list.push(obj)
  956. })
  957. this.$refs.form.setFieldValue('externalUnitIds', list)
  958. },
  959. // 弹出窗取消
  960. handleCancel() {
  961. this.showselectexternal()
  962. },
  963. initExternalUnitIdsData(model) {
  964. const list = []
  965. let codes = []
  966. let names = []
  967. const externalUnitCodes = model.externalUnitCodes
  968. const externalUnitNames = model.externalUnitNames
  969. if (externalUnitCodes) {
  970. codes = externalUnitCodes.split(',')
  971. names = externalUnitNames.split(',')
  972. for (let i = 0; i < codes.length; i++) {
  973. const obj = {
  974. title: names[i],
  975. id: codes[i],
  976. code: codes[i],
  977. name: names[i],
  978. text: names[i],
  979. type: 'Group',
  980. props: {},
  981. }
  982. list.push(obj)
  983. }
  984. this.externalUnitIds = list
  985. }
  986. },
  987. initData() {
  988. if (this.externalUnitIds.length > 0) {
  989. this.$refs.form.setFieldValue('externalUnitIds', this.externalUnitIds)
  990. }
  991. if (this.auditProcessOptions.length > 0) {
  992. this.$refs.form.setFieldValue('auditProcess', [this.auditProcessOptions[0]])
  993. }
  994. },
  995. getPikerData(projectId) {
  996. return function () {
  997. return new Promise((resolve) => {
  998. axios({
  999. url: 'api/xcoa-mobile/v1/audit/auditsource/extrnal/iamExternalBase',
  1000. method: 'get',
  1001. }).then((res) => {
  1002. const dataSource = []
  1003. res.data.forEach((item) => {
  1004. dataSource.push({
  1005. name: item.name,
  1006. code: item.code,
  1007. type: 'Group',
  1008. })
  1009. })
  1010. resolve(dataSource)
  1011. })
  1012. })
  1013. }
  1014. },
  1015. // 打开选择人员的组件
  1016. openProjectUserSelect() {
  1017. this.$refs.projectUserSelect.openPicker()
  1018. },
  1019. //
  1020. projectUserChange(val) {
  1021. this.selectUserFlag = true
  1022. const sl = new Date(this.$refs.form.getFieldValue('planStartTime')).getTime()
  1023. const el = new Date(this.$refs.form.getFieldValue('planEndTime')).getTime()
  1024. const userList = val.map((item) => {
  1025. return {
  1026. id: null,
  1027. joinEndTime: el,
  1028. joinStartTime: sl,
  1029. projectId: this.$route.query.record,
  1030. userAccount: item.code,
  1031. userId:
  1032. '[{"code":"' +
  1033. item.code +
  1034. '","name":"' +
  1035. item.name +
  1036. '","text":"' +
  1037. item.name +
  1038. '","type":"User"}]',
  1039. userName: item.name,
  1040. userType: '03',
  1041. }
  1042. })
  1043. // 获取电话号码及邮箱
  1044. userList.forEach((item, index) => {
  1045. axios({
  1046. url:
  1047. 'api/xcoa-mobile/v1/iamuserbase/getUserBaseInfoByAccount?userAccount=' +
  1048. item.userAccount,
  1049. method: 'get',
  1050. }).then((res) => {
  1051. if (res.data.userMobile === null) {
  1052. item.phoneNumber = ''
  1053. } else {
  1054. item.phoneNumber = res.data.userMobile
  1055. }
  1056. if (res.data.userMail === null) {
  1057. item.email = ''
  1058. } else {
  1059. item.email = res.data.userMail
  1060. }
  1061. // 最后一次循环,赋值
  1062. if (index === userList.length - 1) {
  1063. this.iamProjectUserList1 = this.iamProjectUserList1.concat(userList)
  1064. // 将子表信息赋值,否则无法保存
  1065. this.fnchange()
  1066. // 取消加载状态
  1067. this.selectUserFlag = false
  1068. }
  1069. })
  1070. })
  1071. },
  1072. },
  1073. }
  1074. </script>
  1075. <style module lang="scss">
  1076. @use '@/common/design' as *;
  1077. @import '@/webflow/sd-flow-form.scss';
  1078. .projectstartform {
  1079. .iconclass {
  1080. margin-right: 8px;
  1081. font-size: 70px;
  1082. color: #1890ff;
  1083. vertical-align: middle;
  1084. }
  1085. :global(.ant-checkbox-group > label:first-child) {
  1086. margin-left: 9px !important;
  1087. }
  1088. :global(.title_sd-detail-form_common > span) {
  1089. visibility: hidden;
  1090. }
  1091. :global(.title_sd-detail-form_common ::after) {
  1092. padding: 0 100px 0 0;
  1093. visibility: visible;
  1094. content: '启动项目';
  1095. }
  1096. }
  1097. .form {
  1098. :global(.buttons_sd-detail-form_common) {
  1099. display: none;
  1100. }
  1101. :global .projectstartform > td.ant-form-item-label > label {
  1102. width: 160px;
  1103. white-space: break-spaces !important;
  1104. }
  1105. }
  1106. .add-btn {
  1107. position: absolute;
  1108. top: 7px;
  1109. right: 85px;
  1110. z-index: 99;
  1111. }
  1112. .child-table-td {
  1113. :global(.ant-form-item-children) {
  1114. display: block;
  1115. }
  1116. }
  1117. </style>