From b175633a8a9599a09667d7d7c01a13d77c7733ee Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期三, 06 五月 2026 14:34:03 +0800
Subject: [PATCH] feat(customerService): 新增售后单表单组件及销售台账管理功能

---
 src/views/customerService/feedbackRegistration/components/formDia.vue |    1 
 src/views/salesManagement/returnOrder/components/formDia.vue          |    2 
 src/views/salesManagement/salesLedger/index.vue                       | 3261 +++++++++++++++++++++++++++++++----------------------------
 src/api/inventoryManagement/stockInventory.js                         |    8 
 4 files changed, 1,719 insertions(+), 1,553 deletions(-)

diff --git a/src/api/inventoryManagement/stockInventory.js b/src/api/inventoryManagement/stockInventory.js
index eafccbf..0ba0943 100644
--- a/src/api/inventoryManagement/stockInventory.js
+++ b/src/api/inventoryManagement/stockInventory.js
@@ -87,3 +87,11 @@
     });
 };
 
+export const getStockInventoryByModelId = (productModelId) => {
+    return request({
+        url: "/stockInventory/getByModelId",
+        method: "get",
+        params: { productModelId },
+    });
+};
+
diff --git a/src/views/customerService/feedbackRegistration/components/formDia.vue b/src/views/customerService/feedbackRegistration/components/formDia.vue
index 1fe4eb6..5c9e565 100644
--- a/src/views/customerService/feedbackRegistration/components/formDia.vue
+++ b/src/views/customerService/feedbackRegistration/components/formDia.vue
@@ -212,6 +212,7 @@
     taxInclusiveUnitPrice: row?.taxInclusiveUnitPrice ?? 0,
     taxInclusiveTotalPrice: row?.taxInclusiveTotalPrice ?? 0,
     taxExclusiveTotalPrice: row?.taxExclusiveTotalPrice ?? 0,
+    noQuantity: row?.noQuantity ?? 0,
   }
 }
 
diff --git a/src/views/salesManagement/returnOrder/components/formDia.vue b/src/views/salesManagement/returnOrder/components/formDia.vue
index 27bbb0d..6ee63a8 100644
--- a/src/views/salesManagement/returnOrder/components/formDia.vue
+++ b/src/views/salesManagement/returnOrder/components/formDia.vue
@@ -405,7 +405,7 @@
   }).then(res => {
     if(res.code === 200){
       outboundOptions.value = res.data.map(item => ({
-        label: item.salesContractNo, // Or whatever the outbound number field is
+        label: item.shippingNo, // Or whatever the outbound number field is
         value: item.id,
       }))
     }
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 1235f94..7849b60 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -8,21 +8,21 @@
                     placeholder="璇疯緭鍏�"
                     clearable
                     prefix-icon="Search"
-                    @change="handleQuery" />
+                    @change="handleQuery"/>
         </el-form-item>
         <el-form-item label="閿�鍞悎鍚屽彿锛�">
           <el-input v-model="searchForm.salesContractNo"
                     placeholder="璇疯緭鍏�"
                     clearable
                     prefix-icon="Search"
-                    @change="handleQuery" />
+                    @change="handleQuery"/>
         </el-form-item>
         <el-form-item label="椤圭洰鍚嶇О锛�">
           <el-input v-model="searchForm.projectName"
                     placeholder="璇疯緭鍏�"
                     clearable
                     prefix-icon="Search"
-                    @change="handleQuery" />
+                    @change="handleQuery"/>
         </el-form-item>
         <el-form-item label="褰曞叆鏃ユ湡锛�">
           <el-date-picker v-model="searchForm.entryDate"
@@ -31,11 +31,12 @@
                           type="daterange"
                           placeholder="璇烽�夋嫨"
                           clearable
-                          @change="changeDaterange" />
+                          @change="changeDaterange"/>
         </el-form-item>
         <el-form-item>
           <el-button type="primary"
-                     @click="handleQuery"> 鎼滅储 </el-button>
+                     @click="handleQuery"> 鎼滅储
+          </el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -49,14 +50,17 @@
           </el-button>
           <el-button type="primary"
                      plain
-                     @click="handleImport">瀵煎叆</el-button>
+                     @click="handleImport">瀵煎叆
+          </el-button>
           <el-button @click="handleOut">瀵煎嚭</el-button>
           <el-button type="danger"
                      plain
-                     @click="handleDelete">鍒犻櫎</el-button>
+                     @click="handleDelete">鍒犻櫎
+          </el-button>
           <el-button type="primary"
                      plain
-                     @click="handlePrint">鎵撳嵃</el-button>
+                     @click="handlePrint">鎵撳嵃
+          </el-button>
         </div>
       </div>
       <el-table :data="tableData"
@@ -74,7 +78,7 @@
         <el-table-column align="center"
                          type="selection"
                          width="55"
-                         fixed="left" />
+                         fixed="left"/>
         <el-table-column type="expand"
                          width="60"
                          fixed="left">
@@ -85,23 +89,28 @@
                       :summary-method="(param) => summarizeChildrenTable(param, props.row)">
               <el-table-column align="center"
                                label="搴忓彿"
-                               type="index" />
+                               type="index"/>
               <el-table-column label="浜у搧澶х被"
-                               prop="productCategory" />
+                               prop="productCategory"/>
               <el-table-column label="瑙勬牸鍨嬪彿"
-                               prop="specificationModel" />
+                               prop="specificationModel"/>
               <el-table-column label="鍗曚綅"
-                               prop="unit" />
+                               prop="unit"/>
               <el-table-column label="浜у搧鐘舵��"
                                width="100px"
                                align="center">
                 <template #default="scope">
-                  <el-tag v-if="scope.row.approveStatus === 1 && (!scope.row.shippingDate || !scope.row.shippingCarNumber)"
-                          type="success">鍏呰冻</el-tag>
-                  <el-tag v-else-if="scope.row.approveStatus === 0 && (scope.row.shippingDate || scope.row.shippingCarNumber)"
-                          type="success">宸插嚭搴�</el-tag>
+                  <el-tag
+                      v-if="scope.row.approveStatus === 1 && scope.row.noQuantity !== 0"
+                      type="success">鍏呰冻
+                  </el-tag>
+                  <el-tag
+                      v-else-if="scope.row.approveStatus === 0 && scope.row.noQuantity === 0"
+                      type="success">宸插嚭搴�
+                  </el-tag>
                   <el-tag v-else
-                          type="danger">涓嶈冻</el-tag>
+                          type="danger">涓嶈冻
+                  </el-tag>
                 </template>
               </el-table-column>
               <el-table-column label="鍙戣揣鐘舵��"
@@ -116,19 +125,21 @@
               </el-table-column>
               <el-table-column label="蹇�掑叕鍙�"
                                prop="expressCompany"
-                               show-overflow-tooltip />
+                               show-overflow-tooltip/>
               <el-table-column label="蹇�掑崟鍙�"
                                prop="expressNumber"
-                               show-overflow-tooltip />
+                               show-overflow-tooltip/>
               <el-table-column label="鍙戣揣杞︾墝"
                                minWidth="100px"
                                align="center">
                 <template #default="scope">
                   <div>
                     <el-tag type="success"
-                            v-if="scope.row.shippingCarNumber">{{ scope.row.shippingCarNumber }}</el-tag>
+                            v-if="scope.row.shippingCarNumber">{{ scope.row.shippingCarNumber }}
+                    </el-tag>
                     <el-tag v-else
-                            type="info">-</el-tag>
+                            type="info">-
+                    </el-tag>
                   </div>
                 </template>
               </el-table-column>
@@ -139,23 +150,26 @@
                   <div>
                     <div v-if="scope.row.shippingDate">{{ scope.row.shippingDate }}</div>
                     <el-tag v-else
-                            type="info">-</el-tag>
+                            type="info">-
+                    </el-tag>
                   </div>
                 </template>
               </el-table-column>
               <el-table-column label="鏁伴噺"
-                               prop="quantity" />
+                               prop="quantity"/>
+              <el-table-column label="寰呭彂璐ф暟閲�"
+                               prop="noQuantity"/>
               <el-table-column label="绋庣巼(%)"
-                               prop="taxRate" />
+                               prop="taxRate"/>
               <el-table-column label="鍚◣鍗曚环(鍏�)"
                                prop="taxInclusiveUnitPrice"
-                               :formatter="sensitiveAmountFormatter" />
+                               :formatter="sensitiveAmountFormatter"/>
               <el-table-column label="鍚◣鎬讳环(鍏�)"
                                prop="taxInclusiveTotalPrice"
-                               :formatter="sensitiveAmountFormatter" />
+                               :formatter="sensitiveAmountFormatter"/>
               <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
                                prop="taxExclusiveTotalPrice"
-                               :formatter="sensitiveAmountFormatter" />
+                               :formatter="sensitiveAmountFormatter"/>
               <!--鎿嶄綔-->
               <el-table-column Width="60px"
                                label="鎿嶄綔"
@@ -175,51 +189,51 @@
         <el-table-column align="center"
                          label="搴忓彿"
                          type="index"
-                         width="60" />
+                         width="60"/>
         <el-table-column label="閿�鍞悎鍚屽彿"
                          prop="salesContractNo"
                          width="180"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column label="瀹㈡埛鍚嶇О"
                          prop="customerName"
                          width="300"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column label="涓氬姟鍛�"
                          prop="salesman"
                          width="100"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column label="椤圭洰鍚嶇О"
                          prop="projectName"
                          width="180"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column label="浠樻鏂瑰紡"
                          prop="paymentMethod"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column label="鍚堝悓閲戦(鍏�)"
                          prop="contractAmount"
                          width="220"
                          show-overflow-tooltip
-                         :formatter="formattedNumber" />
+                         :formatter="formattedNumber"/>
         <el-table-column label="褰曞叆浜�"
                          prop="entryPersonName"
                          width="100"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column label="褰曞叆鏃ユ湡"
                          prop="entryDate"
                          width="120"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column label="绛捐鏃ユ湡"
                          prop="executionDate"
                          width="120"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column label="浜や粯鏃ユ湡"
                          prop="deliveryDate"
                          width="120"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column label="澶囨敞"
                          prop="remarks"
                          width="200"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column fixed="right"
                          label="鎿嶄綔"
                          width="130"
@@ -228,10 +242,12 @@
             <el-button link
                        type="primary"
                        @click="openForm('edit', scope.row)"
-                       :disabled="!scope.row.isEdit || scope.row.hasProductionRecord || !canEditLedger(scope.row)">缂栬緫</el-button>
+                       :disabled="!scope.row.isEdit || scope.row.hasProductionRecord || !canEditLedger(scope.row)">缂栬緫
+            </el-button>
             <el-button link
                        type="primary"
-                       @click="openFileDialog(scope.row)">闄勪欢</el-button>
+                       @click="openFileDialog(scope.row)">闄勪欢
+            </el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -240,7 +256,7 @@
                   layout="total, sizes, prev, pager, next, jumper"
                   :page="page.current"
                   :limit="page.size"
-                  @pagination="paginationChange" />
+                  @pagination="paginationChange"/>
     </div>
     <FormDialog v-model="dialogFormVisible"
                 :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'"
@@ -273,7 +289,7 @@
               <el-input v-model="form.salesContractNo"
                         placeholder="鑷姩鐢熸垚"
                         clearable
-                        disabled />
+                        disabled/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -287,7 +303,7 @@
                 <el-option v-for="item in userList"
                            :key="item.nickName"
                            :label="item.nickName"
-                           :value="item.nickName" />
+                           :value="item.nickName"/>
               </el-select>
             </el-form-item>
           </el-col>
@@ -318,7 +334,7 @@
               <el-input v-model="form.projectName"
                         placeholder="璇疯緭鍏�"
                         clearable
-                        :disabled="operationType === 'view'" />
+                        :disabled="operationType === 'view'"/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -333,7 +349,7 @@
                               type="date"
                               placeholder="璇烽�夋嫨"
                               clearable
-                              :disabled="operationType === 'view'" />
+                              :disabled="operationType === 'view'"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -341,7 +357,7 @@
               <el-input v-model="form.paymentMethod"
                         placeholder="璇疯緭鍏�"
                         clearable
-                        :disabled="operationType === 'view'" />
+                        :disabled="operationType === 'view'"/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -359,7 +375,7 @@
                 <el-option v-for="item in userList"
                            :key="item.userId"
                            :label="item.nickName"
-                           :value="item.userId" />
+                           :value="item.userId"/>
               </el-select>
             </el-form-item>
           </el-col>
@@ -372,7 +388,7 @@
                               format="YYYY-MM-DD"
                               type="date"
                               placeholder="璇烽�夋嫨"
-                              clearable />
+                              clearable/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -386,7 +402,7 @@
                               format="YYYY-MM-DD"
                               type="date"
                               placeholder="璇烽�夋嫨"
-                              clearable />
+                              clearable/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -395,11 +411,13 @@
                         prop="entryDate">
             <el-button v-if="operationType !== 'view'"
                        type="primary"
-                       @click="openProductForm('add')">娣诲姞</el-button>
+                       @click="openProductForm('add')">娣诲姞
+            </el-button>
             <el-button v-if="operationType !== 'view'"
                        plain
                        type="danger"
-                       @click="deleteProduct">鍒犻櫎</el-button>
+                       @click="deleteProduct">鍒犻櫎
+            </el-button>
           </el-form-item>
         </el-row>
         <el-table :data="productData"
@@ -411,30 +429,30 @@
                            type="selection"
                            width="55"
                            v-if="operationType !== 'view'"
-                           :selectable="(row) => !isProductShipped(row)" />
+                           :selectable="(row) => !isProductShipped(row)"/>
           <el-table-column align="center"
                            label="搴忓彿"
                            type="index"
-                           width="60" />
+                           width="60"/>
           <el-table-column label="浜у搧澶х被"
-                           prop="productCategory" />
+                           prop="productCategory"/>
           <el-table-column label="瑙勬牸鍨嬪彿"
-                           prop="specificationModel" />
+                           prop="specificationModel"/>
           <el-table-column label="鍗曚綅"
-                           prop="unit" />
+                           prop="unit"/>
           <el-table-column label="鏁伴噺"
-                           prop="quantity" />
+                           prop="quantity"/>
           <el-table-column label="绋庣巼(%)"
-                           prop="taxRate" />
+                           prop="taxRate"/>
           <el-table-column label="鍚◣鍗曚环(鍏�)"
                            prop="taxInclusiveUnitPrice"
-                           :formatter="formattedNumber" />
+                           :formatter="formattedNumber"/>
           <el-table-column label="鍚◣鎬讳环(鍏�)"
                            prop="taxInclusiveTotalPrice"
-                           :formatter="formattedNumber" />
+                           :formatter="formattedNumber"/>
           <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
                            prop="taxExclusiveTotalPrice"
-                           :formatter="formattedNumber" />
+                           :formatter="formattedNumber"/>
           <el-table-column label="鏄惁鐢熶骇"
                            prop="isProduction"
                            width="150">
@@ -454,7 +472,8 @@
                          type="primary"
                          size="small"
                          :disabled="isProductShipped(scope.row)"
-                         @click="openProductForm('edit', scope.row,scope.$index)">缂栬緫</el-button>
+                         @click="openProductForm('edit', scope.row,scope.$index)">缂栬緫
+              </el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -467,7 +486,7 @@
                         clearable
                         type="textarea"
                         :rows="2"
-                        :disabled="operationType === 'view'" />
+                        :disabled="operationType === 'view'"/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -475,7 +494,7 @@
           <el-col :span="24">
             <el-form-item label="闄勪欢鏉愭枡锛�"
                           prop="salesLedgerFiles">
-              <FileUpload v-model:file-list="fileList" />
+              <FileUpload v-model:file-list="fileList"/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -491,14 +510,15 @@
                   placeholder="璇疯緭鍏ユ姤浠峰崟鍙�"
                   clearable
                   style="max-width: 260px;"
-                  @change="fetchQuotationList" />
+                  @change="fetchQuotationList"/>
         <el-input v-model="quotationSearchForm.customer"
                   placeholder="璇疯緭鍏ュ鎴峰悕绉�"
                   clearable
                   style="max-width: 260px;"
-                  @change="fetchQuotationList" />
+                  @change="fetchQuotationList"/>
         <el-button type="primary"
-                   @click="fetchQuotationList">鎼滅储</el-button>
+                   @click="fetchQuotationList">鎼滅储
+        </el-button>
         <el-button @click="resetQuotationSearch">閲嶇疆</el-button>
       </div>
       <el-table :data="quotationList"
@@ -509,26 +529,26 @@
         <el-table-column align="center"
                          label="搴忓彿"
                          type="index"
-                         width="60" />
+                         width="60"/>
         <el-table-column prop="quotationNo"
                          label="鎶ヤ环鍗曞彿"
                          width="180"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column prop="customer"
                          label="瀹㈡埛鍚嶇О"
                          min-width="220"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column prop="salesperson"
                          label="涓氬姟鍛�"
                          width="120"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip/>
         <el-table-column prop="quotationDate"
                          label="鎶ヤ环鏃ユ湡"
-                         width="140" />
+                         width="140"/>
         <el-table-column prop="status"
                          label="瀹℃壒鐘舵��"
                          width="120"
-                         align="center" />
+                         align="center"/>
         <el-table-column prop="totalAmount"
                          label="鎶ヤ环閲戦(鍏�)"
                          width="160"
@@ -544,7 +564,8 @@
           <template #default="scope">
             <el-button type="primary"
                        link
-                       @click="applyQuotation(scope.row)">閫夋嫨</el-button>
+                       @click="applyQuotation(scope.row)">閫夋嫨
+            </el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -553,7 +574,7 @@
                   layout="total, sizes, prev, pager, next, jumper"
                   :page="quotationPage.current"
                   :limit="quotationPage.size"
-                  @pagination="quotationPaginationChange" />
+                  @pagination="quotationPaginationChange"/>
       <template #footer>
         <el-button @click="quotationDialogVisible = false">鍏抽棴</el-button>
       </template>
@@ -582,7 +603,7 @@
                               @change="getModels"
                               :data="productOptions"
                               :render-after-expand="false"
-                              style="width: 100%" />
+                              style="width: 100%"/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -598,7 +619,7 @@
                 <el-option v-for="item in modelOptions"
                            :key="item.id"
                            :label="item.model"
-                           :value="item.id" />
+                           :value="item.id"/>
               </el-select>
             </el-form-item>
           </el-col>
@@ -609,7 +630,7 @@
                           prop="unit">
               <el-input v-model="productForm.unit"
                         placeholder="璇疯緭鍏�"
-                        clearable />
+                        clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -620,11 +641,11 @@
                          clearable
                          @change="calculateFromTaxRate">
                 <el-option label="1"
-                           value="1" />
+                           value="1"/>
                 <el-option label="6"
-                           value="6" />
+                           value="6"/>
                 <el-option label="13"
-                           value="13" />
+                           value="13"/>
               </el-select>
             </el-form-item>
           </el-col>
@@ -640,7 +661,7 @@
                                :precision="2"
                                placeholder="璇疯緭鍏�"
                                clearable
-                               @change="calculateFromUnitPrice" />
+                               @change="calculateFromUnitPrice"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -653,7 +674,7 @@
                                clearable
                                :precision="2"
                                @change="calculateFromQuantity"
-                               style="width: 100%" />
+                               style="width: 100%"/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -664,7 +685,7 @@
               <el-input v-model="productForm.taxInclusiveTotalPrice"
                         placeholder="璇疯緭鍏�"
                         clearable
-                        @change="calculateFromTotalPrice" />
+                        @change="calculateFromTotalPrice"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -673,7 +694,7 @@
               <el-input v-model="productForm.taxExclusiveTotalPrice"
                         placeholder="璇疯緭鍏�"
                         clearable
-                        @change="calculateFromExclusiveTotalPrice" />
+                        @change="calculateFromExclusiveTotalPrice"/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -685,9 +706,9 @@
                          placeholder="璇烽�夋嫨"
                          clearable>
                 <el-option label="澧炴櫘绁�"
-                           value="澧炴櫘绁�" />
+                           value="澧炴櫘绁�"/>
                 <el-option label="澧炰笓绁�"
-                           value="澧炰笓绁�" />
+                           value="澧炰笓绁�"/>
               </el-select>
             </el-form-item>
           </el-col>
@@ -696,9 +717,9 @@
                           prop="isProduction">
               <el-radio-group v-model="productForm.isProduction">
                 <el-radio label="鏄�"
-                          :value="true" />
+                          :value="true"/>
                 <el-radio label="鍚�"
-                          :value="false" />
+                          :value="false"/>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -733,14 +754,16 @@
             浠呮敮鎸� xls/xlsx锛屽ぇ灏忎笉瓒呰繃 10MB銆�
             <el-button link
                        type="primary"
-                       @click="downloadTemplate">涓嬭浇瀵煎叆妯℃澘</el-button>
+                       @click="downloadTemplate">涓嬭浇瀵煎叆妯℃澘
+            </el-button>
           </div>
         </template>
       </el-upload>
     </FormDialog>
-<!-- // todo 闄勪欢棰勮鐩稿叧 -->
+    <!-- // todo 闄勪欢棰勮鐩稿叧 -->
     <!-- 闄勪欢鍒楄〃寮圭獥 -->
-    <FileList v-if="fileDialogVisible"  v-model:visible="fileDialogVisible" record-type="sales_ledger" :record-id="recordId"  />
+    <FileList v-if="fileDialogVisible" v-model:visible="fileDialogVisible" record-type="sales_ledger"
+              :record-id="recordId"/>
     <!-- 鎵撳嵃棰勮寮圭獥 -->
     <el-dialog v-model="printPreviewVisible"
                title="鎵撳嵃棰勮"
@@ -750,7 +773,8 @@
       <div class="print-preview-container">
         <div class="print-preview-header">
           <el-button type="primary"
-                     @click="executePrint">鎵ц鎵撳嵃</el-button>
+                     @click="executePrint">鎵ц鎵撳嵃
+          </el-button>
           <el-button @click="printPreviewVisible = false">鍏抽棴棰勮</el-button>
         </div>
         <div class="print-preview-content">
@@ -792,39 +816,40 @@
               <div class="table-section">
                 <table class="product-table">
                   <thead>
-                    <tr>
-                      <th>浜у搧鍚嶇О</th>
-                      <th>瑙勬牸鍨嬪彿</th>
-                      <th>鍗曚綅</th>
-                      <th>鍗曚环</th>
-                      <th>闆跺敭鏁伴噺</th>
-                      <th>闆跺敭閲戦</th>
-                    </tr>
+                  <tr>
+                    <th>浜у搧鍚嶇О</th>
+                    <th>瑙勬牸鍨嬪彿</th>
+                    <th>鍗曚綅</th>
+                    <th>鍗曚环</th>
+                    <th>闆跺敭鏁伴噺</th>
+                    <th>闆跺敭閲戦</th>
+                  </tr>
                   </thead>
                   <tbody>
-                    <tr v-for="product in item.products"
-                        :key="product.id">
-                      <td>{{ product.productCategory || '' }}</td>
-                      <td>{{ product.specificationModel || '' }}</td>
-                      <td>{{ product.unit || '' }}</td>
-                      <td>{{ product.taxInclusiveUnitPrice || '0' }}</td>
-                      <td>{{ product.quantity || '0' }}</td>
-                      <td>{{ product.taxInclusiveTotalPrice || '0' }}</td>
-                    </tr>
-                    <tr v-if="!item.products || item.products.length === 0">
-                      <td colspan="6"
-                          style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td>
-                    </tr>
+                  <tr v-for="product in item.products"
+                      :key="product.id">
+                    <td>{{ product.productCategory || '' }}</td>
+                    <td>{{ product.specificationModel || '' }}</td>
+                    <td>{{ product.unit || '' }}</td>
+                    <td>{{ product.taxInclusiveUnitPrice || '0' }}</td>
+                    <td>{{ product.quantity || '0' }}</td>
+                    <td>{{ product.taxInclusiveTotalPrice || '0' }}</td>
+                  </tr>
+                  <tr v-if="!item.products || item.products.length === 0">
+                    <td colspan="6"
+                        style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁
+                    </td>
+                  </tr>
                   </tbody>
                   <tfoot>
-                    <tr>
-                      <td class="label">鍚堣</td>
-                      <td class="total-value"></td>
-                      <td class="total-value"></td>
-                      <td class="total-value"></td>
-                      <td class="total-value">{{ getTotalQuantity(item.products) }}</td>
-                      <td class="total-value">{{ getTotalAmount(item.products) }}</td>
-                    </tr>
+                  <tr>
+                    <td class="label">鍚堣</td>
+                    <td class="total-value"></td>
+                    <td class="total-value"></td>
+                    <td class="total-value"></td>
+                    <td class="total-value">{{ getTotalQuantity(item.products) }}</td>
+                    <td class="total-value">{{ getTotalAmount(item.products) }}</td>
+                  </tr>
                   </tfoot>
                 </table>
               </div>
@@ -877,10 +902,47 @@
                          placeholder="璇烽�夋嫨鍙戣揣绫诲瀷"
                          style="width: 100%">
                 <el-option label="璐ц溅"
-                           value="璐ц溅" />
+                           value="璐ц溅"/>
                 <el-option label="蹇��"
-                           value="蹇��" />
+                           value="蹇��"/>
               </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="鎵瑰彿锛�"
+                          prop="batchNo">
+              <el-table :data="deliveryForm.batchNoList"
+                        border
+                        size="small"
+                        max-height="260"
+                        style="width: 100%;">
+                <el-table-column label="鎵瑰彿"
+                                 prop="batchNo"
+                                 min-width="180"/>
+                <el-table-column label="鏁伴噺"
+                                 min-width="120"
+                                 align="center">
+                  <template #default="scope">
+                    {{ getDeliveryBatchQuantity(scope.row) }}
+                  </template>
+                </el-table-column>
+                <el-table-column label="鍙戣揣鏁伴噺"
+                                 min-width="160"
+                                 align="center">
+                  <template #default="scope">
+                    <el-input-number v-model="scope.row.deliveryQuantity"
+                                     :min="0"
+                                     :max="getDeliveryBatchDeliveryMax(scope.row)"
+                                     :precision="2"
+                                     :step="0.01"
+                                     controls-position="right"
+                                     @change="handleDeliveryBatchQuantityChange(scope.row)"
+                                     style="width: 100%;"/>
+                  </template>
+                </el-table-column>
+              </el-table>
             </el-form-item>
           </el-col>
         </el-row>
@@ -888,7 +950,8 @@
       <template #footer>
         <div class="dialog-footer">
           <el-button type="primary"
-                     @click="submitDelivery">纭鍙戣揣</el-button>
+                     @click="submitDelivery">纭鍙戣揣
+          </el-button>
           <el-button @click="closeDeliveryDia">鍙栨秷</el-button>
         </div>
       </template>
@@ -897,249 +960,309 @@
 </template>
 
 <script setup>
-  import { getToken } from "@/utils/auth";
-  import pagination from "@/components/PIMTable/Pagination.vue";
-  import { onMounted, ref, getCurrentInstance } from "vue";
-  import { addShippingInfo } from "@/api/salesManagement/deliveryLedger.js";
-  import { ElMessageBox, ElMessage } from "element-plus";
-  import useUserStore from "@/store/modules/user";
-  import { userListNoPage } from "@/api/system/user.js";
-  import FormDialog from "@/components/Dialog/FormDialog.vue";
-  import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
-  import {
-    ledgerListPage,
-    productList,
-    customerList,
-    addOrUpdateSalesLedger,
-    getSalesLedgerWithProducts,
-    delLedger,
-    addOrUpdateSalesLedgerProduct,
-    delProduct,
-    delLedgerFile,
-    getProductInventory,
-  } from "@/api/salesManagement/salesLedger.js";
-  import { modelList, productTreeList } from "@/api/basicData/product.js";
-  import useFormData from "@/hooks/useFormData.js";
-  import dayjs from "dayjs";
-  import { getCurrentDate } from "@/utils/index.js";
-  import { useRouter, useRoute } from "vue-router";
-  import { listCustomerPrivatePool } from "@/api/basicData/customerFile.js";
-  import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+import {getToken} from "@/utils/auth";
+import pagination from "@/components/PIMTable/Pagination.vue";
+import {onMounted, ref, getCurrentInstance} from "vue";
+import {addShippingInfo} from "@/api/salesManagement/deliveryLedger.js";
+import {ElMessageBox, ElMessage} from "element-plus";
+import useUserStore from "@/store/modules/user";
+import {userListNoPage} from "@/api/system/user.js";
+import FormDialog from "@/components/Dialog/FormDialog.vue";
+import {getQuotationList} from "@/api/salesManagement/salesQuotation.js";
+import {
+  ledgerListPage,
+  productList,
+  customerList,
+  addOrUpdateSalesLedger,
+  getSalesLedgerWithProducts,
+  delLedger,
+  addOrUpdateSalesLedgerProduct,
+  delProduct,
+  delLedgerFile,
+  getProductInventory,
+} from "@/api/salesManagement/salesLedger.js";
+import {getStockInventoryByModelId} from "@/api/inventoryManagement/stockInventory.js";
+import {modelList, productTreeList} from "@/api/basicData/product.js";
+import useFormData from "@/hooks/useFormData.js";
+import dayjs from "dayjs";
+import {getCurrentDate} from "@/utils/index.js";
+import {useRouter, useRoute} from "vue-router";
+import {listCustomerPrivatePool} from "@/api/basicData/customerFile.js";
+import FileUpload from "@/components/AttachmentUpload/file/index.vue";
 
-  const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
+const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
 
-  const router = useRouter();
-  const route = useRoute();
-  const userStore = useUserStore();
-  const { proxy } = getCurrentInstance();
-  const tableData = ref([]);
-  const productData = ref([]);
-  const selectedRows = ref([]);
-  const productSelectedRows = ref([]);
-  const userList = ref([]);
-  const customerOption = ref([]);
-  const productOptions = ref([]);
-  const modelOptions = ref([]);
-  const tableLoading = ref(false);
-  const page = reactive({
-    current: 1,
-    size: 100,
-  });
-  const total = ref(0);
-  const fileList = ref([]);
+const router = useRouter();
+const route = useRoute();
+const userStore = useUserStore();
+const {proxy} = getCurrentInstance();
+const tableData = ref([]);
+const productData = ref([]);
+const selectedRows = ref([]);
+const productSelectedRows = ref([]);
+const userList = ref([]);
+const customerOption = ref([]);
+const productOptions = ref([]);
+const modelOptions = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+  current: 1,
+  size: 100,
+});
+const total = ref(0);
+const fileList = ref([]);
 
-  // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-  const operationType = ref("");
-  const dialogFormVisible = ref(false);
-  const data = reactive({
-    searchForm: {
-      customerName: "", // 瀹㈡埛鍚嶇О
-      salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
-      entryDate: null, // 褰曞叆鏃ユ湡
-      entryDateStart: undefined,
-      entryDateEnd: undefined,
-    },
-    form: {
-      salesContractNo: "",
-      salesman: "",
-      customerId: "",
-      entryPerson: "",
-      entryDate: "",
-      deliveryDate: "",
-      maintenanceTime: "",
-      productData: [],
-      executionDate: "",
-      hasProductionRecord: false,
-    },
-    rules: {
-      salesman: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      customerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      entryPerson: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      entryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      deliveryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      executionDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    },
-  });
-  const { form, rules } = toRefs(data);
-  const { form: searchForm } = useFormData(data.searchForm);
-  // 浜у搧琛ㄥ崟寮规鏁版嵁
-  const productFormVisible = ref(false);
-  const productOperationType = ref("");
-  const currentId = ref("");
-  const productFormData = reactive({
-    productForm: {
-      productCategory: "",
-      specificationModel: "",
-      unit: "",
-      quantity: "",
-      taxInclusiveUnitPrice: "",
-      taxRate: "",
-      taxInclusiveTotalPrice: "",
-      taxExclusiveTotalPrice: "",
-      invoiceType: "",
-      isProduction: false,
-    },
-    productRules: {
-      productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      specificationModel: [
-        { required: true, message: "璇烽�夋嫨", trigger: "change" },
-      ],
-      unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-      quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-      taxInclusiveUnitPrice: [
-        { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-      ],
-      taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      taxInclusiveTotalPrice: [
-        { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-      ],
-      taxExclusiveTotalPrice: [
-        { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-      ],
-      invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      isProduction: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    },
-  });
-  const { productForm, productRules } = toRefs(productFormData);
-  // 闃叉寰幆璁$畻鐨勬爣蹇�
-  const isCalculating = ref(false);
-  // 鎵撳嵃鐩稿叧
-  const printPreviewVisible = ref(false);
-  const printData = ref([]);
+// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
+const operationType = ref("");
+const dialogFormVisible = ref(false);
+const data = reactive({
+  searchForm: {
+    customerName: "", // 瀹㈡埛鍚嶇О
+    salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
+    entryDate: null, // 褰曞叆鏃ユ湡
+    entryDateStart: undefined,
+    entryDateEnd: undefined,
+  },
+  form: {
+    salesContractNo: "",
+    salesman: "",
+    customerId: "",
+    entryPerson: "",
+    entryDate: "",
+    deliveryDate: "",
+    maintenanceTime: "",
+    productData: [],
+    executionDate: "",
+    hasProductionRecord: false,
+  },
+  rules: {
+    salesman: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    customerId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    entryPerson: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    entryDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    deliveryDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    executionDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+  },
+});
+const {form, rules} = toRefs(data);
+const {form: searchForm} = useFormData(data.searchForm);
+// 浜у搧琛ㄥ崟寮规鏁版嵁
+const productFormVisible = ref(false);
+const productOperationType = ref("");
+const currentId = ref("");
+const productFormData = reactive({
+  productForm: {
+    productCategory: "",
+    specificationModel: "",
+    unit: "",
+    quantity: "",
+    taxInclusiveUnitPrice: "",
+    taxRate: "",
+    taxInclusiveTotalPrice: "",
+    taxExclusiveTotalPrice: "",
+    invoiceType: "",
+    isProduction: false,
+  },
+  productRules: {
+    productCategory: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    productModelId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    specificationModel: [
+      {required: true, message: "璇烽�夋嫨", trigger: "change"},
+    ],
+    unit: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+    quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+    taxInclusiveUnitPrice: [
+      {required: true, message: "璇疯緭鍏�", trigger: "blur"},
+    ],
+    taxRate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    taxInclusiveTotalPrice: [
+      {required: true, message: "璇疯緭鍏�", trigger: "blur"},
+    ],
+    taxExclusiveTotalPrice: [
+      {required: true, message: "璇疯緭鍏�", trigger: "blur"},
+    ],
+    invoiceType: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    isProduction: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+  },
+});
+const {productForm, productRules} = toRefs(productFormData);
+// 闃叉寰幆璁$畻鐨勬爣蹇�
+const isCalculating = ref(false);
+// 鎵撳嵃鐩稿叧
+const printPreviewVisible = ref(false);
+const printData = ref([]);
 
-  // 鎶ヤ环鍗曞鍏ョ浉鍏�
-  const quotationDialogVisible = ref(false);
-  const quotationLoading = ref(false);
-  const quotationList = ref([]);
-  const quotationSearchForm = reactive({
-    quotationNo: "",
-    customer: "",
-  });
-  // 鎶ヤ环鍗曞脊妗嗗垎椤�
-  const quotationPage = reactive({
-    current: 1,
-    size: 10,
-    total: 0,
-  });
-  const selectedQuotation = ref(null);
+// 鎶ヤ环鍗曞鍏ョ浉鍏�
+const quotationDialogVisible = ref(false);
+const quotationLoading = ref(false);
+const quotationList = ref([]);
+const quotationSearchForm = reactive({
+  quotationNo: "",
+  customer: "",
+});
+// 鎶ヤ环鍗曞脊妗嗗垎椤�
+const quotationPage = reactive({
+  current: 1,
+  size: 10,
+  total: 0,
+});
+const selectedQuotation = ref(null);
 
-  // 鍙戣揣鐩稿叧
-  const deliveryFormVisible = ref(false);
-  const currentDeliveryRow = ref(null);
-  const deliveryFormData = reactive({
-    deliveryForm: {
-      type: "璐ц溅", // 璐ц溅, 蹇��
-    },
-    deliveryRules: {
-      type: [{ required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change" }],
-    },
-  });
-  const { deliveryForm, deliveryRules } = toRefs(deliveryFormData);
+// 鍙戣揣鐩稿叧
+const deliveryFormVisible = ref(false);
+const currentDeliveryRow = ref(null);
+const getDeliveryBatchQuantity = item => {
+  const quantity = item?.qualitity
+      ?? item?.quantity
+      ?? item?.unLockedQuantity
+      ?? item?.qualifiedUnLockedQuantity
+      ?? item?.qualifiedQuantity
+      ?? item?.stockQuantity;
+  return quantity ?? 0;
+};
+const getCurrentDeliveryRowQuantity = () => {
+  return Number(currentDeliveryRow.value?.noQuantity || 0);
+};
+const getDeliveryBatchDeliveryMax = row => {
+  const productQuantity = getCurrentDeliveryRowQuantity();
+  const batchQuantity = Number(getDeliveryBatchQuantity(row) || 0);
+  const otherBatchTotal = (deliveryForm.value.batchNoList || []).reduce(
+      (sum, item) => {
+        if (item?.id === row?.id) return sum;
+        return sum + Number(item?.deliveryQuantity || 0);
+      },
+      0
+  );
+  const remainingProductQuantity = Math.max(
+      0,
+      productQuantity - otherBatchTotal
+  );
+  return Math.max(0, Math.min(batchQuantity, remainingProductQuantity));
+};
+const handleDeliveryBatchQuantityChange = row => {
+  const max = getDeliveryBatchDeliveryMax(row);
+  const currentValue = Number(row?.deliveryQuantity || 0);
+  if (currentValue > max) {
+    row.deliveryQuantity = max;
+    proxy.$modal.msgWarning("鍙戣揣鏁伴噺涓嶈兘瓒呰繃杩欎釜浜у搧鐨勬暟閲�");
+  }
+};
+const getSelectedDeliveryBatchRows = () => {
+  return (deliveryForm.value.batchNoList || []).filter(
+      item => Number(item?.deliveryQuantity || 0) > 0
+  );
+};
+const getDeliveryBatchNoList = async productModelId => {
+  if (!productModelId) return [];
+  const res = await getStockInventoryByModelId(productModelId);
+  const rawList = Array.isArray(res?.data)
+      ? res.data
+      : res?.data?.records || res?.data?.rows || [];
+  const seenIds = new Set();
+  return rawList.filter(item => {
+    if (!item?.id || !item?.batchNo || seenIds.has(item.id)) {
+      return false;
+    }
+    seenIds.add(item.id);
+    return true;
+  }).map(item => ({
+    ...item,
+    deliveryQuantity: 0,
+  }));
+};
+const deliveryFormData = reactive({
+  deliveryForm: {
+    type: "璐ц溅", // 璐ц溅, 蹇��
+  },
+  deliveryRules: {
+    type: [{required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change"}],
+  },
+});
+const {deliveryForm, deliveryRules} = toRefs(deliveryFormData);
 
-  // 瀵煎叆鐩稿叧
-  const importUploadRef = ref(null);
-  const importUpload = reactive({
-    title: "瀵煎叆閿�鍞彴璐�",
-    open: false,
-    url: import.meta.env.VITE_APP_BASE_API + "/sales/ledger/import",
-    headers: { Authorization: "Bearer " + getToken() },
-    isUploading: false,
-    beforeUpload: file => {
-      const isExcel = file.name.endsWith(".xlsx") || file.name.endsWith(".xls");
-      const isLt10M = file.size / 1024 / 1024 < 10;
-      if (!isExcel) {
-        proxy.$modal.msgError("涓婁紶鏂囦欢鍙兘鏄� xlsx/xls 鏍煎紡!");
-        return false;
+// 瀵煎叆鐩稿叧
+const importUploadRef = ref(null);
+const importUpload = reactive({
+  title: "瀵煎叆閿�鍞彴璐�",
+  open: false,
+  url: import.meta.env.VITE_APP_BASE_API + "/sales/ledger/import",
+  headers: {Authorization: "Bearer " + getToken()},
+  isUploading: false,
+  beforeUpload: file => {
+    const isExcel = file.name.endsWith(".xlsx") || file.name.endsWith(".xls");
+    const isLt10M = file.size / 1024 / 1024 < 10;
+    if (!isExcel) {
+      proxy.$modal.msgError("涓婁紶鏂囦欢鍙兘鏄� xlsx/xls 鏍煎紡!");
+      return false;
+    }
+    if (!isLt10M) {
+      proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB!");
+      return false;
+    }
+    return true;
+  },
+  onChange: (file, fileList) => {
+    console.log("鏂囦欢鐘舵�佹敼鍙�", file, fileList);
+  },
+  onProgress: (event, file, fileList) => {
+    console.log("涓婁紶涓�...", event.percent);
+  },
+  onSuccess: (response, file, fileList) => {
+    console.log("涓婁紶鎴愬姛", response, file, fileList);
+    importUpload.isUploading = false;
+    if (response.code === 200) {
+      proxy.$modal.msgSuccess("瀵煎叆鎴愬姛");
+      importUpload.open = false;
+      if (importUploadRef.value) {
+        importUploadRef.value.clearFiles();
       }
-      if (!isLt10M) {
-        proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB!");
-        return false;
-      }
-      return true;
-    },
-    onChange: (file, fileList) => {
-      console.log("鏂囦欢鐘舵�佹敼鍙�", file, fileList);
-    },
-    onProgress: (event, file, fileList) => {
-      console.log("涓婁紶涓�...", event.percent);
-    },
-    onSuccess: (response, file, fileList) => {
-      console.log("涓婁紶鎴愬姛", response, file, fileList);
-      importUpload.isUploading = false;
-      if (response.code === 200) {
-        proxy.$modal.msgSuccess("瀵煎叆鎴愬姛");
-        importUpload.open = false;
-        if (importUploadRef.value) {
-          importUploadRef.value.clearFiles();
-        }
-        getList();
-      } else {
-        proxy.$modal.msgError(response.msg || "瀵煎叆澶辫触");
-      }
-    },
-    onError: (error, file, fileList) => {
-      console.error("涓婁紶澶辫触", error, file, fileList);
-      importUpload.isUploading = false;
-      proxy.$modal.msgError("瀵煎叆澶辫触锛岃閲嶈瘯");
-    },
-  });
-
-  const changeDaterange = value => {
-    if (value) {
-      searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
-      searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+      getList();
     } else {
-      searchForm.entryDateStart = undefined;
-      searchForm.entryDateEnd = undefined;
+      proxy.$modal.msgError(response.msg || "瀵煎叆澶辫触");
     }
-    handleQuery();
-  };
+  },
+  onError: (error, file, fileList) => {
+    console.error("涓婁紶澶辫触", error, file, fileList);
+    importUpload.isUploading = false;
+    proxy.$modal.msgError("瀵煎叆澶辫触锛岃閲嶈瘯");
+  },
+});
 
-  // 鏌ヨ鍒楄〃
-  /** 鎼滅储鎸夐挳鎿嶄綔 */
-  const handleQuery = () => {
-    // 鍙湁鍦ㄧ偣鍑绘悳绱㈡寜閽椂鎵嶉噸缃〉鐮佸埌绗竴椤�
-    // 閬垮厤琛ㄥ崟瀛楁change浜嬩欢骞叉壈鍒嗛〉
-    if (arguments.length === 0) {
-      page.current = 1;
-    }
-    expandedRowKeys.value = [];
-    getList();
-  };
-  const paginationChange = obj => {
-    page.current = obj.page;
-    page.size = obj.limit;
-    getList();
-  };
-  const getList = () => {
-    tableLoading.value = true;
-    const { entryDate, ...rest } = searchForm;
-    // 灏嗚寖鍥存棩鏈熷瓧娈典紶閫掔粰鍚庣
-    const params = { ...rest, ...page };
-    // 绉婚櫎褰曞叆鏃ユ湡鐨勯粯璁ゅ�艰缃紝鍙繚鐣欒寖鍥存棩鏈熷瓧娈�
-    delete params.entryDate;
-    return ledgerListPage(params)
+const changeDaterange = value => {
+  if (value) {
+    searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+    searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+  } else {
+    searchForm.entryDateStart = undefined;
+    searchForm.entryDateEnd = undefined;
+  }
+  handleQuery();
+};
+
+// 鏌ヨ鍒楄〃
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+  // 鍙湁鍦ㄧ偣鍑绘悳绱㈡寜閽椂鎵嶉噸缃〉鐮佸埌绗竴椤�
+  // 閬垮厤琛ㄥ崟瀛楁change浜嬩欢骞叉壈鍒嗛〉
+  if (arguments.length === 0) {
+    page.current = 1;
+  }
+  expandedRowKeys.value = [];
+  getList();
+};
+const paginationChange = obj => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+const getList = () => {
+  tableLoading.value = true;
+  const {entryDate, ...rest} = searchForm;
+  // 灏嗚寖鍥存棩鏈熷瓧娈典紶閫掔粰鍚庣
+  const params = {...rest, ...page};
+  // 绉婚櫎褰曞叆鏃ユ湡鐨勯粯璁ゅ�艰缃紝鍙繚鐣欒寖鍥存棩鏈熷瓧娈�
+  delete params.entryDate;
+  return ledgerListPage(params)
       .then(res => {
         tableLoading.value = false;
         tableData.value = res.records;
@@ -1152,619 +1275,624 @@
       .catch(() => {
         tableLoading.value = false;
       });
-  };
-  // 鑾峰彇浜у搧澶х被tree鏁版嵁
-  const getProductOptions = () => {
-    // 杩斿洖 Promise锛屼究浜庡湪缂栬緫浜у搧鏃剁瓑寰呭姞杞藉畬鎴�
-    return productTreeList().then(res => {
-      productOptions.value = convertIdToValue(res);
-      return productOptions.value;
-    });
-  };
-  const formattedNumber = (row, column, cellValue) => {
-    if (cellValue === undefined || cellValue === null || cellValue === "") {
-      return "0.00";
-    }
-    return parseFloat(cellValue).toFixed(2);
-  };
-  const findLedgerRecordByRow = row => {
-    if (!row) return null;
-    if (
+};
+// 鑾峰彇浜у搧澶х被tree鏁版嵁
+const getProductOptions = () => {
+  // 杩斿洖 Promise锛屼究浜庡湪缂栬緫浜у搧鏃剁瓑寰呭姞杞藉畬鎴�
+  return productTreeList().then(res => {
+    productOptions.value = convertIdToValue(res);
+    return productOptions.value;
+  });
+};
+const formattedNumber = (row, column, cellValue) => {
+  if (cellValue === undefined || cellValue === null || cellValue === "") {
+    return "0.00";
+  }
+  return parseFloat(cellValue).toFixed(2);
+};
+const findLedgerRecordByRow = row => {
+  if (!row) return null;
+  if (
       row.maintainer !== undefined ||
       row.maintainerName !== undefined ||
       row.entryPerson !== undefined ||
       row.entryPersonName !== undefined
-    ) {
-      return row;
-    }
-    if (row.salesLedgerId !== undefined && row.salesLedgerId !== null) {
-      return (
+  ) {
+    return row;
+  }
+  if (row.salesLedgerId !== undefined && row.salesLedgerId !== null) {
+    return (
         tableData.value.find(
-          item => String(item.id) === String(row.salesLedgerId)
+            item => String(item.id) === String(row.salesLedgerId)
         ) || null
-      );
-    }
-    return null;
-  };
-  const isCurrentUserMaintainer = row => {
-    const ledgerRecord = findLedgerRecordByRow(row);
-    if (!ledgerRecord) return true;
-    const currentUserId = String(userStore.id ?? "");
-    const currentNickName = String(userStore.nickName ?? "").trim();
-    const maintainerId = ledgerRecord.maintainerId ?? ledgerRecord.entryPerson;
-    const maintainerName =
+    );
+  }
+  return null;
+};
+const isCurrentUserMaintainer = row => {
+  const ledgerRecord = findLedgerRecordByRow(row);
+  if (!ledgerRecord) return true;
+  const currentUserId = String(userStore.id ?? "");
+  const currentNickName = String(userStore.nickName ?? "").trim();
+  const maintainerId = ledgerRecord.maintainerId ?? ledgerRecord.entryPerson;
+  const maintainerName =
       ledgerRecord.maintainerName ??
       ledgerRecord.maintainer ??
       ledgerRecord.entryPersonName;
-    if (
+  if (
       maintainerId !== undefined &&
       maintainerId !== null &&
       String(maintainerId) !== ""
-    ) {
-      return String(maintainerId) === currentUserId;
-    }
-    if (
+  ) {
+    return String(maintainerId) === currentUserId;
+  }
+  if (
       maintainerName !== undefined &&
       maintainerName !== null &&
       String(maintainerName).trim() !== ""
-    ) {
-      return String(maintainerName).trim() === currentNickName;
-    }
-    return true;
-  };
-  const canEditLedger = row => isCurrentUserMaintainer(row);
-  const canDeleteLedger = row => isCurrentUserMaintainer(row);
-  const sensitiveAmountFormatter = (row, column, cellValue) => {
-    if (!isCurrentUserMaintainer(row)) {
-      return "*****";
-    }
-    return formattedNumber(row, column, cellValue);
-  };
-  // 鑾峰彇tree瀛愭暟鎹�
-  const getModels = value => {
-    productForm.value.productCategory = findNodeById(productOptions.value, value);
-    modelList({ id: value }).then(res => {
-      modelOptions.value = res;
-    });
-  };
-  const getProductModel = value => {
-    const index = modelOptions.value.findIndex(item => item.id === value);
-    if (index !== -1) {
-      productForm.value.specificationModel = modelOptions.value[index].model;
-      productForm.value.unit = modelOptions.value[index].unit;
-    } else {
-      productForm.value.specificationModel = null;
-      productForm.value.unit = null;
-    }
-  };
-  const findNodeById = (nodes, productId) => {
-    for (let i = 0; i < nodes.length; i++) {
-      if (nodes[i].value === productId) {
-        return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
-      }
-      if (nodes[i].children && nodes[i].children.length > 0) {
-        const foundNode = findNodeById(nodes[i].children, productId);
-        if (foundNode) {
-          return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
-        }
-      }
-    }
-    return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-  };
-  function convertIdToValue(data) {
-    return data.map(item => {
-      const { id, children, ...rest } = item;
-      const newItem = {
-        ...rest,
-        value: id, // 灏� id 鏀逛负 value
-      };
-      if (children && children.length > 0) {
-        newItem.children = convertIdToValue(children);
-      }
-
-      return newItem;
-    });
+  ) {
+    return String(maintainerName).trim() === currentNickName;
   }
-  // 鏍规嵁鍚嶇О鍙嶆煡浜у搧澶х被 id锛屼究浜庝粎瀛樺悕绉版椂鐨勫弽鏄�
-  function findNodeIdByLabel(nodes, label) {
-    if (!label) return null;
-    for (let i = 0; i < nodes.length; i++) {
-      const node = nodes[i];
-      if (node.label === label) return node.value;
-      if (node.children && node.children.length > 0) {
-        const found = findNodeIdByLabel(node.children, label);
-        if (found !== null && found !== undefined) return found;
-      }
-    }
-    return null;
+  return true;
+};
+const canEditLedger = row => isCurrentUserMaintainer(row);
+const canDeleteLedger = row => isCurrentUserMaintainer(row);
+const sensitiveAmountFormatter = (row, column, cellValue) => {
+  if (!isCurrentUserMaintainer(row)) {
+    return "*****";
   }
-  // 琛ㄦ牸閫夋嫨鏁版嵁
-  const handleSelectionChange = selection => {
-    // 杩囨护鎺夊瓙鏁版嵁
-    selectedRows.value = selection.filter(item => item.children !== undefined);
-    console.log("selection", selectedRows.value);
-  };
-  const productSelected = selectedRows => {
-    productSelectedRows.value = selectedRows;
-  };
-  const expandedRowKeys = ref([]);
-  // 灞曞紑琛�
-  const expandChange = (row, expandedRows) => {
-    if (expandedRows.length > 0) {
-      expandedRowKeys.value = [];
-      try {
-        productList({ salesLedgerId: row.id, type: 1 }).then(res => {
-          const index = tableData.value.findIndex(item => item.id === row.id);
-          if (index > -1) {
-            tableData.value[index].children = res.data;
-          }
-          expandedRowKeys.value.push(row.id);
-        });
-      } catch (error) {
-        console.log(error);
+  return formattedNumber(row, column, cellValue);
+};
+// 鑾峰彇tree瀛愭暟鎹�
+const getModels = value => {
+  productForm.value.productCategory = findNodeById(productOptions.value, value);
+  modelList({id: value}).then(res => {
+    modelOptions.value = res;
+  });
+};
+const getProductModel = value => {
+  const index = modelOptions.value.findIndex(item => item.id === value);
+  if (index !== -1) {
+    productForm.value.specificationModel = modelOptions.value[index].model;
+    productForm.value.unit = modelOptions.value[index].unit;
+  } else {
+    productForm.value.specificationModel = null;
+    productForm.value.unit = null;
+  }
+};
+const findNodeById = (nodes, productId) => {
+  for (let i = 0; i < nodes.length; i++) {
+    if (nodes[i].value === productId) {
+      return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
+    }
+    if (nodes[i].children && nodes[i].children.length > 0) {
+      const foundNode = findNodeById(nodes[i].children, productId);
+      if (foundNode) {
+        return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
       }
-    } else {
-      expandedRowKeys.value = [];
     }
-  };
+  }
+  return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
+};
 
-  // 娣诲姞琛ㄨ绫诲悕鏂规硶
-  const tableRowClassName = ({ row }) => {
-    if (!row.deliveryDate) return "";
-    if (row.isFh) return "";
-
-    const diff = row.deliveryDaysDiff;
-    if (diff === 15) {
-      return "yellow";
-    } else if (diff === 10) {
-      return "pink";
-    } else if (diff === 2) {
-      return "purple";
-    } else if (diff < 2) {
-      return "red";
+function convertIdToValue(data) {
+  return data.map(item => {
+    const {id, children, ...rest} = item;
+    const newItem = {
+      ...rest,
+      value: id, // 灏� id 鏀逛负 value
+    };
+    if (children && children.length > 0) {
+      newItem.children = convertIdToValue(children);
     }
-  };
-  // 涓昏〃鍚堣鏂规硶
-  const summarizeMainTable = param => {
-    return proxy.summarizeTable(param, [
-      "contractAmount",
-      "taxInclusiveTotalPrice",
-      "taxExclusiveTotalPrice",
-    ]);
-  };
-  // 瀛愯〃鍚堣鏂规硶
-  const summarizeChildrenTable = (param, parentRow) => {
-    if (!isCurrentUserMaintainer(parentRow)) {
-      const { columns } = param;
-      return columns.map((column, index) => {
-        if (index === 0) {
-          return "鍚堣";
+
+    return newItem;
+  });
+}
+
+// 鏍规嵁鍚嶇О鍙嶆煡浜у搧澶х被 id锛屼究浜庝粎瀛樺悕绉版椂鐨勫弽鏄�
+function findNodeIdByLabel(nodes, label) {
+  if (!label) return null;
+  for (let i = 0; i < nodes.length; i++) {
+    const node = nodes[i];
+    if (node.label === label) return node.value;
+    if (node.children && node.children.length > 0) {
+      const found = findNodeIdByLabel(node.children, label);
+      if (found !== null && found !== undefined) return found;
+    }
+  }
+  return null;
+}
+
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = selection => {
+  // 杩囨护鎺夊瓙鏁版嵁
+  selectedRows.value = selection.filter(item => item.children !== undefined);
+  console.log("selection", selectedRows.value);
+};
+const productSelected = selectedRows => {
+  productSelectedRows.value = selectedRows;
+};
+const expandedRowKeys = ref([]);
+// 灞曞紑琛�
+const expandChange = (row, expandedRows) => {
+  if (expandedRows.length > 0) {
+    expandedRowKeys.value = [];
+    try {
+      productList({salesLedgerId: row.id, type: 1}).then(res => {
+        const index = tableData.value.findIndex(item => item.id === row.id);
+        if (index > -1) {
+          tableData.value[index].children = res.data;
         }
-        if (
+        expandedRowKeys.value.push(row.id);
+      });
+    } catch (error) {
+      console.log(error);
+    }
+  } else {
+    expandedRowKeys.value = [];
+  }
+};
+
+// 娣诲姞琛ㄨ绫诲悕鏂规硶
+const tableRowClassName = ({row}) => {
+  if (!row.deliveryDate) return "";
+  if (row.isFh) return "";
+
+  const diff = row.deliveryDaysDiff;
+  if (diff === 15) {
+    return "yellow";
+  } else if (diff === 10) {
+    return "pink";
+  } else if (diff === 2) {
+    return "purple";
+  } else if (diff < 2) {
+    return "red";
+  }
+};
+// 涓昏〃鍚堣鏂规硶
+const summarizeMainTable = param => {
+  return proxy.summarizeTable(param, [
+    "contractAmount",
+    "taxInclusiveTotalPrice",
+    "taxExclusiveTotalPrice",
+  ]);
+};
+// 瀛愯〃鍚堣鏂规硶
+const summarizeChildrenTable = (param, parentRow) => {
+  if (!isCurrentUserMaintainer(parentRow)) {
+    const {columns} = param;
+    return columns.map((column, index) => {
+      if (index === 0) {
+        return "鍚堣";
+      }
+      if (
           [
             "taxInclusiveUnitPrice",
             "taxInclusiveTotalPrice",
             "taxExclusiveTotalPrice",
           ].includes(column.property)
-        ) {
-          return "*****";
-        }
-        return "";
-      });
-    }
-    return proxy.summarizeTable(param, [
-      "taxInclusiveUnitPrice",
-      "taxInclusiveTotalPrice",
-      "taxExclusiveTotalPrice",
-    ]);
-  };
-  // 鎵撳紑寮规
-  const openForm = async (type, row) => {
-    if (type === "edit" && row && !canEditLedger(row)) {
-      proxy.$modal.msgWarning("褰撳墠绯荤粺鐧诲綍浜轰笉鏄淮鎶や汉锛屼笉鑳界紪杈戞暟鎹�");
-      return;
-    }
-    operationType.value = type;
-    form.value = {};
-    productData.value = [];
-    selectedQuotation.value = null;
-    let userLists = await userListNoPage();
-    userList.value = userLists.data;
-    listCustomerPrivatePool({ current: -1, size: -1 }).then(res => {
-      customerOption.value = res.data.records;
-    });
-    form.value.entryPerson = userStore.id;
-    if (type === "add") {
-      // 鏂板鏃惰缃綍鍏ユ棩鏈熶负褰撳ぉ
-      form.value.entryDate = getCurrentDate();
-      // 绛捐鏃ユ湡榛樿涓哄綋澶�
-      form.value.executionDate = getCurrentDate();
-    } else {
-      currentId.value = row.id;
-      getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => {
-        form.value = { ...res };
-        form.value.entryPerson = Number(res.entryPerson);
-        productData.value = form.value.productData;
-        fileList.value = form.value.storageBlobVOs;
-      });
-    }
-    // let userAll = await userStore.getInfo()
-    // userList.value.forEach(element => {
-    //   if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) {
-    //     form.value.entryPerson = userAll.user.userId // 璁剧疆榛樿涓氬姟鍛樹负褰撳墠鐢ㄦ埛
-    //   }
-    // });
-    form.value.entryDate = getCurrentDate(); // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
-    dialogFormVisible.value = true;
-  };
-
-  // 鎵撳紑鎶ヤ环鍗曢�夋嫨寮圭獥锛堜粎瀹℃壒閫氳繃锛�
-  const openQuotationDialog = async () => {
-    if (operationType.value === "view") return;
-    quotationDialogVisible.value = true;
-    // 鎵撳紑寮圭獥鏃堕噸缃垎椤靛埌绗竴椤�
-    quotationPage.current = 1;
-    // 鍏堢‘淇濆鎴峰垪琛ㄥ凡鍔犺浇锛屼究浜庡悗缁洖濉� customerId
-    if (!customerOption.value || customerOption.value.length === 0) {
-      try {
-        listCustomerPrivatePool({ current: -1, size: -1 }).then(res => {
-          customerOption.value = res.data.records;
-        });
-      } catch (e) {
-        // ignore锛屽厑璁哥敤鎴峰悗缁墜鍔ㄩ�夋嫨瀹㈡埛
+      ) {
+        return "*****";
       }
-    }
-    await fetchQuotationList();
-  };
+      return "";
+    });
+  }
+  return proxy.summarizeTable(param, [
+    "taxInclusiveUnitPrice",
+    "taxInclusiveTotalPrice",
+    "taxExclusiveTotalPrice",
+  ]);
+};
+// 鎵撳紑寮规
+const openForm = async (type, row) => {
+  if (type === "edit" && row && !canEditLedger(row)) {
+    proxy.$modal.msgWarning("褰撳墠绯荤粺鐧诲綍浜轰笉鏄淮鎶や汉锛屼笉鑳界紪杈戞暟鎹�");
+    return;
+  }
+  operationType.value = type;
+  form.value = {};
+  productData.value = [];
+  selectedQuotation.value = null;
+  let userLists = await userListNoPage();
+  userList.value = userLists.data;
+  listCustomerPrivatePool({current: -1, size: -1}).then(res => {
+    customerOption.value = res.data.records;
+  });
+  form.value.entryPerson = userStore.id;
+  if (type === "add") {
+    // 鏂板鏃惰缃綍鍏ユ棩鏈熶负褰撳ぉ
+    form.value.entryDate = getCurrentDate();
+    // 绛捐鏃ユ湡榛樿涓哄綋澶�
+    form.value.executionDate = getCurrentDate();
+  } else {
+    currentId.value = row.id;
+    getSalesLedgerWithProducts({id: row.id, type: 1}).then(res => {
+      form.value = {...res};
+      form.value.entryPerson = Number(res.entryPerson);
+      productData.value = form.value.productData;
+      fileList.value = form.value.storageBlobVOs;
+    });
+  }
+  // let userAll = await userStore.getInfo()
+  // userList.value.forEach(element => {
+  //   if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) {
+  //     form.value.entryPerson = userAll.user.userId // 璁剧疆榛樿涓氬姟鍛樹负褰撳墠鐢ㄦ埛
+  //   }
+  // });
+  form.value.entryDate = getCurrentDate(); // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
+  dialogFormVisible.value = true;
+};
 
-  const fetchQuotationList = async () => {
-    quotationLoading.value = true;
+// 鎵撳紑鎶ヤ环鍗曢�夋嫨寮圭獥锛堜粎瀹℃壒閫氳繃锛�
+const openQuotationDialog = async () => {
+  if (operationType.value === "view") return;
+  quotationDialogVisible.value = true;
+  // 鎵撳紑寮圭獥鏃堕噸缃垎椤靛埌绗竴椤�
+  quotationPage.current = 1;
+  // 鍏堢‘淇濆鎴峰垪琛ㄥ凡鍔犺浇锛屼究浜庡悗缁洖濉� customerId
+  if (!customerOption.value || customerOption.value.length === 0) {
     try {
-      const params = {
-        // 鍚庣鍒嗛〉瀛楁锛歝urrent / size
-        current: quotationPage.current,
-        size: quotationPage.size,
-        ...quotationSearchForm,
-        status: "閫氳繃",
-      };
-      const res = await getQuotationList(params);
-      quotationList.value = res?.data?.records || [];
-      quotationPage.total = res?.data?.total || 0;
-    } finally {
-      quotationLoading.value = false;
+      listCustomerPrivatePool({current: -1, size: -1}).then(res => {
+        customerOption.value = res.data.records;
+      });
+    } catch (e) {
+      // ignore锛屽厑璁哥敤鎴峰悗缁墜鍔ㄩ�夋嫨瀹㈡埛
     }
-  };
+  }
+  await fetchQuotationList();
+};
 
-  const resetQuotationSearch = async () => {
-    quotationSearchForm.quotationNo = "";
-    quotationSearchForm.customer = "";
-    quotationPage.current = 1;
-    await fetchQuotationList();
-  };
+const fetchQuotationList = async () => {
+  quotationLoading.value = true;
+  try {
+    const params = {
+      // 鍚庣鍒嗛〉瀛楁锛歝urrent / size
+      current: quotationPage.current,
+      size: quotationPage.size,
+      ...quotationSearchForm,
+      status: "閫氳繃",
+    };
+    const res = await getQuotationList(params);
+    quotationList.value = res?.data?.records || [];
+    quotationPage.total = res?.data?.total || 0;
+  } finally {
+    quotationLoading.value = false;
+  }
+};
 
-  // 鎶ヤ环鍗曞脊妗嗗垎椤靛垏鎹�
-  const quotationPaginationChange = obj => {
-    quotationPage.current = obj.page;
-    quotationPage.size = obj.limit;
-    fetchQuotationList();
-  };
+const resetQuotationSearch = async () => {
+  quotationSearchForm.quotationNo = "";
+  quotationSearchForm.customer = "";
+  quotationPage.current = 1;
+  await fetchQuotationList();
+};
 
-  // 閫変腑鎶ヤ环鍗曞悗鍥炲~鍒板彴璐﹁〃鍗�
-  const applyQuotation = row => {
-    if (!row) return;
-    selectedQuotation.value = row;
+// 鎶ヤ环鍗曞脊妗嗗垎椤靛垏鎹�
+const quotationPaginationChange = obj => {
+  quotationPage.current = obj.page;
+  quotationPage.size = obj.limit;
+  fetchQuotationList();
+};
 
-    // 涓氬姟鍛�
-    form.value.salesman = (row.salesperson || "").trim();
+// 閫変腑鎶ヤ环鍗曞悗鍥炲~鍒板彴璐﹁〃鍗�
+const applyQuotation = row => {
+  if (!row) return;
+  selectedQuotation.value = row;
 
-    // 瀹㈡埛鍚嶇О -> customerId
-    const qCustomerName = String(row.customer || "").trim();
-    const customer = (customerOption.value || []).find(c => {
-      const name = String(c.customerName || "").trim();
-      return (
+  // 涓氬姟鍛�
+  form.value.salesman = (row.salesperson || "").trim();
+
+  // 瀹㈡埛鍚嶇О -> customerId
+  const qCustomerName = String(row.customer || "").trim();
+  const customer = (customerOption.value || []).find(c => {
+    const name = String(c.customerName || "").trim();
+    return (
         name === qCustomerName ||
         name.includes(qCustomerName) ||
         qCustomerName.includes(name)
-      );
-    });
-    if (customer?.id) {
-      form.value.customerId = customer.id;
-    } else {
-      // 濡傛灉鎵句笉鍒帮紝淇濈暀鍘熷�硷紙鍏佽鐢ㄦ埛鎵嬪姩閫夋嫨/涓嶆墦鏂凡鏈夎緭鍏ワ級
-      form.value.customerId = form.value.customerId || "";
-    }
+    );
+  });
+  if (customer?.id) {
+    form.value.customerId = customer.id;
+  } else {
+    // 濡傛灉鎵句笉鍒帮紝淇濈暀鍘熷�硷紙鍏佽鐢ㄦ埛鎵嬪姩閫夋嫨/涓嶆墦鏂凡鏈夎緭鍏ワ級
+    form.value.customerId = form.value.customerId || "";
+  }
 
-    // 浜у搧淇℃伅鏄犲皠锛氭姤浠� products -> 鍙拌处 productData
-    const products = Array.isArray(row.products) ? row.products : [];
-    productData.value = products.map(p => {
-      const quantity = Number(p.quantity ?? 0) || 0;
-      const unitPrice = Number(p.unitPrice ?? 0) || 0;
-      const taxRate = "13"; // 榛樿 13%锛屼究浜庣洿鎺ユ彁浜わ紙濡傞渶鍙湪浜у搧涓嚜琛屼慨鏀癸級
-      const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-      const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(
+  // 浜у搧淇℃伅鏄犲皠锛氭姤浠� products -> 鍙拌处 productData
+  const products = Array.isArray(row.products) ? row.products : [];
+  productData.value = products.map(p => {
+    const quantity = Number(p.quantity ?? 0) || 0;
+    const unitPrice = Number(p.unitPrice ?? 0) || 0;
+    const taxRate = "13"; // 榛樿 13%锛屼究浜庣洿鎺ユ彁浜わ紙濡傞渶鍙湪浜у搧涓嚜琛屼慨鏀癸級
+    const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
+    const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(
         taxInclusiveTotalPrice,
         taxRate
-      );
-      return {
-        // 鍙拌处瀛楁
-        productCategory: p.product || p.productName || "",
-        specificationModel: p.specification || "",
-        unit: p.unit || "",
-        quantity: quantity,
-        taxRate: taxRate,
-        taxInclusiveUnitPrice: unitPrice.toFixed(2),
-        taxInclusiveTotalPrice: taxInclusiveTotalPrice,
-        taxExclusiveTotalPrice: taxExclusiveTotalPrice,
-        invoiceType: "澧炴櫘绁�",
-        isProduction: true,
-      };
-    });
+    );
+    return {
+      // 鍙拌处瀛楁
+      productCategory: p.product || p.productName || "",
+      specificationModel: p.specification || "",
+      unit: p.unit || "",
+      quantity: quantity,
+      taxRate: taxRate,
+      taxInclusiveUnitPrice: unitPrice.toFixed(2),
+      taxInclusiveTotalPrice: taxInclusiveTotalPrice,
+      taxExclusiveTotalPrice: taxExclusiveTotalPrice,
+      invoiceType: "澧炴櫘绁�",
+      isProduction: true,
+    };
+  });
 
-    quotationDialogVisible.value = false;
-  };
-  function changs(val) {
-    console.log(val);
-  }
-  // 鎻愪氦琛ㄥ崟
-  const submitForm = () => {
-    proxy.$refs["formRef"].validate(valid => {
-      if (valid) {
-        console.log("productData.value--", productData.value);
-        if (productData.value !== null && productData.value.length > 0) {
-          form.value.productData = proxy.HaveJson(productData.value);
-        } else {
-          proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
-          return;
-        }
-        form.value.storageBlobDTOs = fileList;
-        form.value.type = 1;
-        addOrUpdateSalesLedger(form.value).then(res => {
-          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-          closeDia();
-          expandedRowKeys.value = [];
-          getList();
-        });
+  quotationDialogVisible.value = false;
+};
+
+function changs(val) {
+  console.log(val);
+}
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs["formRef"].validate(valid => {
+    if (valid) {
+      console.log("productData.value--", productData.value);
+      if (productData.value !== null && productData.value.length > 0) {
+        form.value.productData = proxy.HaveJson(productData.value);
+      } else {
+        proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
+        return;
       }
-    });
-  };
-  // 鍏抽棴寮规
-  const closeDia = () => {
-    proxy.resetForm("formRef");
-    dialogFormVisible.value = false;
-  };
-
-  const productIndex = ref(0);
-  // 鎵撳紑浜у搧寮规
-  const openProductForm = async (type, row, index) => {
-    // 缂栬緫鏃舵鏌ヤ骇鍝佹槸鍚﹀凡鍙戣揣鎴栧鏍搁�氳繃
-    if (type === "edit" && isProductShipped(row)) {
-      proxy.$modal.msgWarning("宸插彂璐ф垨瀹℃牳閫氳繃鐨勪骇鍝佷笉鑳界紪杈�");
-      return;
+      form.value.storageBlobDTOs = fileList;
+      form.value.type = 1;
+      addOrUpdateSalesLedger(form.value).then(res => {
+        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        closeDia();
+        expandedRowKeys.value = [];
+        getList();
+      });
     }
+  });
+};
+// 鍏抽棴寮规
+const closeDia = () => {
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
 
-    productOperationType.value = type;
-    productForm.value = {};
-    if (type === "add") {
-      productForm.value.isProduction = true;
-    }
-    proxy.resetForm("productFormRef");
-    if (type === "edit") {
-      productForm.value = { ...row };
-      productIndex.value = index;
-      // 缂栬緫鏃舵牴鎹骇鍝佸ぇ绫诲悕绉板弽鏌� tree 鑺傜偣 id锛屽苟鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
-      try {
-        const options =
+const productIndex = ref(0);
+// 鎵撳紑浜у搧寮规
+const openProductForm = async (type, row, index) => {
+  // 缂栬緫鏃舵鏌ヤ骇鍝佹槸鍚﹀凡鍙戣揣鎴栧鏍搁�氳繃
+  if (type === "edit" && isProductShipped(row)) {
+    proxy.$modal.msgWarning("宸插彂璐ф垨瀹℃牳閫氳繃鐨勪骇鍝佷笉鑳界紪杈�");
+    return;
+  }
+
+  productOperationType.value = type;
+  productForm.value = {};
+  if (type === "add") {
+    productForm.value.isProduction = true;
+  }
+  proxy.resetForm("productFormRef");
+  if (type === "edit") {
+    productForm.value = {...row};
+    productIndex.value = index;
+    // 缂栬緫鏃舵牴鎹骇鍝佸ぇ绫诲悕绉板弽鏌� tree 鑺傜偣 id锛屽苟鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
+    try {
+      const options =
           productOptions.value && productOptions.value.length > 0
-            ? productOptions.value
-            : await getProductOptions();
-        const categoryId = findNodeIdByLabel(
+              ? productOptions.value
+              : await getProductOptions();
+      const categoryId = findNodeIdByLabel(
           options,
           productForm.value.productCategory
-        );
-        if (categoryId) {
-          const models = await modelList({ id: categoryId });
-          modelOptions.value = models || [];
-          // 鏍规嵁褰撳墠瑙勬牸鍨嬪彿鍚嶇О鍙嶆煡骞惰缃� productModelId锛屼究浜庝笅鎷夋鏄剧ず宸查�夊��
-          const currentModel = (modelOptions.value || []).find(
+      );
+      if (categoryId) {
+        const models = await modelList({id: categoryId});
+        modelOptions.value = models || [];
+        // 鏍规嵁褰撳墠瑙勬牸鍨嬪彿鍚嶇О鍙嶆煡骞惰缃� productModelId锛屼究浜庝笅鎷夋鏄剧ず宸查�夊��
+        const currentModel = (modelOptions.value || []).find(
             m => m.model === productForm.value.specificationModel
-          );
-          if (currentModel) {
-            productForm.value.productModelId = currentModel.id;
-          }
-        }
-      } catch (e) {
-        // 鍔犺浇澶辫触鏃朵繚鎸佸彲缂栬緫锛屼笉涓柇寮圭獥
-        console.error("鍔犺浇浜у搧瑙勬牸鍨嬪彿澶辫触", e);
-      }
-    } else {
-      getProductOptions();
-    }
-    productFormVisible.value = true;
-  };
-  // 鎻愪氦浜у搧琛ㄥ崟
-  const submitProduct = () => {
-    proxy.$refs["productFormRef"].validate(valid => {
-      if (valid) {
-        if (operationType.value === "edit") {
-          submitProductEdit();
-        } else {
-          if (productOperationType.value === "add") {
-            productData.value.push({ ...productForm.value });
-          } else {
-            productData.value[productIndex.value] = { ...productForm.value };
-          }
-          closeProductDia();
-        }
-      }
-    });
-  };
-  const submitProductEdit = () => {
-    productForm.value.salesLedgerId = currentId.value;
-    productForm.value.type = 1;
-    addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
-      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-      closeProductDia();
-      getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then(res => {
-        productData.value = res.productData;
-      });
-    });
-  };
-  // 鍒犻櫎浜у搧
-  const deleteProduct = () => {
-    if (productSelectedRows.value.length === 0) {
-      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-      return;
-    }
-
-    // 妫�鏌ユ槸鍚︽湁宸插彂璐ф垨瀹℃牳閫氳繃鐨勪骇鍝�
-    const shippedProducts = productSelectedRows.value.filter(row =>
-      isProductShipped(row)
-    );
-    if (shippedProducts.length > 0) {
-      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);
+        if (currentModel) {
+          productForm.value.productModelId = currentModel.id;
         }
-      });
-    } else {
-      let ids = [];
-      if (productSelectedRows.value.length > 0) {
-        ids = productSelectedRows.value.map(item => item.id);
       }
-      ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
-        confirmButtonText: "纭",
-        cancelButtonText: "鍙栨秷",
-        type: "warning",
-      })
+    } catch (e) {
+      // 鍔犺浇澶辫触鏃朵繚鎸佸彲缂栬緫锛屼笉涓柇寮圭獥
+      console.error("鍔犺浇浜у搧瑙勬牸鍨嬪彿澶辫触", e);
+    }
+  } else {
+    getProductOptions();
+  }
+  productFormVisible.value = true;
+};
+// 鎻愪氦浜у搧琛ㄥ崟
+const submitProduct = () => {
+  proxy.$refs["productFormRef"].validate(valid => {
+    if (valid) {
+      if (operationType.value === "edit") {
+        submitProductEdit();
+      } else {
+        if (productOperationType.value === "add") {
+          productData.value.push({...productForm.value});
+        } else {
+          productData.value[productIndex.value] = {...productForm.value};
+        }
+        closeProductDia();
+      }
+    }
+  });
+};
+const submitProductEdit = () => {
+  productForm.value.salesLedgerId = currentId.value;
+  productForm.value.type = 1;
+  addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
+    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    closeProductDia();
+    getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => {
+      productData.value = res.productData;
+    });
+  });
+};
+// 鍒犻櫎浜у搧
+const deleteProduct = () => {
+  if (productSelectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
+  }
+
+  // 妫�鏌ユ槸鍚︽湁宸插彂璐ф垨瀹℃牳閫氳繃鐨勪骇鍝�
+  const shippedProducts = productSelectedRows.value.filter(row =>
+      isProductShipped(row)
+  );
+  if (shippedProducts.length > 0) {
+    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);
+      }
+    });
+  } else {
+    let ids = [];
+    if (productSelectedRows.value.length > 0) {
+      ids = productSelectedRows.value.map(item => item.id);
+    }
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
         .then(() => {
           delProduct(ids).then(res => {
             proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
             closeProductDia();
-            getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then(
-              res => {
-                productData.value = res.productData;
-              }
+            getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(
+                res => {
+                  productData.value = res.productData;
+                }
             );
           });
         })
         .catch(() => {
           proxy.$modal.msg("宸插彇娑�");
         });
-    }
-  };
-  // 鍏抽棴浜у搧寮规
-  const closeProductDia = () => {
-    proxy.resetForm("productFormRef");
-    productFormVisible.value = false;
-  };
-  // 瀵煎叆
-  const handleImport = () => {
-    importUpload.title = "瀵煎叆閿�鍞彴璐�";
-    importUpload.open = true;
-    if (importUploadRef.value) {
-      importUploadRef.value.clearFiles();
-    }
-  };
+  }
+};
+// 鍏抽棴浜у搧寮规
+const closeProductDia = () => {
+  proxy.resetForm("productFormRef");
+  productFormVisible.value = false;
+};
+// 瀵煎叆
+const handleImport = () => {
+  importUpload.title = "瀵煎叆閿�鍞彴璐�";
+  importUpload.open = true;
+  if (importUploadRef.value) {
+    importUploadRef.value.clearFiles();
+  }
+};
 
-  // 涓嬭浇瀵煎叆妯℃澘
-  const downloadTemplate = () => {
-    proxy.download("/sales/ledger/exportTemplate", {}, "閿�鍞彴璐﹀鍏ユā鏉�.xlsx");
-  };
+// 涓嬭浇瀵煎叆妯℃澘
+const downloadTemplate = () => {
+  proxy.download("/sales/ledger/exportTemplate", {}, "閿�鍞彴璐﹀鍏ユā鏉�.xlsx");
+};
 
-  // 鎻愪氦瀵煎叆鏂囦欢
-  const submitImportFile = () => {
-    importUpload.isUploading = true;
-    proxy.$refs["importUploadRef"].submit();
-  };
+// 鎻愪氦瀵煎叆鏂囦欢
+const submitImportFile = () => {
+  importUpload.isUploading = true;
+  proxy.$refs["importUploadRef"].submit();
+};
 
-  // 瀵煎嚭
-  const handleOut = () => {
-    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-    })
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
       .then(() => {
         proxy.download("/sales/ledger/export", {}, "閿�鍞彴璐�.xlsx");
       })
       .catch(() => {
         proxy.$modal.msg("宸插彇娑�");
       });
-  };
-  /** 鍒ゆ柇鍗曚釜浜у搧鏄惁宸插彂璐э紙鏍规嵁shippingStatus鍒ゆ柇锛屽凡鍙戣揣鎴栧鏍搁�氳繃涓嶅彲缂栬緫鍜屽垹闄わ級 */
-  const isProductShipped = product => {
-    if (!product) return false;
-    const status = String(product.shippingStatus || "").trim();
-    // 濡傛灉鍙戣揣鐘舵�佹槸"宸插彂璐�"鎴�"瀹℃牳閫氳繃"锛屽垯涓嶅彲缂栬緫鍜屽垹闄�
-    return status === "宸插彂璐�" || status === "瀹℃牳閫氳繃";
-  };
+};
+/** 鍒ゆ柇鍗曚釜浜у搧鏄惁宸插彂璐э紙鏍规嵁shippingStatus鍒ゆ柇锛屽凡鍙戣揣鎴栧鏍搁�氳繃涓嶅彲缂栬緫鍜屽垹闄わ級 */
+const isProductShipped = product => {
+  if (!product) return false;
+  const status = String(product.shippingStatus || "").trim();
+  // 濡傛灉鍙戣揣鐘舵�佹槸"宸插彂璐�"鎴�"瀹℃牳閫氳繃"锛屽垯涓嶅彲缂栬緫鍜屽垹闄�
+  return status === "宸插彂璐�" || status === "瀹℃牳閫氳繃";
+};
 
-  /** 鍒ゆ柇閿�鍞鍗曚笅鏄惁瀛樺湪宸插彂璐�/鍙戣揣瀹屾垚鐨勪骇鍝侊紙涓嶅彲鍒犻櫎锛� */
-  const hasShippedProducts = products => {
-    if (!products || !products.length) return false;
-    return products.some(p => {
-      const status = String(p.shippingStatus || "").trim();
-      // 鏈夊彂璐ф棩鏈熸垨杞︾墝鍙疯涓哄凡鍙戣揣
-      if (p.shippingDate || p.shippingCarNumber) return true;
-      // 宸茶繘琛屽彂璐с�佸彂璐у畬鎴愩�佸凡鍙戣揣 鍧囦笉鍙垹闄�
-      return (
+/** 鍒ゆ柇閿�鍞鍗曚笅鏄惁瀛樺湪宸插彂璐�/鍙戣揣瀹屾垚鐨勪骇鍝侊紙涓嶅彲鍒犻櫎锛� */
+const hasShippedProducts = products => {
+  if (!products || !products.length) return false;
+  return products.some(p => {
+    const status = String(p.shippingStatus || "").trim();
+    // 鏈夊彂璐ф棩鏈熸垨杞︾墝鍙疯涓哄凡鍙戣揣
+    if (p.shippingDate || p.shippingCarNumber) return true;
+    // 宸茶繘琛屽彂璐с�佸彂璐у畬鎴愩�佸凡鍙戣揣 鍧囦笉鍙垹闄�
+    return (
         status === "宸茶繘琛屽彂璐�" || status === "鍙戣揣瀹屾垚" || status === "宸插彂璐�"
-      );
-    });
-  };
-
-  // 鍒犻櫎
-  const handleDelete = async () => {
-    if (selectedRows.value.length === 0) {
-      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-      return;
-    }
-    const unauthorizedRows = selectedRows.value.filter(
-      row => !canDeleteLedger(row)
     );
-    if (unauthorizedRows.length > 0) {
-      proxy.$modal.msgWarning("褰撳墠鐧诲綍鐢ㄦ埛涓嶆槸褰曞叆浜猴紝涓嶈兘鍒犻櫎璇ユ暟鎹�");
-      return;
-    }
-    const ids = selectedRows.value.map(item => item.id);
+  });
+};
 
-    // 妫�鏌ユ槸鍚︽湁宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勯攢鍞鍗曪紝鑻ユ湁鍒欎笉鍏佽鍒犻櫎
-    const cannotDeleteNames = [];
-    for (const row of selectedRows.value) {
-      let products =
+// 鍒犻櫎
+const handleDelete = async () => {
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
+  }
+  const unauthorizedRows = selectedRows.value.filter(
+      row => !canDeleteLedger(row)
+  );
+  if (unauthorizedRows.length > 0) {
+    proxy.$modal.msgWarning("褰撳墠鐧诲綍鐢ㄦ埛涓嶆槸褰曞叆浜猴紝涓嶈兘鍒犻櫎璇ユ暟鎹�");
+    return;
+  }
+  const ids = selectedRows.value.map(item => item.id);
+
+  // 妫�鏌ユ槸鍚︽湁宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勯攢鍞鍗曪紝鑻ユ湁鍒欎笉鍏佽鍒犻櫎
+  const cannotDeleteNames = [];
+  for (const row of selectedRows.value) {
+    let products =
         row.children && row.children.length > 0 ? row.children : null;
-      if (!products) {
-        try {
-          const res = await productList({ salesLedgerId: row.id, type: 1 });
-          products = res.data || [];
-        } catch {
-          products = [];
-        }
-      }
-      if (hasShippedProducts(products)) {
-        cannotDeleteNames.push(row.salesContractNo || `ID:${row.id}`);
+    if (!products) {
+      try {
+        const res = await productList({salesLedgerId: row.id, type: 1});
+        products = res.data || [];
+      } catch {
+        products = [];
       }
     }
-    if (cannotDeleteNames.length > 0) {
-      proxy.$modal.msgWarning(
+    if (hasShippedProducts(products)) {
+      cannotDeleteNames.push(row.salesContractNo || `ID:${row.id}`);
+    }
+  }
+  if (cannotDeleteNames.length > 0) {
+    proxy.$modal.msgWarning(
         "宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勯攢鍞鍗曚笉鑳藉垹闄わ細" + cannotDeleteNames.join("銆�")
-      );
-      return;
-    }
+    );
+    return;
+  }
 
-    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-    })
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
       .then(() => {
         delLedger(ids).then(res => {
           proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
@@ -1774,67 +1902,67 @@
       .catch(() => {
         proxy.$modal.msg("宸插彇娑�");
       });
-  };
+};
 
-  // 鎵撳嵃鍔熻兘
-  const handlePrint = async () => {
-    if (selectedRows.value.length === 0) {
-      proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
-      return;
-    }
+// 鎵撳嵃鍔熻兘
+const handlePrint = async () => {
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
+    return;
+  }
 
-    // 鏄剧ず鍔犺浇鐘舵��
-    proxy.$modal.loading("姝e湪鑾峰彇浜у搧鏁版嵁锛岃绋嶅��...");
+  // 鏄剧ず鍔犺浇鐘舵��
+  proxy.$modal.loading("姝e湪鑾峰彇浜у搧鏁版嵁锛岃绋嶅��...");
 
-    try {
-      // 涓烘瘡涓�変腑鐨勯攢鍞彴璐﹁褰曟煡璇㈠搴旂殑浜у搧鏁版嵁
-      const printDataWithProducts = [];
+  try {
+    // 涓烘瘡涓�変腑鐨勯攢鍞彴璐﹁褰曟煡璇㈠搴旂殑浜у搧鏁版嵁
+    const printDataWithProducts = [];
 
-      for (const row of selectedRows.value) {
-        try {
-          // 璋冪敤productList鎺ュ彛鏌ヨ浜у搧鏁版嵁
-          const productRes = await productList({
-            salesLedgerId: row.id,
-            type: 1,
-          });
+    for (const row of selectedRows.value) {
+      try {
+        // 璋冪敤productList鎺ュ彛鏌ヨ浜у搧鏁版嵁
+        const productRes = await productList({
+          salesLedgerId: row.id,
+          type: 1,
+        });
 
-          // 灏嗕骇鍝佹暟鎹暣鍚堝埌閿�鍞彴璐﹁褰曚腑
-          const rowWithProducts = {
-            ...row,
-            products: productRes.data || [],
-          };
+        // 灏嗕骇鍝佹暟鎹暣鍚堝埌閿�鍞彴璐﹁褰曚腑
+        const rowWithProducts = {
+          ...row,
+          products: productRes.data || [],
+        };
 
-          printDataWithProducts.push(rowWithProducts);
-        } catch (error) {
-          console.error(`鑾峰彇閿�鍞彴璐� ${row.id} 鐨勪骇鍝佹暟鎹け璐�:`, error);
-          // 鍗充娇鏌愪釜璁板綍鐨勪骇鍝佹暟鎹幏鍙栧け璐ワ紝涔熻鍖呭惈璇ヨ褰�
-          printDataWithProducts.push({
-            ...row,
-            products: [],
-          });
-        }
+        printDataWithProducts.push(rowWithProducts);
+      } catch (error) {
+        console.error(`鑾峰彇閿�鍞彴璐� ${row.id} 鐨勪骇鍝佹暟鎹け璐�:`, error);
+        // 鍗充娇鏌愪釜璁板綍鐨勪骇鍝佹暟鎹幏鍙栧け璐ワ紝涔熻鍖呭惈璇ヨ褰�
+        printDataWithProducts.push({
+          ...row,
+          products: [],
+        });
       }
-
-      printData.value = printDataWithProducts;
-      console.log("鎵撳嵃鏁版嵁锛堝寘鍚骇鍝侊級:", printData.value);
-      printPreviewVisible.value = true;
-    } catch (error) {
-      console.error("鑾峰彇浜у搧鏁版嵁澶辫触:", error);
-      proxy.$modal.msgError("鑾峰彇浜у搧鏁版嵁澶辫触锛岃閲嶈瘯");
-    } finally {
-      proxy.$modal.closeLoading();
     }
-  };
-  // 鎵ц鎵撳嵃
-  const executePrint = () => {
-    console.log("寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:", printData.value.length);
-    console.log("鎵撳嵃鏁版嵁:", printData.value);
 
-    // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
-    const printWindow = window.open("", "_blank", "width=800,height=600");
+    printData.value = printDataWithProducts;
+    console.log("鎵撳嵃鏁版嵁锛堝寘鍚骇鍝侊級:", printData.value);
+    printPreviewVisible.value = true;
+  } catch (error) {
+    console.error("鑾峰彇浜у搧鏁版嵁澶辫触:", error);
+    proxy.$modal.msgError("鑾峰彇浜у搧鏁版嵁澶辫触锛岃閲嶈瘯");
+  } finally {
+    proxy.$modal.closeLoading();
+  }
+};
+// 鎵ц鎵撳嵃
+const executePrint = () => {
+  console.log("寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:", printData.value.length);
+  console.log("鎵撳嵃鏁版嵁:", printData.value);
 
-    // 鏋勫缓鎵撳嵃鍐呭
-    let printContent = `
+  // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
+  const printWindow = window.open("", "_blank", "width=800,height=600");
+
+  // 鏋勫缓鎵撳嵃鍐呭
+  let printContent = `
                                                     <!DOCTYPE html>
                                                     <html>
                                                     <head>
@@ -1969,9 +2097,9 @@
                                                     <body>
                                                   `;
 
-    // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
-    printData.value.forEach((item, index) => {
-      printContent += `
+  // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
+  printData.value.forEach((item, index) => {
+    printContent += `
                                                       <div class="print-page">
                                                         <div class="delivery-note">
                                                           <div class="header">
@@ -1983,22 +2111,22 @@
                                                               <div>
                                                                 <span class="label">鍙戣揣鏃ユ湡锛�</span>
                                                                 <span class="value">${formatDate(
-                                                                  item.createTime
-                                                                )}</span>
+        item.createTime
+    )}</span>
                                                               </div>
                                                               <div>
                                                                 <span class="label">瀹㈡埛鍚嶇О锛�</span>
                                                                 <span class="value">${
-                                                                  item.customerName
-                                                                }</span>
+        item.customerName
+    }</span>
                                                               </div>
                                                             </div>
                                                             <div class="info-row">
                                                               <span class="label">鍗曞彿锛�</span>
                                                               <span class="value">${
-                                                                item.salesContractNo ||
-                                                                ""
-                                                              }</span>
+        item.salesContractNo ||
+        ""
+    }</span>
                                                             </div>
                                                           </div>
 
@@ -2016,43 +2144,43 @@
                                                               </thead>
                                                               <tbody>
                                                                 ${
-                                                                  item.products &&
-                                                                  item.products
-                                                                    .length > 0
-                                                                    ? item.products
-                                                                        .map(
-                                                                          product => `
+        item.products &&
+        item.products
+            .length > 0
+            ? item.products
+                .map(
+                    product => `
                                                                     <tr>
                                                                       <td>${
-                                                                        product.productCategory ||
-                                                                        ""
-                                                                      }</td>
+                        product.productCategory ||
+                        ""
+                    }</td>
                                                                       <td>${
-                                                                        product.specificationModel ||
-                                                                        ""
-                                                                      }</td>
+                        product.specificationModel ||
+                        ""
+                    }</td>
                                                                       <td>${
-                                                                        product.unit ||
-                                                                        ""
-                                                                      }</td>
+                        product.unit ||
+                        ""
+                    }</td>
                                                                       <td>${
-                                                                        product.taxInclusiveUnitPrice ||
-                                                                        "0"
-                                                                      }</td>
+                        product.taxInclusiveUnitPrice ||
+                        "0"
+                    }</td>
                                                                       <td>${
-                                                                        product.quantity ||
-                                                                        "0"
-                                                                      }</td>
+                        product.quantity ||
+                        "0"
+                    }</td>
                                                                       <td>${
-                                                                        product.taxInclusiveTotalPrice ||
-                                                                        "0"
-                                                                      }</td>
+                        product.taxInclusiveTotalPrice ||
+                        "0"
+                    }</td>
                                                                     </tr>
                                                                   `
-                                                                        )
-                                                                        .join("")
-                                                                    : '<tr><td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td></tr>'
-                                                                }
+                )
+                .join("")
+            : '<tr><td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td></tr>'
+    }
                                                               </tbody>
                                                               <tfoot>
                                                                 <tr>
@@ -2061,11 +2189,11 @@
                                                                   <td class="total-value"></td>
                                                                   <td class="total-value"></td>
                                                                   <td class="total-value">${getTotalQuantityForPrint(
-                                                                    item.products
-                                                                  )}</td>
+        item.products
+    )}</td>
                                                                   <td class="total-value">${getTotalAmountForPrint(
-                                                                    item.products
-                                                                  )}</td>
+        item.products
+    )}</td>
                                                                 </tr>
                                                               </tfoot>
                                                             </table>
@@ -2090,640 +2218,669 @@
                                                               <div class="footer-item">
                                                                 <span class="label">鎿嶄綔鍛橈細</span>
                                                                 <span class="value">${
-                                                                  userStore.nickName ||
-                                                                  "鎾曞紑鍓�"
-                                                                }</span>
+        userStore.nickName ||
+        "鎾曞紑鍓�"
+    }</span>
                                                               </div>
                                                               <div class="footer-item">
                                                                 <span class="label">鎵撳嵃鏃ユ湡锛�</span>
                                                                 <span class="value">${formatDateTime(
-                                                                  new Date()
-                                                                )}</span>
+        new Date()
+    )}</span>
                                                               </div>
                                                             </div>
                                                           </div>
                                                         </div>
                                                       </div>
                                                     `;
-    });
+  });
 
-    printContent += `
+  printContent += `
                                                     </body>
                                                     </html>
                                                   `;
 
-    // 鍐欏叆鍐呭鍒版柊绐楀彛
-    printWindow.document.write(printContent);
-    printWindow.document.close();
+  // 鍐欏叆鍐呭鍒版柊绐楀彛
+  printWindow.document.write(printContent);
+  printWindow.document.close();
 
-    // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
-    printWindow.onload = () => {
-      setTimeout(() => {
-        printWindow.print();
-        printWindow.close();
-        printPreviewVisible.value = false;
-      }, 500);
-    };
+  // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
+  printWindow.onload = () => {
+    setTimeout(() => {
+      printWindow.print();
+      printWindow.close();
+      printPreviewVisible.value = false;
+    }, 500);
   };
-  // 鏍煎紡鍖栨棩鏈�
-  const formatDate = dateString => {
-    if (!dateString) return getCurrentDate();
-    const date = new Date(dateString);
-    const year = date.getFullYear();
-    const month = String(date.getMonth() + 1).padStart(2, "0");
-    const day = String(date.getDate()).padStart(2, "0");
-    return `${year}/${month}/${day}`;
-  };
-  // 鏍煎紡鍖栨棩鏈熸椂闂�
-  const formatDateTime = date => {
-    const year = date.getFullYear();
-    const month = String(date.getMonth() + 1).padStart(2, "0");
-    const day = String(date.getDate()).padStart(2, "0");
-    const hours = String(date.getHours()).padStart(2, "0");
-    const minutes = String(date.getMinutes()).padStart(2, "0");
-    const seconds = String(date.getSeconds()).padStart(2, "0");
-    return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
-  };
-  // 璁$畻浜у搧鎬绘暟閲�
-  const getTotalQuantity = products => {
-    if (!products || products.length === 0) return "0";
-    const total = products.reduce((sum, product) => {
-      return sum + (parseFloat(product.quantity) || 0);
-    }, 0);
-    return total.toFixed(2);
-  };
+};
+// 鏍煎紡鍖栨棩鏈�
+const formatDate = dateString => {
+  if (!dateString) return getCurrentDate();
+  const date = new Date(dateString);
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, "0");
+  const day = String(date.getDate()).padStart(2, "0");
+  return `${year}/${month}/${day}`;
+};
+// 鏍煎紡鍖栨棩鏈熸椂闂�
+const formatDateTime = date => {
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, "0");
+  const day = String(date.getDate()).padStart(2, "0");
+  const hours = String(date.getHours()).padStart(2, "0");
+  const minutes = String(date.getMinutes()).padStart(2, "0");
+  const seconds = String(date.getSeconds()).padStart(2, "0");
+  return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
+};
+// 璁$畻浜у搧鎬绘暟閲�
+const getTotalQuantity = products => {
+  if (!products || products.length === 0) return "0";
+  const total = products.reduce((sum, product) => {
+    return sum + (parseFloat(product.quantity) || 0);
+  }, 0);
+  return total.toFixed(2);
+};
 
-  // 璁$畻浜у搧鎬婚噾棰�
-  const getTotalAmount = products => {
-    if (!products || products.length === 0) return "0";
-    const total = products.reduce((sum, product) => {
-      return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
-    }, 0);
-    return total.toFixed(2);
-  };
+// 璁$畻浜у搧鎬婚噾棰�
+const getTotalAmount = products => {
+  if (!products || products.length === 0) return "0";
+  const total = products.reduce((sum, product) => {
+    return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
+  }, 0);
+  return total.toFixed(2);
+};
 
-  // 鐢ㄤ簬鎵撳嵃鐨勮绠楀嚱鏁�
-  const getTotalQuantityForPrint = products => {
-    if (!products || products.length === 0) return "0";
-    const total = products.reduce((sum, product) => {
-      return sum + (parseFloat(product.quantity) || 0);
-    }, 0);
-    return total.toFixed(2);
-  };
+// 鐢ㄤ簬鎵撳嵃鐨勮绠楀嚱鏁�
+const getTotalQuantityForPrint = products => {
+  if (!products || products.length === 0) return "0";
+  const total = products.reduce((sum, product) => {
+    return sum + (parseFloat(product.quantity) || 0);
+  }, 0);
+  return total.toFixed(2);
+};
 
-  const getTotalAmountForPrint = products => {
-    if (!products || products.length === 0) return "0";
-    const total = products.reduce((sum, product) => {
-      return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
-    }, 0);
-    return total.toFixed(2);
-  };
+const getTotalAmountForPrint = products => {
+  if (!products || products.length === 0) return "0";
+  const total = products.reduce((sum, product) => {
+    return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
+  }, 0);
+  return total.toFixed(2);
+};
 
-  const mathNum = () => {
-    console.log("productForm.value", productForm.value);
-    if (!productForm.value.taxInclusiveUnitPrice) {
-      return;
-    }
-    if (!productForm.value.quantity) {
-      return;
-    }
-    // 鍚◣鎬讳环璁$畻
-    productForm.value.taxInclusiveTotalPrice =
+const mathNum = () => {
+  console.log("productForm.value", productForm.value);
+  if (!productForm.value.taxInclusiveUnitPrice) {
+    return;
+  }
+  if (!productForm.value.quantity) {
+    return;
+  }
+  // 鍚◣鎬讳环璁$畻
+  productForm.value.taxInclusiveTotalPrice =
       proxy.calculateTaxIncludeTotalPrice(
-        productForm.value.taxInclusiveUnitPrice,
-        productForm.value.quantity
+          productForm.value.taxInclusiveUnitPrice,
+          productForm.value.quantity
       );
-    if (productForm.value.taxRate) {
-      // 涓嶅惈绋庢�讳环璁$畻
-      productForm.value.taxExclusiveTotalPrice =
-        proxy.calculateTaxExclusiveTotalPrice(
-          productForm.value.taxInclusiveTotalPrice,
-          productForm.value.taxRate
-        );
-    }
-  };
-
-  // 鏍规嵁鍚◣鎬讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
-  const calculateFromTotalPrice = () => {
-    if (isCalculating.value) return;
-
-    const totalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice);
-    const quantity = parseFloat(productForm.value.quantity);
-
-    if (!totalPrice || !quantity || quantity <= 0) {
-      return;
-    }
-
-    isCalculating.value = true;
-
-    // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
-    productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(2);
-
-    // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
-    if (productForm.value.taxRate) {
-      productForm.value.taxExclusiveTotalPrice =
-        proxy.calculateTaxExclusiveTotalPrice(
-          totalPrice,
-          productForm.value.taxRate
-        );
-    }
-
-    isCalculating.value = false;
-  };
-
-  // 鏍规嵁涓嶅惈绋庢�讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
-  const calculateFromExclusiveTotalPrice = () => {
-    if (!productForm.value.taxRate) {
-      proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-      return;
-    }
-    if (isCalculating.value) return;
-
-    const exclusiveTotalPrice = parseFloat(
-      productForm.value.taxExclusiveTotalPrice
-    );
-    const quantity = parseFloat(productForm.value.quantity);
-    const taxRate = parseFloat(productForm.value.taxRate);
-
-    if (!exclusiveTotalPrice || !quantity || quantity <= 0 || !taxRate) {
-      return;
-    }
-
-    isCalculating.value = true;
-
-    // 鍏堣绠楀惈绋庢�讳环 = 涓嶅惈绋庢�讳环 / (1 - 绋庣巼/100)
-    const taxRateDecimal = taxRate / 100;
-    const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
-    productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
-
-    // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
-    productForm.value.taxInclusiveUnitPrice = (
-      inclusiveTotalPrice / quantity
-    ).toFixed(2);
-
-    isCalculating.value = false;
-  };
-
-  // 鏍规嵁鏁伴噺鍙樺寲璁$畻鎬讳环
-  const calculateFromQuantity = () => {
-    if (!productForm.value.taxRate) {
-      proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-      return;
-    }
-    if (isCalculating.value) return;
-
-    const quantity = parseFloat(productForm.value.quantity);
-    const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
-
-    if (!quantity || quantity <= 0 || !unitPrice) {
-      return;
-    }
-
-    isCalculating.value = true;
-
-    // 璁$畻鍚◣鎬讳环
-    productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-
-    // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
-    if (productForm.value.taxRate) {
-      productForm.value.taxExclusiveTotalPrice =
-        proxy.calculateTaxExclusiveTotalPrice(
-          productForm.value.taxInclusiveTotalPrice,
-          productForm.value.taxRate
-        );
-    }
-
-    isCalculating.value = false;
-  };
-
-  // 鏍规嵁鍚◣鍗曚环鍙樺寲璁$畻鎬讳环
-  const calculateFromUnitPrice = () => {
-    if (!productForm.value.taxRate) {
-      proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-      return;
-    }
-    if (isCalculating.value) return;
-
-    const quantity = parseFloat(productForm.value.quantity);
-    const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
-
-    if (!quantity || quantity <= 0 || !unitPrice) {
-      return;
-    }
-
-    isCalculating.value = true;
-
-    // 璁$畻鍚◣鎬讳环
-    productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-
-    // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
-    if (productForm.value.taxRate) {
-      productForm.value.taxExclusiveTotalPrice =
-        proxy.calculateTaxExclusiveTotalPrice(
-          productForm.value.taxInclusiveTotalPrice,
-          productForm.value.taxRate
-        );
-    }
-
-    isCalculating.value = false;
-  };
-
-  // 鏍规嵁绋庣巼鍙樺寲璁$畻涓嶅惈绋庢�讳环
-  const calculateFromTaxRate = () => {
-    if (!productForm.value.taxRate) {
-      proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-      return;
-    }
-    if (isCalculating.value) return;
-
-    const inclusiveTotalPrice = parseFloat(
-      productForm.value.taxInclusiveTotalPrice
-    );
-    const taxRate = parseFloat(productForm.value.taxRate);
-
-    if (!inclusiveTotalPrice || !taxRate) {
-      return;
-    }
-
-    isCalculating.value = true;
-
-    // 璁$畻涓嶅惈绋庢�讳环
+  if (productForm.value.taxRate) {
+    // 涓嶅惈绋庢�讳环璁$畻
     productForm.value.taxExclusiveTotalPrice =
-      proxy.calculateTaxExclusiveTotalPrice(inclusiveTotalPrice, taxRate);
+        proxy.calculateTaxExclusiveTotalPrice(
+            productForm.value.taxInclusiveTotalPrice,
+            productForm.value.taxRate
+        );
+  }
+};
 
-    isCalculating.value = false;
-  };
-  /**
-   * 鑾峰彇鍙戣揣鐘舵�佹枃鏈�
-   * @param row 琛屾暟鎹�
-   */
-  const getShippingStatusText = row => {
-    // 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屾樉绀�"宸插彂璐�"
-    if (row.shippingDate || row.shippingCarNumber) {
-      return "宸插彂璐�";
-    }
+// 鏍规嵁鍚◣鎬讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
+const calculateFromTotalPrice = () => {
+  if (isCalculating.value) return;
 
-    // 鑾峰彇鍙戣揣鐘舵�佸瓧娈�
-    const status = row.shippingStatus;
+  const totalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice);
+  const quantity = parseFloat(productForm.value.quantity);
 
-    // 濡傛灉鐘舵�佷负绌烘垨鏈畾涔夛紝榛樿涓�"寰呭彂璐�"
-    if (status === null || status === undefined || status === "") {
-      return "寰呭彂璐�";
-    }
-
-    // 鐘舵�佹槸瀛楃涓�
-    const statusStr = String(status).trim();
-    const statusTextMap = {
-      寰呭彂璐�: "寰呭彂璐�",
-      寰呭鏍�: "寰呭鏍�",
-      瀹℃牳涓�: "瀹℃牳涓�",
-      瀹℃牳鎷掔粷: "瀹℃牳鎷掔粷",
-      瀹℃牳閫氳繃: "瀹℃牳閫氳繃",
-      宸插彂璐�: "宸插彂璐�",
-    };
-    return statusTextMap[statusStr] || "寰呭彂璐�";
-  };
-
-  /**
-   * 鑾峰彇鍙戣揣鐘舵�佹爣绛剧被鍨嬶紙棰滆壊锛�
-   * @param row 琛屾暟鎹�
-   */
-  const getShippingStatusType = row => {
-    // 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屾樉绀虹豢鑹�
-    if (row.shippingDate || row.shippingCarNumber) {
-      return "success";
-    }
-
-    // 鑾峰彇鍙戣揣鐘舵�佸瓧娈�
-    const status = row.shippingStatus;
-
-    // 濡傛灉鐘舵�佷负绌烘垨鏈畾涔夛紝榛樿涓虹伆鑹诧紙寰呭彂璐э級
-    if (status === null || status === undefined || status === "") {
-      return "info";
-    }
-
-    // 鐘舵�佹槸瀛楃涓�
-    const statusStr = String(status).trim();
-    const typeTextMap = {
-      寰呭彂璐�: "info",
-      寰呭鏍�: "info",
-      瀹℃牳涓�: "warning",
-      瀹℃牳鎷掔粷: "danger",
-      瀹℃牳閫氳繃: "success",
-      宸插彂璐�: "success",
-    };
-    return typeTextMap[statusStr] || "info";
-  };
-
-  /**
-   * 鍒ゆ柇鏄惁鍙互鍙戣揣
-   * 鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐у拰瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣
-   * @param row 琛屾暟鎹�
-   */
-  const canShip = row => {
-    // 浜у搧鐘舵�佸繀椤绘槸鍏呰冻锛坅pproveStatus === 1锛�
-    if (row.approveStatus !== 1) {
-      return false;
-    }
-
-    // 鑾峰彇鍙戣揣鐘舵��
-    const shippingStatus = row.shippingStatus;
-
-    // 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屼笉鑳藉啀娆″彂璐�
-    if (row.shippingDate || row.shippingCarNumber) {
-      return false;
-    }
-
-    // 鍙戣揣鐘舵�佸繀椤绘槸"寰呭彂璐�"鎴�"瀹℃牳鎷掔粷"
-    const statusStr = shippingStatus ? String(shippingStatus).trim() : "";
-    return statusStr === "寰呭彂璐�" || statusStr === "瀹℃牳鎷掔粷";
-  };
-
-  // 鎵撳紑闄勪欢寮圭獥
-  const recordId =ref(0)
-  const fileDialogVisible = ref(false)
-
-  // 鎵撳紑闄勪欢寮规
-  const openFileDialog = async (row) => {
-    recordId.value = row.id
-    fileDialogVisible.value = true
+  if (!totalPrice || !quantity || quantity <= 0) {
+    return;
   }
 
-  // 鎵撳紑鍙戣揣寮规
-  const openDeliveryForm = row => {
-    // 妫�鏌ユ槸鍚﹀彲浠ュ彂璐�
-    if (!canShip(row)) {
-      proxy.$modal.msgWarning(
-        "鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐ф垨瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣"
-      );
-      return;
-    }
+  isCalculating.value = true;
 
-    currentDeliveryRow.value = row;
-    deliveryForm.value = {
-      type: "璐ц溅",
-    };
-    deliveryFormVisible.value = true;
+  // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
+  productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(2);
+
+  // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
+  if (productForm.value.taxRate) {
+    productForm.value.taxExclusiveTotalPrice =
+        proxy.calculateTaxExclusiveTotalPrice(
+            totalPrice,
+            productForm.value.taxRate
+        );
+  }
+
+  isCalculating.value = false;
+};
+
+// 鏍规嵁涓嶅惈绋庢�讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
+const calculateFromExclusiveTotalPrice = () => {
+  if (!productForm.value.taxRate) {
+    proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+    return;
+  }
+  if (isCalculating.value) return;
+
+  const exclusiveTotalPrice = parseFloat(
+      productForm.value.taxExclusiveTotalPrice
+  );
+  const quantity = parseFloat(productForm.value.quantity);
+  const taxRate = parseFloat(productForm.value.taxRate);
+
+  if (!exclusiveTotalPrice || !quantity || quantity <= 0 || !taxRate) {
+    return;
+  }
+
+  isCalculating.value = true;
+
+  // 鍏堣绠楀惈绋庢�讳环 = 涓嶅惈绋庢�讳环 / (1 - 绋庣巼/100)
+  const taxRateDecimal = taxRate / 100;
+  const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
+  productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
+
+  // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
+  productForm.value.taxInclusiveUnitPrice = (
+      inclusiveTotalPrice / quantity
+  ).toFixed(2);
+
+  isCalculating.value = false;
+};
+
+// 鏍规嵁鏁伴噺鍙樺寲璁$畻鎬讳环
+const calculateFromQuantity = () => {
+  if (!productForm.value.taxRate) {
+    proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+    return;
+  }
+  if (isCalculating.value) return;
+
+  const quantity = parseFloat(productForm.value.quantity);
+  const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
+
+  if (!quantity || quantity <= 0 || !unitPrice) {
+    return;
+  }
+
+  isCalculating.value = true;
+
+  // 璁$畻鍚◣鎬讳环
+  productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
+
+  // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
+  if (productForm.value.taxRate) {
+    productForm.value.taxExclusiveTotalPrice =
+        proxy.calculateTaxExclusiveTotalPrice(
+            productForm.value.taxInclusiveTotalPrice,
+            productForm.value.taxRate
+        );
+  }
+
+  isCalculating.value = false;
+};
+
+// 鏍规嵁鍚◣鍗曚环鍙樺寲璁$畻鎬讳环
+const calculateFromUnitPrice = () => {
+  if (!productForm.value.taxRate) {
+    proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+    return;
+  }
+  if (isCalculating.value) return;
+
+  const quantity = parseFloat(productForm.value.quantity);
+  const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
+
+  if (!quantity || quantity <= 0 || !unitPrice) {
+    return;
+  }
+
+  isCalculating.value = true;
+
+  // 璁$畻鍚◣鎬讳环
+  productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
+
+  // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
+  if (productForm.value.taxRate) {
+    productForm.value.taxExclusiveTotalPrice =
+        proxy.calculateTaxExclusiveTotalPrice(
+            productForm.value.taxInclusiveTotalPrice,
+            productForm.value.taxRate
+        );
+  }
+
+  isCalculating.value = false;
+};
+
+// 鏍规嵁绋庣巼鍙樺寲璁$畻涓嶅惈绋庢�讳环
+const calculateFromTaxRate = () => {
+  if (!productForm.value.taxRate) {
+    proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+    return;
+  }
+  if (isCalculating.value) return;
+
+  const inclusiveTotalPrice = parseFloat(
+      productForm.value.taxInclusiveTotalPrice
+  );
+  const taxRate = parseFloat(productForm.value.taxRate);
+
+  if (!inclusiveTotalPrice || !taxRate) {
+    return;
+  }
+
+  isCalculating.value = true;
+
+  // 璁$畻涓嶅惈绋庢�讳环
+  productForm.value.taxExclusiveTotalPrice =
+      proxy.calculateTaxExclusiveTotalPrice(inclusiveTotalPrice, taxRate);
+
+  isCalculating.value = false;
+};
+/**
+ * 鑾峰彇鍙戣揣鐘舵�佹枃鏈�
+ * @param row 琛屾暟鎹�
+ */
+const getShippingStatusText = row => {
+  // 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屾樉绀�"宸插彂璐�"
+  // if (row.shippingDate || row.shippingCarNumber) {
+  //   return "宸插彂璐�";
+  // }
+
+  // 鑾峰彇鍙戣揣鐘舵�佸瓧娈�
+  const status = row.shippingStatus;
+
+  // 濡傛灉鐘舵�佷负绌烘垨鏈畾涔夛紝榛樿涓�"寰呭彂璐�"
+  if (status === null || status === undefined || status === "") {
+    return "寰呭彂璐�";
+  }
+
+  // 鐘舵�佹槸瀛楃涓�
+  const statusStr = String(status).trim();
+  const statusTextMap = {
+    寰呭彂璐�: "寰呭彂璐�",
+    寰呭鏍�: "寰呭鏍�",
+    瀹℃牳涓�: "瀹℃牳涓�",
+    瀹℃牳鎷掔粷: "瀹℃牳鎷掔粷",
+    瀹℃牳閫氳繃: "瀹℃牳閫氳繃",
+    宸插彂璐�: "宸插彂璐�",
   };
+  return statusTextMap[statusStr] || "寰呭彂璐�";
+};
 
-  // 鎻愪氦鍙戣揣琛ㄥ崟
-  const submitDelivery = () => {
-    proxy.$refs["deliveryFormRef"].validate(valid => {
-      if (valid) {
-        // 淇濆瓨褰撳墠灞曞紑鐨勮ID锛屼互渚垮彂璐у悗閲嶆柊鍔犺浇瀛愯〃鏍兼暟鎹�
-        const currentExpandedKeys = [...expandedRowKeys.value];
-        const salesLedgerId = currentDeliveryRow.value.salesLedgerId;
-        addShippingInfo({
-          salesLedgerId: salesLedgerId,
-          salesLedgerProductId: currentDeliveryRow.value.id,
-          type: deliveryForm.value.type,
-        }).then(() => {
-          proxy.$modal.msgSuccess("鍙戣揣鎴愬姛");
-          closeDeliveryDia();
-          // 鍒锋柊涓昏〃鏁版嵁
-          getList().then(() => {
-            // 濡傛灉涔嬪墠鏈夊睍寮�鐨勮锛岄噸鏂板姞杞借繖浜涜鐨勫瓙琛ㄦ牸鏁版嵁
-            if (currentExpandedKeys.length > 0) {
-              // 浣跨敤 Promise.all 骞惰鍔犺浇鎵�鏈夊睍寮�琛岀殑瀛愯〃鏍兼暟鎹�
-              const loadPromises = currentExpandedKeys.map(ledgerId => {
-                return productList({ salesLedgerId: ledgerId, type: 1 }).then(
+/**
+ * 鑾峰彇鍙戣揣鐘舵�佹爣绛剧被鍨嬶紙棰滆壊锛�
+ * @param row 琛屾暟鎹�
+ */
+const getShippingStatusType = row => {
+  // 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屾樉绀虹豢鑹�
+  if (row.shippingStatus === "宸插彂璐�") {
+    return "success";
+  }
+
+  // 鑾峰彇鍙戣揣鐘舵�佸瓧娈�
+  const status = row.shippingStatus;
+
+  // 濡傛灉鐘舵�佷负绌烘垨鏈畾涔夛紝榛樿涓虹伆鑹诧紙寰呭彂璐э級
+  if (status === null || status === undefined || status === "") {
+    return "info";
+  }
+
+  // 鐘舵�佹槸瀛楃涓�
+  const statusStr = String(status).trim();
+  const typeTextMap = {
+    寰呭彂璐�: "info",
+    寰呭鏍�: "info",
+    瀹℃牳涓�: "warning",
+    瀹℃牳鎷掔粷: "danger",
+    瀹℃牳閫氳繃: "success",
+    宸插彂璐�: "success",
+  };
+  return typeTextMap[statusStr] || "info";
+};
+
+/**
+ * 鍒ゆ柇鏄惁鍙互鍙戣揣
+ * 鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐у拰瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣
+ * @param row 琛屾暟鎹�
+ */
+const canShip = row => {
+  // 浜у搧鐘舵�佸繀椤绘槸鍏呰冻锛坅pproveStatus === 1锛�
+  if (row.approveStatus !== 1) {
+    return false;
+  }
+
+  // 鑾峰彇鍙戣揣鐘舵��
+  const shippingStatus = row.shippingStatus;
+
+  // 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屼笉鑳藉啀娆″彂璐�
+  if (shippingStatus === "宸插彂璐�") {
+    return false;
+  }
+
+  // 鍙戣揣鐘舵�佸繀椤绘槸"寰呭彂璐�"鎴�"瀹℃牳鎷掔粷"
+  const statusStr = shippingStatus ? String(shippingStatus).trim() : "";
+  return statusStr === "寰呭彂璐�" || statusStr === "瀹℃牳鎷掔粷";
+};
+
+// 鎵撳紑闄勪欢寮圭獥
+const recordId = ref(0)
+const fileDialogVisible = ref(false)
+
+// 鎵撳紑闄勪欢寮规
+const openFileDialog = async (row) => {
+  recordId.value = row.id
+  fileDialogVisible.value = true
+}
+
+// 鎵撳紑鍙戣揣寮规
+const openDeliveryForm = async row => {
+  // 妫�鏌ユ槸鍚﹀彲浠ュ彂璐�
+  if (!canShip(row)) {
+    proxy.$modal.msgWarning(
+        "鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐ф垨瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣"
+    );
+    return;
+  }
+
+  currentDeliveryRow.value = row;
+  const batchNoList = await getDeliveryBatchNoList(
+      row.productModelId || row.modelId
+  );
+  deliveryForm.value = {
+    type: "璐ц溅",
+    batchNo: [],
+    batchNoList,
+  };
+  deliveryFormVisible.value = true;
+};
+
+// 鎻愪氦鍙戣揣琛ㄥ崟
+const submitDelivery = () => {
+  proxy.$refs["deliveryFormRef"].validate(valid => {
+    if (valid) {
+      const selectedBatchRows = getSelectedDeliveryBatchRows();
+      if (selectedBatchRows.length === 0) {
+        proxy.$modal.msgWarning("璇疯嚦灏戝~鍐欎竴涓壒鍙风殑鍙戣揣鏁伴噺");
+        return;
+      }
+      const totalDeliveryQuantity = selectedBatchRows.reduce(
+          (sum, item) => sum + Number(item.deliveryQuantity || 0),
+          0
+      );
+      const currentRowQuantity = Number(currentDeliveryRow.value?.quantity || 0);
+      if (currentRowQuantity > 0 && totalDeliveryQuantity > currentRowQuantity) {
+        proxy.$modal.msgWarning("鎵瑰彿鍙戣揣鎬绘暟涓嶈兘瓒呰繃褰撳墠浜у搧鏁伴噺");
+        return;
+      }
+      // 淇濆瓨褰撳墠灞曞紑鐨勮ID锛屼互渚垮彂璐у悗閲嶆柊鍔犺浇瀛愯〃鏍兼暟鎹�
+      const currentExpandedKeys = [...expandedRowKeys.value];
+      const salesLedgerId = currentDeliveryRow.value.salesLedgerId;
+      deliveryForm.value.batchNo = selectedBatchRows.map(item => item.id);
+      const productModelId = currentDeliveryRow.value.productModelId || currentDeliveryRow.value.modelId;
+      addShippingInfo({
+        salesLedgerId: salesLedgerId,
+        salesLedgerProductId: currentDeliveryRow.value.id,
+        type: deliveryForm.value.type,
+        batchNo: deliveryForm.value.batchNo,
+        batchNoDetailList: selectedBatchRows.map(item => ({
+          stockInventoryId: item.id,
+          batchNo: item.batchNo,
+          quantity: Number(item.deliveryQuantity || 0),
+          productModelId: productModelId,
+        })),
+      }).then(() => {
+        proxy.$modal.msgSuccess("鍙戣揣鎴愬姛");
+        closeDeliveryDia();
+        // 鍒锋柊涓昏〃鏁版嵁
+        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
+                        item => item.id === ledgerId
                     );
                     if (index > -1) {
                       tableData.value[index].children = res.data;
                     }
                   }
-                );
-              });
-              Promise.all(loadPromises).then(() => {
-                // 鎭㈠灞曞紑鐘舵��
-                expandedRowKeys.value = currentExpandedKeys;
-              });
-            }
-          });
+              );
+            });
+            Promise.all(loadPromises).then(() => {
+              // 鎭㈠灞曞紑鐘舵��
+              expandedRowKeys.value = currentExpandedKeys;
+            });
+          }
         });
-      }
-    });
-  };
-
-  // 鍏抽棴鍙戣揣寮规
-  const closeDeliveryDia = () => {
-    proxy.resetForm("deliveryFormRef");
-    deliveryFormVisible.value = false;
-    currentDeliveryRow.value = null;
-  };
-  const currentFactoryName = ref("");
-  const getCurrentFactoryName = async () => {
-    let res = await userStore.getInfo();
-    currentFactoryName.value = res.user.currentFactoryName;
-  };
-  onMounted(() => {
-    searchForm.salesContractNo = route.query.salesContractNo;
-    getList();
-    userListNoPage().then(res => {
-      userList.value = res.data;
-    });
-    getCurrentFactoryName();
+      });
+    }
   });
+};
+
+// 鍏抽棴鍙戣揣寮规
+const closeDeliveryDia = () => {
+  proxy.resetForm("deliveryFormRef");
+  deliveryFormVisible.value = false;
+  currentDeliveryRow.value = null;
+};
+const currentFactoryName = ref("");
+const getCurrentFactoryName = async () => {
+  let res = await userStore.getInfo();
+  currentFactoryName.value = res.user.currentFactoryName;
+};
+onMounted(() => {
+  searchForm.salesContractNo = route.query.salesContractNo;
+  getList();
+  userListNoPage().then(res => {
+    userList.value = res.data;
+  });
+  getCurrentFactoryName();
+});
 </script>
 
 <style scoped lang="scss">
-  .ml-10 {
-    margin-left: 10px;
+.ml-10 {
+  margin-left: 10px;
+}
+
+:deep(.yellow) {
+  background-color: #faf0de;
+}
+
+:deep(.pink) {
+  background-color: #fae1de;
+}
+
+:deep(.red) {
+  background-color: #fae1de;
+}
+
+:deep(.purple) {
+  background-color: #f4defa;
+}
+
+.table_list {
+  margin-top: unset;
+}
+
+.actions {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 10px;
+}
+
+.print-preview-dialog {
+  .el-dialog__body {
+    padding: 0;
+    max-height: 80vh;
+    overflow-y: auto;
   }
+}
 
-  :deep(.yellow) {
-    background-color: #faf0de;
-  }
-
-  :deep(.pink) {
-    background-color: #fae1de;
-  }
-
-  :deep(.red) {
-    background-color: #fae1de;
-  }
-
-  :deep(.purple) {
-    background-color: #f4defa;
-  }
-
-  .table_list {
-    margin-top: unset;
-  }
-
-  .actions {
-    display: flex;
-    justify-content: space-between;
-    margin-bottom: 10px;
-  }
-  .print-preview-dialog {
-    .el-dialog__body {
-      padding: 0;
-      max-height: 80vh;
-      overflow-y: auto;
-    }
-  }
-
-  .print-preview-container {
-    .print-preview-header {
-      padding: 15px;
-      border-bottom: 1px solid #e4e7ed;
-      text-align: center;
-
-      .el-button {
-        margin: 0 10px;
-      }
-    }
-
-    .print-preview-content {
-      padding: 20px;
-      background-color: #f5f5f5;
-      min-height: 400px;
-    }
-  }
-
-  .print-page {
-    width: 220mm;
-    height: 90mm;
-    padding: 10mm;
-    margin: 0 auto;
-    background: white;
-    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
-    margin-bottom: 10px;
-    box-sizing: border-box;
-  }
-
-  .delivery-note {
-    width: 100%;
-    height: 100%;
-    font-family: "SimSun", serif;
-    font-size: 10px;
-    line-height: 1.2;
-    display: flex;
-    flex-direction: column;
-  }
-
-  .header {
+.print-preview-container {
+  .print-preview-header {
+    padding: 15px;
+    border-bottom: 1px solid #e4e7ed;
     text-align: center;
-    margin-bottom: 8px;
 
-    .company-name {
-      font-size: 18px;
-      font-weight: bold;
-      margin-bottom: 4px;
-    }
-
-    .document-title {
-      font-size: 16px;
-      font-weight: bold;
+    .el-button {
+      margin: 0 10px;
     }
   }
 
-  .info-section {
-    margin-bottom: 8px;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
+  .print-preview-content {
+    padding: 20px;
+    background-color: #f5f5f5;
+    min-height: 400px;
+  }
+}
 
-    .info-row {
-      line-height: 20px;
+.print-page {
+  width: 220mm;
+  height: 90mm;
+  padding: 10mm;
+  margin: 0 auto;
+  background: white;
+  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+  margin-bottom: 10px;
+  box-sizing: border-box;
+}
+
+.delivery-note {
+  width: 100%;
+  height: 100%;
+  font-family: "SimSun", serif;
+  font-size: 10px;
+  line-height: 1.2;
+  display: flex;
+  flex-direction: column;
+}
+
+.header {
+  text-align: center;
+  margin-bottom: 8px;
+
+  .company-name {
+    font-size: 18px;
+    font-weight: bold;
+    margin-bottom: 4px;
+  }
+
+  .document-title {
+    font-size: 16px;
+    font-weight: bold;
+  }
+}
+
+.info-section {
+  margin-bottom: 8px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+
+  .info-row {
+    line-height: 20px;
+
+    .label {
+      font-weight: bold;
+      width: 60px;
+      font-size: 14px;
+    }
+
+    .value {
+      margin-right: 20px;
+      min-width: 80px;
+      font-size: 14px;
+    }
+  }
+}
+
+.table-section {
+  margin-bottom: 4px;
+  flex: 1;
+
+  .product-table {
+    width: 100%;
+    border-collapse: collapse;
+    border: 1px solid #000;
+
+    th,
+    td {
+      border: 1px solid #000;
+      padding: 6px;
+      text-align: center;
+      font-size: 14px;
+      line-height: 1.4;
+    }
+
+    th {
+      font-weight: bold;
+    }
+
+    .total-label {
+      text-align: right;
+      font-weight: bold;
+    }
+
+    .total-value {
+      font-weight: bold;
+    }
+  }
+}
+
+.footer-section {
+  .footer-row {
+    display: flex;
+    margin-bottom: 3px;
+    line-height: 20px;
+    justify-content: space-between;
+
+    .footer-item {
+      display: flex;
+      margin-right: 20px;
 
       .label {
         font-weight: bold;
-        width: 60px;
+        width: 80px;
         font-size: 14px;
       }
 
       .value {
-        margin-right: 20px;
         min-width: 80px;
         font-size: 14px;
       }
-    }
-  }
 
-  .table-section {
-    margin-bottom: 4px;
-    flex: 1;
-
-    .product-table {
-      width: 100%;
-      border-collapse: collapse;
-      border: 1px solid #000;
-
-      th,
-      td {
-        border: 1px solid #000;
-        padding: 6px;
-        text-align: center;
-        font-size: 14px;
-        line-height: 1.4;
-      }
-
-      th {
-        font-weight: bold;
-      }
-
-      .total-label {
-        text-align: right;
-        font-weight: bold;
-      }
-
-      .total-value {
-        font-weight: bold;
-      }
-    }
-  }
-
-  .footer-section {
-    .footer-row {
-      display: flex;
-      margin-bottom: 3px;
-      line-height: 20px;
-      justify-content: space-between;
-
-      .footer-item {
-        display: flex;
-        margin-right: 20px;
-
-        .label {
-          font-weight: bold;
-          width: 80px;
-          font-size: 14px;
-        }
-
-        .value {
-          min-width: 80px;
-          font-size: 14px;
-        }
-
-        &.address-item {
-          .address-value {
-            min-width: 200px;
-          }
+      &.address-item {
+        .address-value {
+          min-width: 200px;
         }
       }
     }
   }
+}
 
-  @media print {
-    .app-container {
-      display: none;
-    }
-
-    .print-page {
-      box-shadow: none;
-      margin: 0;
-      padding: 10mm;
-      padding-left: 20mm;
-      page-break-inside: avoid;
-      page-break-after: always;
-    }
-    .print-page:last-child {
-      page-break-after: avoid;
-    }
+@media print {
+  .app-container {
+    display: none;
   }
+
+  .print-page {
+    box-shadow: none;
+    margin: 0;
+    padding: 10mm;
+    padding-left: 20mm;
+    page-break-inside: avoid;
+    page-break-after: always;
+  }
+  .print-page:last-child {
+    page-break-after: avoid;
+  }
+}
 </style>

--
Gitblit v1.9.3