ee58ebe9 by lihua

提交质量评价

1 parent 70ab5602
...@@ -114,7 +114,7 @@ export const getRegisteredList = (type) => request({ ...@@ -114,7 +114,7 @@ export const getRegisteredList = (type) => request({
114 114
115 /** 质量评价审批通过 */ 115 /** 质量评价审批通过 */
116 export const qualityAllow = (params) => request({ 116 export const qualityAllow = (params) => request({
117 url: `${import.meta.env.VITE_API_NEW_PORTAL}/quality-evaluation/allow`, 117 url: `${import.meta.env.VITE_API_NEW_PORTAL}/quality-evaluation/submit-flow`,
118 method: 'post', 118 method: 'post',
119 data: params 119 data: params
120 }); 120 });
......
...@@ -38,13 +38,13 @@ export const getFlowData = (params) => request({ ...@@ -38,13 +38,13 @@ export const getFlowData = (params) => request({
38 method: 'post', 38 method: 'post',
39 data: params 39 data: params
40 }) 40 })
41 export const getCamundaDeploymentId = (flowType) => request({ 41 export const getCamundaDeploymentId = (flowType, tenantGuid = null, staffGuid = null) => request({
42 url: `${import.meta.env.VITE_APP_WORK_FLOW_URL}/work-flow/data/get-camunda-deployment-id`, 42 url: `${import.meta.env.VITE_APP_WORK_FLOW_URL}/work-flow/data/get-camunda-deployment-id`,
43 method: 'post', 43 method: 'post',
44 data: { 44 data: {
45 tenantGuid: userData.tenantGuid, 45 tenantGuid: tenantGuid || userData.tenantGuid,
46 flowType:flowType, 46 flowType:flowType,
47 staffGuid: userData.staffGuid, 47 staffGuid: staffGuid || userData.staffGuid,
48 } 48 }
49 }) 49 })
50 50
......
...@@ -967,7 +967,7 @@ const panelChange = (scope, row) => { ...@@ -967,7 +967,7 @@ const panelChange = (scope, row) => {
967 </div> 967 </div>
968 <div v-if="item.example" class="panel_header-expample">{{ item.example }}</div> 968 <div v-if="item.example" class="panel_header-expample">{{ item.example }}</div>
969 <el-input ref="exampleTextareaRef" :id="item.field" 969 <el-input ref="exampleTextareaRef" :id="item.field"
970 :class="[item.col, { is_block: item.block, 'extra-textarea-class': item.type === 'textarea' && !item.label }]" 970 :class="[item.col, { is_block: item.block }]"
971 v-model="formInline[item.field]" :rows="item.rows ?? 4" type="textarea" :placeholder="item.placeholder" 971 v-model="formInline[item.field]" :rows="item.rows ?? 4" type="textarea" :placeholder="item.placeholder"
972 :disabled="item.disabled || readonly" :readonly="item.readonly" resize="none" 972 :disabled="item.disabled || readonly" :readonly="item.readonly" resize="none"
973 :maxlength="item.maxlength ?? 500" show-word-limit @focus="(event) => inputFocus(event, item)" 973 :maxlength="item.maxlength ?? 500" show-word-limit @focus="(event) => inputFocus(event, item)"
......
...@@ -86,7 +86,19 @@ const routes: RouteRecordRaw[] = [ ...@@ -86,7 +86,19 @@ const routes: RouteRecordRaw[] = [
86 cache: true, 86 cache: true,
87 reuse: true 87 reuse: true
88 } 88 }
89 } 89 },
90 {
91 path: 'register-catalog-detail',
92 name: 'evaCatalogDetail',
93 component: () => import('@/views/data_asset/registerCatalogDetail.vue'),
94 meta: {
95 title: '详情-',
96 sidebar: false,
97 breadcrumb: false,
98 cache: true,
99 reuse: true
100 }
101 },
90 ], 102 ],
91 }, 103 },
92 { 104 {
......
...@@ -51,14 +51,14 @@ const useUserStore = defineStore( ...@@ -51,14 +51,14 @@ const useUserStore = defineStore(
51 //获取用户信息 51 //获取用户信息
52 account.value = res.data.logonUser 52 account.value = res.data.logonUser
53 userId.value = res.data.userId 53 userId.value = res.data.userId
54 userName.value = res.data.userName
55 // userData.value = JSON.stringify(res.data.data);
56 currentTenantGuid.value = res.data.tenantInfoList && res.data.tenantInfoList.length ? res.data.tenantInfoList[0].guid : ''; 54 currentTenantGuid.value = res.data.tenantInfoList && res.data.tenantInfoList.length ? res.data.tenantInfoList[0].guid : '';
57 localStorage.setItem('currentTenantGuid', currentTenantGuid.value); 55 localStorage.setItem('currentTenantGuid', currentTenantGuid.value);
58 let currentTenant = res.data.tenantInfoList?.[0]; 56 let currentTenant = res.data.tenantInfoList?.[0];
59 getCurrentUserInfo({tenantGuid: currentTenantGuid.value}).then((res: any) => { 57 getCurrentUserInfo({tenantGuid: currentTenantGuid.value}).then((res: any) => {
60 console.log(res, 'getCurrentUserInfo'); 58 console.log(res, 'getCurrentUserInfo');
61 if (res.code == '00000') { 59 if (res.code == '00000') {
60 userName.value = res.data.staffName;
61 localStorage.setItem('userName', res.data?.staffName);
62 localStorage.setItem('userData', JSON.stringify(res.data)); 62 localStorage.setItem('userData', JSON.stringify(res.data));
63 } else { 63 } else {
64 ElMessage.error(res.msg) 64 ElMessage.error(res.msg)
...@@ -66,7 +66,6 @@ const useUserStore = defineStore( ...@@ -66,7 +66,6 @@ const useUserStore = defineStore(
66 }) 66 })
67 return getSystemMenu({ tenantGuid: currentTenantGuid.value }).then((info: any) => { 67 return getSystemMenu({ tenantGuid: currentTenantGuid.value }).then((info: any) => {
68 if (info.code == '00000') { 68 if (info.code == '00000') {
69 localStorage.setItem('userName', currentTenant?.name)
70 localStorage.setItem('userInfoData', JSON.stringify(info.data)); 69 localStorage.setItem('userInfoData', JSON.stringify(info.data));
71 userInfoData.value = info.data; 70 userInfoData.value = info.data;
72 } else { 71 } else {
......
...@@ -11,15 +11,13 @@ import { ...@@ -11,15 +11,13 @@ import {
11 getQualityEvaList, 11 getQualityEvaList,
12 getRegisteredList, 12 getRegisteredList,
13 saveQuality, 13 saveQuality,
14 registerApproveCancel,
15 registerApproveBackup,
16 qualityAllow, 14 qualityAllow,
17 deleteQuality, 15 deleteQuality,
18 updatQuality 16 updatQuality
19 } from "@/api/modules/dataAsset"; 17 } from "@/api/modules/dataAsset";
20 import useUserStore from "@/store/modules/user"; 18 import useUserStore from "@/store/modules/user";
21 import useDataAssetStore from "@/store/modules/dataAsset"; 19 import useDataAssetStore from "@/store/modules/dataAsset";
22 import { passFlowData, rejectFlowData, revokeFlowData, getCamundaDeploymentId, getProcessNodesPromise } from "@/api/modules/workFlowService"; 20 import { rejectFlowData, revokeFlowData, getCamundaDeploymentId, getProcessNodesPromise } from "@/api/modules/workFlowService";
23 21
24 const assetStore = useDataAssetStore(); 22 const assetStore = useDataAssetStore();
25 23
...@@ -44,7 +42,7 @@ const tableFields = ref([ ...@@ -44,7 +42,7 @@ const tableFields = ref([
44 const deploymentId = ref(''); 42 const deploymentId = ref('');
45 43
46 onBeforeMount(() => { 44 onBeforeMount(() => {
47 getCamundaDeploymentId('10018').then((res: any) => { 45 getCamundaDeploymentId('10018', userData.tenantGuid, userData.staffGuid).then((res: any) => {
48 if (res.code == proxy.$passCode) { 46 if (res.code == proxy.$passCode) {
49 deploymentId.value = res.data; 47 deploymentId.value = res.data;
50 } else { 48 } else {
...@@ -168,7 +166,7 @@ const tableInfo = ref({ ...@@ -168,7 +166,7 @@ const tableInfo = ref({
168 actionInfo: { 166 actionInfo: {
169 label: "操作", 167 label: "操作",
170 type: "btn", 168 type: "btn",
171 width: 160, 169 width: 175,
172 btns: (scope) => { 170 btns: (scope) => {
173 let row = scope.row; 171 let row = scope.row;
174 return getTableBtns(row); 172 return getTableBtns(row);
...@@ -178,25 +176,43 @@ const tableInfo = ref({ ...@@ -178,25 +176,43 @@ const tableInfo = ref({
178 176
179 const getTableBtns = (row) => { 177 const getTableBtns = (row) => {
180 let btnsArr: any[] = []; 178 let btnsArr: any[] = [];
181 if (row.approveState == 'A') {//审批中 179 const approveVO = row.approveVO || {};
182 btnsArr.push({ label: "详情", value: "path_detail" }) 180 const approveState = row.approveState || null;
183 if (row.tenantGuid == userData.tenantGuid) { 181 const approveStaffGuids = approveVO.approveStaffGuids || [];
184 btnsArr.push({ label: "撤销", value: "revoke" }); 182 const staffGuid = approveVO.staffGuid || '';
185 } 183 const bizApproveState = row.bizApproveState;
186 if (row.approveTenantGuids?.includes(userData.tenantGuid)) { 184 const currentStaffGuid = userData.staffGuid
187 btnsArr.push({ label: "通过", value: "pass" }); 185 let isShowCancel = false;
188 btnsArr.push({ label: "驳回", value: "backup" }); 186 let flowState;
189 } 187 if (approveState == 'N') {
190 } else if (row.approveState == 'Y') {//已通过的不能删除。 188 flowState = 1;
191 btnsArr.push({ label: "详情", value: "path_detail" }) 189 }
192 } else if (row.approveState == 'R' || row.approveState == 'C') {//已驳回或已撤销 190 if (approveState == 'A' && approveStaffGuids.indexOf(currentStaffGuid) > -1) {
193 btnsArr.push({ label: "详情", value: "path_detail" }); 191 flowState = 2;
194 if (row.tenantGuid == userData.tenantGuid) { 192 }
195 btnsArr.push({ label: "重新提交", value: "edit", disabled: false }) 193 if ((approveState == 'C' || approveState == 'R') && staffGuid == currentStaffGuid) {
196 } 194 flowState = 3;
197 if (row.tenantGuid == userData.tenantGuid) { 195 }
198 btnsArr.push({ label: "删除", value: "delete" }); 196 if (approveVO && approveVO.approveState == 'A' && staffGuid == currentStaffGuid) {
199 } 197 isShowCancel = true;
198 }
199 if (flowState === 1) {
200 btnsArr = [{ label: "删除", value: "del" }]
201 }
202 if (flowState === 2) {
203 btnsArr = [{ label: "通过", value: "pass" }, { label: "驳回", value: "reject" }]
204 }
205 if (flowState === 3) {
206 btnsArr.push({ label: "删除", value: "del" })
207 }
208 if (flowState === 3 && bizApproveState != 'D') {
209 btnsArr.push({ label: "重新提交", value: "redit" })
210 }
211 if (isShowCancel) {
212 btnsArr.push({ label: "撤销", value: "revoke" })
213 }
214 if (flowState !== 1) {
215 btnsArr.push({ label: "详情", value: "detail" })
200 } 216 }
201 return btnsArr; 217 return btnsArr;
202 } 218 }
...@@ -207,15 +223,15 @@ const tableBtnClick = (scope, btn) => { ...@@ -207,15 +223,15 @@ const tableBtnClick = (scope, btn) => {
207 const type = btn.value; 223 const type = btn.value;
208 const row = scope.row; 224 const row = scope.row;
209 currTableData.value = row; 225 currTableData.value = row;
210 if (type == "edit") { 226 if (type == "redit") {
211 dialogInfo.value.visible = true; 227 dialogInfo.value.visible = true;
212 dialogInfo.value.type = 'reSubmit'; 228 dialogInfo.value.type = 'reSubmit';
213 formItems.value[0].visible = false; 229 formItems.value[0].visible = false;
214 formItems.value[0].default = row.registerGuid; 230 formItems.value[0].default = row.registerGuid;
215 formItems.value[1].default = row.qualityEvaluationFile || []; 231 formItems.value[1].default = row.qualityEvaluationFile || [];
216 } else if (type == "delete") { 232 } else if (type == "del") {
217 delTableOpen("此操作将永久删除该资产质量评价,是否继续?", "warning"); 233 delTableOpen("此操作将永久删除该资产质量评价,是否继续?", "warning");
218 } else if (type === 'backup') { 234 } else if (type === 'reject') {
219 rejectDialogInfo.value.visible = true; 235 rejectDialogInfo.value.visible = true;
220 } else if (type === 'pass') { 236 } else if (type === 'pass') {
221 passDialogInfo.value.visible = true; 237 passDialogInfo.value.visible = true;
...@@ -251,7 +267,7 @@ const tableBtnClick = (scope, btn) => { ...@@ -251,7 +267,7 @@ const tableBtnClick = (scope, btn) => {
251 message: '已取消撤销' 267 message: '已取消撤销'
252 }); 268 });
253 }); 269 });
254 } else if (type === 'path_detail') { // 详情 270 } else if (type === 'detail') { // 详情
255 if (row.registerApproveState == 'Y') { 271 if (row.registerApproveState == 'Y') {
256 router.push({ 272 router.push({
257 name: 'registerDetail', 273 name: 'registerDetail',
...@@ -259,14 +275,14 @@ const tableBtnClick = (scope, btn) => { ...@@ -259,14 +275,14 @@ const tableBtnClick = (scope, btn) => {
259 }); 275 });
260 } else { 276 } else {
261 router.push({ 277 router.push({
262 name: 'registerCatalogDetail', 278 name: 'evaCatalogDetail',
263 query: { guid: row.damGuid, type: 'asset' } 279 query: { guid: row.damGuid, evaGuid: row.guid, type: 'qualityEvaluate' }
264 }); 280 });
265 } 281 }
266 } else if (type == 'productDetail') { 282 } else if (type == 'productDetail') {
267 router.push({ 283 router.push({
268 name: 'registerCatalogDetail', 284 name: 'registerCatalogDetail',
269 query: { guid: row.damGuid, type: 'asset' } 285 query: { guid: row.damGuid }
270 }); 286 });
271 } 287 }
272 }; 288 };
...@@ -403,9 +419,10 @@ const dialogBtnClick = (btn, info) => { ...@@ -403,9 +419,10 @@ const dialogBtnClick = (btn, info) => {
403 damGuid: currTableData.value.damGuid, 419 damGuid: currTableData.value.damGuid,
404 daName: currTableData.value.daName, 420 daName: currTableData.value.daName,
405 immediateApprove: true, 421 immediateApprove: true,
406 issuingEntityGuid: res.data?.[1]?.candidateUsers?.[0]?.staffGuid, 422 evaluationAgencyGuid: res.data?.[1]?.candidateUsers?.[0]?.staffGuid,
407 qualityEvaluationFile: info.qualityEvaluationFile?.map(f => f.url) || [] 423 qualityEvaluationFile: info.qualityEvaluationFile || []
408 }).then((res: any) => { 424 }).then((res: any) => {
425 dialogInfo.value.footer.btns[1].loading = false;
409 if (res?.code == proxy.$passCode) { 426 if (res?.code == proxy.$passCode) {
410 ElMessage.success('该资产质量评价重新提交成功'); 427 ElMessage.success('该资产质量评价重新提交成功');
411 dialogInfo.value.visible = false; 428 dialogInfo.value.visible = false;
...@@ -422,10 +439,10 @@ const dialogBtnClick = (btn, info) => { ...@@ -422,10 +439,10 @@ const dialogBtnClick = (btn, info) => {
422 damGuid: info.damGuid, 439 damGuid: info.damGuid,
423 daName: daInfo.damName, 440 daName: daInfo.damName,
424 immediateApprove: true, 441 immediateApprove: true,
425 // registerTime: daInfo.registerTime, 442 evaluationAgencyGuid: res.data?.[1]?.candidateUsers?.[0]?.staffGuid,
426 issuingEntityGuid: res.data?.[1]?.candidateUsers?.[0]?.staffGuid, 443 qualityEvaluationFile: info.qualityEvaluationFile || []
427 qualityEvaluationFile: info.qualityEvaluationFile?.map(f => f.url) || []
428 }).then((res: any) => { 444 }).then((res: any) => {
445 dialogInfo.value.footer.btns[1].loading = false;
429 if (res?.code == proxy.$passCode) { 446 if (res?.code == proxy.$passCode) {
430 ElMessage.success('质量评价发起成功'); 447 ElMessage.success('质量评价发起成功');
431 dialogInfo.value.visible = false; 448 dialogInfo.value.visible = false;
...@@ -568,7 +585,7 @@ const passDialogInfo = ref({ ...@@ -568,7 +585,7 @@ const passDialogInfo = ref({
568 footer: { 585 footer: {
569 btns: [ 586 btns: [
570 { type: "default", label: "取消", value: "cancel" }, 587 { type: "default", label: "取消", value: "cancel" },
571 { type: "primary", label: "确定", value: "submit" }, 588 { type: "primary", label: "确定", value: "submit", loading: false },
572 ], 589 ],
573 }, 590 },
574 }); 591 });
...@@ -581,14 +598,19 @@ const passDialogInputChange = (val, item) => { ...@@ -581,14 +598,19 @@ const passDialogInputChange = (val, item) => {
581 598
582 const passDialogBtnClick = (btn, info) => { 599 const passDialogBtnClick = (btn, info) => {
583 if (btn.value == 'submit') { 600 if (btn.value == 'submit') {
601 passDialogInfo.value.footer.btns[1].loading = true;
584 qualityAllow({ 602 qualityAllow({
585 guid: currTableData.value.guid, 603 guid: currTableData.value.approveVO.approveGuid,
604 bizGuid: currTableData.value.guid,
605 flowType: currTableData.value.approveVO.flowType,
606 approveStaffGuid: userData.staffGuid,
586 qualityScore: info.qualityScore, 607 qualityScore: info.qualityScore,
587 evaluationRangeStart: info.evaluationRange[0], 608 evaluationRangeStart: info.evaluationRange[0],
588 evaluationRangeEnd: info.evaluationRange[1], 609 evaluationRangeEnd: info.evaluationRange[1],
589 evaluationNote: info.evaluationNote, 610 evaluationNote: info.evaluationNote,
590 evaluationFile: info.evaluationFile.map(f => f.url), 611 evaluationFile: info.evaluationFile || [],
591 }).then((res: any) => { 612 }).then((res: any) => {
613 passDialogInfo.value.footer.btns[1].loading = false;
592 if (res?.code == proxy.$passCode) { 614 if (res?.code == proxy.$passCode) {
593 if (res.data) { 615 if (res.data) {
594 ElMessage.success('审批成功'); 616 ElMessage.success('审批成功');
...@@ -648,13 +670,15 @@ const rejectDialogBtnClick = (btn, info) => { ...@@ -648,13 +670,15 @@ const rejectDialogBtnClick = (btn, info) => {
648 ElMessage.error('请填写驳回理由'); 670 ElMessage.error('请填写驳回理由');
649 return 671 return
650 } 672 }
673 let row = currTableData.value;
651 tableInfo.value.loading = true; 674 tableInfo.value.loading = true;
652 let params = { 675 let params = {
653 bizGuid: currTableData.value.guid, 676 guid: row.approveVO.approveGuid,
654 funcCode: currTableData.value.funcCode, 677 flowType: row.approveVO.flowType,
678 approveStaffGuid: userData.staffGuid,
655 approveSuggest: info.approveSuggest 679 approveSuggest: info.approveSuggest
656 } 680 }
657 registerApproveBackup(params).then((res: any) => { 681 rejectFlowData(params).then((res: any) => {
658 tableInfo.value.loading = false; 682 tableInfo.value.loading = false;
659 if (res?.code == proxy.$passCode) { 683 if (res?.code == proxy.$passCode) {
660 if (res.data) { 684 if (res.data) {
......
...@@ -10,15 +10,25 @@ import { ContentWrap } from '@/components/ContentWrap'; ...@@ -10,15 +10,25 @@ import { ContentWrap } from '@/components/ContentWrap';
10 import { 10 import {
11 getRegisterCatalogDetail, 11 getRegisterCatalogDetail,
12 dataSourcesList, 12 dataSourcesList,
13 qualityAllow,
14 costAssessAllow,
13 getRegisterCatalogTableDetail, 15 getRegisterCatalogTableDetail,
16 getEvaDetail
14 } from "@/api/modules/dataAsset"; 17 } from "@/api/modules/dataAsset";
15 import { changeNum } from '@/utils/common' 18 import { changeNum } from '@/utils/common'
19 import { ElMessage, ElMessageBox } from "element-plus";
20 import { passFlowData, rejectFlowData, revokeFlowData } from "@/api/modules/workFlowService";
21 import { CircleCloseFilled } from '@element-plus/icons-vue'
22 import { onUploadFilePreview, onUploadFileDownload, setFileName } from '@/api/modules/common';
16 23
17 const router = useRouter(); 24 const router = useRouter();
18 const route = useRoute(); 25 const route = useRoute();
19 const userStore = useUserStore(); 26 const userStore = useUserStore();
27 const userData = JSON.parse(userStore.userData)
20 const fullPath = route.fullPath; 28 const fullPath = route.fullPath;
21 const catalogGuid = route.query.guid; 29 const catalogGuid = route.query.guid;
30 const evaGuid = route.query.evaGuid;
31 const detailType = ref(route.query.type);
22 32
23 const { proxy } = getCurrentInstance() as any; 33 const { proxy } = getCurrentInstance() as any;
24 /** 当前主要类型的详情信息。 */ 34 /** 当前主要类型的详情信息。 */
...@@ -64,6 +74,12 @@ const baseInfoFormItems = ref([ ...@@ -64,6 +74,12 @@ const baseInfoFormItems = ref([
64 }, 74 },
65 ]); 75 ]);
66 76
77 const evaDetailInfo: any = ref({});
78
79 const deploymentId = ref('');
80
81 const processInstanceId = ref('');
82
67 const getDetailInfo = () => { 83 const getDetailInfo = () => {
68 fullscreenLoading.value = true; 84 fullscreenLoading.value = true;
69 getRegisterCatalogDetail(catalogGuid).then((res: any) => { 85 getRegisterCatalogDetail(catalogGuid).then((res: any) => {
...@@ -89,6 +105,18 @@ const getDetailInfo = () => { ...@@ -89,6 +105,18 @@ const getDetailInfo = () => {
89 proxy.$ElMessage.error(res.msg); 105 proxy.$ElMessage.error(res.msg);
90 } 106 }
91 }); 107 });
108 if (evaGuid) {
109 getEvaDetail({ guid: evaGuid }).then((res: any) => {
110 if (res.code == proxy.$passCode) {
111 const data = res.data || {};
112 evaDetailInfo.value = data;
113 deploymentId.value = data.approveVO.camundaDeploymentId;
114 processInstanceId.value = data.approveVO?.camundaInstanceId;
115 } else {
116 proxy.$ElMessage.error(res.msg);
117 }
118 });
119 }
92 } 120 }
93 121
94 onBeforeMount(() => { 122 onBeforeMount(() => {
...@@ -159,10 +187,562 @@ const handleTableViewData = (scope) => { ...@@ -159,10 +187,562 @@ const handleTableViewData = (scope) => {
159 }); 187 });
160 } 188 }
161 189
190 const toolBtns: any = computed(() => {
191 let btnsArr: any = [{
192 label: "关闭", value: "cancel", plain: true
193 }];
194 let approveVO = evaDetailInfo.value.approveVO;
195 let staffGuid = userData.staffGuid;
196 if (approveVO && approveVO.approveState == 'A' && approveVO.approveStaffGuids&&approveVO.approveStaffGuids.indexOf(staffGuid) > -1) {
197 btnsArr.push(...[{ label: "通过", value: "pass", type: 'primary' }, { label: "驳回", value: "reject", type: 'danger', plain: true }]);
198 }
199 if (approveVO && approveVO.approveState == 'A' && approveVO.staffGuid == staffGuid) {
200 btnsArr.push({ label: "撤销", value: "revoke" });
201 }
202 return btnsArr;
203 });
204
205 const btnClick = (btn) => {
206 const type = btn.value;
207 if (type == 'cancel') {
208 userStore.setTabbar(userStore.tabbar.filter((tab: any) => tab.fullPath !== fullPath));
209 router.push({
210 name: detailType.value == 'qualityEvaluate' ? 'qualityEvaluate' : (detailType.value == 'costAssess' ? 'valueEvaluate' : (detailType.value == 'certificate' ? 'certificateManagement' : 'registerManagemant'))
211 });
212 } else if (type == 'pass') {
213 passDialogInfo.value.visible = true;
214 assessFormItems.value[2].placeholder = '按照本次评估目的及价值类型,该笔数据资产在评估基准日的评估值为人民币***元。本次评估结论在评估基准日后一年内有效,即自20*年*月*日至20*年*月*日止。超过一年,需重新举行资产评估。';
215 qualityEvaluateFormItems.value[2].placeholder = '本次评估数据资产总体质量得分为**分\n准确性:\n一致性:\n可访问性:\n规范性:\n完整性:';
216 // if (assetDetailInfo.value.dataStartDate) {
217 // qualityEvaluateFormItems.value[1].default = [assetDetailInfo.value.dataStartDate, assetDetailInfo.value.dataEndDate];
218 // qualityEvaluateFormItems.value[1].disabled = true;
219 // } else {
220 // qualityEvaluateFormItems.value[1].default = null;
221 // qualityEvaluateFormItems.value[1].disabled = false;
222 // }
223 } else if (type == 'reject') {
224 rejectDialogInfo.value.visible = true;
225 } else if (type == 'revoke') {
226 ElMessageBox.confirm('确定撤销该资产登记审批流程吗?', "提示", {
227 confirmButtonText: "确定",
228 cancelButtonText: "取消",
229 type: 'warning',
230 }).then(() => {
231 let params = {
232 guid: evaDetailInfo.value.approveVO.approveGuid,
233 flowType: evaDetailInfo.value.approveVO.flowType,
234 approveStaffGuid: userData.staffGuid,
235 }
236 revokeFlowData(params).then((res: any) => {
237 if (res?.code == proxy.$passCode) {
238 if (res.data) {
239 ElMessage.success('该审批流程撤销成功!');
240 getDetailInfo();
241 } else {
242 ElMessage.error('该审批流程撤销失败!');
243 }
244 } else {
245 ElMessage.error(res.msg);
246 }
247 });
248 }).catch(() => {
249 ElMessage({
250 type: 'info',
251 message: '已取消撤销'
252 });
253 });
254 } else if (type == 'confirm') {
255 passDialogInfo.value.visible = true;
256 }
257 }
258
259 const passDialogSize = computed(() => {
260 if (detailType.value == 'asset') {
261 return 460;
262 } else if (detailType.value == 'qualityEvaluate' || detailType.value == 'costAssess') {
263 return 700;
264 }
265 });
266
267 const passDialogTitle = computed(() => {
268 if (detailType.value == 'asset' || detailType.value == 'qualityEvaluate' || detailType.value == 'costAssess') {
269 return "通过";
270 }
271 });
272
273 const qualityEvaluateFormItems = ref([
274 {
275 label: '质量得分',
276 type: 'input',
277 placeholder: '请输入数值',
278 field: 'qualityScore',
279 default: '',
280 inputType: 'scoreNumber',
281 min: 0,
282 max: 100,
283 required: true
284 },
285 {
286 label: "评价对象范围",
287 type: "date-picker",
288 field: "evaluationRange",
289 default: null,
290 placeholder: "开始时间~结束时间",
291 clearable: true,
292 required: true,
293 },
294 {
295 label: '质量评价说明',
296 type: 'textarea',
297 example: '示例:本次评估数据资产总体质量得分为99.80分。从评价维度分析,准确性、一致性和可访问性均为 100 分;规范性 99.42 分、完整性 99.50分。',
298 placeholder: `本次评估数据资产总体质量得分为**分\n准确性:\n一致性:\n可访问性:\n规范性:\n完整性:`,
299 field: 'evaluationNote',
300 focusValue: true,
301 rows: 6,
302 default: '',
303 clearable: true,
304 required: true,
305 block: true,
306 },
307 {
308 label: '质量评价报告',
309 tip: '支持扩展名:PDF',
310 type: 'upload-file',
311 accept: '.pdf',
312 limit: 1,
313 block: true,
314 required: true,
315 default: [],
316 field: 'evaluationFile',
317 }
318 ]);
319
320 const assessFormItems = ref([
321 {
322 label: '评估金额(元)',
323 type: 'input',
324 inputType: 'moneyNumber',
325 placeholder: '请输入数值',
326 field: 'assessmentMoney',
327 default: '',
328 required: true
329 },
330 {
331 label: "评价日期",
332 type: "date",
333 field: "assessmentDate",
334 default: null,
335 placeholder: "请选择",
336 clearable: true,
337 required: true,
338 },
339 {
340 label: '价值评估说明',
341 type: 'textarea',
342 placeholder: '按照本次评估目的及价值类型,该笔数据资产在评估基准日的评估值为人民币***元。本次评估结论在评估基准日后一年内有效,即自20*年*月*日至20*年*月*日止。超过一年,需重新举行资产评估。',
343 field: 'assessmentNote',
344 focusValue: true,
345 default: '',
346 clearable: true,
347 required: true,
348 block: true,
349 },
350 {
351 label: '价值评估报告',
352 tip: '支持扩展名:PDF',
353 type: 'upload-file',
354 accept: '.pdf',
355 limit: 1,
356 required: true,
357 block: true,
358 default: [],
359 field: 'assessmentFile',
360 }
361 ]);
362
363 const passFormItems = computed(() => {
364 if (detailType.value == 'asset') {
365 return [{
366 label: '',
367 type: "textarea",
368 placeholder: "请填写通过理由(必填)",
369 field: "approveSuggest",
370 clearable: true,
371 block: true,
372 col: 'margin_b_0',
373 }];
374 } else if (detailType.value == 'qualityEvaluate') {
375 return qualityEvaluateFormItems.value;
376 } else if (detailType.value == 'costAssess') {
377 return assessFormItems.value
378 }
379 });
380
381 const evaFormRules = ref({
382 qualityScore: [{
383 validator: (rule: any, value: any, callback: any) => {
384 if (value === 0) {
385 callback();
386 return;
387 }
388 if (!value) {
389 callback(new Error('请填写质量得分'));
390 return;
391 }
392 //TODO 请填写1~100以内的整数
393 // const r = /(^[0-9]([0-9]*)$|^[0-9]$)/; // 正整数(可以以0打头)
394 // if (value && !r.test(value)) {
395 // callback(new Error('请填写大于或等于零整数'));
396 // return;
397 // }
398 // if ((value + '').length > 6) {
399 // callback(new Error('请填写1~100以内的整数'));
400 // return;
401 // }
402 callback();
403 },
404 trigger: "blur",
405 }],
406 evaluationRange: [{
407 type: 'array', required: true, message: '请填写评价对象范围', trigger: 'change',
408 }],
409 evaluationNote: [{
410 validator: (rule: any, value: any, callback: any) => {
411 if (!value) {
412 callback(new Error('请填写质量评价说明'));
413 return;
414 }
415 if (value && value.length > 500) {
416 callback(new Error('请填写小于500个字的质量评价说明'));
417 return;
418 }
419 callback();
420 },
421 trigger: "blur",
422 }],
423 evaluationFile: [{
424 validator: (rule: any, value: any, callback: any) => {
425 if (!value?.length) {
426 callback(new Error('请上传质量评价报告'));
427 return;
428 }
429 callback();
430 },
431 trigger: "blur",
432 }]
433 });
434
435 const passFormRules = computed(() => {
436 if (detailType.value == 'asset') {
437 return {};
438 } else if (detailType.value == 'qualityEvaluate') {
439 return evaFormRules.value;
440 } else if (detailType.value == 'costAssess') {
441 return {
442 assessmentMoney: [{
443 validator: (rule: any, value: any, callback: any) => {
444 if (value === 0) {
445 callback();
446 return;
447 }
448 if (!value) {
449 callback(new Error('请填写评估金额'));
450 return;
451 }
452 //TODO 请填写1~100以内的整数
453 // const r = /(^[0-9]([0-9]*)$|^[0-9]$)/; // 正整数(可以以0打头)
454 // if (value && !r.test(value)) {
455 // callback(new Error('请填写大于或等于零整数'));
456 // return;
457 // }
458 // if ((value + '').length > 6) {
459 // callback(new Error('请填写1~100以内的整数'));
460 // return;
461 // }
462 callback();
463 },
464 trigger: "blur",
465 }],
466 assessmentNote: [{
467 validator: (rule: any, value: any, callback: any) => {
468 if (!value) {
469 callback(new Error('请填写价值评估说明'));
470 return;
471 }
472 if (value && value.length > 500) {
473 callback(new Error('请填写小于500个字的价值评估说明'));
474 return;
475 }
476 callback();
477 },
478 trigger: "blur",
479 }],
480 assessmentDate: [{
481 required: true, message: '请填写评价日期', trigger: 'blur'
482 }],
483 assessmentFile: [{
484 validator: (rule: any, value: any, callback: any) => {
485 if (!value?.length) {
486 callback(new Error('请上传价值评估报告'));
487 return;
488 }
489 callback();
490 },
491 trigger: "blur",
492 }]
493 }
494 } else if (detailType.value == 'certificate') {
495 return {
496 documentFile: [{
497 validator: (rule: any, value: any, callback: any) => {
498 if (!value?.length) {
499 callback(new Error('请上传证件'))
500 } else {
501 callback();
502 }
503 }, trigger: 'change'
504 }]
505 };
506 }
507 });
508
509 const passDialogInfo = ref({
510 visible: false,
511 size: passDialogSize.value,
512 direction: "column",
513 header: {
514 title: passDialogTitle.value,
515 },
516 type: '',
517 contents: [
518 {
519 type: 'form',
520 title: '',
521 formInfo: {
522 id: 'quality-pass-dialog',
523 items: passFormItems.value,
524 rules: passFormRules.value
525 }
526 }
527 ],
528 footer: {
529 btns: [
530 { type: "default", label: "取消", value: "cancel" },
531 { type: "primary", label: "确定", value: "submit", loading: false, },
532 ],
533 },
534 });
535
536 const passDialogInputChange = (val, item, inlineValue) => {
537 if (item.field == 'qualityScore') {
538 qualityEvaluateFormItems.value[2].placeholder = `本次评估数据资产总体质量得分为${val}分\n准确性:\n一致性:\n可访问性:\n规范性:\n完整性:`;
539 } else if (item.field == 'assessmentMoney') {
540 let M = "";
541 let D = "";
542 let assessmentDate = inlineValue.assessmentDate;
543 if (assessmentDate) {
544 M = (assessmentDate.getMonth() + 1 < 10 ? '0' + (assessmentDate.getMonth() + 1) : assessmentDate.getMonth() + 1);
545 D = (assessmentDate.getDate() + 1 < 10 ? '0' + assessmentDate.getDate() : assessmentDate.getDate());
546 }
547 assessFormItems.value[2].placeholder = `按照本次评估目的及价值类型,该笔数据资产在评估基准日的评估值为人民币${val}元。本次评估结论在评估基准日后一年内有效,即自${inlineValue.assessmentDate ? `${inlineValue.assessmentDate.getFullYear()}${M}${D}日至${inlineValue.assessmentDate.getFullYear() + 1}${M}${D}日` : '20*年*月*日至20*年*月*日'}止。超过一年,需重新举行资产评估。`;
548 } else if (item.field == 'assessmentDate') {
549 let M = (val.getMonth() + 1 < 10 ? '0' + (val.getMonth() + 1) : val.getMonth() + 1);
550 let D = (val.getDate() + 1 < 10 ? '0' + val.getDate() : val.getDate());
551 assessFormItems.value[2].placeholder = `按照本次评估目的及价值类型,该笔数据资产在评估基准日的评估值为人民币${inlineValue.assessmentMoney ? inlineValue.assessmentMoney : '***'}元。本次评估结论在评估基准日后一年内有效,即自${val ? `${val.getFullYear()}${M}${D}日至${val.getFullYear() + 1}${M}${D}日` : '20*年*月*日至20*年*月*日'}止。超过一年,需重新举行资产评估。`;
552 }
553 }
554
555 const submitPromise: any = ref(null);
556
557 const passDialogBtnClick = (btn, info) => {
558 if (btn.value == 'submit') {
559 if (detailType.value == 'asset') { //如果是资产登记的审批。
560 if (submitPromise.value) {
561 return;
562 }
563 passDialogInfo.value.footer.btns[1].loading = true;
564 let params = {
565 guid: evaDetailInfo.value.approveVO.approveGuid,
566 flowType: evaDetailInfo.value.approveVO.flowType,
567 approveSuggest: info.approveSuggest,
568 approveStaffGuid: userData.staffGuid,
569 }
570 submitPromise.value = passFlowData(params).then((res: any) => {
571 submitPromise.value = null;
572 passDialogInfo.value.footer.btns[1].loading = false;
573 if (res?.code == proxy.$passCode) {
574 if (res.data) {
575 ElMessage.success('审批成功');
576 passDialogInfo.value.visible = false;
577 getDetailInfo();
578 } else {
579 ElMessage.error('审批失败');
580 }
581 } else {
582 ElMessage.error(res.msg);
583 }
584 });
585 } else if (detailType.value == 'qualityEvaluate') {
586 if (submitPromise.value) {
587 return;
588 }
589 passDialogInfo.value.footer.btns[1].loading = true;
590 submitPromise.value = qualityAllow({
591 bizGuid: evaDetailInfo.value.guid,
592 flowType: evaDetailInfo.value.approveVO.flowType,
593 approveStaffGuid: userData.staffGuid,
594 guid: evaDetailInfo.value.approveVO.approveGuid,
595 qualityScore: info.qualityScore,
596 evaluationRangeStart: info.evaluationRange[0],
597 evaluationRangeEnd: info.evaluationRange[1],
598 evaluationNote: info.evaluationNote,
599 evaluationFile: info.evaluationFile || []
600 }).then((res: any) => {
601 passDialogInfo.value.footer.btns[1].loading = false;
602 submitPromise.value = null;
603 if (res?.code == proxy.$passCode) {
604 if (res.data) {
605 ElMessage.success('审批成功');
606 passDialogInfo.value.visible = false;
607 getDetailInfo();
608 } else {
609 ElMessage.error('审批失败');
610 }
611 } else {
612 ElMessage.error(res.msg);
613 }
614 });
615 } else if (detailType.value == 'costAssess') {
616 if (submitPromise.value) {
617 return;
618 }
619 submitPromise.value = costAssessAllow({
620 guid: evaDetailInfo.value.guid,
621 assessmentMoney: info.assessmentMoney,
622 assessmentDate: info.assessmentDate,
623 assessmentNote: info.assessmentNote,
624 assessmentFile: info.assessmentFile.map(f => f.url),
625 }).then((res: any) => {
626 submitPromise.value = null;
627 if (res?.code == proxy.$passCode) {
628 if (res.data) {
629 ElMessage.success('审批成功');
630 passDialogInfo.value.visible = false;
631 getDetailInfo();
632 } else {
633 ElMessage.error('审批失败');
634 }
635 } else {
636 ElMessage.error(res.msg);
637 }
638 });
639 }
640 } else if (btn.value == 'cancel') {
641 passDialogInfo.value.visible = false;
642 }
643 };
644
645 const rejectDialogInfo = ref({
646 visible: false,
647 size: 460,
648 direction: "column",
649 header: {
650 title: "驳回",
651 },
652 type: '',
653 contents: [
654 {
655 type: 'form',
656 title: '',
657 formInfo: {
658 id: 'batch-reject-form',
659 items: [
660 {
661 label: '',
662 type: "textarea",
663 placeholder: "请填写驳回理由(必填)",
664 field: "approveSuggest",
665 clearable: true,
666 block: true,
667 col: 'margin_b_0',
668 }
669 ]
670 }
671 }
672 ],
673 footer: {
674 btns: [
675 { type: "default", label: "取消", value: "cancel" },
676 { type: "primary", label: "确定", value: "submit" },
677 ],
678 },
679 });
680
681 const rejectDialogBtnClick = (btn, info) => {
682 if (btn.value == 'submit') {
683 if (info.approveSuggest == '') {
684 ElMessage.error('请填写驳回理由');
685 return
686 }
687 //资产登记的驳回。
688 let params = {
689 guid: evaDetailInfo.value.approveVO.approveGuid,
690 flowType: evaDetailInfo.value.approveVO.flowType,
691 approveSuggest: info.approveSuggest,
692 approveStaffGuid: userData.staffGuid,
693 }
694 rejectFlowData(params).then((res: any) => {
695 if (res?.code == proxy.$passCode) {
696 if (res.data) {
697 ElMessage.success('驳回成功');
698 rejectDialogInfo.value.visible = false;
699 getDetailInfo();
700 } else {
701 ElMessage.error('驳回失败');
702 }
703 } else {
704 ElMessage.error(res.msg);
705 }
706 });
707 } else if (btn.value == 'cancel') {
708 rejectDialogInfo.value.visible = false;
709 }
710 };
711
162 </script> 712 </script>
163 713
164 <template> 714 <template>
165 <div class="main-content" v-loading="fullscreenLoading"> 715 <div class="main-content" v-loading="fullscreenLoading">
716 <div class="detail-content" :style="{ height: detailType == 'qualityEvaluate' ? 'calc(100% - 44px)' : '100%' }">
717 <div v-if="detailType == 'qualityEvaluate'"
718 :class="['panel_wrap', 'results_panel', evaDetailInfo.approveVO?.approveState == 'Y' ? 'success' : (evaDetailInfo.approveVO?.approveState == 'R' ? 'reject' : (evaDetailInfo.approveVO?.approveState == 'C' ? 'revoke' : 'audit'))]">
719 <div class="panel_header">
720 <div class="header_title" v-if="evaDetailInfo.approveVO?.approveState == 'Y'">
721 <el-icon class="title-icon">
722 <svg-icon name="icon-success" />
723 </el-icon>
724 <span class="title_text">审批通过</span>
725 </div>
726 <div class="header_title" v-else-if="evaDetailInfo.approveVO?.approveState == 'R'">
727 <el-icon class="title-icon">
728 <CircleCloseFilled />
729 </el-icon>
730 <span class="title_text">审批被驳回</span>
731 </div>
732 <div class="header_title" v-else-if="evaDetailInfo.approveVO?.approveState == 'A'">
733 <el-icon class="title-icon">
734 <svg-icon name="icon-audit" />
735 </el-icon>
736 <span class="title_text">待审批</span>
737 </div>
738 <div class="header_title" v-else-if="evaDetailInfo.approveVO?.approveState == 'C'">
739 <el-icon class="title-icon">
740 <svg-icon name="icon-revoke" />
741 </el-icon>
742 <span class="title_text">已撤销</span>
743 </div>
744 </div>
745 </div>
166 <div class="header"> 746 <div class="header">
167 <div class="left-img"></div> 747 <div class="left-img"></div>
168 <div class="right-main"> 748 <div class="right-main">
...@@ -281,13 +861,219 @@ const handleTableViewData = (scope) => { ...@@ -281,13 +861,219 @@ const handleTableViewData = (scope) => {
281 </el-table-column> 861 </el-table-column>
282 </el-table> 862 </el-table>
283 </ContentWrap> 863 </ContentWrap>
864 <ContentWrap v-if="route.query.type == 'qualityEvaluate'" id="id-assetContent" title="附件信息" description="" style="margin: 16px 16px 16px">
865 <div class="list_panel mt4">
866 <div class="list_item is_block isFile" v-if="evaDetailInfo?.qualityEvaluationFile?.length" :style="{ width: '40%' }">
867 <span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">数据质量评价收集</span>
868 <span v-for="(item) in (evaDetailInfo?.qualityEvaluationFile || [])"
869 class="item_value" :style="{ 'padding-left': '0px' }">
870 <div class="file-operate">
871 <template
872 v-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'xls' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'xlsx' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'csv'">
873 <img class="file-img" src="../../assets/images/excel.png" />
874 </template>
875 <template
876 v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'doc' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'docx'">
877 <img class="file-img" src="../../assets/images/word.png" />
878 </template>
879 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'zip'">
880 <img class="file-img" src="../../assets/images/zip.png" />
881 </template>
882 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'rar'">
883 <img class="file-img" src="../../assets/images/RAR.png" />
884 </template>
885 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'pdf'">
886 <img class="file-img" src="../../assets/images/PDF.png" />
887 </template>
888 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'png'">
889 <img class="file-img" src="../../assets/images/png.png" />
890 </template>
891 <template
892 v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'">
893 <img class="file-img" src="../../assets/images/jpg.png" />
894 </template>
895 <div class="file-name">{{ item.name }}</div>
896 <div :style="{ right: '36px' }"
897 v-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'pdf' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'png' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'"
898 class="file-preview" @click="onUploadFilePreview(item)">查看</div>
899 <div :style="{ right: '0px' }" class="file-preview" @click="onUploadFileDownload(item)">下载</div>
900 </div>
901 </span>
902 </div>
903 </div>
904 </ContentWrap>
905 <ContentWrap id="id-qualityEvaluate" v-if="route.query.type == 'qualityEvaluate' && evaDetailInfo.qualityScore != null" title="质量评价"
906 description="资产质量评价信息" style="margin-top: 15px">
907 <div class="list_panel">
908 <div class="list_item">
909 <span class="item_label">质量得分:</span>
910 <span class="item_value">{{ evaDetailInfo.qualityScore }}</span>
911 </div>
912 <div class="list_item" :style="{ width: '60%' }">
913 <span class="item_label">评价对象范围:</span>
914 <span class="item_value">{{ evaDetailInfo.evaluationRangeStart + '~' + evaDetailInfo.evaluationRangeEnd
915 }}</span>
916 </div>
917 <div class="list_item is_block">
918 <span class="item_label">质量评价结果:</span>
919 <span class="item_value">{{ evaDetailInfo.evaluationNote ?? '--' }}</span>
920 </div>
921 <div class="list_item is_block" :style="{ 'max-width': '700px' }">
922 <span class="item_label">质量评价报告:</span>
923 <span class="item_value">
924 <div class="file-operate">
925 <img class="file-img" src="../../assets/images/PDF.png" />
926 <div class="file-name">{{ evaDetailInfo.evaluationFile?.[0]?.name }}</div>
927 <div :style="{ right: '36px' }" class="file-preview"
928 @click="onUploadFilePreview(evaDetailInfo.evaluationFile?.[0])">查看</div>
929 <div :style="{ right: '0px' }" class="file-preview"
930 @click="onUploadFileDownload(evaDetailInfo.evaluationFile?.[0])">下载</div>
931 </div>
932 </span>
933 </div>
934 </div>
935 </ContentWrap>
936 <ContentWrap v-if="route.query.type == 'qualityEvaluate'" id="id-approveInfo" title="审批信息" description="" style="margin: 16px 16px 16px">
937 <ApprovalProcess v-if="deploymentId" :deploymentId="deploymentId" :processInstanceId="processInstanceId">
938 </ApprovalProcess>
939 </ContentWrap>
940 </div>
941 <div class="tool_btns" v-if="toolBtns.length && route.query.type == 'qualityEvaluate'">
942 <div class="btns">
943 <el-button v-for="btn in toolBtns" :type="btn.type" :plain="btn.plain" @click="btnClick(btn)">{{ btn.label
944 }}</el-button>
945 </div>
946 </div>
947 <Dialog :dialogInfo="passDialogInfo" @btnClick="passDialogBtnClick" @inputChange=passDialogInputChange />
948 <Dialog :dialogInfo="rejectDialogInfo" @btnClick="rejectDialogBtnClick" />
284 </div> 949 </div>
285 </template> 950 </template>
286 951
287 <style lang="scss" scoped> 952 <style lang="scss" scoped>
288 .main-content { 953 .main-content {
954 height: 100%;
955 }
956
957 .detail-content {
289 overflow-y: auto; 958 overflow-y: auto;
290 height: 100%; 959 height: 100%;
960
961 .panel_wrap {
962 .panel_header {
963 .header_title {
964 height: 40px;
965 padding: 0 16px;
966 background-color: #fafafa;
967 box-shadow: 0 0 0 1px rgba(229, 229, 229, 1);
968 display: flex;
969 align-items: center;
970 }
971
972 .title_text {
973 line-height: 22px;
974 font-size: 14px;
975 color: var(--el-color-regular);
976 font-weight: 600;
977 }
978 }
979 &.results_panel {
980 box-shadow: 0 0 0 1px #d9d9d9;
981 margin: 16px 16px 0px;
982
983 .panel_header {
984 .header_title {
985 background-color: transparent;
986 box-shadow: none;
987
988 .el-icon {
989 margin-right: 8px;
990 width: 20px;
991 height: 20px;
992
993 svg {
994 width: 100%;
995 height: 100%;
996 }
997 }
998 }
999 }
1000
1001 .panel_body {
1002 padding-top: 0;
1003 margin-top: 0;
1004 box-shadow: none;
1005
1006 .results_list {
1007 display: flex;
1008
1009 .list_item {
1010 display: flex;
1011 margin-bottom: 8px;
1012 margin-right: 60px;
1013 color: #666;
1014
1015 .item_value {
1016 word-break: break-all;
1017 padding: 0 8px;
1018 color: var(--el-color-regular);
1019 }
1020 }
1021 }
1022 }
1023
1024 &.success {
1025 background-color: #F4FEF6;
1026 box-shadow: 0 0 0 1px #4FA55D;
1027
1028 .panel_header {
1029 .header_title {
1030 .el-icon {
1031 color: #4FA55D;
1032 }
1033 }
1034 }
1035 }
1036
1037 &.reject {
1038 background-color: #FDF2F4;
1039 box-shadow: 0 0 0 1px #E63E33;
1040
1041 .panel_header {
1042 .header_title {
1043 .el-icon {
1044 color: #E63E33;
1045 }
1046 }
1047 }
1048 }
1049
1050 &.audit {
1051 background-color: #FEFBF3;
1052 box-shadow: 0 0 0 1px #F19E40;
1053
1054 .panel_header {
1055 .header_title {
1056 .el-icon {
1057 color: #F19E40;
1058 }
1059 }
1060 }
1061 }
1062
1063 &.revoke {
1064 background-color: #F5F5F5;
1065 box-shadow: 0 0 0 1px #CCCCCC;
1066
1067 .panel_header {
1068 .header_title {
1069 .el-icon {
1070 color: #666666;
1071 }
1072 }
1073 }
1074 }
1075 }
1076 }
291 } 1077 }
292 1078
293 .header { 1079 .header {
...@@ -375,4 +1161,117 @@ const handleTableViewData = (scope) => { ...@@ -375,4 +1161,117 @@ const handleTableViewData = (scope) => {
375 padding-right: 8px; 1161 padding-right: 8px;
376 } 1162 }
377 } 1163 }
1164
1165 .tool_btns {
1166 width: 100%;
1167 display: flex;
1168 justify-content: center;
1169 align-items: center;
1170 height: 44px;
1171 padding: 0 16px;
1172 border-top: 1px solid var(--el-border-color-regular);
1173 }
1174
1175 .file-operate {
1176 display: flex;
1177 align-items: center;
1178 position: relative;
1179
1180 .file-img {
1181 width: 24px;
1182 height: 24px;
1183 }
1184
1185 &:hover {
1186 background-color: #f5f5f5;
1187 }
1188
1189 .file-name {
1190 color: var(--el-color-regular);
1191 margin-left: 4px;
1192 }
1193
1194 .file-preview {
1195 position: absolute;
1196 cursor: pointer;
1197 color: var(--el-color-primary);
1198 margin-right: 8px;
1199 }
1200 }
1201
1202 .list_panel {
1203 display: flex;
1204 flex-wrap: wrap;
1205 display: flex;
1206 align-items: center;
1207
1208 .small-title {
1209 width: 100%;
1210 font-size: 14px;
1211 color: var(--el-text-color-primary);
1212 line-height: 18px;
1213 font-weight: 600;
1214 }
1215
1216 .list_item {
1217 width: 33.33%;
1218 line-height: 32px;
1219 font-size: 14px;
1220 color: var(--el-text-color-regular);
1221 display: flex;
1222 justify-content: space-between;
1223 min-width: 120px;
1224
1225 .item_label {
1226 text-align: left;
1227 }
1228
1229 .item_value {
1230 color: var(--el-color-regular);
1231 padding: 0 4px;
1232 flex: 1;
1233 text-align: justify;
1234 min-width: 0;
1235 }
1236
1237 &.is_block {
1238 width: 100%;
1239
1240 .item_value {
1241 white-space: pre-wrap;
1242 }
1243 }
1244
1245 .file-operate {
1246 display: flex;
1247 align-items: center;
1248 position: relative;
1249
1250 .file-img {
1251 width: 24px;
1252 height: 24px;
1253 }
1254
1255 &:hover {
1256 background-color: #f5f5f5;
1257 }
1258
1259 .file-name {
1260 color: var(--el-color-regular);
1261 margin-left: 4px;
1262 }
1263
1264 .file-preview {
1265 position: absolute;
1266 cursor: pointer;
1267 color: var(--el-color-primary);
1268 margin-right: 8px;
1269 }
1270 }
1271 }
1272
1273 .isFile {
1274 flex-direction: column;
1275 }
1276 }
378 </style> 1277 </style>
......
...@@ -11,10 +11,6 @@ import { CircleCloseFilled, Document } from '@element-plus/icons-vue' ...@@ -11,10 +11,6 @@ import { CircleCloseFilled, Document } from '@element-plus/icons-vue'
11 import { ElMessage, ElMessageBox } from "element-plus"; 11 import { ElMessage, ElMessageBox } from "element-plus";
12 import { 12 import {
13 getRegiaterDetail, 13 getRegiaterDetail,
14 getApproveList,
15 registerApproveAllow,
16 registerApproveBackup,
17 registerApproveCancel,
18 getEvaDetail, 14 getEvaDetail,
19 qualityAllow, 15 qualityAllow,
20 costAssessAllow, 16 costAssessAllow,
...@@ -25,7 +21,6 @@ import { ...@@ -25,7 +21,6 @@ import {
25 } from "@/api/modules/dataAsset"; 21 } from "@/api/modules/dataAsset";
26 import { 22 import {
27 getTenantDetailInfo, 23 getTenantDetailInfo,
28 getImageContent,
29 getTenantInfo 24 getTenantInfo
30 } from "@/api/modules/queryService"; 25 } from "@/api/modules/queryService";
31 import { passFlowData, rejectFlowData, revokeFlowData } from "@/api/modules/workFlowService"; 26 import { passFlowData, rejectFlowData, revokeFlowData } from "@/api/modules/workFlowService";
...@@ -87,6 +82,8 @@ const getDetailInfo = () => { ...@@ -87,6 +82,8 @@ const getDetailInfo = () => {
87 const data = res.data || {}; 82 const data = res.data || {};
88 evaDetailInfo.value = data; 83 evaDetailInfo.value = data;
89 detailInfo.value = data; 84 detailInfo.value = data;
85 deploymentId.value = data.approveVO.camundaDeploymentId;
86 processInstanceId.value = data.approveVO?.camundaInstanceId;
90 //需要显示质量评价信息 87 //需要显示质量评价信息
91 if (data.qualityScore != null) { 88 if (data.qualityScore != null) {
92 if (tabsInfo.value.tabs.length == 4) { 89 if (tabsInfo.value.tabs.length == 4) {
...@@ -509,13 +506,13 @@ const toolBtns: any = computed(() => { ...@@ -509,13 +506,13 @@ const toolBtns: any = computed(() => {
509 } 506 }
510 return btnsArr; 507 return btnsArr;
511 } 508 }
512 if (detailInfo.value.approveState == 'A') { 509 let approveVO = detailInfo.value.approveVO;
513 if (detailInfo.value.approveTenantGuids?.includes(userData.tenantGuid)) { 510 let staffGuid = userData.staffGuid;
514 btnsArr.push(...[{ label: "通过", value: "pass", type: 'primary' }, { label: "驳回", value: "reject", type: 'danger', plain: true }]); 511 if (approveVO && approveVO.approveState == 'A' && approveVO.approveStaffGuids&&approveVO.approveStaffGuids.indexOf(staffGuid) > -1) {
515 } 512 btnsArr.push(...[{ label: "通过", value: "pass", type: 'primary' }, { label: "驳回", value: "reject", type: 'danger', plain: true }]);
516 if (detailInfo.value.tenantGuid == userData.tenantGuid) { 513 }
517 btnsArr.push({ label: "撤销", value: "revoke" }); 514 if (approveVO && approveVO.approveState == 'A' && approveVO.staffGuid == staffGuid) {
518 } 515 btnsArr.push({ label: "撤销", value: "revoke" });
519 } 516 }
520 return btnsArr; 517 return btnsArr;
521 }); 518 });
...@@ -920,12 +917,15 @@ const passDialogBtnClick = (btn, info) => { ...@@ -920,12 +917,15 @@ const passDialogBtnClick = (btn, info) => {
920 return; 917 return;
921 } 918 }
922 submitPromise.value = qualityAllow({ 919 submitPromise.value = qualityAllow({
923 guid: detailInfo.value.guid, 920 bizGuid: detailInfo.value.guid,
921 flowType: detailInfo.value.approveVO.flowType,
922 approveStaffGuid: userData.staffGuid,
923 guid: detailInfo.value.approveVO.approveGuid,
924 qualityScore: info.qualityScore, 924 qualityScore: info.qualityScore,
925 evaluationRangeStart: info.evaluationRange[0], 925 evaluationRangeStart: info.evaluationRange[0],
926 evaluationRangeEnd: info.evaluationRange[1], 926 evaluationRangeEnd: info.evaluationRange[1],
927 evaluationNote: info.evaluationNote, 927 evaluationNote: info.evaluationNote,
928 evaluationFile: info.evaluationFile.map(f => f.url), 928 evaluationFile: info.evaluationFile || [],
929 }).then((res: any) => { 929 }).then((res: any) => {
930 submitPromise.value = null; 930 submitPromise.value = null;
931 if (res?.code == proxy.$passCode) { 931 if (res?.code == proxy.$passCode) {
...@@ -1086,34 +1086,34 @@ const formattedDate = (dateVal) => { ...@@ -1086,34 +1086,34 @@ const formattedDate = (dateVal) => {
1086 </div> 1086 </div>
1087 <div class="main-wrap" ref="contentRef"> 1087 <div class="main-wrap" ref="contentRef">
1088 <div v-if="detailType != 'certificate' && detailType != 'asset'" 1088 <div v-if="detailType != 'certificate' && detailType != 'asset'"
1089 :class="['panel_wrap', 'results_panel', detailInfo.approveState == 'Y' ? 'success' : (detailInfo.approveState == 'R' ? 'reject' : (detailInfo.approveState == 'C' ? 'revoke' : 'audit'))]"> 1089 :class="['panel_wrap', 'results_panel', detailInfo.approveVO?.approveState == 'Y' ? 'success' : (detailInfo.approveVO?.approveState == 'R' ? 'reject' : (detailInfo.approveVO?.approveState == 'C' ? 'revoke' : 'audit'))]">
1090 <div class="panel_header"> 1090 <div class="panel_header">
1091 <div class="header_title" v-if="detailInfo.approveState == 'Y'"> 1091 <div class="header_title" v-if="detailInfo.approveVO?.approveState == 'Y'">
1092 <el-icon class="title-icon"> 1092 <el-icon class="title-icon">
1093 <svg-icon name="icon-success" /> 1093 <svg-icon name="icon-success" />
1094 </el-icon> 1094 </el-icon>
1095 <span class="title_text">审批通过</span> 1095 <span class="title_text">审批通过</span>
1096 </div> 1096 </div>
1097 <div class="header_title" v-else-if="detailInfo.approveState == 'R'"> 1097 <div class="header_title" v-else-if="detailInfo.approveVO?.approveState == 'R'">
1098 <el-icon class="title-icon"> 1098 <el-icon class="title-icon">
1099 <CircleCloseFilled /> 1099 <CircleCloseFilled />
1100 </el-icon> 1100 </el-icon>
1101 <span class="title_text">审批被驳回</span> 1101 <span class="title_text">审批被驳回</span>
1102 </div> 1102 </div>
1103 <div class="header_title" v-else-if="detailInfo.approveState == 'A'"> 1103 <div class="header_title" v-else-if="detailInfo.approveVO?.approveState == 'A'">
1104 <el-icon class="title-icon"> 1104 <el-icon class="title-icon">
1105 <svg-icon name="icon-audit" /> 1105 <svg-icon name="icon-audit" />
1106 </el-icon> 1106 </el-icon>
1107 <span class="title_text">待审批</span> 1107 <span class="title_text">待审批</span>
1108 </div> 1108 </div>
1109 <div class="header_title" v-else-if="detailInfo.approveState == 'C'"> 1109 <div class="header_title" v-else-if="detailInfo.approveVO?.approveState == 'C'">
1110 <el-icon class="title-icon"> 1110 <el-icon class="title-icon">
1111 <svg-icon name="icon-revoke" /> 1111 <svg-icon name="icon-revoke" />
1112 </el-icon> 1112 </el-icon>
1113 <span class="title_text">已撤销</span> 1113 <span class="title_text">已撤销</span>
1114 </div> 1114 </div>
1115 </div> 1115 </div>
1116 <div class="panel_body" v-if="detailInfo.approveState != 'A' && detailInfo.approveState != 'C'"> 1116 <div class="panel_body" v-if="detailInfo.approveVO?.approveState != 'A' && detailInfo.approveVO?.approveState != 'C'">
1117 <div class="results_list"> 1117 <div class="results_list">
1118 <div class="list_item"> 1118 <div class="list_item">
1119 <span class="item_label">审批人:</span> 1119 <span class="item_label">审批人:</span>
...@@ -1123,7 +1123,7 @@ const formattedDate = (dateVal) => { ...@@ -1123,7 +1123,7 @@ const formattedDate = (dateVal) => {
1123 <span class="item_label">审批时间:</span> 1123 <span class="item_label">审批时间:</span>
1124 <span class="item_value">{{ approveTableInfo.data.at(-1)?.approveTime || '--' }}</span> 1124 <span class="item_value">{{ approveTableInfo.data.at(-1)?.approveTime || '--' }}</span>
1125 </div> 1125 </div>
1126 <div class="list_item" v-if="detailInfo.approveState == 'R'"> 1126 <div class="list_item" v-if="detailInfo.approveVO?.approveState == 'R'">
1127 <span class="item_label">审批意见:</span> 1127 <span class="item_label">审批意见:</span>
1128 <span class="item_value">{{ approveTableInfo.data.at(-1)?.approveSuggest || '--' }}</span> 1128 <span class="item_value">{{ approveTableInfo.data.at(-1)?.approveSuggest || '--' }}</span>
1129 </div> 1129 </div>
...@@ -1380,7 +1380,7 @@ const formattedDate = (dateVal) => { ...@@ -1380,7 +1380,7 @@ const formattedDate = (dateVal) => {
1380 </div> 1380 </div>
1381 </span> 1381 </span>
1382 </div> 1382 </div>
1383 <!-- <div class="list_item is_block isFile" :style="{ width: '40%' }" 1383 <div class="list_item is_block isFile" :style="{ width: '40%' }"
1384 v-if="(detailType != 'asset' || assetDetailInfo.isEvaluationAssessment == 'Y') && assetDetailInfo.registerAttachment?.qualityEvaluationFile?.length"> 1384 v-if="(detailType != 'asset' || assetDetailInfo.isEvaluationAssessment == 'Y') && assetDetailInfo.registerAttachment?.qualityEvaluationFile?.length">
1385 <span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">数据质量评价收集</span> 1385 <span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">数据质量评价收集</span>
1386 <span v-for="(item) in (assetDetailInfo.registerAttachment?.qualityEvaluationFile || [])" 1386 <span v-for="(item) in (assetDetailInfo.registerAttachment?.qualityEvaluationFile || [])"
...@@ -1410,14 +1410,14 @@ const formattedDate = (dateVal) => { ...@@ -1410,14 +1410,14 @@ const formattedDate = (dateVal) => {
1410 v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'"> 1410 v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'">
1411 <img class="file-img" src="../../assets/images/jpg.png" /> 1411 <img class="file-img" src="../../assets/images/jpg.png" />
1412 </template> 1412 </template>
1413 <div class="file-name">{{ setFileName(item.name) }}</div> 1413 <div class="file-name">{{ item.name }}</div>
1414 <div :style="{ right: '36px' }" 1414 <div :style="{ right: '36px' }"
1415 v-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'pdf' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'png' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'" 1415 v-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'pdf' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'png' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'"
1416 class="file-preview" @click="onUploadFilePreview(item)">查看</div> 1416 class="file-preview" @click="onUploadFilePreview(item)">查看</div>
1417 <div :style="{ right: '0px' }" class="file-preview" @click="onUploadFileDownload(item)">下载</div> 1417 <div :style="{ right: '0px' }" class="file-preview" @click="onUploadFileDownload(item)">下载</div>
1418 </div> 1418 </div>
1419 </span> 1419 </span>
1420 </div> --> 1420 </div>
1421 <div class="list_item is_block isFile" :style="{ width: '40%', 'margin-right': '28px' }" 1421 <div class="list_item is_block isFile" :style="{ width: '40%', 'margin-right': '28px' }"
1422 v-if="detailType == 'certificate' && assetDetailInfo.registerAttachment?.assessmentFile?.length"> 1422 v-if="detailType == 'certificate' && assetDetailInfo.registerAttachment?.assessmentFile?.length">
1423 <span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">数据价值评估</span> 1423 <span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">数据价值评估</span>
...@@ -1456,88 +1456,6 @@ const formattedDate = (dateVal) => { ...@@ -1456,88 +1456,6 @@ const formattedDate = (dateVal) => {
1456 </div> 1456 </div>
1457 </span> 1457 </span>
1458 </div> 1458 </div>
1459 <div class="list_item is_block isFile" :style="{ width: '40%', 'margin-right': '28px' }"
1460 v-if="detailType == 'certificate' && assetDetailInfo.registerAttachment?.evaluationFile?.length">
1461 <span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">质量评估报告</span>
1462 <span v-for="(item) in (assetDetailInfo.registerAttachment?.evaluationFile || [])" class="item_value"
1463 :style="{ 'padding-left': '0px' }">
1464 <div class="file-operate">
1465 <template
1466 v-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'xls' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'xlsx' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'csv'">
1467 <img class="file-img" src="../../assets/images/excel.png" />
1468 </template>
1469 <template
1470 v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'doc' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'docx'">
1471 <img class="file-img" src="../../assets/images/word.png" />
1472 </template>
1473 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'zip'">
1474 <img class="file-img" src="../../assets/images/zip.png" />
1475 </template>
1476 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'rar'">
1477 <img class="file-img" src="../../assets/images/RAR.png" />
1478 </template>
1479 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'pdf'">
1480 <img class="file-img" src="../../assets/images/PDF.png" />
1481 </template>
1482 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'png'">
1483 <img class="file-img" src="../../assets/images/png.png" />
1484 </template>
1485 <template
1486 v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'">
1487 <img class="file-img" src="../../assets/images/jpg.png" />
1488 </template>
1489 <div class="file-name">{{ setFileName(item.name) }}</div>
1490 <div :style="{ right: '36px' }"
1491 v-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'pdf' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'png' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'"
1492 class="file-preview" @click="onUploadFilePreview(item)">查看</div>
1493 <div :style="{ right: '0px' }" class="file-preview" @click="onUploadFileDownload(item)">下载</div>
1494 </div>
1495 </span>
1496 </div>
1497
1498
1499
1500
1501 <div class="list_item is_block isFile" :style="{ width: '40%', 'margin-right': '28px' }"
1502 v-if="(detailType == 'asset' && assetDetailInfo.isCostAssessment == 'Y') && assetDetailInfo.registerAttachment?.costAssessmentFile?.length">
1503 <span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">价值评估报告</span>
1504 <span v-for="(item) in (assetDetailInfo.registerAttachment?.costAssessmentFile || [])" class="item_value"
1505 :style="{ 'padding-left': '0px' }">
1506 <div class="file-operate">
1507 <template
1508 v-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'xls' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'xlsx' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'csv'">
1509 <img class="file-img" src="../../assets/images/excel.png" />
1510 </template>
1511 <template
1512 v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'doc' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'docx'">
1513 <img class="file-img" src="../../assets/images/word.png" />
1514 </template>
1515 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'zip'">
1516 <img class="file-img" src="../../assets/images/zip.png" />
1517 </template>
1518 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'rar'">
1519 <img class="file-img" src="../../assets/images/RAR.png" />
1520 </template>
1521 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'pdf'">
1522 <img class="file-img" src="../../assets/images/PDF.png" />
1523 </template>
1524 <template v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'png'">
1525 <img class="file-img" src="../../assets/images/png.png" />
1526 </template>
1527 <template
1528 v-else-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'">
1529 <img class="file-img" src="../../assets/images/jpg.png" />
1530 </template>
1531 <div class="file-name">{{ setFileName(item.name) }}</div>
1532 <div :style="{ right: '36px' }"
1533 v-if="item.name.substring(item.name.lastIndexOf('.') + 1) == 'pdf' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'png' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpg' || item.name.substring(item.name.lastIndexOf('.') + 1) == 'jpeg'"
1534 class="file-preview" @click="onUploadFilePreview(item)">查看</div>
1535 <div :style="{ right: '0px' }" class="file-preview" @click="onUploadFileDownload(item)">下载</div>
1536 </div>
1537 </span>
1538 </div>
1539
1540
1541 1459
1542 <div class="list_item is_block isFile" :style="{ width: '40%' }" 1460 <div class="list_item is_block isFile" :style="{ width: '40%' }"
1543 v-if="(detailType == 'asset' && assetDetailInfo.isQualityAssessment == 'Y') && assetDetailInfo.registerAttachment?.evaluationFile?.length"> 1461 v-if="(detailType == 'asset' && assetDetailInfo.isQualityAssessment == 'Y') && assetDetailInfo.registerAttachment?.evaluationFile?.length">
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!