From 60a702a3dbcbe6e16a26faab49e66d710d1f8656 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 28 十一月 2025 14:57:36 +0800
Subject: [PATCH] 湟水峡-销售台账/采购台账,有可能同一个公司不同单子,但是开票登记的时候会一起,一对多或者多对一

---
 src/views/salesManagement/invoiceRegistration/index.vue |  248 ++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 204 insertions(+), 44 deletions(-)

diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
index bfd84f3..bdacb18 100644
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ b/src/views/salesManagement/invoiceRegistration/index.vue
@@ -2,7 +2,7 @@
   <div class="app-container">
     <div class="search_form">
       <el-form :inline="true" :model="searchForm">
-        <el-form-item label="寮�绁ㄧ櫥璁�">
+        <el-form-item label="瀹㈡埛鍚嶇О">
           <el-input
             v-model="searchForm.customerName"
             style="width: 240px"
@@ -26,6 +26,12 @@
             clearable
           />
         </el-form-item>
+        <br>
+        <el-form-item label="浜у搧澶х被锛�">
+          <el-input v-model="searchForm.productCategory" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+                    @change="handleQuery" />
+        </el-form-item>
+
         <el-form-item>
           <el-checkbox
             v-model="searchForm.status"
@@ -36,15 +42,18 @@
         <el-form-item>
           <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
           <el-button @click="resetForm"> 閲嶇疆 </el-button>
+          <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
         </el-form-item>
       </el-form>
     </div>
     <div class="table_list">
       <div class="flex justify-between">
         <div></div>
+        <div>
         <el-button type="primary" @click="openForm" style="margin-bottom: 8px">
           鏂板鐧昏
         </el-button>
+        </div>
       </div>
       <el-table
         :data="tableData"
@@ -81,7 +90,7 @@
               />
               <el-table-column label="鍗曚綅" prop="unit" width="70" />
               <el-table-column label="鏁伴噺" prop="quantity" width="70" />
-              <el-table-column label="绋庣巼(%)" prop="taxRate" width="70" />
+              <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
               <el-table-column
                 label="鍚◣鍗曚环(鍏�)"
                 prop="taxInclusiveUnitPrice"
@@ -125,36 +134,48 @@
           label="閿�鍞悎鍚屽彿"
           prop="salesContractNo"
           show-overflow-tooltip
+          width="200"
         />
         <el-table-column
           label="瀹㈡埛鍚堝悓鍙�"
           prop="customerContractNo"
+          width="200"
           show-overflow-tooltip
         />
         <el-table-column
           label="瀹㈡埛鍚嶇О"
           prop="customerName"
           show-overflow-tooltip
+          width="240"
         />
-        <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip />
+        <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip width="90"/>
         <el-table-column
           label="椤圭洰鍚嶇О"
           prop="projectName"
           show-overflow-tooltip
+          width="200"
         />
         <el-table-column
           label="鍚堝悓閲戦(鍏�)"
           prop="contractAmount"
           show-overflow-tooltip
           :formatter="formattedNumber"
+					width="220"
+
         />
         <el-table-column
           label="宸插紑绁ㄩ噾棰�(鍏�)"
           prop="invoiceTotal"
           show-overflow-tooltip
           :formatter="formattedNumber"
+          width="120"
         />
-        <el-table-column label="鏈紑绁ㄩ噾棰�(鍏�)" show-overflow-tooltip>
+        <el-table-column
+          label="鏈紑绁ㄩ噾棰�(鍏�)"
+          prop="noInvoiceAmountTotal"
+          show-overflow-tooltip
+          width="120"
+        >
           <template #default="{ row, column }">
             <el-text type="danger">
               {{ formattedNumber(row, column, row.noInvoiceAmountTotal) }}
@@ -187,7 +208,7 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input v-model="form.salesContractNo" disabled></el-input>
+              <el-input v-model="form.salesContractNo" disabled placeholder="澶氬悎鍚屾壒閲忓鐞嗭紙鍏蜂綋鍚堝悓鍙疯浜у搧鍒楄〃锛�"></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -277,6 +298,11 @@
             type="index"
             width="60"
           />
+          <el-table-column label="鎵�灞炲悎鍚�" prop="salesContractNo" width="200">
+            <template #default="{ row }">
+              <el-tag type="primary">{{ row.salesContractNo }}</el-tag>
+            </template>
+          </el-table-column>
           <el-table-column label="浜у搧澶х被" prop="productCategory" />
           <el-table-column
             label="瑙勬牸鍨嬪彿"
@@ -285,16 +311,18 @@
           />
           <el-table-column label="鍗曚綅" prop="unit" />
           <el-table-column label="鏁伴噺" prop="quantity" width="70" />
-          <el-table-column label="绋庣巼(%)" prop="taxRate" width="70" />
+          <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
           <el-table-column
             label="鍚◣鍗曚环(鍏�)"
             prop="taxInclusiveUnitPrice"
             :formatter="formattedNumber"
+						width="200"
           />
           <el-table-column
             label="鍚◣鎬讳环(鍏�)"
             prop="taxInclusiveTotalPrice"
             :formatter="formattedNumber"
+						width="200"
           />
           <el-table-column
             label="涓嶅惈绋庢�讳环(鍏�)"
@@ -302,33 +330,29 @@
             :formatter="formattedNumber"
             width="150"
           />
-          <el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum">
+          <el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum" width="180">
             <template #default="scope">
-              <el-input
-                type="number"
-                :step="0.1"
-                min="0"
+              <el-input-number :step="0.1" :min="0" style="width: 100%"
+															 :precision="2"
                 v-model="scope.row.currentInvoiceNum"
-                @blur="invoiceNumBlur(scope.row)"
-              ></el-input>
+                @change="invoiceNumBlur(scope.row)"
+              ></el-input-number>
             </template>
           </el-table-column>
           <el-table-column
             label="鏈寮�绁ㄩ噾棰�(鍏�)"
             prop="currentInvoiceAmount"
-            width="150"
+            width="180"
           >
             <template #default="scope">
-              <el-input
-                type="number"
-                :step="0.01"
-                min="0"
+              <el-input-number :step="0.01" :min="0" style="width: 100%"
+															 :precision="2"
                 v-model="scope.row.currentInvoiceAmount"
-                @blur="invoiceAmountBlur(scope.row)"
-              ></el-input>
+                @change="invoiceAmountBlur(scope.row)"
+              ></el-input-number>
             </template>
           </el-table-column>
-          <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum">
+          <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum" width="120">
             <template #default="scope">
               <el-input
                 type="number"
@@ -341,7 +365,7 @@
           <el-table-column
             label="鏈紑绁ㄩ噾棰�(鍏�)"
             prop="noInvoiceAmount"
-            width="150"
+            width="200"
           >
             <template #default="scope">
               <el-input
@@ -356,12 +380,16 @@
             </template>
           </el-table-column>
           <el-table-column label="鐧昏浜�" prop="register" width="100">
-            <template #default="{ row }">
-              <el-input v-model="row.register" placeholder="璇疯緭鍏ョ櫥璁颁汉" />
-            </template>
+            <!-- <template #default="{ row }">
+              <el-input
+                v-model="row.register"
+                placeholder="璇疯緭鍏ョ櫥璁颁汉"
+                disabled
+              />
+            </template> -->
           </el-table-column>
           <el-table-column label="鐧昏鏃ユ湡" prop="registerDate" width="150">
-            <template #default="{ row }">
+            <!-- <template #default="{ row }">
               <el-date-picker
                 style="width: 100%"
                 v-model="row.registerDate"
@@ -372,7 +400,7 @@
                 clearable
                 disabled
               />
-            </template>
+            </template> -->
           </el-table-column>
         </el-table>
       </el-form>
@@ -425,6 +453,8 @@
     createUer: undefined, // 鐧昏浜�
     issueDate: undefined, // 寮�绁ㄦ棩鏈�
     createTime: undefined, // 褰曞叆鏃ユ湡锛�
+    productCategory: "",
+    isInvoice: 1
   },
   form: {
     salesLedgerId: "",
@@ -435,11 +465,13 @@
     invoiceNo: "",
     createUer: userStore.nickName,
     issueDate: dayjs().format("YYYY-MM-DD"),
+    selectedContractIds: [], // 鏂板锛氬瓨鍌ㄦ墍鏈夐�変腑鐨勫悎鍚孖D
+    isBatch: false // 鏂板锛氭爣璇嗘槸鍚︿负鎵归噺鎿嶄綔
   },
   rules: {
-    salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     createUer: [{ required: true, message: "璇烽�夋嫨", trigger: "blur" }],
     issueDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    invoiceNo: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
     createTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
   },
 });
@@ -512,8 +544,8 @@
 const summarizeMainTable = (param) => {
   return proxy.summarizeTable(param, [
     "contractAmount",
-    "noInvoiceAmountTotal",
     "invoiceTotal",
+    "noInvoiceAmountTotal",
   ]);
 };
 // 瀛愯〃鍚堣鏂规硶
@@ -527,24 +559,67 @@
     "currentInvoiceAmount",
     "noInvoiceNum",
     "noInvoiceAmount",
+    "currentInvoiceNum",
   ]);
 };
 // 鎵撳紑寮规
 const openForm = () => {
-  // 鍒ゆ柇鏄惁澶氶��
-  if (selectedRows.value.length != 1) {
-    proxy.$modal.msgError("璇烽�夋嫨涓�鏉″悎鍚�");
+  // 鍒ゆ柇鏄惁閫夋嫨浜嗗悎鍚�
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgError("璇疯嚦灏戦�夋嫨涓�鏉″悎鍚�");
     return;
   }
+  
+  // 妫�鏌ユ墍鏈夐�夋嫨鐨勫悎鍚屾槸鍚﹀叿鏈夌浉鍚岀殑瀹㈡埛鍚嶇О
+  const firstRow = selectedRows.value[0];
+  const isSameCustomer = selectedRows.value.every(row => 
+    row.customerName === firstRow.customerName
+  );
+  
+  if (!isSameCustomer) {
+    proxy.$modal.msgError("璇烽�夋嫨鐩稿悓瀹㈡埛鍚嶇О鐨勫悎鍚�");
+    return;
+  }
+  
+  // 鍏佽涓嶅悓鐨勯攢鍞悎鍚屽彿鎵归噺澶勭悊锛屾棤闇�妫�鏌ラ噸澶�
+  
   form.value = {};
   productData.value = [];
-  getSalesLedgerWithProducts({ id: selectedRows.value[0].id }).then((res) => {
-    form.value = { ...res };
-    form.value.createTime = dayjs().format("YYYY-MM-DD");
-    form.value.createUer = userStore.nickName;
-    productData.value = form.value.productData.map((item) => {
-      return item;
+  
+  // 鍔犺浇鎵�鏈夐�変腑鍚堝悓鐨勪骇鍝佹暟鎹�
+  const promises = selectedRows.value.map(row => 
+    getSalesLedgerWithProducts({ id: row.id })
+  );
+  
+  Promise.all(promises).then(results => {
+    // 鍚堝苟鎵�鏈夊悎鍚岀殑浜у搧鏁版嵁锛屽苟涓烘瘡涓骇鍝佹坊鍔犲搴旂殑鍚堝悓淇℃伅
+    const allProductData = [];
+    results.forEach((result, index) => {
+      const contract = selectedRows.value[index];
+      const contractId = contract.id;
+      if (result.productData) {
+        result.productData.forEach(item => {
+          allProductData.push({
+            ...item,
+            id: contractId, // 鏄庣‘璁剧疆鍚堝悓ID
+            salesContractNo: contract.salesContractNo, // 娣诲姞閿�鍞悎鍚屽彿
+            customerName: contract.customerName, // 娣诲姞瀹㈡埛鍚嶇О
+            customerContractNo: contract.customerContractNo // 娣诲姞瀹㈡埛鍚堝悓鍙�
+          });
+        });
+      }
     });
+    
+    // 璁剧疆琛ㄥ崟鏁版嵁锛堜娇鐢ㄧ涓�涓悎鍚岀殑鍩烘湰淇℃伅锛岄攢鍞悎鍚屽彿鐣欑┖锛�
+    form.value = { ...results[0] };
+    form.value.createTime = dayjs().format("YYYY-MM-DD");
+    form.value.issueDate = dayjs().format("YYYY-MM-DD");
+    form.value.createUer = userStore.nickName;
+    form.value.selectedContractIds = selectedRows.value.map(row => row.id); // 瀛樺偍鎵�鏈夐�変腑鐨勫悎鍚孖D
+    form.value.salesContractNo = ""; // 閿�鍞悎鍚屽彿鐣欑┖锛屽洜涓轰細鍦ㄤ骇鍝佽〃鏍间腑鍒嗗埆鏄剧ず
+    
+    productData.value = allProductData;
+    
     dialogFormVisible.value = true;
     console.log("productData.value ", productData.value);
   });
@@ -553,12 +628,77 @@
 const submitForm = () => {
   proxy.$refs["formRef"].validate((valid) => {
     if (valid) {
-      form.value.productData = proxy.HaveJson(productData.value);
-      invoiceRegistrationSave(form.value).then((res) => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        closeDia();
-        getList();
-      });
+      // 濡傛灉鏄壒閲忔搷浣滐紝灏嗘墍鏈夊悎鍚岀殑鏁版嵁鏀惧湪涓�涓暟缁勯噷锛屽彧璋冪敤涓�娆℃帴鍙�
+      if (selectedRows.value.length > 1) {
+        // 鍒涘缓鍖呭惈鎵�鏈夊悎鍚屾暟鎹殑鏁扮粍
+        const batchData = selectedRows.value.map(contract => {
+          // 绛涢�夊嚭灞炰簬褰撳墠鍚堝悓鐨勪骇鍝佹暟鎹�
+          const contractProductData = productData.value.filter(item => 
+            item.salesLedgerId === contract.id
+          );
+          
+          // 涓烘瘡涓攢鍞悎鍚屽彿鍒涘缓鐙珛鐨勫璞�
+          return {
+            // 鍩虹琛ㄥ崟鏁版嵁
+            issueDate: form.value.issueDate,
+            createTime: form.value.createTime,
+            createUer: form.value.createUer,
+            invoiceNo: form.value.invoiceNo,
+            
+            // 鍚堝悓瀹為檯淇℃伅
+            id: contract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负salesLedgerId
+            salesContractNo: contract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
+            customerName: contract.customerName, // 浣跨敤瀹為檯鐨勫鎴峰悕绉�
+            customerId: contract.customerId, // 娣诲姞瀹㈡埛ID
+            customerContractNo: contract.customerContractNo, // 浣跨敤瀹為檯鐨勫鎴峰悎鍚屽彿
+            projectName: contract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
+            salesman: contract.salesman, // 浣跨敤瀹為檯鐨勪笟鍔″憳
+            
+            // 浜у搧鏁版嵁
+            productData: proxy.HaveJson(contractProductData),
+            
+            // 鎵归噺鏍囪瘑
+            isBatch: true
+          };
+        });
+        
+        // 鍙皟鐢ㄤ竴娆℃帴鍙o紝浼犻�掑寘鍚墍鏈夊悎鍚屾暟鎹殑鏁扮粍
+        invoiceRegistrationSave(batchData).then(() => {
+          proxy.$modal.msgSuccess("鎵归噺鏂板鎴愬姛");
+          closeDia();
+          getList();
+        });
+      } else {
+        // 鍗曚釜鍚堝悓鎻愪氦閫昏緫
+        const singleContract = selectedRows.value[0];
+        const singleForm = {
+          // 鍩虹琛ㄥ崟鏁版嵁
+          issueDate: form.value.issueDate,
+          createTime: form.value.createTime,
+          createUer: form.value.createUer,
+          invoiceNo: form.value.invoiceNo,
+          
+          // 鍚堝悓瀹為檯淇℃伅
+          id: singleContract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负salesLedgerId
+          salesContractNo: singleContract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
+          customerName: singleContract.customerName, // 浣跨敤瀹為檯鐨勫鎴峰悕绉�
+          customerId: singleContract.customerId, // 娣诲姞瀹㈡埛ID
+          customerContractNo: singleContract.customerContractNo, // 浣跨敤瀹為檯鐨勫鎴峰悎鍚屽彿
+          projectName: singleContract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
+          salesman: singleContract.salesman, // 浣跨敤瀹為檯鐨勪笟鍔″憳
+          
+          // 浜у搧鏁版嵁
+          productData: proxy.HaveJson(productData.value),
+          
+          // 鎵归噺鏍囪瘑
+          isBatch: false
+        };
+        invoiceRegistrationSave(singleForm).then((res) => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+          getList();
+        });
+      }
     }
   });
 };
@@ -576,6 +716,21 @@
   })
     .then(() => {
       proxy.download("/invoiceRegistration/export", {}, "寮�绁ㄧ櫥璁颁俊鎭�.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
+
+// 瀵煎嚭閿�鍞彴璐�
+const handleExport = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(() => {
+      proxy.download("/sales/ledger/exportOne", { ...searchForm, ...page }, "寮�绁ㄧ櫥璁�.xlsx");
     })
     .catch(() => {
       proxy.$modal.msg("宸插彇娑�");
@@ -649,3 +804,8 @@
   font-weight: bold;
 }
 </style>
+
+
+
+
+

--
Gitblit v1.9.3