From c1657d7fa4e9c9272da960fb1f7fa2595188571c Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期六, 30 五月 2026 15:06:17 +0800
Subject: [PATCH] 修改协同审批采购,发货,报价显示

---
 src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js                 |   76 ++++++++++++++++++
 src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue                         |    7 +
 src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js           |    3 
 src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue |  123 ++++++++++++++++++++++++++++++
 4 files changed, 202 insertions(+), 7 deletions(-)

diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
index 3251f0c..e2f1e45 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
@@ -457,6 +457,9 @@
     currentNodeIndex: 0,
     approvalRecords,
     rejectReason: approvalRecords.find(r => r.result === "rejected")?.opinion || "",
+    purchaseContractNumber: row.purchaseContractNumber || "",
+    quotationNo: row.quotationNo || "",
+    shippingNo: row.shippingNo || "",
   };
 }
 
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
index 721a5c2..b9eb42f 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -35,9 +35,116 @@
     </div>
     <div class="detail-block">
       <div class="detail-block-title">濉姤鍐呭</div>
-      <FormPayloadFields :fields="formResolved.fields"
+      <!-- 榛樿琛ㄥ崟灞曠ず -->
+      <FormPayloadFields v-if="!isSpecialApprovalType"
+                         :fields="formResolved.fields"
                          :form-payload="formResolved.formPayload"
                          readonly />
+      
+      <!-- 鍙戣揣瀹℃壒璇︽儏 -->
+      <template v-else-if="row.businessType === 7">
+        <div v-if="detailData.shippingInfo" class="shipment-detail">
+          <el-divider content-position="left">鍙戣揣璇︽儏</el-divider>
+          <el-descriptions :column="2" border>
+            <el-descriptions-item label="閿�鍞鍗�">{{ detailData.shippingInfo.salesContractNo || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{ detailData.shippingInfo.shippingNo || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.shippingInfo.customerName || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣绫诲瀷">{{ detailData.shippingInfo.type || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣鏃ユ湡">{{ detailData.shippingInfo.shippingDateDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="瀹℃牳鐘舵��">{{ detailData.shippingInfo.status || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{ detailData.shippingInfo.shippingCarNumber || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="蹇�掑叕鍙�">{{ detailData.shippingInfo.expressCompany || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="蹇�掑崟鍙�" :span="2">{{ detailData.shippingInfo.expressNumber || "--" }}</el-descriptions-item>
+          </el-descriptions>
+          <div v-if="detailData.shippingProductDetailDtoList.length" style="margin-top: 20px;">
+            <h4>浜у搧鏄庣粏</h4>
+            <el-table :data="detailData.shippingProductDetailDtoList"
+                      border
+                      size="small"
+                      style="width: 100%">
+              <el-table-column label="鎵瑰彿" prop="batchNo" min-width="160" show-overflow-tooltip />
+              <el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="160" show-overflow-tooltip />
+              <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" min-width="160" show-overflow-tooltip />
+              <el-table-column label="鍙戣揣鏁伴噺" prop="deliveryQuantity" min-width="120" align="center" />
+            </el-table>
+          </div>
+        </div>
+      </template>
+      
+      <!-- 閲囪喘瀹℃壒璇︽儏 -->
+      <template v-else-if="row.businessType === 5">
+        <div v-if="detailData" class="procurement-detail">
+          <el-divider content-position="left">閲囪喘璇︽儏</el-divider>
+          <el-descriptions :column="2" border>
+            <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{ detailData.purchaseContractNumber || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{ detailData.supplierName || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="椤圭洰鍚嶇О">{{ detailData.projectName || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="閿�鍞悎鍚屽彿">{{ detailData.salesContractNo || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="绛捐鏃ユ湡">{{ detailData.executionDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="褰曞叆鏃ユ湡">{{ detailData.entryDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍚堝悓閲戦" :span="2">
+              <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+                楼{{ Number(detailData.contractAmount ?? 0).toFixed(2) }}
+              </span>
+            </el-descriptions-item>
+          </el-descriptions>
+          <div v-if="detailData.productData.length" style="margin-top: 20px;">
+            <h4>浜у搧鏄庣粏</h4>
+            <el-table :data="detailData.productData"
+                      border
+                      style="width: 100%">
+              <el-table-column prop="productCategory" label="浜у搧鍚嶇О" />
+              <el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" />
+              <el-table-column prop="unit" label="鍗曚綅" />
+              <el-table-column prop="quantity" label="鏁伴噺" />
+              <el-table-column prop="taxInclusiveUnitPrice" label="鍚◣鍗曚环">
+                <template #default="scope">楼{{ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2) }}</template>
+              </el-table-column>
+              <el-table-column prop="taxInclusiveTotalPrice" label="鍚◣鎬讳环">
+                <template #default="scope">楼{{ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2) }}</template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </div>
+      </template>
+      
+      <!-- 鎶ヤ环瀹℃壒璇︽儏 -->
+      <template v-else-if="row.businessType === 6">
+        <div v-if="detailData" class="quotation-detail">
+          <el-divider content-position="left">鎶ヤ环璇︽儏</el-divider>
+          <el-descriptions :column="2" border>
+            <el-descriptions-item label="鎶ヤ环鍗曞彿">{{ detailData.quotationNo || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.customer || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="涓氬姟鍛�">{{ detailData.salesperson || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{ detailData.quotationDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鏈夋晥鏈熻嚦">{{ detailData.validDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鎶ヤ环鎬婚" :span="2">
+              <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+                楼{{ Number(detailData.totalAmount ?? 0).toFixed(2) }}
+              </span>
+            </el-descriptions-item>
+          </el-descriptions>
+          <div v-if="detailData.products.length" style="margin-top: 20px;">
+            <h4>浜у搧鏄庣粏</h4>
+            <el-table :data="detailData.products"
+                      border
+                      style="width: 100%">
+              <el-table-column prop="product" label="浜у搧鍚嶇О" />
+              <el-table-column prop="specification" label="瑙勬牸鍨嬪彿" />
+              <el-table-column prop="unit" label="鍗曚綅" />
+              <el-table-column prop="unitPrice" label="鍗曚环">
+                <template #default="scope">楼{{ Number(scope.row.unitPrice ?? 0).toFixed(2) }}</template>
+              </el-table-column>
+            </el-table>
+          </div>
+          <div v-if="detailData.remark" style="margin-top: 20px;">
+            <h4>澶囨敞</h4>
+            <p>{{ detailData.remark }}</p>
+          </div>
+        </div>
+      </template>
     </div>
     <div v-if="attachmentList.length"
          class="detail-block">
@@ -86,9 +193,21 @@
 
   const props = defineProps({
     row: { type: Object, default: () => ({}) },
+    detailData: { type: Object, default: () => ({}) },
   });
 
   const formResolved = computed(() => resolveInstanceFormFields(props.row));
+
+
+  // 鏄惁涓虹壒娈婂鎵圭被鍨嬶紙閲囪喘銆佸彂璐с�佹姤浠凤級
+  const isSpecialApprovalType = computed(() => {
+    return [5, 7, 6].includes(props.row.businessType);
+  });
+
+  // 璇︽儏鏁版嵁锛堢洿鎺ヤ娇鐢ㄤ紶鍏ョ殑 detail-data 鍙傛暟锛�
+  const detailData = computed(() => {
+    return props.detailData || {};
+  });
 
   const attachmentList = computed(() => {
     const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
@@ -164,4 +283,4 @@
     align-items: center;
     flex-shrink: 0;
   }
-</style>
+</style>
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue
index bbfa56a..4a9cf29 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue
@@ -172,7 +172,7 @@
       class="approve-detail-dialog"
     >
       <div class="approve-detail-body">
-        <ApproveDetailPanel :row="detailRow" />
+        <ApproveDetailPanel :row="detailRow" :detail-data="detailData" />
         <div class="detail-block">
           <div class="detail-block-title">
             瀹℃壒娴佺▼锛坽{ detailRow.tasks?.length || detailRow.flowNodes?.length || 0 }} 椤癸級
@@ -290,7 +290,7 @@
       destroy-on-close
       @closed="approveOpinion = ''"
     >
-      <ApproveDetailPanel :row="approveDialog.row" />
+      <ApproveDetailPanel :row="approveDialog.row" :detail-data="detailData" />
       <div class="detail-block mt16">
         <div class="detail-block-title">
           瀹℃壒娴佺▼锛坽{ approveDialog.row?.tasks?.length || approveDialog.row?.flowNodes?.length || 0 }} 椤癸級
@@ -369,6 +369,7 @@
   tableColumn,
   detailDialog,
   detailRow,
+  detailData,
   reimburseDialog,
   approveDialog,
   approveOpinion,
@@ -610,4 +611,4 @@
   border-left: 3px solid var(--el-color-primary);
   line-height: 1.4;
 }
-</style>
+</style>
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index a4aa917..3f0e99c 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -10,6 +10,9 @@
   saveApprovalInstance,
   updateApprovalInstance,
 } from "@/api/officeProcessAutomation/approvalInstance.js";
+import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
+import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js";
+import { getDeliveryDetailByShippingNo } from "@/api/salesManagement/deliveryLedger.js";
 import useUserStore from "@/store/modules/user";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessage, ElMessageBox } from "element-plus";
@@ -77,6 +80,7 @@
 
   const detailDialog = reactive({ visible: false });
   const detailRow = ref({});
+  const detailData = ref({});
 
   const approveDialog = reactive({ visible: false, row: null });
   const approveOpinion = ref("");
@@ -220,7 +224,7 @@
         fetchBusinessTypeOptions(),
         listApprovalTemplate(TEMPLATE_TYPE_CUSTOM),
       ]);
-      submitBusinessTypeOptions.value = typeOptions;
+      submitBusinessTypeOptions.value = typeOptions.filter((x) => ![5, 6, 7].includes(x.value));
       allSubmitTemplates.value = unwrapTemplateList(customRes)
         .filter((row) => mapEnabledFromApi(row.enabled))
         .map(mapSubmitTemplateCard);
@@ -288,11 +292,46 @@
       await openReimburseDetail(row, "detail");
       return;
     }
+    
     detailRow.value = { ...row };
+    // 鎶ヤ环瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鎶ヤ环鍗曞彿"鍘绘煡鎶ヤ环鍒楄〃
+    if (row.businessType === 6) {
+      const quotationNo = row?.quotationNo;
+      if (quotationNo) {
+        const res = await getQuotationList({ quotationNo });
+        const records = res?.data?.records || [];
+        detailData.value = records[0] || {};
+      }
+    }
+    
+    // 閲囪喘瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"閲囪喘鍚堝悓鍙�"鍘绘煡閲囪喘璇︽儏
+    else if (row.businessType === 5) {
+      const purchaseContractNumber = row?.purchaseContractNumber;
+      if (purchaseContractNumber) {
+        const res = await getPurchaseByCode({ purchaseContractNumber });
+        detailData.value = res || {};
+      }
+    }
+    
+    // 鍙戣揣瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鍙戣揣鍗曞彿"鍘绘煡鍙戣揣璇︽儏
+    else if (row.businessType === 7) {
+      const shippingNo = row?.shippingNo;
+      if (shippingNo) {
+        const res = await getDeliveryDetailByShippingNo({ shippingNo });
+        detailData.value = res?.data || res || {};
+      }
+    }
+    
+    // 鍏朵粬瀹℃壒绫诲瀷
+    else {
+      detailData.value = {};
+    }
+    
     detailDialog.visible = true;
   }
 
   async function openApprove(row) {
+
     if (inferReimburseModuleKeyFromInstance(row)) {
       approveOpinion.value = "";
       await openReimburseDetail(row, "approve");
@@ -300,6 +339,38 @@
     }
     approveDialog.row = { ...row };
     approveOpinion.value = "";
+    // 鎶ヤ环瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鎶ヤ环鍗曞彿"鍘绘煡鎶ヤ环鍒楄〃
+    if (row.businessType === 6) {
+      const quotationNo = row?.quotationNo;
+      if (quotationNo) {
+        const res = await getQuotationList({ quotationNo });
+        const records = res?.data?.records || [];
+        detailData.value = records[0] || {};
+      }
+    }
+
+    // 閲囪喘瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"閲囪喘鍚堝悓鍙�"鍘绘煡閲囪喘璇︽儏
+    else if (row.businessType === 5) {
+      const purchaseContractNumber = row?.purchaseContractNumber;
+      if (purchaseContractNumber) {
+        const res = await getPurchaseByCode({ purchaseContractNumber });
+        detailData.value = res || {};
+      }
+    }
+
+    // 鍙戣揣瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鍙戣揣鍗曞彿"鍘绘煡鍙戣揣璇︽儏
+    else if (row.businessType === 7) {
+      const shippingNo = row?.shippingNo;
+      if (shippingNo) {
+        const res = await getDeliveryDetailByShippingNo({ shippingNo });
+        detailData.value = res?.data || res || {};
+      }
+    }
+
+    // 鍏朵粬瀹℃壒绫诲瀷
+    else {
+      detailData.value = {};
+    }
     approveDialog.visible = true;
   }
 
@@ -586,6 +657,7 @@
     tableColumn,
     detailDialog,
     detailRow,
+    detailData,
     reimburseDialog,
     approveDialog,
     approveOpinion,
@@ -625,4 +697,4 @@
     openApprove,
     fetchApprovalList,
   };
-}
+}
\ No newline at end of file

--
Gitblit v1.9.3