liding
2026-04-10 c05b81c7f50df80ab247a05f9f92af2d799e77cd
src/views/salesManagement/salesLedger/index.vue
@@ -1,223 +1,274 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <el-form :model="searchForm" :inline="true">
        <el-form-item label="客户名称:">
          <el-input v-model="searchForm.customerName" placeholder="请输入" clearable prefix-icon="Search"
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="客户合同号:">
          <el-input v-model="searchForm.customerContractNo" placeholder="请输入" clearable prefix-icon="Search"
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="销售合同号:">
          <el-input v-model="searchForm.salesContractNo" placeholder="请输入" clearable prefix-icon="Search"
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="项目名称:">
          <el-input v-model="searchForm.projectName" placeholder="请输入" clearable prefix-icon="Search"
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="录入日期:">
          <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
            placeholder="请选择" clearable @change="changeDaterange" />
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="handleQuery"> 搜索 </el-button>
        </el-form-item>
      </el-form>
    </div>
    <div class="table_list">
      <div class="actions">
        <div></div>
        <div>
          <el-button type="primary" @click="openForm('add')">
            新增台账
          </el-button>
          <el-button @click="handleOut">导出</el-button>
          <el-button type="danger" plain @click="handleDelete">删除</el-button>
          <el-button type="primary" plain @click="handlePrint">打印</el-button>
        </div>
      </div>
      <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
        :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" show-summary style="width: 100%"
        :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)">
        <el-table-column align="center" type="selection" width="55" />
        <el-table-column type="expand">
          <template #default="props">
            <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
              <el-table-column align="center" label="序号" type="index" width="60" />
              <el-table-column label="产品大类" prop="productCategory" />
              <el-table-column label="规格型号" prop="specificationModel" />
              <el-table-column label="单位" prop="unit" />
              <el-table-column label="产品状态" width="100px" align="center">
                <template #default="scope">
                  <el-tag v-if="scope.row.approveStatus === 0" type="info">未出库</el-tag>
                  <el-tag v-if="scope.row.approveStatus === 1" type="success">已出库</el-tag>
                  <el-tag v-if="scope.row.approveStatus === 2" type="warning">审核中</el-tag>
                  <el-tag v-if="scope.row.approveStatus === 3" type="success">审核成功</el-tag>
                  <el-tag v-if="scope.row.approveStatus === 4" type="danger">审核失败</el-tag>
                </template>
              </el-table-column>
              <el-table-column label="发货车牌" minWidth="100px" align="center">
                <template #default="scope">
                  <div>
                    <el-tag type="success" v-if="scope.row.shippingCarNumber">{{ scope.row.shippingCarNumber }}</el-tag>
                    <el-tag v-else type="info">未发货</el-tag>
                  </div>
                </template>
              </el-table-column>
              <el-table-column label="发货日期" minWidth="100px" align="center">
                <template #default="scope">
                  <div>
                    <div v-if="scope.row.shippingDate">{{ scope.row.shippingDate }}</div>
                    <el-tag v-else type="info">未发货</el-tag>
                  </div>
                </template>
              </el-table-column>
              <el-table-column label="数量" prop="quantity" />
              <el-table-column label="税率(%)" prop="taxRate" />
              <el-table-column label="含税单价(元)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
              <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
              <el-table-column label="不含税总价(元)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
            <!--操作-->
              <el-table-column Width="60px" label="操作" align="center">
                <template #default="scope">
                  <el-button :disabled="scope.row.approveStatus!==2 || scope.row.approveStatus!==5" link type="primary" size="small" @click="openDeliveryForm(scope.row)">发货</el-button>
                </template>
              </el-table-column>
            </el-table>
          </template>
        </el-table-column>
        <el-table-column align="center" label="序号" type="index" width="60" />
        <el-table-column label="销售合同号" prop="salesContractNo" width="180" show-overflow-tooltip />
        <el-table-column label="客户合同号" prop="customerContractNo" width="180" show-overflow-tooltip />
        <el-table-column label="客户名称" prop="customerName" width="300" show-overflow-tooltip />
        <el-table-column label="业务员" prop="salesman" width="100" show-overflow-tooltip />
        <el-table-column label="项目名称" prop="projectName" width="180" show-overflow-tooltip />
        <el-table-column label="付款方式" prop="paymentMethod" show-overflow-tooltip />
        <el-table-column label="合同金额(元)" prop="contractAmount" width="220" show-overflow-tooltip
          :formatter="formattedNumber" />
        <el-table-column label="录入人" prop="entryPersonName" width="100" show-overflow-tooltip />
        <el-table-column label="录入日期" prop="entryDate" width="120" show-overflow-tooltip />
        <el-table-column label="签订日期" prop="executionDate" width="120" show-overflow-tooltip />
        <el-table-column fixed="right" label="操作" min-width="100" align="center">
          <template #default="scope">
            <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">编辑</el-button>
<!--            <el-button link type="primary" size="small" @click="openForm('view', scope.row)">详情</el-button>-->
            <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">附件</el-button>
<!--            <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">发货</el-button>-->
          </template>
        </el-table-column>
      </el-table>
      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
        :page="page.current" :limit="page.size" @pagination="paginationChange" />
    </div>
    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '新增销售台账页面' : '编辑销售台账页面'" width="70%"
      @close="closeDia">
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="销售合同号:" prop="salesContractNo">
              <el-input v-model="form.salesContractNo" placeholder="自动生成" clearable disabled />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="业务员:" prop="salesman">
              <el-select v-model="form.salesman" placeholder="请选择" clearable :disabled="operationType === 'view'">
                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
                  :value="item.nickName" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="客户合同号:" prop="customerContractNo">
              <el-input v-model="form.customerContractNo" placeholder="请输入" clearable :disabled="operationType === 'view'"/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="客户名称:" prop="customerId">
              <el-select v-model="form.customerId" placeholder="请选择" clearable :disabled="operationType === 'view'">
                <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id">
                  {{
                    item.customerName + "——" + item.taxpayerIdentificationNumber
                  }}
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="项目名称:" prop="projectName">
              <el-input v-model="form.projectName" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
   <div class="app-container">
      <div class="search_form">
         <el-form :model="searchForm" :inline="true">
            <el-form-item label="客户名称:">
               <el-input v-model="searchForm.customerName" placeholder="请输入" clearable prefix-icon="Search"
                  @change="handleQuery" />
            </el-form-item>
            <el-form-item label="销售合同号:">
               <el-input v-model="searchForm.salesContractNo" placeholder="请输入" clearable prefix-icon="Search"
                  @change="handleQuery" />
            </el-form-item>
            <el-form-item label="项目名称:">
               <el-input v-model="searchForm.projectName" placeholder="请输入" clearable prefix-icon="Search"
                  @change="handleQuery" />
            </el-form-item>
            <el-form-item label="录入日期:">
               <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
                  type="daterange" placeholder="请选择" clearable @change="changeDaterange" />
            </el-form-item>
            <el-form-item>
               <el-button type="primary" @click="handleQuery"> 搜索 </el-button>
            </el-form-item>
         </el-form>
      </div>
      <div class="table_list">
         <div class="actions">
            <div></div>
            <div>
               <el-button type="primary" @click="openForm('add')">
                  新增台账
               </el-button>
               <el-button type="primary" plain @click="handleImport">导入</el-button>
               <el-button @click="handleOut">导出</el-button>
               <el-button type="danger" plain @click="handleDelete">删除</el-button>
               <el-button type="primary" plain @click="handlePrint">打印</el-button>
            </div>
         </div>
         <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
            :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" :row-class-name="tableRowClassName"
            show-summary style="width: 100%" :summary-method="summarizeMainTable" @expand-change="expandChange"
            height="calc(100vh - 18.5em)">
            <el-table-column align="center" type="selection" width="55" fixed="left" />
            <el-table-column type="expand" width="60" fixed="left">
               <template #default="props">
                  <el-table :data="props.row.children" border show-summary
                     :summary-method="summarizeChildrenTable">
                     <el-table-column align="center" label="序号" type="index" />
                     <el-table-column label="产品大类" prop="productCategory" />
                     <el-table-column label="规格型号" prop="specificationModel" />
                     <el-table-column label="单位" prop="unit" />
                     <el-table-column label="料号" prop="materialCode" />
                     <el-table-column label="产品状态" width="100px" align="center">
                        <template #default="scope">
                           <el-tag v-if="scope.row.approveStatus === 1" type="success">充足</el-tag>
                           <el-tag v-else type="danger">不足</el-tag>
                        </template>
                     </el-table-column>
                     <el-table-column label="发货状态" width="140" align="center">
                        <template #default="scope">
                           <el-tag :type="getShippingStatusType(scope.row)" size="small">
                              {{ getShippingStatusText(scope.row) }}
                           </el-tag>
                        </template>
                     </el-table-column>
                     <el-table-column label="快递公司" prop="expressCompany" show-overflow-tooltip />
                     <el-table-column label="快递单号" prop="expressNumber" show-overflow-tooltip />
                     <el-table-column label="发货车牌" minWidth="100px" align="center">
                        <template #default="scope">
                           <div>
                              <el-tag type="success" v-if="scope.row.shippingCarNumber">{{
                                 scope.row.shippingCarNumber }}</el-tag>
                              <el-tag v-else type="info">-</el-tag>
                           </div>
                        </template>
                     </el-table-column>
                     <el-table-column label="发货日期" minWidth="100px" align="center">
                        <template #default="scope">
                           <div>
                              <div v-if="scope.row.shippingDate">{{ scope.row.shippingDate }}</div>
                              <el-tag v-else type="info">-</el-tag>
                           </div>
                        </template>
                     </el-table-column>
                     <el-table-column label="数量" prop="quantity" />
                     <el-table-column label="税率(%)" prop="taxRate" />
                     <el-table-column label="含税单价(元)" prop="taxInclusiveUnitPrice"
                        :formatter="formattedNumber" />
                     <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice"
                        :formatter="formattedNumber" />
                     <el-table-column label="不含税总价(元)" prop="taxExclusiveTotalPrice"
                        :formatter="formattedNumber" />
                     <!--操作-->
                     <el-table-column Width="60px" label="操作" align="center">
                        <template #default="scope">
                           <el-button link type="primary" size="small" :disabled="!canShip(scope.row)"
                              @click="openDeliveryForm(scope.row)">
                              发货
                           </el-button>
                        </template>
                     </el-table-column>
                  </el-table>
               </template>
            </el-table-column>
            <el-table-column align="center" label="序号" type="index" width="60" />
            <el-table-column label="销售合同号" prop="salesContractNo" width="180" show-overflow-tooltip />
            <el-table-column label="客户名称" prop="customerName" width="300" show-overflow-tooltip />
            <el-table-column label="业务员" prop="salesman" width="100" show-overflow-tooltip />
            <el-table-column label="项目名称" prop="projectName" width="180" show-overflow-tooltip />
            <el-table-column label="付款方式" prop="paymentMethod" show-overflow-tooltip />
            <el-table-column label="合同金额(元)" prop="contractAmount" width="220" show-overflow-tooltip
               :formatter="formattedNumber" />
            <el-table-column label="录入人" prop="entryPersonName" width="100" show-overflow-tooltip />
            <el-table-column label="录入日期" prop="entryDate" width="120" show-overflow-tooltip />
            <el-table-column label="签订日期" prop="executionDate" width="120" show-overflow-tooltip />
            <el-table-column label="交付日期" prop="deliveryDate" width="120" show-overflow-tooltip />
            <el-table-column label="备注" prop="remarks" width="200" show-overflow-tooltip />
            <el-table-column fixed="right" label="操作" min-width="100" align="center">
               <template #default="scope">
                  <el-button link type="primary" size="small" @click="openForm('edit', scope.row)"
                     :disabled="!scope.row.isEdit">编辑</el-button>
                  <!--            <el-button link type="primary" size="small" @click="openForm('view', scope.row)">详情</el-button>-->
                  <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">附件</el-button>
                  <!--            <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">发货</el-button>-->
               </template>
            </el-table-column>
         </el-table>
         <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
            :page="page.current" :limit="page.size" @pagination="paginationChange" />
      </div>
      <FormDialog v-model="dialogFormVisible" :title="operationType === 'add' ? '新增销售台账页面' : '编辑销售台账页面'"
         :width="'70%'" :operation-type="operationType" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
         <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
            <!-- 报价单导入入口:放在表单顶部,选择后反显客户/业务员等 -->
            <el-row v-if="operationType === 'add'" style="margin-bottom: 10px;">
               <el-col :span="24" style="text-align: right;">
                  <el-button type="primary" plain @click="openQuotationDialog">
                     从销售报价导入
                  </el-button>
               </el-col>
            </el-row>
            <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="销售合同号:" prop="salesContractNo">
                     <el-input v-model="form.salesContractNo" placeholder="自动生成" clearable disabled />
                  </el-form-item>
               </el-col>
               <el-col :span="12">
                  <el-form-item label="业务员:" prop="salesman">
                     <el-select v-model="form.salesman" placeholder="请选择" clearable
                        :disabled="operationType === 'view'">
                        <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
                           :value="item.nickName" />
                     </el-select>
                  </el-form-item>
               </el-col>
            </el-row>
            <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="客户名称:" prop="customerId">
                     <el-select v-model="form.customerId" placeholder="请选择" clearable
                        :disabled="operationType === 'view'">
                        <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName"
                           :value="item.id">
                           {{
                              item.customerName + "——" + item.taxpayerIdentificationNumber
                           }}
                        </el-option>
                     </el-select>
                  </el-form-item>
               </el-col>
               <el-col :span="12">
                  <el-form-item label="项目名称:" prop="projectName">
                     <el-input v-model="form.projectName" placeholder="请输入" clearable
                        :disabled="operationType === 'view'" />
                  </el-form-item>
               </el-col>
            </el-row>
            <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="签订日期:" prop="executionDate">
                     <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD"
                                             format="YYYY-MM-DD" type="date" placeholder="请选择" clearable :disabled="operationType === 'view'" />
                        format="YYYY-MM-DD" type="date" placeholder="请选择" clearable
                        :disabled="operationType === 'view'" />
                  </el-form-item>
               </el-col>
               <el-col :span="12">
                  <el-form-item label="付款方式">
                     <el-input v-model="form.paymentMethod" placeholder="请输入" clearable
                        :disabled="operationType === 'view'" />
                  </el-form-item>
               </el-col>
            </el-row>
            <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="录入人:" prop="entryPerson">
                     <el-select v-model="form.entryPerson"
                                     filterable
                                     default-first-option
                                     :reserve-keyword="false" placeholder="请选择" clearable @change="changs">
                        <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
                     <el-select v-model="form.entryPerson" filterable default-first-option
                        :reserve-keyword="false" placeholder="请选择" clearable @change="changs">
                        <el-option v-for="item in userList" :key="item.userId" :label="item.nickName"
                           :value="item.userId" />
                     </el-select>
                  </el-form-item>
               </el-col>
               <el-col :span="12">
                  <el-form-item label="录入日期:" prop="entryDate">
                     <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
                                             type="date" placeholder="请选择" clearable />
                     <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD"
                        format="YYYY-MM-DD" type="date" placeholder="请选择" clearable />
                  </el-form-item>
               </el-col>
            </el-row>
            <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="交货日期:" prop="entryDate">
                     <el-date-picker style="width: 100%" v-model="form.deliveryDate" value-format="YYYY-MM-DD"
                        format="YYYY-MM-DD" type="date" placeholder="请选择" clearable />
                  </el-form-item>
               </el-col>
               <el-col :span="12">
                  <el-form-item label="是否生产:" prop="produce">
                     <el-radio-group v-model="form.produce">
                        <el-radio :label="true">是</el-radio>
                        <el-radio :label="false">否</el-radio>
                     </el-radio-group>
                  </el-form-item>
               </el-col>
            </el-row>
            <el-row>
               <el-form-item label="产品信息:" prop="entryDate">
                  <el-button v-if="operationType !== 'view'" type="primary" @click="openProductForm('add')">添加</el-button>
                  <el-button v-if="operationType !== 'view'" plain type="danger" @click="deleteProduct" >删除</el-button>
                  <el-button v-if="operationType !== 'view'" type="primary"
                     @click="openProductForm('add')">添加</el-button>
                  <el-button v-if="operationType !== 'view'" plain type="danger"
                     @click="deleteProduct">删除</el-button>
               </el-form-item>
            </el-row>
            <el-table :data="productData" border @selection-change="productSelected" show-summary
                           :summary-method="summarizeMainTable">
               <el-table-column align="center" type="selection" width="55" v-if="operationType !== 'view'" />
               :summary-method="summarizeMainTable">
               <el-table-column align="center" type="selection" width="55" v-if="operationType !== 'view'"
                  :selectable="(row) => !isProductShipped(row)" />
               <el-table-column align="center" label="序号" type="index" width="60" />
               <el-table-column label="产品大类" prop="productCategory" />
               <el-table-column label="规格型号" prop="specificationModel" />
               <el-table-column label="单位" prop="unit" />
               <el-table-column label="料号" prop="materialCode" />
               <el-table-column label="数量" prop="quantity" />
               <el-table-column label="税率(%)" prop="taxRate" />
               <el-table-column label="含税单价(元)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
               <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
               <el-table-column label="不含税总价(元)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
               <el-table-column fixed="right" label="操作" min-width="60" align="center" v-if="operationType !== 'view'">
               <el-table-column fixed="right" label="操作" min-width="60" align="center"
                  v-if="operationType !== 'view'">
                  <template #default="scope">
                     <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row,scope.$index)">编辑</el-button>
                     <el-button link type="primary" size="small" :disabled="isProductShipped(scope.row)"
                        @click="openProductForm('edit', scope.row, scope.$index)">编辑</el-button>
                  </template>
               </el-table-column>
            </el-table>
            <el-row :gutter="30">
               <el-col :span="24">
                  <el-form-item label="备注·:" prop="remark">
                     <el-input v-model="form.remark" placeholder="请输入" clearable type="textarea" :rows="2" :disabled="operationType === 'view'" />
                  <el-form-item label="备注:" prop="remarks">
                     <el-input v-model="form.remarks" placeholder="请输入" clearable type="textarea" :rows="2"
                        :disabled="operationType === 'view'" />
                  </el-form-item>
               </el-col>
            </el-row>
            <el-row :gutter="30">
               <el-col :span="24">
                  <el-form-item label="附件材料:" prop="remark">
                     <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
                                     :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"
                                     :on-success="handleUploadSuccess" :on-remove="handleRemove">
                  <el-form-item label="附件材料:" prop="salesLedgerFiles">
                     <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload"
                        auto-upload :headers="upload.headers" :before-upload="handleBeforeUpload"
                        :on-error="handleUploadError" :on-success="handleUploadSuccess"
                        :on-remove="handleRemove">
                        <el-button type="primary" v-if="operationType !== 'view'">上传</el-button>
                        <template #tip v-if="operationType !== 'view'">
                           <div class="el-upload__tip">
@@ -231,40 +282,19 @@
            </el-row>
         </el-form>
      </FormDialog>
      <!-- 从报价单导入(仅审批通过) -->
      <el-dialog
         v-model="quotationDialogVisible"
         title="选择审批通过的销售报价单"
         width="80%"
         :close-on-click-modal="false"
      >
      <el-dialog v-model="quotationDialogVisible" title="选择审批通过的销售报价单" width="80%" :close-on-click-modal="false">
         <div style="margin-bottom: 12px; display:flex; gap: 12px; align-items:center;">
            <el-input
               v-model="quotationSearchForm.quotationNo"
               placeholder="请输入报价单号"
               clearable
               style="max-width: 260px;"
               @change="fetchQuotationList"
            />
            <el-input
               v-model="quotationSearchForm.customer"
               placeholder="请输入客户名称"
               clearable
               style="max-width: 260px;"
               @change="fetchQuotationList"
            />
            <el-input v-model="quotationSearchForm.quotationNo" placeholder="请输入报价单号" clearable
               style="max-width: 260px;" @change="fetchQuotationList" />
            <el-input v-model="quotationSearchForm.customer" placeholder="请输入客户名称" clearable
               style="max-width: 260px;" @change="fetchQuotationList" />
            <el-button type="primary" @click="fetchQuotationList">搜索</el-button>
            <el-button @click="resetQuotationSearch">重置</el-button>
         </div>
         <el-table
            :data="quotationList"
            border
            stripe
            v-loading="quotationLoading"
            height="420px"
         >
         <el-table :data="quotationList" border stripe v-loading="quotationLoading" height="420px">
            <el-table-column align="center" label="序号" type="index" width="60" />
            <el-table-column prop="quotationNo" label="报价单号" width="180" show-overflow-tooltip />
            <el-table-column prop="customer" label="客户名称" min-width="220" show-overflow-tooltip />
@@ -282,37 +312,45 @@
               </template>
            </el-table-column>
         </el-table>
         <pagination v-show="quotationPage.total > 0" :total="quotationPage.total"
            layout="total, sizes, prev, pager, next, jumper" :page="quotationPage.current"
            :limit="quotationPage.size" @pagination="quotationPaginationChange" />
         <template #footer>
            <el-button @click="quotationDialogVisible = false">关闭</el-button>
         </template>
      </el-dialog>
      <FormDialog
         v-model="productFormVisible"
         :title="productOperationType === 'add' ? '新增产品' : '编辑产品'"
         :width="'40%'"
         :operation-type="productOperationType"
         @close="closeProductDia"
         @confirm="submitProduct"
      <FormDialog v-model="productFormVisible" :title="productOperationType === 'add' ? '新增产品' : '编辑产品'"
         :width="'40%'" :operation-type="productOperationType" @close="closeProductDia" @confirm="submitProduct"
         @cancel="closeProductDia">
         <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
         <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules"
            ref="productFormRef">
            <el-row :gutter="30">
               <el-col :span="24">
                  <el-form-item label="产品大类:" prop="productCategory">
                     <!-- <el-select v-model="productForm.productCategory" placeholder="请选择" clearable>
                        <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
                     </el-select> -->
                     <el-tree-select v-model="productForm.productCategory" placeholder="请选择" clearable check-strictly
                                             @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
                     <el-tree-select v-model="productForm.productCategory" placeholder="请选择" clearable
                        check-strictly @change="getModels" :data="productOptions" :render-after-expand="false"
                        style="width: 100%" />
                  </el-form-item>
               </el-col>
            </el-row>
            <el-row :gutter="30">
               <el-col :span="24">
                  <el-form-item label="规格型号:" prop="productModelId">
                     <el-select v-model="productForm.productModelId" placeholder="请选择" clearable @change="getProductModel" filterable>
                        <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
                     <el-select v-model="productForm.productModelId" placeholder="请选择" clearable
                        @change="getProductModel" filterable>
                        <el-option v-for="item in modelOptions" :key="item.id" :label="item.model"
                           :value="item.id" />
                     </el-select>
                  </el-form-item>
               </el-col>
               <el-col :span="24">
                  <el-form-item label="料号:" prop="materialCode">
                     <el-input v-model="productForm.materialCode" placeholder="请输入" disabled />
                  </el-form-item>
               </el-col>
            </el-row>
@@ -324,7 +362,8 @@
               </el-col>
               <el-col :span="12">
                  <el-form-item label="税率(%):" prop="taxRate">
                     <el-select v-model="productForm.taxRate" placeholder="请选择" clearable @change="calculateFromTaxRate">
                     <el-select v-model="productForm.taxRate" placeholder="请选择" clearable
                        @change="calculateFromTaxRate">
                        <el-option label="1" value="1" />
                        <el-option label="6" value="6" />
                        <el-option label="13" value="13" />
@@ -335,28 +374,29 @@
            <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="含税单价(元):" prop="taxInclusiveUnitPrice">
                     <el-input-number :step="0.01" :min="0" v-model="productForm.taxInclusiveUnitPrice" style="width: 100%"
                                              :precision="2"
                                              placeholder="请输入" clearable @change="calculateFromUnitPrice" />
                     <el-input-number :step="0.01" :min="0" v-model="productForm.taxInclusiveUnitPrice"
                        style="width: 100%" :precision="2" placeholder="请输入" clearable
                        @change="calculateFromUnitPrice" />
                  </el-form-item>
               </el-col>
               <el-col :span="12">
                  <el-form-item label="数量:" prop="quantity">
                     <el-input-number  :step="0.1" :min="0" v-model="productForm.quantity" placeholder="请输入" clearable
                                                :precision="2"
                                                @change="calculateFromQuantity" style="width: 100%" />
                     <el-input-number :step="0.1" :min="0" v-model="productForm.quantity" placeholder="请输入"
                        clearable :precision="2" @change="calculateFromQuantity" style="width: 100%" />
                  </el-form-item>
               </el-col>
            </el-row>
            <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="含税总价(元):" prop="taxInclusiveTotalPrice">
                     <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="请输入" clearable @change="calculateFromTotalPrice" />
                     <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="请输入" clearable
                        @change="calculateFromTotalPrice" />
                  </el-form-item>
               </el-col>
               <el-col :span="12">
                  <el-form-item label="不含税总价(元):" prop="taxExclusiveTotalPrice">
                     <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="请输入" clearable @change="calculateFromExclusiveTotalPrice" />
                     <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="请输入" clearable
                        @change="calculateFromExclusiveTotalPrice" />
                  </el-form-item>
               </el-col>
            </el-row>
@@ -372,14 +412,30 @@
            </el-row>
         </el-form>
      </FormDialog>
      <!-- 导入弹窗 -->
      <FormDialog v-model="importUpload.open" :title="importUpload.title" :width="'600px'"
         @close="importUpload.open = false" @confirm="submitImportFile" @cancel="importUpload.open = false">
         <el-upload ref="importUploadRef" :limit="1" accept=".xlsx,.xls" :action="importUpload.url"
            :headers="importUpload.headers" :before-upload="importUpload.beforeUpload"
            :on-success="importUpload.onSuccess" :on-error="importUpload.onError"
            :on-progress="importUpload.onProgress" :on-change="importUpload.onChange" :auto-upload="false" drag>
            <i class="el-icon-upload"></i>
            <div class="el-upload__text">
               将文件拖到此处,或<em>点击上传</em>
            </div>
            <template #tip>
               <div class="el-upload__tip">
                  仅支持 xls/xlsx,大小不超过 10MB。
                  <el-button link type="primary" @click="downloadTemplate">下载导入模板</el-button>
               </div>
            </template>
         </el-upload>
      </FormDialog>
      <!-- 附件列表弹窗 -->
      <FileListDialog ref="fileListRef" v-model="fileListDialogVisible" title="附件列表" />
      <!-- 打印预览弹窗 -->
      <el-dialog
         v-model="printPreviewVisible"
         title="打印预览"
         width="90%"
         :close-on-click-modal="false"
         class="print-preview-dialog"
      >
      <el-dialog v-model="printPreviewVisible" title="打印预览" width="90%" :close-on-click-modal="false"
         class="print-preview-dialog">
         <div class="print-preview-container">
            <div class="print-preview-header">
               <el-button type="primary" @click="executePrint">执行打印</el-button>
@@ -389,122 +445,130 @@
               <div v-if="printData.length === 0" style="text-align: center; padding: 50px; color: #999;">
                  暂无打印数据
               </div>
               <div v-else style="text-align: center; padding: 10px; color: #666; font-size: 14px; background: #e8f4fd; margin-bottom: 10px;">
               <div v-else
                  style="text-align: center; padding: 10px; color: #666; font-size: 14px; background: #e8f4fd; margin-bottom: 10px;">
                  共 {{ printData.length }} 条数据待打印
               </div>
               <div v-for="(item, index) in printData" :key="index" class="print-page">
                  <div class="delivery-note">
                     <div class="header">
                        <div class="company-name">鼎诚瑞实业有限责任公司</div>
                        <div class="document-title">零售发货单</div>
                        <div class="company-name">湖南鹏创电子有限公司</div>
                        <div class="document-title">送货单</div>
                     </div>
                     <div class="info-section">
                        <div class="info-row">
                           <div>
                              <span class="label">发货日期:</span>
                              <span class="value">{{ formatDate(item.createTime) }}</span>
                              <span class="label">客户名称:</span>
                              <span class="value">{{ item.customerName }}</span>
                           </div>
                           <div>
                              <span class="label">发货车牌号:</span>
                              <span class="value">{{ item.shippingCarNumber }}</span>
                              <span class="label">送货地址:</span>
                              <span class="value">{{ item.companyAddress }}</span>
                           </div>
                        </div>
                        <div class="info-row">
                           <div>
                              <span class="label">客户名称:</span>
                              <span class="value">{{ item.customerName || '张爱有' }}</span>
                              <span class="label">单据编号:</span>
                              <span class="value">{{ item.salesContractNo }}</span>
                           </div>
                           <span class="label">单号:</span>
                           <span class="value">{{ item.salesContractNo }}</span>
                           <div>
                              <span class="label">送货日期:</span>
                              <span class="value">{{ formatDate(null) }}</span>
                           </div>
                           <div>
                              <span class="label">联系电话:</span>
                              <span class="value">{{ item.contactPhone }}</span>
                           </div>
                        </div>
                     </div>
                     <div class="info-section">
                        <div class="info-row">
                           <div>
                              <span class="label">联系方式:</span>
                              <span class="value"></span>
                           </div>
                           <div>
                              <span class="label">送货单位:</span>
                              <span class="value">湖南鹏创电子有限公司</span>
                           </div>
                           <div>
                              <span class="label">地址:</span>
                              <span class="value">湖南耒阳市创新创业园A1栋</span>
                           </div>
                        </div>
                     </div>
                     <span style="font-size: 16px;">货物详细信息:</span>
                     <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, index) in item.products" :key="product.id">
                                 <td>{{ index + 1 }}</td>
                                 <td>{{ product.materialCode || '' }}</td>
                                 <td>{{ `${product.productCategory || ''}/${product.specificationModel || ''}`
                                    }}</td>
                                 <td>{{ product.unit || '' }}</td>
                                 <td>{{ product.quantity || '0' }}</td>
                                 <td>{{ item.salesContractNo || '' }}</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="label">合计</td>
                                 <td class="total-value"></td>
                                 <td class="total-value"></td>
                                 <td class="total-value">{{ getTotalQuantity(item.products) }}</td>
                                 <td class="total-value"></td>
                              </tr>
                           </tfoot>
                        </table>
                     </div>
                     <div class="footer-section">
                        <div class="footer-row">
                           <div class="footer-item">
                              <span class="label">收货电话:</span>
                              <span class="value"></span>
                           </div>
                           <div class="footer-item">
                              <span class="label">收货人:</span>
                              <span class="value"></span>
                           </div>
                           <div class="footer-item address-item">
                              <span class="label">收货地址:</span>
                              <span class="value address-value"></span>
                           </div>
                        </div>
                        <div class="footer-row">
                           <div class="footer-item">
                              <span class="label">操作员:</span>
                              <span class="value">{{ userStore.nickName || '撕开前' }}</span>
                           </div>
                           <div class="footer-item">
                              <span class="label">打印日期:</span>
                              <span class="value">{{ formatDateTime(new Date()) }}</span>
                           </div>
                        <div style="width: 30px;">
                           共四联存根回单客户仓库
                        </div>
                     </div>
                     <el-descriptions :column="1">
                        <el-descriptions-item
                           label="备注:">贵公司在收货后请即刻核实数量及品质,若有异议,请在3日内提出,否则视为收妥。</el-descriptions-item>
                     </el-descriptions>
                     <el-descriptions :column="2">
                        <el-descriptions-item label="送货单位(签章):" />
                        <el-descriptions-item label="收货单位:" />
                        <el-descriptions-item label="送货人:" />
                        <el-descriptions-item label="收货人:" />
                     </el-descriptions>
                  </div>
               </div>
            </div>
         </div>
      </el-dialog>
      <!-- 发货弹框 -->
      <el-dialog
         v-model="deliveryFormVisible"
         title="发货信息"
      width="40%"
         @close="closeDeliveryDia"
      >
         <el-form :model="deliveryForm" label-width="120px" label-position="top" :rules="deliveryRules" ref="deliveryFormRef">
      <el-dialog v-model="deliveryFormVisible" title="发货信息" width="40%" @close="closeDeliveryDia">
         <el-form :model="deliveryForm" label-width="120px" label-position="top" :rules="deliveryRules"
            ref="deliveryFormRef">
            <el-row :gutter="30">
               <el-col :span="24">
                  <el-form-item label="发货类型:" prop="type">
                     <el-select
                        v-model="deliveryForm.type"
                        placeholder="请选择发货类型"
                        style="width: 100%"
                     >
                     <el-select v-model="deliveryForm.type" placeholder="请选择发货类型" style="width: 100%">
                        <el-option label="货车" value="货车" />
                        <el-option label="快递" value="快递" />
                     </el-select>
@@ -512,50 +576,36 @@
               </el-col>
            </el-row>
        <!-- 审批人选择(仿协同审批里的审批人节点选择) -->
        <el-row>
          <el-col :span="24">
            <el-form-item>
              <template #label>
                <span>审批人选择:</span>
                <el-button type="primary" @click="addApproverNode" style="margin-left: 8px;">新增节点</el-button>
              </template>
              <div style="display: flex; align-items: flex-end; flex-wrap: wrap;">
                <div
                  v-for="(node, index) in approverNodes"
                  :key="node.id"
                  style="margin-right: 20px; text-align: center; margin-bottom: 10px;"
                >
                  <div>
                    <span>审批人</span>
                    →
                  </div>
                  <el-select
                    v-model="node.userId"
                    placeholder="选择人员"
                    filterable
                    style="width: 140px; margin-bottom: 8px;"
                  >
                    <el-option
                      v-for="user in userList"
                      :key="user.userId"
                      :label="user.nickName"
                      :value="user.userId"
                    />
                  </el-select>
                  <div>
                    <el-button
                      type="danger"
                      size="small"
                      @click="removeApproverNode(index)"
                      v-if="approverNodes.length > 1"
                    >删除</el-button>
                  </div>
                </div>
              </div>
            </el-form-item>
          </el-col>
        </el-row>
            <!-- 审批人选择(仿协同审批里的审批人节点选择) -->
            <el-row>
               <el-col :span="24">
                  <el-form-item>
                     <template #label>
                        <span>审批人选择:</span>
                        <el-button type="primary" @click="addApproverNode"
                           style="margin-left: 8px;">新增节点</el-button>
                     </template>
                     <div style="display: flex; align-items: flex-end; flex-wrap: wrap;">
                        <div v-for="(node, index) in approverNodes" :key="node.id"
                           style="margin-right: 20px; text-align: center; margin-bottom: 10px;">
                           <div>
                              <span>审批人</span>
                              →
                           </div>
                           <el-select v-model="node.userId" placeholder="选择人员" filterable
                              style="width: 140px; margin-bottom: 8px;">
                              <el-option v-for="user in userList" :key="user.userId" :label="user.nickName"
                                 :value="user.userId" />
                           </el-select>
                           <div>
                              <el-button type="danger" size="small" @click="removeApproverNode(index)"
                                 v-if="approverNodes.length > 1">删除</el-button>
                           </div>
                        </div>
                     </div>
                  </el-form-item>
               </el-col>
            </el-row>
         </el-form>
         <template #footer>
            <div class="dialog-footer">
@@ -570,7 +620,7 @@
<script setup>
import { getToken } from "@/utils/auth";
import pagination from "@/components/PIMTable/Pagination.vue";
import {onMounted, ref, getCurrentInstance} from "vue";
import { onMounted, ref, getCurrentInstance } from "vue";
import { addShippingInfo } from "@/api/salesManagement/deliveryLedger.js";
import { ElMessageBox, ElMessage } from "element-plus";
import { UploadFilled, Download } from "@element-plus/icons-vue";
@@ -630,6 +680,8 @@
      customerId: "",
      entryPerson: "",
      entryDate: "",
      deliveryDate: "",
      produce: false,
      maintenanceTime: "",
      productData: [],
      executionDate: "",
@@ -639,6 +691,7 @@
      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" }],
   },
});
@@ -652,6 +705,7 @@
   productForm: {
      productCategory: "",
      specificationModel: "",
      materialCode: "",
      unit: "",
      quantity: "",
      taxInclusiveUnitPrice: "",
@@ -702,20 +756,26 @@
   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" }
    ]
  },
   deliveryForm: {
      type: "货车", // 货车, 快递
   },
   deliveryRules: {
      type: [
         { required: true, message: "请选择发货类型", trigger: "change" }
      ]
   },
});
const { deliveryForm, deliveryRules } = toRefs(deliveryFormData);
@@ -723,10 +783,10 @@
const approverNodes = ref([{ id: 1, userId: null }]);
let nextApproverId = 2;
const addApproverNode = () => {
  approverNodes.value.push({ id: nextApproverId++, userId: null });
   approverNodes.value.push({ id: nextApproverId++, userId: null });
};
const removeApproverNode = (index) => {
  approverNodes.value.splice(index, 1);
   approverNodes.value.splice(index, 1);
};
// 导入相关
@@ -811,7 +871,7 @@
   const params = { ...rest, ...page };
   // 移除录入日期的默认值设置,只保留范围日期字段
   delete params.entryDate;
   ledgerListPage(params)
   return ledgerListPage(params)
      .then((res) => {
         tableLoading.value = false;
         tableData.value = res.records;
@@ -819,6 +879,7 @@
            item.children = [];
         });
         total.value = res.total;
         return res;
      })
      .catch(() => {
         tableLoading.value = false;
@@ -847,9 +908,11 @@
   if (index !== -1) {
      productForm.value.specificationModel = modelOptions.value[index].model;
      productForm.value.unit = modelOptions.value[index].unit;
      productForm.value.materialCode = modelOptions.value[index].materialCode;
   } else {
      productForm.value.specificationModel = null;
      productForm.value.unit = null;
      productForm.value.materialCode = null;
   }
};
const findNodeById = (nodes, productId) => {
@@ -876,7 +939,7 @@
      if (children && children.length > 0) {
         newItem.children = convertIdToValue(children);
      }
      return newItem;
   });
}
@@ -922,6 +985,23 @@
      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, [
@@ -955,6 +1035,8 @@
      form.value.entryDate = getCurrentDate();
      // 签订日期默认为当天
      form.value.executionDate = getCurrentDate();
      // 是否生产默认为否
      form.value.produce = false;
   } else {
      currentId.value = row.id;
      getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
@@ -978,6 +1060,8 @@
const openQuotationDialog = async () => {
   if (operationType.value === "view") return;
   quotationDialogVisible.value = true;
   // 打开弹窗时重置分页到第一页
   quotationPage.current = 1;
   // 先确保客户列表已加载,便于后续回填 customerId
   if (!customerOption.value || customerOption.value.length === 0) {
      try {
@@ -994,14 +1078,15 @@
   quotationLoading.value = true;
   try {
      const params = {
         // 兼容后端分页字段:这里沿用报价页面已有可用的字段命名
         currentPage: 1,
         pageSize: 100,
         // 后端分页字段:current / 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;
   }
@@ -1010,26 +1095,38 @@
const resetQuotationSearch = async () => {
   quotationSearchForm.quotationNo = "";
   quotationSearchForm.customer = "";
   quotationPage.current = 1;
   await fetchQuotationList();
};
// 报价单弹框分页切换
const quotationPaginationChange = (obj) => {
   quotationPage.current = obj.page;
   quotationPage.size = obj.limit;
   fetchQuotationList();
};
// 选中报价单后回填到台账表单
const applyQuotation = (row) => {
   if (!row) return;
   selectedQuotation.value = row;
   // 业务员
   form.value.salesman = row.salesperson || "";
   form.value.salesman = (row.salesperson || "").trim();
   // 客户名称 -> customerId
   const customer = (customerOption.value || []).find((c) => c.customerName === row.customer);
   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 || "";
   }
   // 产品信息映射:报价 products -> 台账 productData
   const products = Array.isArray(row.products) ? row.products : [];
   productData.value = products.map((p) => {
@@ -1051,7 +1148,7 @@
         invoiceType: "增普票",
      };
   });
   quotationDialogVisible.value = false;
};
function changs(val) {
@@ -1127,6 +1224,12 @@
const productIndex = ref(0);
// 打开产品弹框
const openProductForm = async (type, row, index) => {
   // 编辑时检查产品是否已发货或审核通过
   if (type === "edit" && isProductShipped(row)) {
      proxy.$modal.msgWarning("已发货或审核通过的产品不能编辑");
      return;
   }
   productOperationType.value = type;
   productForm.value = {};
   proxy.resetForm("productFormRef");
@@ -1154,6 +1257,8 @@
         // 加载失败时保持可编辑,不中断弹窗
         console.error("加载产品规格型号失败", e);
      }
   } else {
      getProductOptions()
   }
   productFormVisible.value = true;
};
@@ -1164,9 +1269,9 @@
         if (operationType.value === "edit") {
            submitProductEdit();
         } else {
            if(productOperationType.value === "add"){
            if (productOperationType.value === "add") {
               productData.value.push({ ...productForm.value });
            }else{
            } else {
               productData.value[productIndex.value] = { ...productForm.value }
            }
            closeProductDia();
@@ -1191,6 +1296,14 @@
      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(
@@ -1265,15 +1378,55 @@
         proxy.$modal.msg("已取消");
      });
};
/** 判断单个产品是否已发货(根据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 status === "已进行发货" || status === "发货完成" || status === "已发货";
   });
};
// 删除
const handleDelete = () => {
   let ids = [];
   if (selectedRows.value.length > 0) {
      ids = selectedRows.value.map((item) => item.id);
   } else {
const handleDelete = async () => {
   if (selectedRows.value.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 (cannotDeleteNames.length > 0) {
      proxy.$modal.msgWarning("已进行发货或发货完成的销售订单不能删除:" + cannotDeleteNames.join("、"));
      return;
   }
   ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "导出", {
      confirmButtonText: "确认",
      cancelButtonText: "取消",
@@ -1296,25 +1449,25 @@
      proxy.$modal.msgWarning("请选择要打印的数据");
      return;
   }
   // 显示加载状态
   proxy.$modal.loading("正在获取产品数据,请稍候...");
   try {
      // 为每个选中的销售台账记录查询对应的产品数据
      const printDataWithProducts = [];
      for (const row of selectedRows.value) {
         try {
            // 调用productList接口查询产品数据
            const productRes = await productList({ salesLedgerId: row.id, type: 1 });
            // 将产品数据整合到销售台账记录中
            const rowWithProducts = {
               ...row,
               products: productRes.data || []
            };
            printDataWithProducts.push(rowWithProducts);
         } catch (error) {
            console.error(`获取销售台账 ${row.id} 的产品数据失败:`, error);
@@ -1325,11 +1478,11 @@
            });
         }
      }
      printData.value = printDataWithProducts;
      console.log('打印数据(包含产品):', printData.value);
      printPreviewVisible.value = true;
   } catch (error) {
      console.error('获取产品数据失败:', error);
      proxy.$modal.msgError("获取产品数据失败,请重试");
@@ -1341,10 +1494,10 @@
const executePrint = () => {
   console.log('开始执行打印,数据条数:', printData.value.length);
   console.log('打印数据:', printData.value);
   // 创建一个新的打印窗口
   const printWindow = window.open('', '_blank', 'width=800,height=600');
   // 构建打印内容
   let printContent = `
    <!DOCTYPE html>
@@ -1405,7 +1558,7 @@
        }
        .label {
          font-weight: bold;
          width: 60px;
          min-width: 60px;
          font-size: 12px;
        }
        .value {
@@ -1413,10 +1566,11 @@
          min-width: 80px;
          font-size: 12px;
        }
                 .table-section {
                 margin-bottom: 40px;
          //  flex: 0.6;
         }
        .table-section {
          margin-bottom: 4px;
          flex: 1;
          display: flex;
        }
        .product-table {
          width: 100%;
          border-collapse: collapse;
@@ -1444,13 +1598,66 @@
          line-height: 22px;
          justify-content: space-between;
        }
        .remarks-section {
          margin: 10px 0;
          .remark-item {
            display: flex;
            align-items: flex-start;
            .label {
              font-weight: bold;
              min-width: 30px;
              font-size: 14px;
              margin-right: 10px;
              white-space: nowrap;
            }
            .value {
              flex: 1;
              font-size: 14px;
              line-height: 1.4;
            }
          }
        }
        .sign-section {
          margin-top: 15px;
          .sign-row {
            display: flex;
            justify-content: space-between;
            margin-bottom: 10px;
            .sign-item {
              display: flex;
              align-items: center;
              width: 48%;
              .label {
                font-weight: bold;
                font-size: 14px;
                margin-right: 10px;
                white-space: nowrap;
              }
              .value {
                flex: 1;
                min-height: 30px;
                border-bottom: 1px solid #000;
                font-size: 14px;
              }
            }
          }
        }
        .footer-item {
          display: flex;
          margin-right: 20px;
        }
        .footer-item .label {
          font-weight: bold;
          width: 80px;
          min-width: 80px;
          font-size: 12px;
        }
        .footer-item .value {
@@ -1480,114 +1687,146 @@
    </head>
    <body>
  `;
   // 为每条数据生成打印页面
   printData.value.forEach((item, index) => {
      printContent += `
      <div class="print-page">
        <div class="delivery-note">
          <div class="header">
            <div class="company-name">鼎诚瑞实业有限责任公司</div>
            <div class="document-title">零售发货单</div>
              <div class="company-name">湖南鹏创电子有限公司</div>
              <div class="document-title">送货单</div>
          </div>
          <div class="info-section">
            <div class="info-row">
              <div>
                <span class="label">发货日期:</span>
                <span class="value">${formatDate(item.createTime)}</span>
              <div class="info-row">
                <div>
                  <span class="label">客户名称:</span>
                  <span class="value">${item.customerName || ''}</span>
                </div>
                <div>
                  <span class="label">送货地址:</span>
                  <span class="value">${item.companyAddress || ''}</span>
                </div>
              </div>
              <div>
                <span class="label">客户名称:</span>
                <span class="value">${item.customerName || '张爱有'}</span>
              </div>
            </div>
            <div class="info-row">
              <span class="label">单号:</span>
              <span class="value">${item.salesContractNo || ''}</span>
            </div>
          </div>
              <div class="info-row">
                <div>
                  <span class="label">单据编号:</span>
                  <span class="value">${item.salesContractNo || ''}</span>
                </div>
                <div>
                  <span class="label">送货日期:</span>
                  <span class="value">${formatDate(null)}</span>
                </div>
                <div>
                  <span class="label">联系电话:</span>
                  <span class="value">${item.contactPhone || ''}</span>
                </div>
              </div>
            </div>
          <div class="info-section">
              <div class="info-row">
                <div>
                  <span class="label">联系方式:</span>
                  <span class="value"></span>
                </div>
                <div>
                  <span class="label">送货单位:</span>
                  <span class="value">湖南鹏创电子有限公司</span>
                </div>
                <div>
                  <span class="label">地址:</span>
                  <span class="value">湖南耒阳市创新创业园A1栋</span>
                </div>
              </div>
            </div>
          <span style="font-size: 16px;">货物详细信息:</span>
          <div class="table-section">
            <table class="product-table">
              <thead>
                <tr>
                  <th>产品名称</th>
                  <th>规格型号</th>
                  <th>序号</th>
                  <th>料号</th>
                  <th>品名/规格</th>
                  <th>单位</th>
                  <th>单价</th>
                  <th>零售数量</th>
                  <th>零售金额</th>
                  <th>数量</th>
                  <th>订单号</th>
                </tr>
              </thead>
              <tbody>
                  <tbody>
                ${item.products && item.products.length > 0 ?
         item.products.map(product => `
            item.products.map((product, index) => `
                    <tr>
                      <td>${product.productCategory || ''}</td>
                      <td>${product.specificationModel || ''}</td>
                      <td>${index + 1}</td>
                      <td>${product.materialCode || ''}</td>
                      <td>${product.productCategory || ''}/${product.specificationModel || ''}</td>
                      <td>${product.unit || ''}</td>
                      <td>${product.taxInclusiveUnitPrice || '0'}</td>
                      <td>${product.quantity || '0'}</td>
                      <td>${product.taxInclusiveTotalPrice || '0'}</td>
                      <td>${item.salesContractNo || ''}</td>
                    </tr>
                  `).join('') :
         '<tr><td colspan="6" style="text-align: center; color: #999;">暂无产品数据</td></tr>'
      }
            '<tr><td colspan="6" style="text-align: center; color: #999;">暂无产品数据</td></tr>'
         }
              </tbody>
              <tfoot>
                <tr>
                  <td></td>
                  <td class="label">合计</td>
                  <td class="total-value"></td>
                  <td class="total-value"></td>
                  <td class="total-value">${getTotalQuantity(item.products) || '0'}</td>
                  <td class="total-value"></td>
                  <td class="total-value">${getTotalQuantityForPrint(item.products)}</td>
                  <td class="total-value">${getTotalAmountForPrint(item.products)}</td>
                </tr>
              </tfoot>
            </table>
            <div style="width: 30px;">
              共四联存根回单客户仓库
            </div>
          </div>
          <div class="footer-section">
            <div class="footer-row">
              <div class="footer-item">
                <span class="label">收货电话:</span>
                <span class="value"></span>
          <div class="remarks-section">
            <div class="remark-item">
              <span class="label">备注:</span>
              <span class="value">贵公司在收货后请即刻核实数量及品质,若有异议,请在3日内提出,否则视为收妥。</span>
            </div>
          </div>
          <div class="sign-section">
            <div class="sign-row">
              <div class="sign-item">
                <span class="label">送货单位(签章):</span>
              </div>
              <div class="footer-item">
                <span class="label">收货人:</span>
                <span class="value"></span>
              </div>
              <div class="footer-item address-item">
                <span class="label">收货地址:</span>
                <span class="value address-value"></span>
              <div class="sign-item">
                <span class="label">收货单位:</span>
              </div>
            </div>
            <div class="footer-row">
              <div class="footer-item">
                <span class="label">操作员:</span>
                <span class="value">${userStore.nickName || '撕开前'}</span>
            <div class="sign-row">
              <div class="sign-item">
                <span class="label">送货人:</span>
              </div>
              <div class="footer-item">
                <span class="label">打印日期:</span>
                <span class="value">${formatDateTime(new Date())}</span>
              <div class="sign-item">
                <span class="label">收货人:</span>
              </div>
            </div>
          </div>
        </div>
      </div>
    `;
   });
   printContent += `
    </body>
    </html>
  `;
   // 写入内容到新窗口
   printWindow.document.write(printContent);
   printWindow.document.close();
   // 等待内容加载完成后打印
   printWindow.onload = () => {
      setTimeout(() => {
@@ -1599,13 +1838,14 @@
};
// 格式化日期
const formatDate = (dateString) => {
   if (!dateString) return getCurrentDate();
   if (!dateString) return getCurrentDate().replace(/-/g, '/');
   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();
@@ -1678,19 +1918,19 @@
// 根据含税总价计算含税单价和数量
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 =
@@ -1699,7 +1939,7 @@
            productForm.value.taxRate
         );
   }
   isCalculating.value = false;
};
@@ -1710,25 +1950,25 @@
      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;
};
@@ -1739,19 +1979,19 @@
      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 =
@@ -1760,7 +2000,7 @@
            productForm.value.taxRate
         );
   }
   isCalculating.value = false;
};
@@ -1771,19 +2011,19 @@
      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 =
@@ -1792,7 +2032,7 @@
            productForm.value.taxRate
         );
   }
   isCalculating.value = false;
};
@@ -1803,25 +2043,111 @@
      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] || '待发货';
};
/**
 * 获取发货状态标签类型(颜色)
 * @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) => {
   // 产品状态必须是充足(approveStatus === 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 === '审核拒绝';
};
/**
 * 下载文件
 *
@@ -1833,54 +2159,80 @@
   getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
      if (fileListRef.value) {
         fileListRef.value.open(res.salesLedgerFiles)
         fileListDialogVisible.value = true
      }
   });
}
// 打开发货弹框
const openDeliveryForm = (row) => {
   // 检查是否可以发货
   if (!canShip(row)) {
      proxy.$modal.msgWarning("只有在产品状态是充足,发货状态是待发货或审核拒绝的时候才可以发货");
      return;
   }
   currentDeliveryRow.value = row;
  deliveryForm.value = {
    type: "货车",
  };
  // 重置审批人节点(默认一个空节点)
  approverNodes.value = [{ id: 1, userId: null }];
  nextApproverId = 2;
   deliveryForm.value = {
      type: "货车",
   };
   // 重置审批人节点(默认一个空节点)
   approverNodes.value = [{ id: 1, userId: null }];
   nextApproverId = 2;
   deliveryFormVisible.value = true;
};
// 提交发货表单
const submitDelivery = () => {
  proxy.$refs["deliveryFormRef"].validate((valid) => {
    if (valid) {
      // 审批人必填校验(所有节点都要选人)
      const hasEmptyApprover = approverNodes.value.some(node => !node.userId);
      if (hasEmptyApprover) {
        proxy.$modal.msgError("请为所有审批节点选择审批人!");
        return;
      }
      const approveUserIds = approverNodes.value.map(node => node.userId).join(",");
      addShippingInfo({
        salesLedgerId: currentDeliveryRow.value.salesLedgerId,
        salesLedgerProductId: currentDeliveryRow.value.id,
        type: deliveryForm.value.type,
   proxy.$refs["deliveryFormRef"].validate((valid) => {
      if (valid) {
         // 审批人必填校验(所有节点都要选人)
         const hasEmptyApprover = approverNodes.value.some(node => !node.userId);
         if (hasEmptyApprover) {
            proxy.$modal.msgError("请为所有审批节点选择审批人!");
            return;
         }
         const approveUserIds = approverNodes.value.map(node => node.userId).join(",");
         // 保存当前展开的行ID,以便发货后重新加载子表格数据
         const currentExpandedKeys = [...expandedRowKeys.value];
         const salesLedgerId = currentDeliveryRow.value.salesLedgerId;
         addShippingInfo({
            salesLedgerId: salesLedgerId,
            salesLedgerProductId: currentDeliveryRow.value.id,
            type: deliveryForm.value.type,
            approveUserIds,
      })
        .then(() => {
          proxy.$modal.msgSuccess("发货成功");
          closeDeliveryDia();
          getList();
        })
    }
  });
         })
            .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);
                           if (index > -1) {
                              tableData.value[index].children = res.data;
                           }
                        });
                     });
                     Promise.all(loadPromises).then(() => {
                        // 恢复展开状态
                        expandedRowKeys.value = currentExpandedKeys;
                     });
                  }
               });
            })
      }
   });
};
// 关闭发货弹框
const closeDeliveryDia = () => {
  proxy.resetForm("deliveryFormRef");
  deliveryFormVisible.value = false;
  currentDeliveryRow.value = null;
   proxy.resetForm("deliveryFormRef");
   deliveryFormVisible.value = false;
   currentDeliveryRow.value = null;
};
const currentFactoryName = ref("");
const getCurrentFactoryName = async () => {
@@ -1901,6 +2253,22 @@
   margin-left: 10px;
}
::v-deep .yellow {
   background-color: #FAF0DE;
}
::v-deep .pink {
   background-color: #FAE1DE;
}
::v-deep .red {
   background-color: #FAE1DE;
}
::v-deep .purple {
   background-color: #F4DEFA;
}
.table_list {
   margin-top: unset;
}
@@ -1910,6 +2278,7 @@
   justify-content: space-between;
   margin-bottom: 10px;
}
.print-preview-dialog {
   .el-dialog__body {
      padding: 0;
@@ -1923,12 +2292,12 @@
      padding: 15px;
      border-bottom: 1px solid #e4e7ed;
      text-align: center;
      .el-button {
         margin: 0 10px;
      }
   }
   .print-preview-content {
      padding: 20px;
      background-color: #f5f5f5;
@@ -1938,7 +2307,7 @@
.print-page {
   width: 220mm;
   height: 90mm;
   min-height: 90mm;
   padding: 10mm;
   margin: 0 auto;
   background: white;
@@ -1960,13 +2329,13 @@
.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;
@@ -1978,16 +2347,16 @@
   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;
@@ -1999,29 +2368,31 @@
.table-section {
   margin-bottom: 4px;
   flex: 1;
   display: flex;
   .product-table {
      width: 100%;
      border-collapse: collapse;
      border: 1px solid #000;
      th, td {
      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;
      }
@@ -2033,23 +2404,25 @@
      display: flex;
      margin-bottom: 3px;
      line-height: 20px;
      justify-content: space-between;
      justify-content: flex-start;
      .footer-item {
         display: flex;
         align-items: center;
         margin-right: 20px;
         .label {
            font-weight: bold;
            width: 80px;
            white-space: nowrap;
            margin-right: 10px;
            font-size: 14px;
         }
         .value {
            min-width: 80px;
            min-width: 300px;
            font-size: 14px;
         }
         &.address-item {
            .address-value {
               min-width: 200px;
@@ -2063,7 +2436,7 @@
   .app-container {
      display: none;
   }
   .print-page {
      box-shadow: none;
      margin: 0;
@@ -2072,6 +2445,7 @@
      page-break-inside: avoid;
      page-break-after: always;
   }
   .print-page:last-child {
      page-break-after: avoid;
   }