Newer
Older
KaiFengPC / src / views / project / ProjectProcessAdministration / constructionPermitsa / operate.vue
@zhangdeliang zhangdeliang on 12 Jun 29 KB update
  1. <template>
  2. <div class="operate" v-loading.fullscreen.lock="loading" element-loading-text="加载中..." element-loading-background="rgba(0, 0, 0, 0.6)">
  3. <el-steps :active="active" finish-status="success" align-center class="steps">
  4. <el-step title="施工许可提交" />
  5. <el-step title="项目预审" />
  6. <el-step title="人工审查" />
  7. <el-step title="审核通过" />
  8. </el-steps>
  9. <el-form ref="ruleForm" :model="form" :rules="rules" :disabled="opts.type === 'view'">
  10. <el-row :gutter="20">
  11. <el-col :span="8">
  12. <el-form-item label="项目名称:" prop="projectNo" class="formItem110">
  13. <el-select
  14. v-model="form.projectNo"
  15. placeholder="请选择项目名称"
  16. style="width: 100%"
  17. @change="projectChange"
  18. :disabled="opts.type !== 'add'"
  19. >
  20. <el-option v-for="dict in projectList" :key="dict.projectNo" :label="dict.projectName" :value="dict.projectNo" />
  21. </el-select>
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="8">
  25. <el-form-item label="项目编码:" prop="projectNo" class="formItem110">
  26. <el-input v-model="form.projectNo" :disabled="true" />
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="8">
  30. <el-form-item label="项目类型:" prop="projectTypeId" class="formItem110">
  31. <el-input v-model="form.projectTypeIdName" :disabled="true" />
  32. </el-form-item>
  33. </el-col>
  34. </el-row>
  35. <el-row :gutter="20">
  36. <el-col :span="8">
  37. <el-form-item label="项目面积:" prop="projectArea" class="formItem110">
  38. <el-input v-model="form.projectArea" :disabled="true" />
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="8">
  42. <el-form-item label="用地类型:" prop="spongeLandType" class="formItem110">
  43. <el-input v-model="form.spongeLandTypeName" :disabled="true" />
  44. </el-form-item>
  45. </el-col>
  46. <el-col :span="8">
  47. <el-form-item label="绿地率:" prop="greenRate" class="formItem110">
  48. <el-input v-model="form.greenRate" :disabled="true" />
  49. </el-form-item>
  50. </el-col>
  51. </el-row>
  52. <el-row :gutter="20">
  53. <el-col :span="8">
  54. <el-form-item label="建设单位:" prop="chargeDepartment" class="formItem110">
  55. <el-input v-model="form.chargeDepartment" :disabled="true" />
  56. </el-form-item>
  57. </el-col>
  58. <el-col :span="8">
  59. <el-form-item label="建设状态:" prop="buildStatus" class="formItem110">
  60. <el-input v-model="form.buildStatusName" :disabled="true" />
  61. </el-form-item>
  62. </el-col>
  63. </el-row>
  64. <el-divider content-position="left">建设目标</el-divider>
  65. <div class="pl20">
  66. <el-row :gutter="20">
  67. <el-col :span="8">
  68. <el-form-item label="年径流总量控制率:" prop="annualRunoffTotalControlRate" class="formItem140">
  69. <el-input v-model="form.annualRunoffTotalControlRate" />
  70. </el-form-item>
  71. </el-col>
  72. <el-col :span="8">
  73. <el-form-item label="年径流污染去除率:" prop="annualRunoffPollutionControlRate" class="formItem140">
  74. <el-input v-model="form.annualRunoffPollutionControlRate" />
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="8">
  78. <el-form-item label="硬化地面率:" prop="hardGroundRate" class="formItem140">
  79. <el-input v-model="form.hardGroundRate" />
  80. </el-form-item>
  81. </el-col>
  82. </el-row>
  83. </div>
  84. <el-divider content-position="left">责任部门</el-divider>
  85. <el-row :gutter="20">
  86. <el-col :span="8">
  87. <el-form-item label="责任部门:" prop="chargeDepartment" class="formItem110">
  88. <el-input v-model="form.chargeDepartment" :disabled="true" />
  89. </el-form-item>
  90. </el-col>
  91. <el-col :span="8">
  92. <el-form-item label="责任人:" prop="chargeUser" class="formItem110">
  93. <el-input v-model="form.chargeUser" :disabled="true" />
  94. </el-form-item>
  95. </el-col>
  96. <el-col :span="8">
  97. <el-form-item label="联系方式:" prop="phone" class="formItem110">
  98. <el-input v-model="form.phone" :disabled="true" />
  99. </el-form-item>
  100. </el-col>
  101. </el-row>
  102. <el-row :gutter="20">
  103. <el-col :span="8">
  104. <el-form-item label="设计单位:" prop="designUnit" class="formItem110">
  105. <el-input v-model="form.designUnitName" :disabled="true" />
  106. </el-form-item>
  107. </el-col>
  108. <el-col :span="8">
  109. <el-form-item label="施工单位:" prop="constructUnit" class="formItem110">
  110. <el-input v-model="form.constructUnitName" :disabled="true" />
  111. </el-form-item>
  112. </el-col>
  113. <el-col :span="8">
  114. <el-form-item label="运维单位:" prop="operationUnit" class="formItem110">
  115. <el-input v-model="form.operationUnitName" :disabled="true" />
  116. </el-form-item>
  117. </el-col>
  118. </el-row>
  119. <el-divider content-position="left">项目投资</el-divider>
  120. <el-row :gutter="20">
  121. <el-col :span="12">
  122. <el-form-item label="投资批复文件说明(已批复项目填写):" prop="investFileName">
  123. <el-input v-model="form.investFileName" :disabled="true" />
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="12">
  127. <div class="fileName" v-show="fileInfo.fileName">
  128. <span>{{ fileInfo.fileName }}</span>
  129. <!-- <el-button type="primary" link>下载</el-button> -->
  130. </div>
  131. </el-col>
  132. </el-row>
  133. <el-row :gutter="20">
  134. <el-col :span="8">
  135. <el-form-item label="项目总投资(含主体工程)(万元):" prop="totalInvest" class="mb5">
  136. <el-input v-model="form.totalInvest" :disabled="true" />
  137. </el-form-item>
  138. </el-col>
  139. <el-col :span="8">
  140. <el-form-item label="地方政府投资(万元):" prop="govermentInvest" class="mb5">
  141. <el-input v-model="form.govermentInvest" :disabled="true" />
  142. </el-form-item>
  143. </el-col>
  144. <el-col :span="8">
  145. <el-form-item label="社会资本投入(万元):" prop="socialInvest" class="mb5">
  146. <el-input v-model="form.socialInvest" :disabled="true" />
  147. </el-form-item>
  148. </el-col>
  149. </el-row>
  150. <el-row :gutter="20">
  151. <el-col :span="8">
  152. <el-form-item label="项目运作模式:" prop="projectOperationPatternName" class="mb5">
  153. <el-input v-model="form.projectOperationPatternName" :disabled="true" />
  154. </el-form-item>
  155. </el-col>
  156. <el-col :span="10">
  157. <el-form-item label="海绵相关投资(不含主体工程)(万元):" prop="spongeInvest" class="mb5">
  158. <el-input v-model="form.spongeInvest" :disabled="true" />
  159. </el-form-item>
  160. </el-col>
  161. </el-row>
  162. <el-table :data="form.list1" v-if="projectInvestList[0]">
  163. <el-table-column v-for="it in projectInvestList[0].list" :label="it.propertyName" :prop="it.propertyKey">
  164. <template #default="{ row }">
  165. <el-input v-model="row[it.propertyKey]" :disabled="opts.type === 'audit'" />
  166. </template>
  167. </el-table-column>
  168. </el-table>
  169. <el-divider content-position="left">立项资料</el-divider>
  170. <div class="box" v-for="item in projectApprovalFileList">
  171. <el-row :gutter="24">
  172. <el-col :span="24">
  173. <el-form-item :label="`${item.name}:`" class="formItem140">
  174. <el-input v-model="item.filieDescription" :disabled="true" style="width: 200px" />
  175. <!-- 文件列表展示 -->
  176. <div class="ggFileListShow">
  177. <div class="part flex" v-for="(img, index) in item.fileList" :key="index">
  178. <p class="name ellipsis" :title="img.name">{{ img.name || '--' }}</p>
  179. </div>
  180. </div>
  181. </el-form-item>
  182. </el-col>
  183. </el-row>
  184. </div>
  185. <el-divider content-position="left">规划阶段资料</el-divider>
  186. <div class="pl20">
  187. <div class="box" v-for="item in planningStageFileList">
  188. <el-row :gutter="24">
  189. <el-col :span="24">
  190. <el-form-item :label="`${item.name}:`" class="formItem140">
  191. <el-input v-model="item.filieDescription" :disabled="true" style="width: 200px" />
  192. <!-- 文件列表展示 -->
  193. <div class="ggFileListShow">
  194. <div class="part flex" v-for="(img, index) in item.fileList" :key="index">
  195. <p class="name ellipsis" :title="img.name">{{ img.name || '--' }}</p>
  196. </div>
  197. </div>
  198. </el-form-item>
  199. </el-col>
  200. </el-row>
  201. </div>
  202. <el-form-item label="其他说明:" prop="permissionDescription" class="formItem140 mb0">
  203. <el-input v-model="form.permissionDescription" type="textarea" resize="none" :disabled="true" />
  204. </el-form-item>
  205. </div>
  206. <el-divider content-position="left">施工阶段资料</el-divider>
  207. <div class="box" v-for="(item, i) in form.projectProcessAttachmentSaveRequestList">
  208. <el-row :gutter="24">
  209. <el-col :span="12">
  210. <!-- 必填 :rules="opts.type === 'add' || (i < 2 && opts.type === 'audit') ? rules['filieDescription'] : []"-->
  211. <el-form-item
  212. :label="`${item.name}:`"
  213. :prop="'projectProcessAttachmentSaveRequestList.' + i + '.' + 'filieDescription'"
  214. class="formItem140"
  215. >
  216. <el-input
  217. v-model="item.filieDescription"
  218. placeholder="请输入资料说明"
  219. style="width: 200px"
  220. :disabled="i < 2 && opts.type === 'audit'"
  221. />
  222. </el-form-item>
  223. </el-col>
  224. <el-col :span="12">
  225. <ImageFileUpload
  226. listType="text"
  227. :limit="10"
  228. :saveFileArr="item.fileList"
  229. :refType="item.dictType"
  230. :refField="item.dictData"
  231. :fileType="['pdf', 'doc', 'docx', 'xlsx', 'xls', 'txt']"
  232. :disabled="i < 2 && opts.type === 'audit'"
  233. />
  234. </el-col>
  235. </el-row>
  236. </div>
  237. <el-row :gutter="20">
  238. <el-col :span="12">
  239. <el-form-item label="指定处理人:" prop="dealUsers" class="formItem110">
  240. <el-select v-model="form.dealUsers" placeholder="请选择指定处理人" style="width: 100%" :disabled="opts.type === 'audit'">
  241. <el-option v-for="dict in userLists" :key="dict.userId" :label="dict.nickName" :value="dict.userId" />
  242. </el-select>
  243. </el-form-item>
  244. </el-col>
  245. <el-col :span="12">
  246. <el-form-item label="流程抄送人:" prop="pushUsers" class="formItem110">
  247. <el-select v-model="form.pushUsers" placeholder="请选择流程抄送人" style="width: 100%" :disabled="opts.type === 'audit'">
  248. <el-option v-for="dict in userLists" :key="dict.userId" :label="dict.nickName" :value="dict.userId" />
  249. </el-select>
  250. </el-form-item>
  251. </el-col>
  252. </el-row>
  253. <el-form-item label="审核意见:" prop="approveComment" class="formItem110" v-if="opts.type === 'audit'">
  254. <el-input v-model="form.approveComment" type="textarea" resize="none" />
  255. </el-form-item>
  256. <el-divider content-position="left" v-if="form.status && form.status !== 'start'">流程日志</el-divider>
  257. <div class="stapesBox" v-if="form.status && form.status !== 'start'">
  258. <el-steps direction="vertical" :active="stapesDate.length">
  259. <el-step v-for="i in stapesDate" :title="i.activityName" style="width: 300px">
  260. <template #description>
  261. <div class="direction">时间:{{ i.endTime }}</div>
  262. <div class="direction">分配人:{{ i.assigneeName }}</div>
  263. <div class="direction">任务备注:{{ i.comment }}</div>
  264. </template>
  265. </el-step>
  266. </el-steps>
  267. </div>
  268. </el-form>
  269. </div>
  270. </template>
  271.  
  272. <script setup>
  273. import { ref, reactive, onMounted } from 'vue';
  274. import { required } from '@/utils/validate-helper';
  275. import { getProjectInfoNewList, getDicts } from '@/api/project/projectApproval';
  276. import ImageFileUpload from '@/components/ImageFileUpload/index.vue'; //图片文件上传
  277. import { projectInfoNewDetail, getFileLIst, getProjectCompanyList } from '@/api/project/projectInformationNew';
  278. import {
  279. projectConstructionPermitsAdd,
  280. projectConstructionPermitsEdit,
  281. projectConstructionPermitsStartWorkFlow,
  282. userList,
  283. projectConstructionPermitsDetail,
  284. workflowProcess,
  285. projectConstructionPermitsApprove,
  286. } from '@/api/project/constructionPermits';
  287. import { inheritAttr } from '@/utils/v3';
  288. import { useDicts } from '@/hooks';
  289. import useUserStore from '@/store/modules/user';
  290.  
  291. const { proxy } = getCurrentInstance();
  292. const showDetail = ref(false);
  293. const fileObj = ref({});
  294. const { findText } = useDicts(proxy);
  295. const { pro_project_approval } = proxy.useDict('pro_project_approval');
  296. const { planning_stage } = proxy.useDict('planning_stage');
  297. const { construction_permits } = proxy.useDict('construction_permits');
  298. const emit = defineEmits(['close']);
  299. const props = defineProps({
  300. curRow: {
  301. type: Object,
  302. default: () => ({}),
  303. },
  304. opts: {
  305. type: Object,
  306. default: () => ({}),
  307. },
  308. types: {
  309. type: Array,
  310. default: [],
  311. },
  312. projectContentType: {
  313. type: Array,
  314. default: () => [],
  315. },
  316. curStatus: {
  317. type: String,
  318. default: '',
  319. },
  320. });
  321. const { curRow, opts } = props;
  322. const loading = ref(false);
  323. const active = ref(0);
  324. const form = reactive({
  325. projectName: '',
  326. projectNo: '',
  327. projectNo: '',
  328. projectTypeId: '',
  329. projectTypeIdName: '',
  330. projectArea: '',
  331. spongeLandType: '',
  332. spongeLandTypeName: '',
  333. greenRate: '',
  334. chargeDepartment: '',
  335. buildStatus: '',
  336. buildStatusName: '',
  337. annualRunoffTotalControlRate: '',
  338. annualRunoffPollutionControlRate: '',
  339. hardGroundRate: '',
  340. chargeDepartment: '',
  341. chargeUser: '',
  342. phone: '',
  343. designUnit: '',
  344. designUnitName: '',
  345. constructUnit: '',
  346. constructUnitName: '',
  347. operationUnit: '',
  348. operationUnitName: '',
  349. investFileName: '',
  350. totalInvest: '',
  351. govermentInvest: '',
  352. socialInvest: '',
  353. projectOperationPattern: '',
  354. projectOperationPatternName: '',
  355. spongeInvest: '',
  356. permissionDescription: '',
  357. list1: [{}],
  358. projectProcessAttachmentSaveRequestList: [],
  359. fileSaveRequestList: [],
  360. dealUsers: '',
  361. pushUsers: '',
  362. projectItemDescriptionSaveRequestList: [],
  363. status: '',
  364. approveComment: '',
  365. workflowInstanceId: '',
  366. });
  367.  
  368. const rules = reactive({
  369. projectName: required('项目名称'),
  370. projectNo: required('项目编码'),
  371. projectTypeId: required('项目类型'),
  372. projectArea: required('项目面积'),
  373. spongeLandType: required('用地类型'),
  374. greenRate: required('绿地率'),
  375. chargeDepartment: required('建设单位'),
  376. buildStatus: required('建设状态'),
  377. annualRunoffTotalControlRate: required('年径流总量控制率'),
  378. annualRunoffPollutionControlRate: required('年径流污染去除率'),
  379. hardGroundRate: required('硬化地面率'),
  380. chargeDepartment: required('责任部门'),
  381. chargeUser: required('责任人'),
  382. phone: required('联系方式'),
  383. designUnit: required('设计单位'),
  384. designUnit: required('施工单位'),
  385. operationUnit: required('运维单位'),
  386. investFileName: required('投资批复文件名称'),
  387. totalInvest: required('项目总投资'),
  388. govermentInvest: required('地方政府投资'),
  389. socialInvest: required('社会资本投入'),
  390. projectOperationPattern: required('项目运作模式'),
  391. spongeInvest: required('海绵相关投资'),
  392. filieDescription: required('内容'),
  393. approveComment: required('审核意见'),
  394. });
  395.  
  396. const stapesDate = ref([]);
  397.  
  398. const projectList = ref([]);
  399. const projectApprovalFileList = ref([]);
  400. const planningStageFileList = ref([]);
  401.  
  402. const fileInfo = reactive({
  403. fileName: '',
  404. });
  405.  
  406. const projectInvestList = ref([]);
  407. const userLists = ref([]);
  408.  
  409. const projectCompanyList = ref([]);
  410.  
  411. // 选择附件上传,对应动态参数添加
  412. function uploadGo(item, index) {
  413. fileObj.value.refType = item.dictType;
  414. fileObj.value.refField = item.dictData;
  415. fileObj.value.fileList = item.fileList;
  416. fileObj.value.index = index; //动态的第几个
  417. showDetail.value = true;
  418. }
  419. // 文件列表删除
  420. function deleteGG(list, index) {
  421. list.splice(index, 1);
  422. }
  423. // 确定之后选择的附件
  424. const closeGGDialog = e => {
  425. form.projectProcessAttachmentSaveRequestList[fileObj.value.index].fileList = e;
  426. showDetail.value = false;
  427. };
  428.  
  429. const getProjectCompanyLists = async () => {
  430. const res = await getProjectCompanyList();
  431. if (res?.code !== 200) return;
  432. projectCompanyList.value = res?.data || [];
  433. };
  434.  
  435. // const getProjectInvestList = async () => {
  436. // const res = await getProjectItemDescriptionConfigList({ projectTypeId: form.projectTypeId })
  437. // if(res?.code !== 200) return
  438. // const projectItemDescriptionConfigList = res?.data || []
  439. // projectInvestList.value = props.projectContentType.slice(3).map(item => {
  440. // const list = projectItemDescriptionConfigList.filter(it => it.projectContentType === item.value)
  441. // const obj = {}
  442. // for (const item of list) {
  443. // obj[item.propertyKey] = ''
  444. // }
  445. // form.list1 = [obj]
  446. // return {
  447. // list: JSON.parse(JSON.stringify(list)),
  448. // label: item.label
  449. // }
  450. // })
  451. // }
  452.  
  453. const getFileInfo = async (id, refType, refField, callback) => {
  454. const res = await getFileLIst({ refId: id, refType, refField });
  455. if (res?.code !== 200) return;
  456. callback && callback(res.data);
  457. };
  458.  
  459. const getProjectTypeFileList = async (fileGroup, type, list, filterList) => {
  460. for (const key in fileGroup) {
  461. if (key === type) {
  462. if (Object.hasOwnProperty.call(fileGroup, key)) {
  463. const element = fileGroup[key];
  464. for (const item of element) {
  465. const info = filterList.value.find(it => it.value === item.dictData);
  466. if (!info) continue;
  467. const dictDatas = list.map(it => it.dictData);
  468. if (dictDatas.includes(item.dictData)) continue;
  469. list.push({
  470. fileList: item.fileList,
  471. dictData: item.dictData,
  472. dictType: item.dictType,
  473. filieDescription: item.filieDescription,
  474. projectNo: item.projectNo,
  475. name: info.label,
  476. });
  477. }
  478. }
  479. }
  480. }
  481. };
  482.  
  483. const getProjectList = async () => {
  484. const res = await getProjectInfoNewList();
  485. if (res?.code !== 200) return;
  486. projectList.value = res?.data || [];
  487. if (opts.type === 'add' && projectList.value.length) {
  488. projectChange(projectList.value[0].projectNo);
  489. fileObj.value.refId = projectList.value[0].id; //项目返回的id值
  490. }
  491. };
  492.  
  493. const projectChange = async val => {
  494. form.list1 = [{}];
  495. const res = await projectInfoNewDetail(val);
  496. if (res?.code !== 200) return;
  497. fileObj.value.refId = res.data.id; //项目返回的id值
  498. inheritAttr(res.data, form);
  499. form.projectTypeIdName = props.types.find(it => it.id === form.projectTypeId)?.projectTypeName;
  500. form.spongeLandTypeName = findText('sponge_land_type', form.spongeLandType);
  501. form.buildStatusName = findText('build_status', form.buildStatus);
  502. form.projectOperationPatternName = findText('project_operation_pattern', form.projectOperationPattern);
  503. form.designUnitName = projectCompanyList.value.find(item => item.id === form.designUnit)?.unitName || '';
  504. form.constructUnitName = projectCompanyList.value.find(item => item.id === form.constructUnit)?.unitName || '';
  505. form.operationUnitName = projectCompanyList.value.find(item => item.id === form.operationUnit)?.unitName || '';
  506.  
  507. getFileInfo(res.data.id, 'projectInfoNew', 'investmentApproval', data => {
  508. console.log(data);
  509. fileInfo.fileName = data?.[0]?.name || '';
  510. });
  511.  
  512. // getProjectInvestList()
  513. const projectItemDescriptionConfigList = res?.data?.projectItemDescriptionList || [];
  514. projectInvestList.value = props.projectContentType.slice(3).map(item => {
  515. const list = projectItemDescriptionConfigList.filter(it => it.projectContentType === item.value);
  516. const obj = {};
  517. for (const item of list) {
  518. obj[item.propertyKey] = item.propertyValue;
  519. }
  520. form.list1 = [obj];
  521. return {
  522. list: JSON.parse(JSON.stringify(list)),
  523. label: item.label,
  524. };
  525. });
  526.  
  527. const fileGroup = res.data.fileGroup;
  528. projectApprovalFileList.value = [];
  529. getProjectTypeFileList(fileGroup, 'pro_project_approval', projectApprovalFileList.value, pro_project_approval);
  530. planningStageFileList.value = [];
  531. getProjectTypeFileList(fileGroup, 'planning_stage', planningStageFileList.value, planning_stage);
  532. getDictMaps('construction_permits');
  533. };
  534.  
  535. const getDictMaps = async dictType => {
  536. const res = await getDicts(dictType);
  537. if (res?.code !== 200) return;
  538. if (res?.data) {
  539. form.projectProcessAttachmentSaveRequestList = [];
  540. for (const item of res.data) {
  541. form.projectProcessAttachmentSaveRequestList.push({
  542. fileList: [],
  543. dictData: item.dictValue,
  544. dictType: item.dictType,
  545. filieDescription: '',
  546. projectNo: '',
  547. name: item.dictLabel,
  548. });
  549. }
  550. console.log(form.projectProcessAttachmentSaveRequestList);
  551. form.projectProcessAttachmentSaveRequestList = form.projectProcessAttachmentSaveRequestList.slice(0, 2);
  552. }
  553.  
  554. setTimeout(() => {
  555. if (proxy.$refs.ruleForm) {
  556. proxy.$refs.ruleForm.clearValidate();
  557. }
  558. });
  559. };
  560.  
  561. const getUserList = async () => {
  562. const res = await userList();
  563. if (res?.code !== 200) return;
  564. userLists.value = res?.data || [];
  565. };
  566.  
  567. const submit = type => {
  568. proxy.$refs.ruleForm.validate(async (valid, fields) => {
  569. if (valid) {
  570. if (type === 2) {
  571. if (!form.dealUsers) return proxy.$modal.msgError('请指定处理人!');
  572. if (!form.pushUsers) return proxy.$modal.msgError('请指定抄送人!');
  573. }
  574. loading.value = true;
  575. const params = JSON.parse(JSON.stringify(form));
  576. delete params.list1;
  577. for (const item of params.projectProcessAttachmentSaveRequestList) {
  578. item.projectNo = params.projectNo;
  579. for (const it of item.fileList) {
  580. params.fileSaveRequestList.push(it);
  581. }
  582. }
  583. params.projectItemDescriptionSaveRequestList = [];
  584. for (let j = 0; j < projectInvestList.value.length; j++) {
  585. const formList = form.list1;
  586. const item = projectInvestList.value[j];
  587. for (const it of item.list) {
  588. for (const key in formList[0]) {
  589. if (Object.hasOwnProperty.call(formList[0], key)) {
  590. const element = formList[0][key];
  591. if (key === it.propertyKey) {
  592. it.propertyValue = element;
  593. }
  594. }
  595. }
  596. params.projectItemDescriptionSaveRequestList.push(it);
  597. }
  598. }
  599. console.log(params);
  600. let methed = '';
  601. if (type === 1) {
  602. if (curRow?.id) {
  603. params.id = curRow.id;
  604. methed = projectConstructionPermitsEdit;
  605. } else {
  606. methed = projectConstructionPermitsAdd;
  607. }
  608. } else {
  609. if (curRow?.id) {
  610. params.id = curRow.id;
  611. }
  612. methed = projectConstructionPermitsStartWorkFlow;
  613. }
  614. try {
  615. const res = await methed(params);
  616. loading.value = false;
  617. if (res?.code !== 200) return;
  618. proxy.$modal.msgSuccess('操作成功!');
  619. emit('close');
  620. } catch (error) {
  621. loading.value = false;
  622. }
  623. } else {
  624. console.log('error submit!', fields);
  625. }
  626. });
  627. };
  628.  
  629. const handleAudit = result => {
  630. proxy.$refs.ruleForm.validate(async (valid, fields) => {
  631. if (valid) {
  632. const params = JSON.parse(JSON.stringify(form));
  633. delete params.list1;
  634. params.fileSaveRequestList = [];
  635. for (let i = 0; i < params.projectProcessAttachmentSaveRequestList.length; i++) {
  636. if (opts.type === 'audit' && i < 2) continue;
  637. const item = params.projectProcessAttachmentSaveRequestList[i];
  638. if (result === 'true' && !item.filieDescription) {
  639. return proxy.$modal.msgError(`${item.name}文件说明不能为空!`);
  640. }
  641. item.projectNo = params.projectNo;
  642. for (const it of item.fileList) {
  643. params.fileSaveRequestList.push(it);
  644. }
  645. }
  646. loading.value = true;
  647. if (opts.type === 'audit') {
  648. params.projectProcessAttachmentSaveRequestList = params.projectProcessAttachmentSaveRequestList.slice(2);
  649. }
  650. params.projectItemDescriptionSaveRequestList = [];
  651. for (let j = 0; j < projectInvestList.value.length; j++) {
  652. const formList = form.list1;
  653. const item = projectInvestList.value[j];
  654. for (const it of item.list) {
  655. for (const key in formList[0]) {
  656. if (Object.hasOwnProperty.call(formList[0], key)) {
  657. const element = formList[0][key];
  658. if (key === it.propertyKey) {
  659. it.propertyValue = element;
  660. }
  661. }
  662. }
  663. params.projectItemDescriptionSaveRequestList.push(it);
  664. }
  665. }
  666.  
  667. params.approveResult = result;
  668. params.submitUserId = useUserStore().userId;
  669. params.id = curRow.id;
  670. console.log(params);
  671. try {
  672. const res = await projectConstructionPermitsApprove(params);
  673. loading.value = false;
  674. if (res?.code !== 200) return;
  675. proxy.$modal.msgSuccess('操作成功!');
  676. emit('close');
  677. } catch (error) {
  678. loading.value = false;
  679. }
  680. } else {
  681. console.log('error submit!', fields);
  682. }
  683. });
  684. };
  685.  
  686. const getDetail = async () => {
  687. const res = await projectConstructionPermitsDetail(curRow.id);
  688. if (res?.code !== 200) return;
  689. fileObj.value.refId = res.data.projectId; //项目返回的id值
  690. inheritAttr(res.data, form);
  691.  
  692. form.projectTypeIdName = props.types.find(it => it.id === form.projectTypeId)?.projectTypeName;
  693. form.spongeLandTypeName = findText('sponge_land_type', form.spongeLandType);
  694. form.buildStatusName = findText('build_status', form.buildStatus);
  695. form.projectOperationPatternName = findText('project_operation_pattern', form.projectOperationPattern);
  696. form.designUnitName = projectCompanyList.value.find(item => item.id === form.designUnit)?.unitName || '';
  697. form.constructUnitName = projectCompanyList.value.find(item => item.id === form.constructUnit)?.unitName || '';
  698. form.operationUnitName = projectCompanyList.value.find(item => item.id === form.operationUnit)?.unitName || '';
  699. form.dealUsers = form.dealUsers * 1 || '';
  700. form.pushUsers = form.pushUsers * 1 || '';
  701.  
  702. getFileInfo(res.data.id, 'projectInfoNew', 'investmentApproval', data => {
  703. console.log(data);
  704. fileInfo.fileName = data?.[0]?.name || '';
  705. });
  706. const projectItemDescriptionConfigList = res?.data?.projectItemDescriptionSaveRequestList || [];
  707. projectInvestList.value = props.projectContentType.slice(3).map(item => {
  708. const list = projectItemDescriptionConfigList.filter(it => it.projectContentType === item.value);
  709. const obj = {};
  710. for (const item of list) {
  711. obj[item.propertyKey] = item.propertyValue;
  712. }
  713. form.list1 = [obj];
  714. return {
  715. list: JSON.parse(JSON.stringify(list)),
  716. label: item.label,
  717. };
  718. });
  719.  
  720. const fileGroup = res.data.fileGroup;
  721. projectApprovalFileList.value = [];
  722. getProjectTypeFileList(fileGroup, 'pro_project_approval', projectApprovalFileList.value, pro_project_approval);
  723. planningStageFileList.value = [];
  724. getProjectTypeFileList(fileGroup, 'planning_stage', planningStageFileList.value, planning_stage);
  725. form.projectProcessAttachmentSaveRequestList = [];
  726. getProjectTypeFileList(fileGroup, 'construction_permits', form.projectProcessAttachmentSaveRequestList, construction_permits);
  727.  
  728. if (form.status && form.status !== 'start') {
  729. workflowProcessM(res.data.id);
  730. if (form.status === 'submit') {
  731. active.value = 0;
  732. } else if (form.status === 'projectInquiry') {
  733. active.value = 1;
  734. } else if (form.status === 'manualReview') {
  735. active.value = 2;
  736. } else if (form.status === 'end') {
  737. active.value = 4;
  738. }
  739. }
  740.  
  741. if (opts.type === 'audit') {
  742. const res = await getDicts('construction_permits');
  743. if (res?.code !== 200) return;
  744. if (res?.data) {
  745. res.data = res.data.slice(2);
  746. for (const item of res.data) {
  747. form.projectProcessAttachmentSaveRequestList.push({
  748. fileList: [],
  749. dictData: item.dictValue,
  750. dictType: item.dictType,
  751. filieDescription: '',
  752. projectNo: '',
  753. name: item.dictLabel,
  754. });
  755. }
  756. }
  757. }
  758. };
  759.  
  760. //获取流程日志
  761. const workflowProcessM = async id => {
  762. let params = {
  763. businessKey: id,
  764. workflowKey: 'projectConstructionPermits',
  765. workflowUserId: '',
  766. };
  767. let { data } = await workflowProcess(params);
  768. stapesDate.value = data;
  769. };
  770.  
  771. onMounted(async () => {
  772. await getProjectCompanyLists();
  773. getProjectList();
  774. getUserList();
  775. if (curRow?.id) {
  776. getDetail();
  777. }
  778. });
  779.  
  780. defineExpose({
  781. submit,
  782. handleAudit,
  783. });
  784. </script>
  785.  
  786. <style lang="scss" scoped>
  787. .operate {
  788. .steps {
  789. margin-bottom: 20px;
  790. }
  791.  
  792. .pl20 {
  793. padding-left: 20px;
  794. }
  795.  
  796. .tips {
  797. margin-left: 10px;
  798. line-height: 30px;
  799. }
  800.  
  801. .mb5 {
  802. margin-bottom: 5px;
  803. }
  804.  
  805. .mb0 {
  806. margin-bottom: 0;
  807. }
  808.  
  809. .fileName {
  810. white-space: nowrap;
  811. line-height: 30px;
  812. }
  813.  
  814. .fileSaveRequestList {
  815. .file-item {
  816. white-space: nowrap;
  817. display: flex;
  818. align-items: center;
  819. margin-bottom: 5px;
  820. line-height: 30px;
  821. }
  822. }
  823. .box {
  824. margin-bottom: 10px;
  825. }
  826.  
  827. .direction {
  828. min-width: 190px;
  829. }
  830.  
  831. .stapesBox {
  832. min-height: 100px;
  833. margin-bottom: 30px;
  834. margin-left: 30px;
  835. }
  836. }
  837. </style>