From a868d0b4a9b892bd921b5261757b4eced153d9ce Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 26 一月 2026 10:20:38 +0800
Subject: [PATCH] 进销存升级 1.销售台账页面代码重构 2.发货台账页面联调

---
 src/views/salesManagement/deliveryLedger/index.vue |  122 +++++++++++++++++++++++++++++-
 src/views/salesManagement/salesLedger/index.vue    |  106 +++++++++++++++++++-------
 2 files changed, 194 insertions(+), 34 deletions(-)

diff --git a/src/views/salesManagement/deliveryLedger/index.vue b/src/views/salesManagement/deliveryLedger/index.vue
index 7b94a29..688741b 100644
--- a/src/views/salesManagement/deliveryLedger/index.vue
+++ b/src/views/salesManagement/deliveryLedger/index.vue
@@ -32,15 +32,33 @@
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column label="閿�鍞鍗�" prop="salesContractNo" show-overflow-tooltip />
+        <el-table-column label="鍙戣揣璁㈠崟鍙�" prop="shippingNo" show-overflow-tooltip />
         <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip />
         <el-table-column label="鍙戣揣鏃堕棿" prop="shippingDate" show-overflow-tooltip />
         <el-table-column label="鍙戣揣杞︾墝鍙�" prop="shippingCarNumber" show-overflow-tooltip />
         <el-table-column label="蹇�掑叕鍙�" prop="expressCompany" show-overflow-tooltip />
         <el-table-column label="蹇�掑崟鍙�" prop="expressNumber" show-overflow-tooltip />
+        <el-table-column label="瀹℃牳鐘舵��" prop="status" align="center" width="120">
+          <template #default="scope">
+            <el-tag :type="getApprovalStatusType(scope.row.status)">
+              {{ getApprovalStatusText(scope.row.status) }}
+            </el-tag>
+          </template>
+        </el-table-column>
         <el-table-column fixed="right" label="鎿嶄綔" width="150" align="center">
           <template #default="scope">
-            <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">缂栬緫</el-button>
-            <el-button link type="danger" size="small" @click="handleDeleteSingle(scope.row)">鍒犻櫎</el-button>
+            <el-button 
+              link 
+              type="primary" 
+              size="small" 
+              :disabled="!isApproved(scope.row.status)"
+              @click="openForm('edit', scope.row)">缂栬緫</el-button>
+            <el-button 
+              link 
+              type="danger" 
+              size="small" 
+              :disabled="!isApproved(scope.row.status)"
+              @click="handleDeleteSingle(scope.row)">鍒犻櫎</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -266,6 +284,12 @@
 
 // 鎵撳紑寮规
 const openForm = async (type, row) => {
+  // 缂栬緫鏃舵鏌ュ鏍哥姸鎬�
+  if (type === 'edit' && row && !isApproved(row.status)) {
+    proxy.$modal.msgWarning("鍙兘缂栬緫瀹℃牳閫氳繃鐨勬暟鎹�");
+    return;
+  }
+  
   operationType.value = type;
   const baseUrl = import.meta.env.VITE_APP_BASE_API;
   
@@ -401,13 +425,19 @@
 
 // 鎵归噺鍒犻櫎
 const handleDelete = () => {
-  let ids = [];
-  if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map((item) => item.id);
-  } else {
+  if (selectedRows.value.length === 0) {
     proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
     return;
   }
+  
+  // 妫�鏌ラ�変腑鐨勮鏄惁閮芥槸"瀹℃牳閫氳繃"鐘舵��
+  const notApprovedRows = selectedRows.value.filter(row => !isApproved(row.status));
+  if (notApprovedRows.length > 0) {
+    proxy.$modal.msgWarning("鍙兘鍒犻櫎瀹℃牳閫氳繃鐨勬暟鎹�");
+    return;
+  }
+  
+  const ids = selectedRows.value.map((item) => item.id);
   ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
     confirmButtonText: "纭",
     cancelButtonText: "鍙栨秷",
@@ -426,6 +456,12 @@
 
 // 鍗曚釜鍒犻櫎
 const handleDeleteSingle = (row) => {
+  // 妫�鏌ユ槸鍚︿负"瀹℃牳閫氳繃"鐘舵��
+  if (!isApproved(row.deliveryLedger)) {
+    proxy.$modal.msgWarning("鍙兘鍒犻櫎瀹℃牳閫氳繃鐨勬暟鎹�");
+    return;
+  }
+  
   ElMessageBox.confirm("姝ゆ搷浣滃皢鍒犻櫎璇ヨ褰曪紝鏄惁纭锛�", "鍒犻櫎", {
     confirmButtonText: "纭",
     cancelButtonText: "鍙栨秷",
@@ -525,6 +561,80 @@
   }
 };
 
+// 鑾峰彇瀹℃牳鐘舵�佹枃鏈�
+const getApprovalStatusText = (status) => {
+  if (status === null || status === undefined || status === '') {
+    return '寰呭鏍�';
+  }
+  // 濡傛灉鏄暟瀛�
+  if (typeof status === 'number') {
+    const statusMap = {
+      0: '寰呭鏍�',
+      1: '瀹℃牳涓�',
+      2: '瀹℃牳鎷掔粷',
+      3: '瀹℃牳閫氳繃'
+    };
+    return statusMap[status] || '寰呭鏍�';
+  }
+  // 濡傛灉鏄瓧绗︿覆锛岀洿鎺ヨ繑鍥炴垨鏄犲皠
+  const statusStr = String(status).trim();
+  const statusTextMap = {
+    '寰呭鏍�': '寰呭鏍�',
+    '瀹℃牳涓�': '瀹℃牳涓�',
+    '瀹℃牳鎷掔粷': '瀹℃牳鎷掔粷',
+    '瀹℃牳閫氳繃': '瀹℃牳閫氳繃',
+    '0': '寰呭鏍�',
+    '1': '瀹℃牳涓�',
+    '2': '瀹℃牳鎷掔粷',
+    '3': '瀹℃牳閫氳繃'
+  };
+  return statusTextMap[statusStr] || statusStr || '寰呭鏍�';
+};
+
+// 鑾峰彇瀹℃牳鐘舵�佹爣绛剧被鍨嬶紙棰滆壊锛�
+const getApprovalStatusType = (status) => {
+  if (status === null || status === undefined || status === '') {
+    return 'info';
+  }
+  // 濡傛灉鏄暟瀛�
+  if (typeof status === 'number') {
+    const typeMap = {
+      0: 'info',      // 寰呭鏍� - 鐏拌壊
+      1: 'warning',   // 瀹℃牳涓� - 榛勮壊
+      2: 'danger',    // 瀹℃牳鎷掔粷 - 绾㈣壊
+      3: 'success'    // 瀹℃牳閫氳繃 - 缁胯壊
+    };
+    return typeMap[status] || 'info';
+  }
+  // 濡傛灉鏄瓧绗︿覆
+  const statusStr = String(status).trim();
+  const typeTextMap = {
+    '寰呭鏍�': 'info',
+    '瀹℃牳涓�': 'warning',
+    '瀹℃牳鎷掔粷': 'danger',
+    '瀹℃牳閫氳繃': 'success',
+    '0': 'info',
+    '1': 'warning',
+    '2': 'danger',
+    '3': 'success'
+  };
+  return typeTextMap[statusStr] || 'info';
+};
+
+// 妫�鏌ュ鏍哥姸鎬佹槸鍚︿负"瀹℃牳閫氳繃"
+const isApproved = (status) => {
+  if (status === null || status === undefined || status === '') {
+    return false;
+  }
+  // 濡傛灉鏄暟瀛楋紝3 琛ㄧず瀹℃牳閫氳繃
+  if (typeof status === 'number') {
+    return status === 3;
+  }
+  // 濡傛灉鏄瓧绗︿覆
+  const statusStr = String(status).trim();
+  return statusStr === '瀹℃牳閫氳繃' || statusStr === '3';
+};
+
 onMounted(() => {
   getList();
 });
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 05c6a55..a07aa44 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -42,23 +42,27 @@
       <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
         :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" show-summary style="width: 100%"
         :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)">
-        <el-table-column align="center" type="selection" width="55" />
-        <el-table-column type="expand">
+        <el-table-column align="center" type="selection" width="55" fixed="left"/>
+        <el-table-column type="expand" width="60" fixed="left">
           <template #default="props">
             <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
-              <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+              <el-table-column align="center" label="搴忓彿" type="index"/>
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
               <el-table-column label="鍗曚綅" prop="unit" />
-              <el-table-column label="浜у搧鐘舵��" width="100px" align="center">
-                <template #default="scope">
-                  <el-tag v-if="scope.row.approveStatus === 0" type="info">鏈嚭搴�</el-tag>
-                  <el-tag v-if="scope.row.approveStatus === 1" type="success">宸插嚭搴�</el-tag>
-                  <el-tag v-if="scope.row.approveStatus === 2" type="warning">瀹℃牳涓�</el-tag>
-                  <el-tag v-if="scope.row.approveStatus === 3" type="success">瀹℃牳鎴愬姛</el-tag>
-                  <el-tag v-if="scope.row.approveStatus === 4" type="danger">瀹℃牳澶辫触</el-tag>
-                </template>
-              </el-table-column>
+							<el-table-column label="浜у搧鐘舵��"
+															 width="100px"
+															 align="center">
+								<template #default="scope">
+									<el-tag v-if="scope.row.approveStatus === 1"
+													type="success">鍏呰冻</el-tag>
+									<el-tag v-else
+													type="danger">涓嶈冻</el-tag>
+								</template>
+							</el-table-column>
+							<el-table-column label="鍙戣揣鐘舵��" prop="shippingStatus" width="140" align="center" show-overflow-tooltip />
+							<el-table-column label="蹇�掑叕鍙�" prop="expressCompany" show-overflow-tooltip />
+							<el-table-column label="蹇�掑崟鍙�" prop="expressNumber" show-overflow-tooltip />
               <el-table-column label="鍙戣揣杞︾墝" minWidth="100px" align="center">
                 <template #default="scope">
                   <div>
@@ -67,14 +71,17 @@
                   </div>
                 </template>
               </el-table-column>
-              <el-table-column label="鍙戣揣鏃ユ湡" minWidth="100px" align="center">
-                <template #default="scope">
-                  <div>
-                    <div v-if="scope.row.shippingDate">{{ scope.row.shippingDate }}</div>
-                    <el-tag v-else type="info">鏈彂璐�</el-tag>
-                  </div>
-                </template>
-              </el-table-column>
+							<el-table-column label="鍙戣揣鏃ユ湡"
+															 minWidth="100px"
+															 align="center">
+								<template #default="scope">
+									<div>
+										<div v-if="scope.row.shippingDate">{{ scope.row.shippingDate }}</div>
+										<el-tag v-else
+														type="info">-</el-tag>
+									</div>
+								</template>
+							</el-table-column>
               <el-table-column label="鏁伴噺" prop="quantity" />
               <el-table-column label="绋庣巼(%)" prop="taxRate" />
               <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
@@ -83,7 +90,14 @@
             <!--鎿嶄綔-->
               <el-table-column Width="60px" label="鎿嶄綔" align="center">
                 <template #default="scope">
-                  <el-button :disabled="scope.row.approveStatus!==2 || scope.row.approveStatus!==5" link type="primary" size="small" @click="openDeliveryForm(scope.row)">鍙戣揣</el-button>
+                  <el-button 
+                    link 
+                    type="primary" 
+                    size="small" 
+                    :disabled="scope.row.approveStatus !== 1 || !!scope.row.shippingDate || !!scope.row.shippingCarNumber"
+                    @click="openDeliveryForm(scope.row)">
+                    鍙戣揣
+                  </el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -113,8 +127,8 @@
       <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
         :page="page.current" :limit="page.size" @pagination="paginationChange" />
     </div>
-    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'" width="70%"
-      @close="closeDia">
+    <FormDialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'" :width="'70%'"
+      :operation-type="operationType" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
       <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
         <el-row :gutter="30">
           <el-col :span="12">
@@ -231,7 +245,7 @@
 				</el-row>
 			</el-form>
 		</FormDialog>
-		
+
 		<!-- 浠庢姤浠峰崟瀵煎叆锛堜粎瀹℃壒閫氳繃锛� -->
 		<el-dialog
 			v-model="quotationDialogVisible"
@@ -372,6 +386,12 @@
 				</el-row>
 			</el-form>
 		</FormDialog>
+		<!-- 闄勪欢鍒楄〃寮圭獥 -->
+		<FileListDialog
+			ref="fileListRef"
+			v-model="fileListDialogVisible"
+			title="闄勪欢鍒楄〃"
+		/>
 		<!-- 鎵撳嵃棰勮寮圭獥 -->
 		<el-dialog
 			v-model="printPreviewVisible"
@@ -811,7 +831,7 @@
 	const params = { ...rest, ...page };
 	// 绉婚櫎褰曞叆鏃ユ湡鐨勯粯璁ゅ�艰缃紝鍙繚鐣欒寖鍥存棩鏈熷瓧娈�
 	delete params.entryDate;
-	ledgerListPage(params)
+	return ledgerListPage(params)
 		.then((res) => {
 			tableLoading.value = false;
 			tableData.value = res.records;
@@ -819,6 +839,7 @@
 				item.children = [];
 			});
 			total.value = res.total;
+			return res;
 		})
 		.catch(() => {
 			tableLoading.value = false;
@@ -1833,13 +1854,21 @@
 	getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
 		if (fileListRef.value) {
 			fileListRef.value.open(res.salesLedgerFiles)
-			fileListDialogVisible.value = true
 		}
 	});
 }
 
 // 鎵撳紑鍙戣揣寮规
 const openDeliveryForm = (row) => {
+	// 鏍¢獙锛氬彧鏈変骇鍝佺姸鎬佷负鍏呰冻涓旀湭鍙戣揣鏃舵墠鑳藉彂璐�
+	if (row.approveStatus !== 1) {
+		proxy.$modal.msgWarning("浜у搧鐘舵�佷笉瓒筹紝鏃犳硶鍙戣揣");
+		return;
+	}
+	if (row.shippingDate || row.shippingCarNumber) {
+		proxy.$modal.msgWarning("璇ヤ骇鍝佸凡鍙戣揣锛屾棤娉曢噸澶嶅彂璐�");
+		return;
+	}
 	currentDeliveryRow.value = row;
   deliveryForm.value = {
     type: "璐ц溅",
@@ -1861,8 +1890,11 @@
         return;
       }
       const approveUserIds = approverNodes.value.map(node => node.userId).join(",");
+      // 淇濆瓨褰撳墠灞曞紑鐨勮ID锛屼互渚垮彂璐у悗閲嶆柊鍔犺浇瀛愯〃鏍兼暟鎹�
+      const currentExpandedKeys = [...expandedRowKeys.value];
+      const salesLedgerId = currentDeliveryRow.value.salesLedgerId;
       addShippingInfo({
-        salesLedgerId: currentDeliveryRow.value.salesLedgerId,
+        salesLedgerId: salesLedgerId,
         salesLedgerProductId: currentDeliveryRow.value.id,
         type: deliveryForm.value.type,
 				approveUserIds,
@@ -1870,7 +1902,25 @@
         .then(() => {
           proxy.$modal.msgSuccess("鍙戣揣鎴愬姛");
           closeDeliveryDia();
-          getList();
+          // 鍒锋柊涓昏〃鏁版嵁
+          getList().then(() => {
+            // 濡傛灉涔嬪墠鏈夊睍寮�鐨勮锛岄噸鏂板姞杞借繖浜涜鐨勫瓙琛ㄦ牸鏁版嵁
+            if (currentExpandedKeys.length > 0) {
+              // 浣跨敤 Promise.all 骞惰鍔犺浇鎵�鏈夊睍寮�琛岀殑瀛愯〃鏍兼暟鎹�
+              const loadPromises = currentExpandedKeys.map(ledgerId => {
+                return productList({ salesLedgerId: ledgerId, type: 1 }).then((res) => {
+                  const index = tableData.value.findIndex((item) => item.id === ledgerId);
+                  if (index > -1) {
+                    tableData.value[index].children = res.data;
+                  }
+                });
+              });
+              Promise.all(loadPromises).then(() => {
+                // 鎭㈠灞曞紑鐘舵��
+                expandedRowKeys.value = currentExpandedKeys;
+              });
+            }
+          });
         })
     }
   });

--
Gitblit v1.9.3