audit-project-start-form.vue 36 KB

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