From 3cd0964299bf9e83c6b2d10d8d37ddbeecf2a6e7 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期三, 12 八月 2026 10:54:18 +0800
Subject: [PATCH] Merge branch 'dev_天津_意博凯信' of http://114.132.189.42:9002/r/product-inventory-management into dev_天津_意博凯信

---
 src/views/procurementManagement/procurementLedger/index.vue |  794 +++++++++++++++++++++-----------------------------------
 1 files changed, 298 insertions(+), 496 deletions(-)

diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index cffdcc6..aa2ac98 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -2,49 +2,37 @@
   <div class="app-container">
     <div class="search_form">
       <div>
-        <el-form :model="searchForm"
-                 :inline="true">
+        <el-form :model="searchForm" :inline="true">
           <el-form-item label="渚涘簲鍟嗗悕绉帮細">
-            <el-input v-model="searchForm.supplierName"
-                      placeholder="璇疯緭鍏�"
-                      clearable
-                      prefix-icon="Search"
-                      @change="handleQuery" />
+            <el-input v-model="searchForm.supplierName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+              @change="handleQuery" />
           </el-form-item>
           <el-form-item label="閲囪喘鍚堝悓鍙凤細">
-            <el-input v-model="searchForm.purchaseContractNumber"
-                      style="width: 240px"
-                      placeholder="璇疯緭鍏�"
-                      @change="handleQuery"
-                      clearable
-                      :prefix-icon="Search" />
+            <el-input v-model="searchForm.purchaseContractNumber" style="width: 240px" placeholder="璇疯緭鍏�"
+              @change="handleQuery" clearable :prefix-icon="Search" />
           </el-form-item>
           <el-form-item label="閿�鍞悎鍚屽彿锛�">
-            <el-input v-model="searchForm.salesContractNo"
-                      placeholder="璇疯緭鍏�"
-                      clearable
-                      prefix-icon="Search"
-                      @change="handleQuery" />
+            <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+              @change="handleQuery" />
           </el-form-item>
           <el-form-item label="椤圭洰鍚嶇О锛�">
-            <el-input v-model="searchForm.projectName"
-                      placeholder="璇疯緭鍏�"
-                      clearable
-                      prefix-icon="Search"
-                      @change="handleQuery" />
+            <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+              @change="handleQuery" />
           </el-form-item>
           <el-form-item label="褰曞叆鏃ユ湡锛�">
-            <el-date-picker v-model="searchForm.entryDate"
-                            value-format="YYYY-MM-DD"
-                            format="YYYY-MM-DD"
-                            type="daterange"
-                            placeholder="璇烽�夋嫨"
-                            clearable
-                            @change="changeDaterange" />
+            <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
+              type="daterange" placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+          </el-form-item>
+          <el-form-item label="鍏ュ簱鐘舵�侊細">
+            <el-select v-model="searchForm.stockInStatus" placeholder="璇烽�夋嫨" clearable style="width: 240px"
+              @change="handleQuery">
+              <el-option label="寰呭叆搴�" value="寰呭叆搴�" />
+              <el-option label="鍏ュ簱涓�" value="鍏ュ簱涓�" />
+              <el-option label="瀹屽叏鍏ュ簱" value="瀹屽叏鍏ュ簱" />
+            </el-select>
           </el-form-item>
           <el-form-item>
-            <el-button type="primary"
-                       @click="handleQuery"> 鎼滅储
+            <el-button type="primary" @click="handleQuery"> 鎼滅储
             </el-button>
           </el-form-item>
         </el-form>
@@ -52,385 +40,222 @@
     </div>
     <div class="table_list">
       <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
-        <el-button type="primary"
-                   @click="openForm('add')">鏂板鍙拌处</el-button>
-        <el-button type="primary"
-                   plain
-                   @click="handleImport">瀵煎叆</el-button>
+        <el-button type="success" plain @click="handleBatchGenerate">鎵归噺鐢熸垚鏁版嵁</el-button>
+        <el-button type="primary" @click="openForm('add')">鏂板鍙拌处</el-button>
+        <el-button type="primary" plain @click="handleImport">瀵煎叆</el-button>
         <el-button @click="handleOut">瀵煎嚭</el-button>
-        <el-button type="danger"
-                   plain
-                   @click="handleDelete">鍒犻櫎
+        <el-button type="danger" plain @click="handleDelete">鍒犻櫎
         </el-button>
       </div>
-      <el-table :data="tableData"
-                border
-                v-loading="tableLoading"
-                @selection-change="handleSelectionChange"
-                :expand-row-keys="expandedRowKeys"
-                :row-key="(row) => row.id"
-                show-summary
-                :summary-method="summarizeMainTable"
-                @expand-change="expandChange"
-                height="calc(100vh - 21.5em)">
-        <el-table-column align="center"
-                         type="selection"
-                         width="55" />
+      <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
+        :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" show-summary :summary-method="summarizeMainTable"
+        @expand-change="expandChange" height="calc(100vh - 21.5em)">
+        <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
           <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 label="浜у搧澶х被"
-                               prop="productCategory" />
-              <el-table-column label="瑙勬牸鍨嬪彿"
-                               prop="specificationModel" />
-              <el-table-column label="鍗曚綅"
-                               prop="unit" />
-              <el-table-column label="鏁伴噺"
-                               prop="quantity" />
-              <el-table-column label="鍙敤鏁伴噺"
-                               prop="availableQuality" />
-              <el-table-column label="閫�璐ф暟閲�"
-                               prop="returnQuality" />
-              <el-table-column label="绋庣巼(%)"
-                               prop="taxRate" />
-              <el-table-column label="鍚◣鍗曚环(鍏�)"
-                               prop="taxInclusiveUnitPrice"
-                               :formatter="formattedNumber" />
-              <el-table-column label="鍚◣鎬讳环(鍏�)"
-                               prop="taxInclusiveTotalPrice"
-                               :formatter="formattedNumber" />
-              <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
-                               prop="taxExclusiveTotalPrice"
-                               :formatter="formattedNumber" />
+            <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 label="浜у搧澶х被" prop="productCategory" />
+              <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+              <el-table-column label="鍗曚綅" prop="unit" />
+              <el-table-column label="鍏ュ簱瀹℃牳鐘舵��" prop="stockInApprovalStatus" width="120">
+                <template #default="scope">
+                  <el-tag :type="getStockInApprovalStatusType(scope.row.stockInApprovalStatus)" size="small">
+                    {{ scope.row.stockInApprovalStatus || '--' }}
+                  </el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="鏁伴噺" prop="quantity" />
+              <el-table-column label="鍙敤鏁伴噺" prop="availableQuality" />
+              <el-table-column label="閫�璐ф暟閲�" prop="returnQuantity" />
+              <el-table-column label="绋庣巼(%)" prop="taxRate" />
+              <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
+              <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
+              <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
             </el-table>
           </template>
         </el-table-column>
-        <el-table-column align="center"
-                         label="搴忓彿"
-                         type="index"
-                         width="60" />
-        <el-table-column label="閲囪喘鍚堝悓鍙�"
-                         prop="purchaseContractNumber"
-                         width="160"
-                         show-overflow-tooltip />
-        <el-table-column label="閿�鍞悎鍚屽彿"
-                         prop="salesContractNo"
-                         width="160"
-                         show-overflow-tooltip />
-        <el-table-column label="渚涘簲鍟嗗悕绉�"
-                         prop="supplierName"
-                         width="160"
-                         show-overflow-tooltip />
-        <el-table-column label="椤圭洰鍚嶇О"
-                         prop="projectName"
-                         width="320"
-                         show-overflow-tooltip />
-        <el-table-column label="瀹℃壒鐘舵��"
-                         prop="approvalStatus"
-                         width="100"
-                         show-overflow-tooltip>
+        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" width="160" show-overflow-tooltip />
+        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="160" show-overflow-tooltip />
+        <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="160" show-overflow-tooltip />
+        <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="320" show-overflow-tooltip />
+        <el-table-column label="瀹℃壒鐘舵��" prop="approvalStatus" width="100" show-overflow-tooltip>
           <template #default="scope">
-            <el-tag :type="getApprovalStatusType(scope.row.approvalStatus)"
-                    size="small">
+            <el-tag :type="getApprovalStatusType(scope.row.approvalStatus)" size="small">
               {{ approvalStatusText[scope.row.approvalStatus] || '鏈煡鐘舵��' }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="绛捐鏃ユ湡"
-                         prop="executionDate"
-                         width="100"
-                         show-overflow-tooltip />
-        <el-table-column label="浠樻鏂瑰紡"
-                         width="100"
-                         prop="paymentMethod"
-                         show-overflow-tooltip />
-        <el-table-column label="鍚堝悓閲戦(鍏�)"
-                         prop="contractAmount"
+        <el-table-column label="鍏ュ簱鐘舵��" prop="stockInStatus" width="100" show-overflow-tooltip>
+          <template #default="scope">
+            <el-tag :type="getStockInStatusType(scope.row.stockInStatus)" size="small">
+              {{ scope.row.stockInStatus || '--' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="100" show-overflow-tooltip />
+        <el-table-column label="浠樻鏂瑰紡" width="100" prop="paymentMethod" show-overflow-tooltip />
+        <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="200" show-overflow-tooltip
+          :formatter="formattedNumber" />
+        <!-- <el-table-column label="瀹為檯鍚堝悓閲戦(鍏�)"
+                         prop="netContractAmount"
                          width="200"
                          show-overflow-tooltip
-                         :formatter="formattedNumber" />
-        <el-table-column label="褰曞叆浜�"
-                         prop="recorderName"
-                         width="120"
-                         show-overflow-tooltip />
-        <el-table-column label="褰曞叆鏃ユ湡"
-                         prop="entryDate"
-                         width="100"
-                         show-overflow-tooltip />
-        <el-table-column label="澶囨敞"
-                         prop="remarks"
-                         width="200"
-                         show-overflow-tooltip />
-        <el-table-column fixed="right"
-                         label="鎿嶄綔"
-                         width="120"
-                         align="center">
+                         :formatter="formattedNumber" /> -->
+        <el-table-column label="褰曞叆浜�" prop="recorderName" width="120" show-overflow-tooltip />
+        <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="100" show-overflow-tooltip />
+        <el-table-column label="澶囨敞" prop="remarks" width="200" show-overflow-tooltip />
+        <el-table-column fixed="right" label="鎿嶄綔" width="120" align="center">
           <template #default="scope">
-            <el-button link
-                       type="primary"
-                       @click="openForm('edit', scope.row)"
-                       :disabled="scope.row.approvalStatus !== 1 && scope.row.approvalStatus !== 4">缂栬緫
+            <el-button link type="primary" @click="openForm('edit', scope.row)"
+              :disabled="scope.row.stockInStatus === '瀹屽叏鍏ュ簱'">缂栬緫
             </el-button>
-            <el-button link
-                       type="primary"
-                       @click="openFileDialog(scope.row)">闄勪欢</el-button>
+            <el-button link type="primary" @click="openFileDialog(scope.row)">闄勪欢</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <pagination v-show="total > 0"
-                  :total="total"
-                  layout="total, sizes, prev, pager, next, jumper"
-                  :page="page.current"
-                  :limit="page.size"
-                  @pagination="paginationChange" />
+      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current" :limit="page.size" @pagination="paginationChange" />
     </div>
-    <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">
+    <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">
-            <el-form-item label="閲囪喘鍚堝悓鍙凤細"
-                          prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber"
-                        placeholder="璇疯緭鍏�"
-                        clearable />
+            <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
+              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�"
-                          prop="salesLedgerId">
-              <el-select v-model="form.salesLedgerId"
-                         placeholder="璇烽�夋嫨"
-                         filterable
-                         clearable
-                         @change="salesLedgerChange">
-                <el-option v-for="item in salesContractList"
-                           :key="item.id"
-                           :label="item.salesContractNo"
-                           :value="item.id" />
+            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesLedgerId">
+              <el-select v-model="form.salesLedgerId" placeholder="璇烽�夋嫨" filterable clearable
+                @change="salesLedgerChange">
+                <el-option v-for="item in salesContractList" :key="item.id" :label="item.salesContractNo"
+                  :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="渚涘簲鍟嗗悕绉帮細"
-                          prop="supplierId">
-              <el-select v-model="form.supplierId"
-                         placeholder="璇烽�夋嫨"
-                         filterable
-                         clearable>
-                <el-option v-for="item in supplierList"
-                           :key="item.id"
-                           :label="item.supplierName"
-                           :value="item.id">{{ item.supplierName + '---' + item.supplierType }}
+            <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierId">
+              <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨" filterable clearable>
+                <el-option v-for="item in supplierList" :key="item.id" :label="item.supplierName" :value="item.id">{{
+                  item.supplierName + '---' + item.supplierType }}
                 </el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О"
-                          prop="projectName">
-              <el-input v-model="form.projectName"
-                        placeholder="璇疯緭鍏�"
-                        clearable />
+            <el-form-item label="椤圭洰鍚嶇О" prop="projectName">
+              <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="浠樻鏂瑰紡">
-              <el-input v-model="form.paymentMethod"
-                        placeholder="璇疯緭鍏�"
-                        clearable />
+              <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="绛捐鏃ユ湡锛�"
-                          prop="executionDate">
-              <el-date-picker style="width: 100%"
-                              v-model="form.executionDate"
-                              value-format="YYYY-MM-DD"
-                              format="YYYY-MM-DD"
-                              type="date"
-                              placeholder="璇烽�夋嫨"
-                              clearable />
+            <el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate">
+              <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="褰曞叆浜猴細"
-                          prop="recorderId">
-              <el-select v-model="form.recorderId"
-                         placeholder="璇烽�夋嫨"
-                         clearable
-                         filterable>
-                <el-option v-for="item in userList"
-                           :key="item.userId"
-                           :label="item.nickName"
-                           :value="item.userId" />
+            <el-form-item label="褰曞叆浜猴細" prop="recorderId">
+              <el-select v-model="form.recorderId" placeholder="璇烽�夋嫨" clearable filterable>
+                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="褰曞叆鏃ユ湡锛�"
-                          prop="entryDate">
-              <el-date-picker style="width: 100%"
-                              v-model="form.entryDate"
-                              value-format="YYYY-MM-DD"
-                              format="YYYY-MM-DD"
-                              type="date"
-                              placeholder="璇烽�夋嫨"
-                              clearable />
+            <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
+              <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
+                type="date" placeholder="璇烽�夋嫨" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-form-item label="浜у搧淇℃伅锛�"
-                        prop="entryDate">
-            <el-button type="primary"
-                       @click="openProductForm('add')">娣诲姞
+          <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
+            <el-button type="primary" @click="openProductForm('add')">娣诲姞
             </el-button>
-            <el-button plain
-                       type="danger"
-                       @click="deleteProduct">鍒犻櫎
+            <el-button plain type="danger" @click="deleteProduct">鍒犻櫎
             </el-button>
           </el-form-item>
-          <div class="select-button-group"
-               style="width: 500px; margin: 20px 0;"
-               v-if="operationType === 'add'">
-            <el-select filterable
-                       allow-create
-                       :reserve-keyword="true"
-                       :default-first-option="false"
-                       clearable
-                       v-model="templateName"
-                       :input-value="filterInputValue"
-                       @filter-change="onTemplateFilterChange"
-                       @change="onTemplateChange"
-                       @focus="getTemplateList"
-                       style="width: 500px;"
-                       placeholder="璇烽�夋嫨妯$増鎴栬�呰緭鍏ユ柊鐨勬ā鐗堝悕绉板悗閫夋嫨"
-                       class="no-arrow-select">
-              <el-option v-for="item in templateList"
-                         :key="item.id || item.value"
-                         :label="item.templateName"
-                         :value="item.templateName">
+          <div class="select-button-group" style="width: 500px; margin: 20px 0;" v-if="operationType === 'add'">
+            <el-select filterable allow-create :reserve-keyword="true" :default-first-option="false" clearable
+              v-model="templateName" :input-value="filterInputValue" @filter-change="onTemplateFilterChange"
+              @change="onTemplateChange" @focus="getTemplateList" style="width: 500px;" placeholder="璇烽�夋嫨妯$増鎴栬�呰緭鍏ユ柊鐨勬ā鐗堝悕绉板悗閫夋嫨"
+              class="no-arrow-select">
+              <el-option v-for="item in templateList" :key="item.id || item.value" :label="item.templateName"
+                :value="item.templateName">
                 <div style="display: flex; justify-content: space-between; align-items: center;">
                   <span>{{ item.templateName }}</span>
-                  <el-icon v-if="item.id"
-                           class="delete-icon"
-                           @click.stop="handleDeleteTemplate(item)"
-                           style="cursor: pointer; color: #f56c6c; font-size: 14px; margin-left: 8px;">
+                  <el-icon v-if="item.id" class="delete-icon" @click.stop="handleDeleteTemplate(item)"
+                    style="cursor: pointer; color: #f56c6c; font-size: 14px; margin-left: 8px;">
                     <Delete />
                   </el-icon>
                 </div>
               </el-option>
             </el-select>
             <!-- 鎸夐挳锛氫笌 Select 楂樺害鍖归厤锛屽幓鎺夊乏渚ц竟妗嗭紝鏃犵紳琛旀帴 -->
-            <el-button size="small"
-                       style="height: 32px;margin-left: 8px;"
-                       @click="handleButtonClick"
-                       :disabled="!templateName || templateName.trim() === '' || (!currentTemplateId && isTemplateNameDuplicate)">
+            <el-button size="small" style="height: 32px;margin-left: 8px;" @click="handleButtonClick"
+              :disabled="!templateName || templateName.trim() === '' || (!currentTemplateId && isTemplateNameDuplicate)">
               淇濆瓨
             </el-button>
           </div>
         </el-row>
-        <el-table :data="productData"
-                  border
-                  @selection-change="productSelected"
-                  show-summary
-                  :summary-method="summarizeProTable">
-          <el-table-column align="center"
-                           type="selection"
-                           width="55" />
-          <el-table-column align="center"
-                           label="搴忓彿"
-                           type="index"
-                           width="60" />
-          <el-table-column label="浜у搧澶х被"
-                           prop="productCategory" />
-          <el-table-column label="瑙勬牸鍨嬪彿"
-                           prop="specificationModel" />
-          <el-table-column label="鍗曚綅"
-                           prop="unit"
-                           width="70" />
-          <el-table-column label="鏁伴噺"
-                           prop="quantity"
-                           width="70" />
-          <el-table-column label="搴撳瓨棰勮鏁伴噺"
-                           prop="warnNum"
-                           width="120"
-                           show-overflow-tooltip />
-          <el-table-column label="绋庣巼(%)"
-                           prop="taxRate"
-                           width="80" />
-          <el-table-column label="鍚◣鍗曚环(鍏�)"
-                           prop="taxInclusiveUnitPrice"
-                           :formatter="formattedNumber"
-                           width="150" />
-          <el-table-column label="鍚◣鎬讳环(鍏�)"
-                           prop="taxInclusiveTotalPrice"
-                           :formatter="formattedNumber"
-                           width="150" />
-          <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
-                           prop="taxExclusiveTotalPrice"
-                           :formatter="formattedNumber"
-                           width="150" />
-          <el-table-column label="鏄惁璐ㄦ"
-                           prop="isChecked"
-                           width="150">
+        <el-table :data="productData" border @selection-change="productSelected" show-summary
+          :summary-method="summarizeProTable">
+          <el-table-column align="center" type="selection" width="55" />
+          <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+          <el-table-column label="浜у搧澶х被" prop="productCategory" />
+          <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+          <el-table-column label="鍗曚綅" prop="unit" width="70" />
+          <el-table-column label="鏁伴噺" prop="quantity" width="70" />
+          <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum" width="120" show-overflow-tooltip />
+          <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
+          <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" width="150" />
+          <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" width="150" />
+          <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" width="150" />
+          <el-table-column label="鏄惁璐ㄦ" prop="isChecked" width="150">
             <template #default="scope">
               <el-tag :type="scope.row.isChecked ? 'success' : 'info'">
                 {{ scope.row.isChecked ? '鏄�' : '鍚�' }}
               </el-tag>
             </template>
           </el-table-column>
-          <el-table-column fixed="right"
-                           label="鎿嶄綔"
-                           min-width="60"
-                           align="center">
+          <el-table-column label="鍏ュ簱瀹℃牳鐘舵��" prop="stockInApprovalStatus" width="120">
             <template #default="scope">
-              <el-button link
-                         type="primary"
-                         @click="openProductForm('edit', scope.row, scope.$index)">缂栬緫
+              <el-tag :type="getStockInApprovalStatusType(scope.row.stockInApprovalStatus)" size="small">
+                {{ scope.row.stockInApprovalStatus || '--' }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
+            <template #default="scope">
+              <el-button link type="primary" @click="openProductForm('edit', scope.row, scope.$index)"
+                :disabled="scope.row.stockInApprovalStatus === '瀹屽叏鍏ュ簱'">缂栬緫
               </el-button>
             </template>
           </el-table-column>
         </el-table>
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="澶囨敞路锛�"
-                          prop="remarks">
-              <el-input v-model="form.remarks"
-                        placeholder="璇疯緭鍏�"
-                        clearable
-                        type="textarea"
-                        :rows="2" />
+            <el-form-item label="澶囨敞路锛�" prop="remarks">
+              <el-input v-model="form.remarks" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="闄勪欢鏉愭枡锛�"
-                          prop="purchaseLedgerFiles">
+            <el-form-item label="闄勪欢鏉愭枡锛�" prop="purchaseLedgerFiles">
               <FileUpload v-model:file-list="fileList" />
             </el-form-item>
           </el-col>
@@ -438,24 +263,12 @@
       </el-form>
     </FormDialog>
     <!-- 瀵煎叆寮圭獥 -->
-    <FormDialog v-model="importUpload.open"
-                :title="importUpload.title"
-                :width="'600px'"
-                @close="importUpload.open = false"
-                @confirm="submitImportFile"
-                @cancel="importUpload.open = false">
-      <el-upload ref="importUploadRef"
-                 :limit="1"
-                 accept=".xlsx,.xls"
-                 :action="importUpload.url"
-                 :headers="importUpload.headers"
-                 :before-upload="importUpload.beforeUpload"
-                 :on-success="importUpload.onSuccess"
-                 :on-error="importUpload.onError"
-                 :on-progress="importUpload.onProgress"
-                 :on-change="importUpload.onChange"
-                 :auto-upload="false"
-                 drag>
+    <FormDialog v-model="importUpload.open" :title="importUpload.title" :width="'600px'"
+      @close="importUpload.open = false" @confirm="submitImportFile" @cancel="importUpload.open = false">
+      <el-upload ref="importUploadRef" :limit="1" accept=".xlsx,.xls" :action="importUpload.url"
+        :headers="importUpload.headers" :before-upload="importUpload.beforeUpload" :on-success="importUpload.onSuccess"
+        :on-error="importUpload.onError" :on-progress="importUpload.onProgress" :on-change="importUpload.onChange"
+        :auto-upload="false" drag>
         <i class="el-icon-upload"></i>
         <div class="el-upload__text">
           灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em>
@@ -463,180 +276,105 @@
         <template #tip>
           <div class="el-upload__tip">
             浠呮敮鎸� xls/xlsx锛屽ぇ灏忎笉瓒呰繃 10MB銆�
-            <el-button link
-                       type="primary"
-                       @click="downloadTemplate">涓嬭浇瀵煎叆妯℃澘</el-button>
+            <el-button link type="primary" @click="downloadTemplate">涓嬭浇瀵煎叆妯℃澘</el-button>
           </div>
         </template>
       </el-upload>
     </FormDialog>
-    <FormDialog v-model="productFormVisible"
-                :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'"
-                :width="'40%'"
-                :operation-type="productOperationType"
-                @close="closeProductDia"
-                @confirm="submitProduct"
-                @cancel="closeProductDia">
-      <el-form :model="productForm"
-               label-width="140px"
-               label-position="top"
-               :rules="productRules"
-               ref="productFormRef">
+    <FormDialog v-model="productFormVisible" :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" :width="'40%'"
+      :operation-type="productOperationType" @close="closeProductDia" @confirm="submitProduct"
+      @cancel="closeProductDia">
+      <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="浜у搧澶х被锛�"
-                          prop="productId">
-              <el-tree-select v-model="productForm.productId"
-                              placeholder="璇烽�夋嫨"
-                              clearable
-                              filterable
-                              check-strictly
-                              @change="getModels"
-                              :data="productOptions"
-                              :render-after-expand="false"
-                              style="width: 100%" />
+            <el-form-item label="浜у搧澶х被锛�" prop="productId">
+              <el-tree-select v-model="productForm.productId" placeholder="璇烽�夋嫨" clearable filterable check-strictly
+                @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�"
-                          prop="productModelId">
-              <el-select v-model="productForm.productModelId"
-                         placeholder="璇烽�夋嫨"
-                         filterable
-                         clearable
-                         @change="getProductModel">
-                <el-option v-for="item in modelOptions"
-                           :key="item.id"
-                           :label="item.model"
-                           :value="item.id" />
+            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+              <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" filterable clearable
+                @change="getProductModel">
+                <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鍗曚綅锛�"
-                          prop="unit">
-              <el-input v-model="productForm.unit"
-                        placeholder="璇疯緭鍏�"
-                        clearable />
+            <el-form-item label="鍗曚綅锛�" prop="unit">
+              <el-input v-model="productForm.unit" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="绋庣巼(%)锛�"
-                          prop="taxRate">
-              <el-select v-model="productForm.taxRate"
-                         placeholder="璇烽�夋嫨"
-                         clearable
-                         @change="mathNum">
-                <el-option v-for="dict in tax_rate"
-                           :key="dict.value"
-                           :label="dict.label"
-                           :value="dict.value" />
+            <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
+              <el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="mathNum">
+                <el-option v-for="dict in tax_rate" :key="dict.value" :label="dict.label" :value="dict.value" />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鍚◣鍗曚环(鍏�)锛�"
-                          prop="taxInclusiveUnitPrice">
-              <el-input-number v-model="productForm.taxInclusiveUnitPrice"
-                               :precision="2"
-                               :step="0.1"
-                               :min="0"
-                               clearable
-                               style="width: 100%"
-                               @change="mathNum" />
+            <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
+              <el-input-number v-model="productForm.taxInclusiveUnitPrice" :precision="2" :step="0.1" :min="0" clearable
+                style="width: 100%" @change="mathNum" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鏁伴噺锛�"
-                          prop="quantity">
-              <el-input-number :step="0.1"
-                               clearable
-                               :precision="2"
-                               :min="0"
-                               style="width: 100%"
-                               v-model="productForm.quantity"
-                               placeholder="璇疯緭鍏�"
-                               @change="mathNum" />
+            <el-form-item label="鏁伴噺锛�" prop="quantity">
+              <el-input-number :step="0.1" clearable :precision="2" :min="0" style="width: 100%"
+                v-model="productForm.quantity" placeholder="璇疯緭鍏�" @change="mathNum" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鍚◣鎬讳环(鍏�)锛�"
-                          prop="taxInclusiveTotalPrice">
-              <el-input-number v-model="productForm.taxInclusiveTotalPrice"
-                               :precision="2"
-                               :step="0.1"
-                               :min="0"
-                               clearable
-                               style="width: 100%"
-                               @change="reverseMathNum('taxInclusiveTotalPrice')" />
+            <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
+              <el-input-number v-model="productForm.taxInclusiveTotalPrice" :precision="2" :step="0.1" :min="0"
+                clearable style="width: 100%" @change="reverseMathNum('taxInclusiveTotalPrice')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�"
-                          prop="taxExclusiveTotalPrice">
-              <el-input-number v-model="productForm.taxExclusiveTotalPrice"
-                               :precision="2"
-                               :step="0.1"
-                               :min="0"
-                               clearable
-                               style="width: 100%"
-                               @change="reverseMathNum('taxExclusiveTotalPrice')" />
+            <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice">
+              <el-input-number v-model="productForm.taxExclusiveTotalPrice" :precision="2" :step="0.1" :min="0"
+                clearable style="width: 100%" @change="reverseMathNum('taxExclusiveTotalPrice')" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鍙戠エ绫诲瀷锛�"
-                          prop="invoiceType">
-              <el-select v-model="productForm.invoiceType"
-                         placeholder="璇烽�夋嫨"
-                         clearable>
-                <el-option label="澧炴櫘绁�"
-                           value="澧炴櫘绁�" />
-                <el-option label="澧炰笓绁�"
-                           value="澧炰笓绁�" />
+            <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType">
+              <el-select v-model="productForm.invoiceType" placeholder="璇烽�夋嫨" clearable>
+                <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
+                <el-option label="澧炰笓绁�" value="澧炰笓绁�" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="搴撳瓨棰勮鏁伴噺锛�"
-                          prop="warnNum">
-              <el-input-number v-model="productForm.warnNum"
-                               :precision="2"
-                               :step="0.1"
-                               :min="0"
-                               clearable
-                               style="width: 100%" />
+            <el-form-item label="搴撳瓨棰勮鏁伴噺锛�" prop="warnNum">
+              <el-input-number v-model="productForm.warnNum" :precision="2" :step="0.1" :min="0" clearable
+                style="width: 100%" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鏄惁璐ㄦ锛�"
-                          prop="isChecked">
+            <el-form-item label="鏄惁璐ㄦ锛�" prop="isChecked">
               <el-radio-group v-model="productForm.isChecked">
-                <el-radio label="鏄�"
-                          :value="true" />
-                <el-radio label="鍚�"
-                          :value="false" />
+                <el-radio label="鏄�" :value="true" />
+                <el-radio label="鍚�" :value="false" />
               </el-radio-group>
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
     </FormDialog>
-    <FileList v-if="fileListDialogVisible"
-              v-model:visible="fileListDialogVisible"
-              record-type="purchase_ledger"
-              :record-id="recordId" />
+    <FileList v-if="fileListDialogVisible" v-model:visible="fileListDialogVisible" record-type="purchase_ledger"
+      :record-id="recordId" />
   </div>
 </template>
 
@@ -675,6 +413,7 @@
     getOptions,
     getPurchaseTemplateList,
     delPurchaseTemplate,
+    batchGeneratePurchaseInboundSteps,
   } from "@/api/procurementManagement/procurementLedger.js";
   import useFormData from "@/hooks/useFormData.js";
   const FileList = defineAsyncComponent(() =>
@@ -693,6 +432,7 @@
   const salesContractList = ref([]);
   const supplierList = ref([]);
   const tableLoading = ref(false);
+  const recordId = ref();
   const fileListDialogVisible = ref(false);
   const page = reactive({
     current: 1,
@@ -722,6 +462,26 @@
       2: "warning", // 瀹℃壒涓� - 姗欒壊
       3: "success", // 瀹℃壒閫氳繃 - 缁胯壊
       4: "danger", // 瀹℃壒澶辫触 - 绾㈣壊
+    };
+    return typeMap[status] || "";
+  };
+
+  // 鑾峰彇鍏ュ簱鐘舵�佹爣绛剧被鍨�
+  const getStockInStatusType = status => {
+    const typeMap = {
+      寰呭叆搴�: "info", // 寰呭叆搴� - 鐏拌壊
+      鍏ュ簱涓�: "warning", // 鍏ュ簱涓� - 姗欒壊
+      瀹屽叏鍏ュ簱: "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
+    };
+    return typeMap[status] || "";
+  };
+
+  // 鑾峰彇鍏ュ簱瀹℃牳鐘舵�佹爣绛剧被鍨�
+  const getStockInApprovalStatusType = status => {
+    const typeMap = {
+      寰呭叆搴�: "info", // 寰呭叆搴� - 鐏拌壊
+      鍏ュ簱涓�: "warning", // 鍏ュ簱涓� - 姗欒壊
+      瀹屽叏鍏ュ簱: "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
     };
     return typeMap[status] || "";
   };
@@ -856,7 +616,7 @@
     },
     rules: {
       purchaseContractNumber: [
-        { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+        { required: false, message: "璇疯緭鍏�", trigger: "blur" },
       ],
       projectName: [
         { required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" },
@@ -867,16 +627,7 @@
     },
   });
   const { form, rules } = toRefs(data);
-  const { form: searchForm } = useFormData({
-    ...data.searchForm,
-    // 璁剧疆褰曞叆鏃ユ湡鑼冨洿涓哄綋澶�
-    entryDate: [
-      dayjs().startOf("day").format("YYYY-MM-DD"),
-      dayjs().endOf("day").format("YYYY-MM-DD"),
-    ],
-    entryDateStart: dayjs().startOf("day").format("YYYY-MM-DD"),
-    entryDateEnd: dayjs().endOf("day").format("YYYY-MM-DD"),
-  });
+  const { form: searchForm } = useFormData(data.searchForm);
 
   // 浜у搧琛ㄥ崟寮规鏁版嵁
   const productFormVisible = ref(false);
@@ -1193,7 +944,7 @@
   };
   // 涓昏〃鍚堣鏂规硶
   const summarizeMainTable = param => {
-    return proxy.summarizeTable(param, ["contractAmount"]);
+    return proxy.summarizeTable(param, ["contractAmount", "netContractAmount"]);
   };
   // 瀛愯〃鍚堣鏂规硶
   const summarizeProTable = param => {
@@ -1205,10 +956,10 @@
   };
   // 鎵撳紑寮规
   const openForm = async (type, row) => {
-    // 缂栬緫鏃舵鏌ュ鏍哥姸鎬侊紝鍙湁寰呭鏍�(1)鍜屽鎵瑰け璐�(4)鎵嶈兘缂栬緫
+    // 缂栬緫鏃舵鏌ュ叆搴撶姸鎬侊紝瀹屽叏鍏ュ簱鏃朵笉鑳界紪杈�
     if (type === "edit" && row) {
-      if (row.approvalStatus !== 1 && row.approvalStatus !== 4) {
-        proxy.$modal.msgWarning("鍙湁寰呭鏍稿拰瀹℃壒澶辫触鐘舵�佺殑璁板綍鎵嶈兘缂栬緫");
+      if (row.stockInStatus === "瀹屽叏鍏ュ簱") {
+        proxy.$modal.msgWarning("瀹屽叏鍏ュ簱鐘舵�佺殑璁板綍涓嶈兘缂栬緫");
         return;
       }
     }
@@ -1239,25 +990,19 @@
 
       form.value.entryDate = getCurrentDate();
 
-      if (type === "add") {
-        // 鏂板鏃剁敓鎴愰噰璐悎鍚屽彿
-        try {
-          const purchaseNoRes = await createPurchaseNo();
-          if (purchaseNoRes?.data) {
-            form.value.purchaseContractNumber = purchaseNoRes.data;
-          }
-        } catch (error) {
-          console.error("鐢熸垚閲囪喘鍚堝悓鍙峰け璐�:", error);
-          proxy.$modal.msgWarning("鐢熸垚閲囪喘鍚堝悓鍙峰け璐�");
-        }
-      } else if (type === "edit" && row?.id) {
+      if (type === "edit" && row?.id) {
         // 缂栬緫鏃跺姞杞芥暟鎹�
         currentId.value = row.id;
         try {
           const purchaseRes = await getPurchaseById({ id: row.id, type: 2 });
-          form.value = { ...purchaseRes };
-          productData.value = purchaseRes.productData || [];
+          form.value = { ...purchaseRes, stockInStatus: row.stockInStatus };
           fileList.value = purchaseRes.storageBlobVOS || [];
+          // 浣跨敤 productList 鎺ュ彛鑾峰彇浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
+          const productRes = await productList({
+            salesLedgerId: row.id,
+            type: 2,
+          });
+          productData.value = productRes.data || [];
         } catch (error) {
           console.error("鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:", error);
           proxy.$modal.msgError("鍔犺浇鏁版嵁澶辫触");
@@ -1329,7 +1074,7 @@
 
   // 鎻愪氦琛ㄥ崟
   const submitForm = () => {
-    proxy.$refs["formRef"].validate(valid => {
+    proxy.$refs["formRef"].validate(async valid => {
       if (valid) {
         if (productData.value.length > 0) {
           // 鏂板鏃讹紝闇�瑕佷粠姣忎釜浜у搧瀵硅薄涓垹闄� id 瀛楁
@@ -1359,6 +1104,20 @@
           delete submitData.id;
         }
 
+        // 濡傛灉閲囪喘鍚堝悓鍙蜂负绌猴紝鍒欐牴鎹綍鍏ユ棩鏈熻嚜鍔ㄧ敓鎴�
+        if (!submitData.purchaseContractNumber) {
+          try {
+            const purchaseNoRes = await createPurchaseNo(submitData.entryDate);
+            if (purchaseNoRes?.data) {
+              submitData.purchaseContractNumber = purchaseNoRes.data;
+            }
+          } catch (error) {
+            console.error("鐢熸垚閲囪喘鍚堝悓鍙峰け璐�:", error);
+            proxy.$modal.msgWarning("鐢熸垚閲囪喘鍚堝悓鍙峰け璐�");
+            return;
+          }
+        }
+
         addOrEditPurchase(submitData).then(res => {
           proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
           closeDia();
@@ -1374,6 +1133,12 @@
   };
   // 鎵撳紑浜у搧寮规
   const openProductForm = async (type, row, index) => {
+    // 缂栬緫鏃舵鏌ヤ骇鍝佸叆搴撳鏍哥姸鎬侊紝瀹屽叏鍏ュ簱鏃朵笉鑳界紪杈�
+    if (type === "edit" && row && row.stockInApprovalStatus === "瀹屽叏鍏ュ簱") {
+      proxy.$modal.msgWarning("瀹屽叏鍏ュ簱鐘舵�佺殑浜у搧涓嶈兘缂栬緫");
+      return;
+    }
+
     productOperationType.value = type;
     productOperationIndex.value = index;
     productForm.value = {};
@@ -1544,8 +1309,9 @@
     addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
       proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
       closeProductDia();
-      getPurchaseById({ id: currentId.value, type: 2 }).then(res => {
-        productData.value = res.productData;
+      // 浣跨敤 productList 鎺ュ彛鍒锋柊浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
+      productList({ salesLedgerId: currentId.value, type: 2 }).then(res => {
+        productData.value = res.data || [];
       });
     });
   };
@@ -1555,15 +1321,19 @@
       proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
       return;
     }
+    // 妫�鏌ラ�変腑鐨勪骇鍝佷腑鏄惁鏈夊畬鍏ㄥ叆搴撶殑
+    const hasFullyStocked = productSelectedRows.value.some(
+      row => row.stockInApprovalStatus === "瀹屽叏鍏ュ簱"
+    );
+    if (hasFullyStocked) {
+      proxy.$modal.msgWarning("閫変腑鐨勪骇鍝佷腑鍖呭惈瀹屽叏鍏ュ簱鐨勪骇鍝侊紝鏃犳硶鍒犻櫎");
+      return;
+    }
     if (operationType.value === "add") {
-      productSelectedRows.value.forEach(selectedRow => {
-        const index = productData.value.findIndex(
-          product => product.id === selectedRow.id
-        );
-        if (index !== -1) {
-          productData.value.splice(index, 1);
-        }
-      });
+      productData.value = productData.value.filter(
+        item => !productSelectedRows.value.includes(item)
+      );
+      productSelectedRows.value = [];
     } else {
       let ids = [];
       if (productSelectedRows.value.length > 0) {
@@ -1578,8 +1348,9 @@
           delProduct(ids).then(res => {
             proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
             closeProductDia();
-            getPurchaseById({ id: currentId.value, type: 2 }).then(res => {
-              productData.value = res.productData;
+            // 浣跨敤 productList 鎺ュ彛鍒锋柊浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
+            productList({ salesLedgerId: currentId.value, type: 2 }).then(res => {
+              productData.value = res.data || [];
             });
           });
         })
@@ -1628,6 +1399,37 @@
           proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
           getList();
         });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
+
+  const handleBatchGenerate = async () => {
+    if (selectedRows.value.length === 0) {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+      return;
+    }
+    const ids = selectedRows.value.map((item) => item.id);
+    
+    ElMessageBox.confirm("纭鎵归噺鐢熸垚鏁版嵁锛�", "鎵归噺鐢熸垚", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "info",
+    })
+      .then(() => {
+        proxy.$modal.loading("姝e湪鎵归噺鐢熸垚鏁版嵁锛岃绋嶅��...");
+        batchGeneratePurchaseInboundSteps({ ids })
+          .then((res) => {
+            proxy.$modal.msgSuccess("鎵归噺鐢熸垚鎴愬姛");
+            getList();
+          })
+          .catch(() => {
+            proxy.$modal.msgError("鎵归噺鐢熸垚澶辫触");
+          })
+          .finally(() => {
+            proxy.$modal.closeLoading();
+          });
       })
       .catch(() => {
         proxy.$modal.msg("宸插彇娑�");
@@ -1771,7 +1573,7 @@
       contractNo: form.value.salesLedgerId,
     });
     if (code == 200) {
-      productData.value = data;
+      productData.value = data || [];
     }
   };
 

--
Gitblit v1.9.3