From 2d3530a7c11557a40807ad7c0b9e302ce6ce3a9f Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期五, 28 八月 2026 10:16:32 +0800
Subject: [PATCH] feat: 综合业务模块页面重构与交互完善

---
 src/views/salesManagement/deliveryLedger/index.vue |  203 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 182 insertions(+), 21 deletions(-)

diff --git a/src/views/salesManagement/deliveryLedger/index.vue b/src/views/salesManagement/deliveryLedger/index.vue
index 33fa45f..af41f00 100644
--- a/src/views/salesManagement/deliveryLedger/index.vue
+++ b/src/views/salesManagement/deliveryLedger/index.vue
@@ -32,6 +32,36 @@
             @change="handleQuery"
           />
         </el-form-item>
+        <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectId">
+          <el-select
+            v-model="searchForm.projectId"
+            placeholder="璇烽�夋嫨椤圭洰"
+            clearable
+            filterable
+            style="width: 200px"
+            @change="handleQuery"
+          >
+            <el-option
+              v-for="item in projectOptions"
+              :key="item.id"
+              :label="item.no + ' - ' + item.title"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍙戣揣鏃ユ湡锛�" prop="shippingDateRange">
+          <el-date-picker
+            v-model="searchForm.shippingDateRange"
+            type="daterange"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+            value-format="YYYY-MM-DD"
+            style="width: 240px"
+            @change="handleQuery"
+            clearable
+          />
+        </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="handleQuery"> 鎼滅储</el-button>
         </el-form-item>
@@ -64,6 +94,12 @@
         <el-table-column
           label="鍙戣揣璁㈠崟鍙�"
           prop="shippingNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="椤圭洰鍚嶇О"
+          prop="projectName"
+          min-width="150"
           show-overflow-tooltip
         />
         <el-table-column
@@ -124,14 +160,22 @@
           show-overflow-tooltip
           width="130"
         />
+        <el-table-column label="閫�璐у崟" align="center" width="140">
+          <template #default="scope">
+            <el-button v-if="scope.row.returnNoList && scope.row.returnNoList.length > 0" link type="primary" @click="openReturnNosDialog(scope.row)">
+              鏌ョ湅 {{ scope.row.returnNoList.length }} 涓��璐у崟
+            </el-button>
+            <span v-else>--</span>
+          </template>
+        </el-table-column>
         <el-table-column fixed="right" label="鎿嶄綔" width="220" align="center">
           <template #default="scope">
-            <!--            <el-button-->
-            <!--                link-->
-            <!--                type="primary"-->
-            <!--                :disabled="!isApproved(scope.row.status)"-->
-            <!--                @click="openForm('edit', scope.row)">鍙戣揣-->
-            <!--            </el-button>-->
+            <el-button
+              link
+              type="primary"
+              :disabled="scope.row.status === '瀹℃牳閫氳繃' || scope.row.status === '宸插彂璐�'"
+              @click="openForm('edit', scope.row)">琛ュ厖鍙戣揣淇℃伅
+            </el-button>
             <el-button
               link
               type="primary"
@@ -139,13 +183,13 @@
               @click="openDetail(scope.row)"
               >璇︽儏
             </el-button>
-            <!--            <el-button-->
-            <!--              link-->
-            <!--              type="danger"-->
-            <!--              :disabled="isApproving(scope.row.status)"-->
-            <!--              @click="handleDeleteSingle(scope.row)"-->
-            <!--              >鍒犻櫎-->
-            <!--            </el-button>-->
+            <el-button
+              link
+              type="danger"
+              :disabled="scope.row.status === '宸插彂璐�' || scope.row.status === '瀹℃牳閫氳繃'"
+              @click="handleDeleteSingle(scope.row)"
+              >鍒犻櫎
+            </el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -239,6 +283,56 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="鍙戣揣鍗曟嵁锛�" prop="shippingDocument">
+              <el-input
+                v-model="form.shippingDocument"
+                placeholder="璇疯緭鍏ュ彂璐у崟鎹�"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="8">
+            <el-form-item label="鏄惁瀵硅处锛�" prop="isReconciled">
+              <el-switch v-model="form.isReconciled" :active-value="1" :inactive-value="0" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鏄惁缁撶畻锛�" prop="isSettled">
+              <el-switch v-model="form.isSettled" :active-value="1" :inactive-value="0" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鏄惁宸插紑绁細" prop="isInvoiced">
+              <el-switch v-model="form.isInvoiced" :active-value="1" :inactive-value="0" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12" v-if="form.isReconciled === 1">
+            <el-form-item label="瀵硅处鍗曞綊妗f儏鍐碉細" prop="statementArchivingStatus">
+              <el-input
+                type="textarea"
+                v-model="form.statementArchivingStatus"
+                placeholder="璇疯緭鍏ュ璐﹀崟褰掓。鎯呭喌"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.isSettled === 1">
+            <el-form-item label="缁撶畻鍗曞綊妗f儏鍐碉細" prop="settlementArchivingStatus">
+              <el-input
+                type="textarea"
+                v-model="form.settlementArchivingStatus"
+                placeholder="璇疯緭鍏ョ粨绠楀崟褰掓。鎯呭喌"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -293,6 +387,24 @@
           <el-descriptions-item label="鍑哄簱鍗曞彿" :span="2">{{
             detailRow.outboundBatches || "--"
           }}</el-descriptions-item>
+          <el-descriptions-item label="鍙戣揣鍗曟嵁">{{
+            detailRow.shippingDocument || "--"
+          }}</el-descriptions-item>
+          <el-descriptions-item label="鏄惁瀵硅处">{{
+            detailRow.isReconciled === 1 ? '鏄�' : '鍚�'
+          }}</el-descriptions-item>
+          <el-descriptions-item label="鏄惁缁撶畻">{{
+            detailRow.isSettled === 1 ? '鏄�' : '鍚�'
+          }}</el-descriptions-item>
+          <el-descriptions-item label="鏄惁宸插紑绁�">{{
+            detailRow.isInvoiced === 1 ? '鏄�' : '鍚�'
+          }}</el-descriptions-item>
+          <el-descriptions-item label="瀵硅处鍗曞綊妗f儏鍐�" :span="2">{{
+            detailRow.statementArchivingStatus || "--"
+          }}</el-descriptions-item>
+          <el-descriptions-item label="缁撶畻鍗曞綊妗f儏鍐�" :span="2">{{
+            detailRow.settlementArchivingStatus || "--"
+          }}</el-descriptions-item>
         </el-descriptions>
         <el-table
           :data="getDeliveryProductInfoList()"
@@ -334,6 +446,19 @@
         </div>
       </template>
     </el-dialog>
+
+    <!-- 閫�璐у崟鍙峰脊妗� -->
+    <el-dialog v-model="returnNosDialogVisible" title="閫�璐у崟鍙峰垪琛�" width="400px" @close="closeReturnNosDialog">
+      <el-table :data="currentReturnNos" border size="small">
+        <el-table-column label="搴忓彿" type="index" width="60" align="center" />
+        <el-table-column label="閫�璐у崟鍙�" prop="returnNo" align="center" />
+      </el-table>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="closeReturnNosDialog">鍏抽棴</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -349,6 +474,7 @@
   getDeliveryDetail,
 } from "@/api/salesManagement/deliveryLedger.js";
 import { delLedgerFile } from "@/api/salesManagement/salesLedger.js";
+import { listProject } from "@/api/projectManagement/project.js";
 import ImageUpload from "@/components/AttachmentUpload/image/index.vue";
 import ImagePreview from "@/components/AttachmentPreview/image/index.vue";
 
@@ -357,6 +483,7 @@
 const selectedRows = ref([]);
 const tableLoading = ref(false);
 const salesOrderOptions = ref([]);
+const projectOptions = ref([]);
 const page = reactive({
   current: 1,
   size: 100,
@@ -368,14 +495,30 @@
 const detailRow = ref(null);
 const detailProductList = ref([]);
 
+// 閫�璐у崟鍙峰脊妗�
+const returnNosDialogVisible = ref(false);
+const currentReturnNos = ref([]);
+
+const openReturnNosDialog = (row) => {
+  currentReturnNos.value = (row.returnNoList || []).map(no => ({ returnNo: no }));
+  returnNosDialogVisible.value = true;
+};
+
+const closeReturnNosDialog = () => {
+  returnNosDialogVisible.value = false;
+  currentReturnNos.value = [];
+};
+
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
 const operationType = ref("");
 const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    salesContractNo: "", // 閿�鍞鍗曞彿
-    shippingCarNumber: "", // 杞︾墝鍙�
-    expressNumber: "", // 蹇�掑崟鍙�
+    salesContractNo: undefined,
+    shippingCarNumber: undefined,
+    expressNumber: undefined,
+    projectId: undefined,
+    shippingDateRange: []
   },
   form: {
     id: null,
@@ -433,7 +576,13 @@
 
 const getList = () => {
   tableLoading.value = true;
-  deliveryLedgerListPage({ ...searchForm.value, ...page })
+  const params = { ...searchForm.value };
+  if (params.shippingDateRange && params.shippingDateRange.length === 2) {
+    params.beginShippingDate = params.shippingDateRange[0];
+    params.endShippingDate = params.shippingDateRange[1];
+  }
+  delete params.shippingDateRange;
+  deliveryLedgerListPage({ ...params, ...page })
     .then((res) => {
       tableLoading.value = false;
       tableData.value = res.data.records || [];
@@ -461,9 +610,8 @@
 
 // 鎵撳紑寮规
 const openForm = async (type, row) => {
-  // 鍙戣揣锛氫粎鈥滃鏍搁�氳繃鈥濆厑璁哥紪杈�
-  if (type === "edit" && row && !isApproved(row.status)) {
-    proxy.$modal.msgWarning("鍙湁瀹℃牳閫氳繃鐨勬暟鎹墠鍙互鍙戣揣");
+  if (type === "edit" && row && (row.status === "瀹℃牳閫氳繃" || row.status === "宸插彂璐�")) {
+    proxy.$modal.msgWarning("璇ョ姸鎬佺殑鏁版嵁涓嶅彲浠ョ紪杈戝彂璐т俊鎭�");
     return;
   }
 
@@ -479,6 +627,12 @@
       shippingCarNumber: row.shippingCarNumber ?? "",
       expressCompany: row.expressCompany ?? "",
       expressNumber: row.expressNumber ?? "",
+      shippingDocument: row.shippingDocument ?? "",
+      isReconciled: row.isReconciled ?? 0,
+      statementArchivingStatus: row.statementArchivingStatus ?? "",
+      isSettled: row.isSettled ?? 0,
+      settlementArchivingStatus: row.settlementArchivingStatus ?? "",
+      isInvoiced: row.isInvoiced ?? 0,
     };
     deliveryFileList.value = row.storageBlobVOs || [];
   }
@@ -616,7 +770,13 @@
     type: "warning",
   })
     .then(() => {
-      proxy.download("/shippingInfo/export", {}, "鍙戣揣鍙拌处.xlsx");
+      const params = { ...searchForm.value };
+      if (params.shippingDateRange && params.shippingDateRange.length === 2) {
+        params.beginShippingDate = params.shippingDateRange[0];
+        params.endShippingDate = params.shippingDateRange[1];
+      }
+      delete params.shippingDateRange;
+      proxy.download("/shippingInfo/export", params, "鍙戣揣鍙拌处.xlsx");
     })
     .catch(() => {
       proxy.$modal.msg("宸插彇娑�");
@@ -866,6 +1026,7 @@
 };
 
 onMounted(() => {
+  listProject({}).then(res => projectOptions.value = res.rows || res.data.records || res.data);
   getList();
 });
 </script>

--
Gitblit v1.9.3