From b3fedd4221b807a07058be9d5d5d8ba8998adbcb Mon Sep 17 00:00:00 2001 From: Bang Hu <hu_bang@hotmail.com> Date: 星期四, 11 九月 2025 21:35:31 +0800 Subject: [PATCH] Bug修改代码提交 --- src/views/tradeManage/detail/index.vue | 258 +++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 206 insertions(+), 52 deletions(-) diff --git a/src/views/tradeManage/detail/index.vue b/src/views/tradeManage/detail/index.vue index 098fffc..c5eb9b5 100644 --- a/src/views/tradeManage/detail/index.vue +++ b/src/views/tradeManage/detail/index.vue @@ -24,7 +24,7 @@ <el-tag :type="getStatusType(detail.status)" size="small">{{ detail.statusName }}</el-tag> </el-descriptions-item> </el-descriptions> - + <!-- 鐢宠浜轰俊鎭紙涓庤鍗曚俊鎭悓鍗$墖锛屽鐢ㄥ垎闅旀爣棰樻牱寮忥級 --> <el-descriptions :column="2" @@ -68,13 +68,19 @@ </el-descriptions-item> <el-descriptions-item label="鎻愪緵鑰�">{{ detail.supplier }}</el-descriptions-item> <el-descriptions-item label="琛屼笟棰嗗煙">{{ detail.industry }}</el-descriptions-item> - <el-descriptions-item label="鍗曚綅宸ョ▼">{{ detail.projectUnit }}</el-descriptions-item> + <el-descriptions-item label="鍗曚綅宸ョ▼"> + <el-tooltip effect="dark" :content="detail.projectUnit || '-'" placement="top" :disabled="!(detail.projectUnit && String(detail.projectUnit).trim())" popper-class="tooltip-wrap"> + <div class="ellipsis-1">{{ detail.projectUnit || '-' }}</div> + </el-tooltip> + </el-descriptions-item> <el-descriptions-item label="浜у搧绫诲瀷">{{ detail.productType || '-' }}</el-descriptions-item> <el-descriptions-item label="浜у搧绠�浠�"> - <div class="desc-wrap">{{ detail.productDesc }}</div> + <el-tooltip effect="dark" :content="detail.productDesc || '-'" placement="top" :disabled="!(detail.productDesc && String(detail.productDesc).trim())" popper-class="tooltip-wrap" trigger="click"> + <div class="desc-wrap ellipsis-3">{{ detail.productDesc || '-' }}</div> + </el-tooltip> </el-descriptions-item> </el-descriptions> - + <!-- 璁㈠崟璇︽儏锛堢Щ鍔ㄥ埌浜ゆ槗鍐呭涓嬮潰锛屽悓涓�鍗$墖鍐咃級 --> <div ref="orderTableWrapRef"> <el-table @@ -226,11 +232,11 @@ </el-card> <!-- 瀹℃壒杩借釜 --> - <el-card class="mt15" shadow="never" v-if="detail.records?.length"> + <el-card class="mt15" shadow="never"> <div class="title">瀹℃壒杩借釜</div> - + <!-- 鏍囩椤� --> - <el-tabs v-model="activeTab" class="approval-tabs"> + <!-- <el-tabs v-model="activeTab" class="approval-tabs"> <el-tab-pane label="瀹℃壒璁板綍" name="records"> <el-table :data="detail.records" @@ -279,13 +285,65 @@ </el-table-column> </el-table> </el-tab-pane> - </el-tabs> - - <!-- 杩斿洖鎸夐挳 --> - <div class="action-buttons"> - <el-button @click="goBack">杩斿洖</el-button> + </el-tabs> --> + + <!-- 澶栭儴绯荤粺瀹℃壒杞ㄨ抗 iframe --> + <div class="iframe-wrap" v-if="workflowIframeUrl"> + <iframe :src="workflowIframeUrl" class="workflow-iframe" referrerpolicy="no-referrer"></iframe> + </div> + + </el-card> + + <!-- 浜ゆ槗璇勪环锛堝綋宸茶瘎浠锋椂鏄剧ず锛� --> + <el-card class="mt15" shadow="never" v-if="showEvaluation"> + <div class="title">浜ゆ槗璇勪环</div> + <div class="evaluation-content"> + <div class="evaluation-form"> + <div class="rating-section"> + <div class="rating-items"> + <div class="rating-row"> + <div class="rating-item"> + <label class="required">缁煎悎璇勫垎:</label> + <el-rate :model-value="evaluation.overallRating" :max="5" disabled :colors="['#99A9BF', '#F7BA2A', '#FF9900']" /> + </div> + <div class="rating-item"> + <label class="required">鏈嶅姟璇勫垎:</label> + <el-rate :model-value="evaluation.serviceRating" :max="5" disabled :colors="['#99A9BF', '#F7BA2A', '#FF9900']" /> + </div> + </div> + <div class="rating-row"> + <div class="rating-item"> + <label class="required">璐ㄩ噺璇勫垎:</label> + <el-rate :model-value="evaluation.qualityRating" :max="5" disabled :colors="['#99A9BF', '#F7BA2A', '#FF9900']" /> + </div> + <div class="rating-item"> + <label class="required">閫熷害璇勫垎:</label> + <el-rate :model-value="evaluation.speedRating" :max="5" disabled :colors="['#99A9BF', '#F7BA2A', '#FF9900']" /> + </div> + </div> + </div> + </div> + + <div class="form-item"> + <label class="required">璇勪环鍐呭:</label> + <div class="eval-text">{{ evaluation.content || '-' }}</div> + </div> + + <div class="form-item"> + <label>鍏朵粬淇℃伅:</label> + <div class="eval-meta"> + <span>鏄惁鍖垮悕锛歿{ evaluation.isAnonymous ? '鏄�' : '鍚�' }}</span> + <span class="split">|</span> + <span>璇勪环鏃堕棿锛歿{ evaluation.evaluateTime || '-' }}</span> + </div> + </div> + </div> </div> </el-card> + <!-- 杩斿洖鎸夐挳 --> + <div class="action-buttons"> + <el-button @click="goBack">杩斿洖</el-button> + </div> </div> </template> @@ -296,12 +354,32 @@ import { ElMessage } from 'element-plus' import orderApi from '@/api/orderApi' import createAxios from '@/utils/axios' +import productApi from '@/api/productApi' +import sysUserService from '@/api/sysUser' +import { useUserInfo } from '@/stores/modules/userInfo' +const hostUrl = import.meta.env.VITE_AXIOS_BASE_URL const route = useRoute() const router = useRouter() const detail = reactive<any>({ items: [], records: [], nodes: [] }) +const evaluation = reactive<any>({ + content: '', + overallRating: 0, + serviceRating: 0, + qualityRating: 0, + speedRating: 0, + isAnonymous: false, + evaluateTime: '' +}) const orderTableWrapRef = ref<HTMLElement | null>(null) const activeTab = ref('records') +const userStore = useUserInfo() +// 澶栭儴瀹℃壒杞ㄨ抗iframe鍦板潃 +const workflowIframeUrl = computed(() => { + const pid = (detail.workflowId || route.query.processinstId || '').toString().trim() + if (!pid) return '' + return `${hostUrl}/activity/history?processinstId=${encodeURIComponent(pid)}&token=${userStore.getAdminToken}` +}) const labelStyle = { width: '180px', maxWidth: '180px' } const contentStyle = { width: 'calc(50% - 180px)' } @@ -318,6 +396,11 @@ const statusOrder = ['WAIT_UPLOAD', 'WAIT_AUTHORIZE', 'WAIT_CONFIRM', 'COMPLETED', 'EVALUATED'] const currentStatus = statusServerToUi[statusName] return currentStatus && statusOrder.indexOf(currentStatus) >= statusOrder.indexOf('WAIT_CONFIRM') +}) + +// 鏄惁鏄剧ず璇勪环鍗$墖锛堝凡璇勪环鏃舵樉绀猴級 +const showEvaluation = computed(() => { + return (detail.isEvaluate === '宸茶瘎浠�') }) // 璁$畻琛ㄦ牸鏁版嵁锛屾坊鍔犳眹鎬昏 @@ -361,23 +444,56 @@ onMounted(async () => { const orderId = String(route.params.id || '') if (!orderId) return - + try { // 骞惰鑾峰彇璁㈠崟璇︽儏鍜屽崗璁被鍨嬫鏌� const [orderRes, agreementRes] = await Promise.all([ orderApi.getOrderDetail(orderId), orderApi.checkAgreementPriceType(orderId) ]) - + const res = orderRes as any const data = res?.data || {} - + // 璁剧疆鏄惁涓哄崗璁鍗� const agreementResult = agreementRes as any isAgreementOrder.value = agreementResult?.data === true const statusName: string = data.orderStatus || '' const uiStatus = statusServerToUi[statusName] || 'INFO' + + // 鏍规嵁浜у搧id鑾峰彇浜у搧淇℃伅锛屾洿鏂板ご閮ㄥ睍绀� + try { + if (data.productId) { + const detailRes: any = await productApi.getProductById({ id: data.productId }) + if (detailRes?.code === 200 && detailRes.data) { + // 鐢ㄤ骇鍝佽鎯呰ˉ鍏ㄥご淇℃伅 + data.productName = detailRes.data.name || data.productName + data.providerName = detailRes.data.submissionUnit || data.providerName + data.industry = detailRes.data.industrialChainName || data.industry + data.productDesc = detailRes.data.describe || data.productDesc + data.projectUnit = detailRes.data.importantAreaName || data.productDesc + data.productType = detailRes.data.typeName || data.productDesc + } + } + } catch (e) { + // 蹇界暐浜у搧璇︽儏澶辫触锛屼笉闃诲璁㈠崟璇︽儏 + } + + // 鑾峰彇鐢ㄦ埛淇℃伅 + try { + const userRes: any = await sysUserService.getUserdetail({ userId: data.userId }) + if (userRes?.code === 200 && userRes.data) { + // 鐢ㄤ骇鍝佽鎯呰ˉ鍏ㄥご淇℃伅 + data.unitName = userRes.data.unitName || data.unitName + data.userName = userRes.data.name || data.userName + data.userDept = userRes.data.departmentName || data.userDept + data.userPhone = userRes.data.phone || data.userPhone + data.userAccount = userRes.data.username || data.userAccount + } + }catch (e){ + + } // 鏄犲皠璁㈠崟璇︽儏澶撮儴淇℃伅 const head = { @@ -397,6 +513,7 @@ projectUnit: data.projectUnit || '-', productType: data.productType || '-', productDesc: data.productDesc || '-', + isEvaluate: data.isEvaluate || '鏈瘎浠�' } // 鏄庣粏椤规槧灏� @@ -430,7 +547,20 @@ cashTotal: cashTotalNum.toLocaleString(), records: [], nodes: [], + workflowId: data.workflowId || data.processinstId || '' }) + + // 鏄犲皠浜ゆ槗璇勪环淇℃伅锛堝鏋滃瓨鍦級 + if (data.evaluation) { + evaluation.content = data.evaluation.content || '' + evaluation.overallRating = Number(data.evaluation.rating || data.evaluation.overallRating || 0) + evaluation.serviceRating = Number(data.evaluation.serviceRating || 0) + evaluation.qualityRating = Number(data.evaluation.qualityRating || 0) + // 鍚庣涓� deliveryRating锛屽榻愬墠绔� speedRating 鍛藉悕 + evaluation.speedRating = Number(data.evaluation.deliveryRating || data.evaluation.speedRating || 0) + evaluation.isAnonymous = Boolean(data.evaluation.isAnonymous) + evaluation.evaluateTime = formatDateTime((data.evaluation.replyTime || data.evaluation.createdAt || data.evaluation.createTime) as any) + } // 鍒濆鍖栦氦鏄撲俊鎭娉ㄦ暟鎹� remarkItems.value = (detail.items || []).map((item: any, index: number) => { @@ -443,11 +573,11 @@ endDateObj.setFullYear(endDateObj.getFullYear() + item.period) endDate = endDateObj.toISOString().split('T')[0] // 鏍煎紡鍖栦负 YYYY-MM-DD } - - return { + + return { name: item.name, start: data.applyTime ? data.applyTime.split('T')[0] : '', // 浣跨敤璁㈠崟鐢宠鏃堕棿 - end: endDate, + end: endDate, forever: item.period === 0, // 鏈熼檺涓�0鏃惰缃负姘镐箙 remark: item.remarks || '' // 浣跨敤濂椾欢淇℃伅涓殑remarks瀛楁 } @@ -510,7 +640,7 @@ } // 琛ㄥご鏂囧瓧灞呬腑锛屼絾绗竴琛岀殑"璇︽儏"鏂囧瓧闈犲乏瀵归綈 -const headerCenterStyle: CSSProperties = { +const headerCenterStyle: CSSProperties = { textAlign: 'center', fontSize: '14px', background: '#f3f6fb' @@ -520,7 +650,7 @@ const bodyCellStyle: CSSProperties = { fontSize: '12px' } // 瀹℃壒杩借釜琛ㄦ牸鏍峰紡 -const recordTableHeaderStyle: CSSProperties = { +const recordTableHeaderStyle: CSSProperties = { textAlign: 'center', fontSize: '14px', background: '#f3f6fb' @@ -528,7 +658,7 @@ const recordTableCellStyle: CSSProperties = { fontSize: '12px' } // 鏂囦欢鍒楄〃琛ㄦ牸琛ㄥご鏂囧瓧灞呬腑锛屼絾绗竴鍒楃殑"浜ゆ槗鏂囦欢"鏂囧瓧闈犲乏瀵归綈 -const fileTableHeaderStyle: CSSProperties = { +const fileTableHeaderStyle: CSSProperties = { textAlign: 'center', fontSize: '14px', background: '#f3f6fb' @@ -587,23 +717,23 @@ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx ] - + // 濡傛灉MIME绫诲瀷鍖归厤锛岀洿鎺ヨ繑鍥瀟rue if (previewableTypes.includes(file.type || '')) { return true } - + // 濡傛灉MIME绫诲瀷涓虹┖鎴栦笉鍖归厤锛屾牴鎹枃浠舵墿灞曞悕鍒ゆ柇 const fileName = file.name || '' const fileExtension = fileName.toLowerCase().split('.').pop() - + const previewableExtensions = [ 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'txt', 'html', 'htm', 'css', 'js', 'pdf', 'docx', 'xlsx', 'pptx' ] - + return previewableExtensions.includes(fileExtension) } @@ -619,13 +749,13 @@ ElMessage.warning('鏂囦欢閾炬帴涓嶅瓨鍦�') return } - + // 鑾峰彇鏂囦欢鎵╁睍鍚� const fileName = file.name || '' const fileExtension = fileName.toLowerCase().split('.').pop() - + let previewUrl = file.url - + // 濡傛灉鏂囦欢瀛樺偍鍦∕inIO锛屼紭鍏堜娇鐢ㄩ瑙圲RL if (file.url.includes('order-attachments')) { try { @@ -637,13 +767,14 @@ fileName: file.url } }) - + console.log('棰勮URL鍝嶅簲:', previewResponse) - + // 妫�鏌ュ搷搴旀牸寮� const responseData = previewResponse as any if (responseData && responseData.code === 200 && responseData.data) { - previewUrl = responseData.data + previewUrl = responseData.data.replaceAll("http://192.168.20.52:9000", import.meta.env.VITE_FILE_PREVIEW_URL) + // previewUrl = responseData.data console.log('浣跨敤棰勮URL:', previewUrl) } else { console.log('棰勮URL鑾峰彇澶辫触锛屼娇鐢ㄤ笅杞芥柟寮�') @@ -657,7 +788,7 @@ originalName: file.name } }) - + // 鍒涘缓棰勮URL const blob = new Blob([response as any]) previewUrl = window.URL.createObjectURL(blob) @@ -669,30 +800,30 @@ return } } - + // 鍥剧墖鏂囦欢鐩存帴鍦ㄦ柊绐楀彛鎵撳紑 - if ((file.type && file.type.startsWith('image/')) || + if ((file.type && file.type.startsWith('image/')) || ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].includes(fileExtension)) { console.log('棰勮鍥剧墖鏂囦欢:', previewUrl) window.open(previewUrl, '_blank') return } - + // PDF鏂囦欢鍦ㄦ柊绐楀彛鎵撳紑 if (file.type === 'application/pdf' || fileExtension === 'pdf') { console.log('棰勮PDF鏂囦欢:', previewUrl) window.open(previewUrl, '_blank') return } - + // 鏂囨湰鏂囦欢鍦ㄦ柊绐楀彛鎵撳紑 - if ((file.type && file.type.startsWith('text/')) || + if ((file.type && file.type.startsWith('text/')) || ['txt', 'html', 'htm', 'css', 'js'].includes(fileExtension)) { console.log('棰勮鏂囨湰鏂囦欢:', previewUrl) window.open(previewUrl, '_blank') return } - + // Office鏂囨。鍜屽叾浠栨枃浠剁被鍨嬶紝灏濊瘯鍦ㄦ柊绐楀彛鎵撳紑 try { console.log('棰勮鍏朵粬鏂囦欢:', previewUrl) @@ -709,14 +840,14 @@ ElMessage.warning('鏂囦欢閾炬帴涓嶅瓨鍦�') return } - + console.log('寮�濮嬩笅杞芥枃浠�:', file.name, 'URL:', file.url) - + try { // 濡傛灉鏂囦欢瀛樺偍鍦∕inIO锛屼娇鐢ㄥ悗绔洿鎺ヤ笅杞紸PI if (file.url.includes('order-attachments')) { console.log('浣跨敤MinIO涓嬭浇API') - + // 浣跨敤axios閫氳繃浠g悊璁块棶鍚庣API const response = await createAxios({ url: `/admin/file/download`, @@ -727,28 +858,28 @@ originalName: file.name } }) - + console.log('涓嬭浇鍝嶅簲:', response) - + // 鍒涘缓涓嬭浇閾炬帴 const blob = new Blob([response as any]) const downloadUrl = window.URL.createObjectURL(blob) - + console.log('鍒涘缓涓嬭浇閾炬帴:', downloadUrl) - + const link = document.createElement('a') link.href = downloadUrl link.download = file.name || 'download' link.target = '_blank' link.rel = 'noopener noreferrer' - + document.body.appendChild(link) link.click() document.body.removeChild(link) - + // 娓呯悊URL瀵硅薄 window.URL.revokeObjectURL(downloadUrl) - + ElMessage.success('鏂囦欢涓嬭浇鎴愬姛') } else { console.log('浣跨敤鐩存帴URL涓嬭浇') @@ -758,11 +889,11 @@ link.download = file.name || 'download' link.target = '_blank' link.rel = 'noopener noreferrer' - + document.body.appendChild(link) link.click() document.body.removeChild(link) - + ElMessage.success('寮�濮嬩笅杞芥枃浠�') } } catch (error) { @@ -960,6 +1091,25 @@ line-height: 22px; } +/* 鍗曡鐪佺暐锛堢敤浜庘�滃崟浣嶅伐绋嬧�濓級 */ +.ellipsis-1 { + max-height: 22px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* 澶氳鐪佺暐锛堢敤浜庘�滀骇鍝佺畝浠嬧�濓紝鍥哄畾涓�3琛岋紝鍙寜闇�璋冩暣锛� */ +.ellipsis-3 { + display: -webkit-box; + line-clamp: 3; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} + + + /* 瀹℃壒杩借釜鏍囩椤垫牱寮� */ .approval-tabs { margin-top: 15px; @@ -1006,13 +1156,17 @@ text-align: left !important; } +/* 澶栭儴瀹℃壒杞ㄨ抗 iframe 鏍峰紡 */ +.iframe-wrap { margin-top: 10px; } +.workflow-iframe { width: 100%; height: 500px; border: none; border-radius: 6px; } + /* 鏂囦欢鎿嶄綔鎸夐挳鏍峰紡 */ .file-actions { display: flex; gap: 8px; align-items: center; justify-content: center; - + .preview-btn { color: #409eff; &:hover { @@ -1023,7 +1177,7 @@ cursor: not-allowed; } } - + .download-btn { color: #67c23a; &:hover { -- Gitblit v1.8.0