huminmin
11 小时以前 baf3c33766ccec31c172b7d81d96a6d32dfac8cc
src/views/salesManagement/salesLedger/index.vue
@@ -6,10 +6,6 @@
          <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" />
@@ -34,13 +30,14 @@
          <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" show-summary style="width: 100%"
        :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">
@@ -53,35 +50,41 @@
                     <el-table-column label="产品状态"
                                              width="100px"
                                              align="center">
                        <template #default="scope">
                <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="shippingStatus" width="140" align="center" show-overflow-tooltip />
                     <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>
                    <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>
                <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>
                  </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" />
@@ -93,8 +96,8 @@
                  <el-button 
                    link 
                    type="primary" 
                    size="small"
                    :disabled="scope.row.approveStatus !== 1 || !!scope.row.shippingDate || !!scope.row.shippingCarNumber"
                    size="small"
                    :disabled="!canShip(scope.row)"
                    @click="openDeliveryForm(scope.row)">
                    发货
                  </el-button>
@@ -105,7 +108,6 @@
        </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 />
@@ -115,9 +117,11 @@
        <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)">编辑</el-button>
            <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>-->
@@ -130,6 +134,14 @@
    <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">
@@ -147,11 +159,6 @@
        </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">
@@ -162,17 +169,22 @@
              </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="projectName">
              <el-input v-model="form.projectName" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
               <el-col :span="12">
                  <el-form-item label="签订日期:" prop="executionDate">
                     <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD"
                                             format="YYYY-MM-DD" type="date" placeholder="请选择" clearable :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>
@@ -194,7 +206,14 @@
                  </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-row>
            <el-row>
               <el-form-item label="产品信息:" prop="entryDate">
                  <el-button v-if="operationType !== 'view'" type="primary" @click="openProductForm('add')">添加</el-button>
@@ -203,7 +222,8 @@
            </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'" />
               <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" />
@@ -215,20 +235,22 @@
               <el-table-column label="不含税总价(元)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
               <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-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">
@@ -296,6 +318,15 @@
               </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>
@@ -386,6 +417,41 @@
            </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"
@@ -415,51 +481,77 @@
               <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>
                           </div>
                           <div>
                              <span class="label">发货车牌号:</span>
                              <span class="value">{{ item.shippingCarNumber }}</span>
                           </div>
                  <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 class="info-row">
                           <div>
                              <span class="label">客户名称:</span>
                              <span class="value">{{ item.customerName || '张爱有' }}</span>
                           </div>
                           <span class="label">单号:</span>
                           <span class="value">{{ item.salesContractNo }}</span>
                  <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>
                           <tr v-for="product in item.products" :key="product.id">
                              <td>{{ product.productCategory || '' }}</td>
                              <td>{{ product.specificationModel || '' }}</td>
                           <tr v-for="(product, index) in item.products" :key="product.id">
                              <td>{{ index + 1 }}</td>
                              <td>{{ product.productNo || '' }}</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>
                           <tr v-if="!item.products || item.products.length === 0">
                              <td colspan="6" style="text-align: center; color: #999;">暂无产品数据</td>
@@ -467,43 +559,30 @@
                           </tbody>
                           <tfoot>
                           <tr>
                              <td class="label"></td>
                              <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>
                              <td class="total-value"></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>
                           <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>
                     </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>
@@ -650,6 +729,7 @@
      customerId: "",
      entryPerson: "",
      entryDate: "",
    deliveryDate: "",
      maintenanceTime: "",
      productData: [],
      executionDate: "",
@@ -659,6 +739,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" }],
   },
});
@@ -721,6 +802,12 @@
const quotationSearchForm = reactive({
   quotationNo: "",
   customer: "",
});
// 报价单弹框分页
const quotationPage = reactive({
   current: 1,
   size: 10,
   total: 0,
});
const selectedQuotation = ref(null);
@@ -943,6 +1030,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, [
@@ -999,6 +1103,8 @@
const openQuotationDialog = async () => {
   if (operationType.value === "view") return;
   quotationDialogVisible.value = true;
   // 打开弹窗时重置分页到第一页
   quotationPage.current = 1;
   // 先确保客户列表已加载,便于后续回填 customerId
   if (!customerOption.value || customerOption.value.length === 0) {
      try {
@@ -1015,14 +1121,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;
   }
@@ -1031,7 +1138,15 @@
const resetQuotationSearch = async () => {
   quotationSearchForm.quotationNo = "";
   quotationSearchForm.customer = "";
   quotationPage.current = 1;
   await fetchQuotationList();
};
// 报价单弹框分页切换
const quotationPaginationChange = (obj) => {
   quotationPage.current = obj.page;
   quotationPage.size = obj.limit;
   fetchQuotationList();
};
// 选中报价单后回填到台账表单
@@ -1040,10 +1155,14 @@
   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 {
@@ -1148,6 +1267,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");
@@ -1175,6 +1300,8 @@
         // 加载失败时保持可编辑,不中断弹窗
         console.error("加载产品规格型号失败", e);
      }
   } else {
      getProductOptions()
   }
   productFormVisible.value = true;
};
@@ -1212,6 +1339,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(
@@ -1286,15 +1421,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: "取消",
@@ -1426,7 +1601,7 @@
        }
        .label {
          font-weight: bold;
          width: 60px;
          min-width: 60px;
          font-size: 12px;
        }
        .value {
@@ -1471,7 +1646,7 @@
        }
        .footer-item .label {
          font-weight: bold;
          width: 80px;
          min-width: 80px;
          font-size: 12px;
        }
        .footer-item .value {
@@ -1508,7 +1683,7 @@
      <div class="print-page">
        <div class="delivery-note">
          <div class="header">
            <div class="company-name">鼎诚瑞实业有限责任公司</div>
            <div class="company-name">湖南鹏创电子有限公司</div>
            <div class="document-title">零售发货单</div>
          </div>
          
@@ -1620,13 +1795,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();
@@ -1844,6 +2020,92 @@
   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 === '审核拒绝';
};
/**
 * 下载文件
 *
 * @param row 下载文件的相关信息对象
@@ -1860,15 +2122,12 @@
// 打开发货弹框
const openDeliveryForm = (row) => {
   // 校验:只有产品状态为充足且未发货时才能发货
   if (row.approveStatus !== 1) {
      proxy.$modal.msgWarning("产品状态不足,无法发货");
   // 检查是否可以发货
   if (!canShip(row)) {
      proxy.$modal.msgWarning("只有在产品状态是充足,发货状态是待发货或审核拒绝的时候才可以发货");
      return;
   }
   if (row.shippingDate || row.shippingCarNumber) {
      proxy.$modal.msgWarning("该产品已发货,无法重复发货");
      return;
   }
   currentDeliveryRow.value = row;
  deliveryForm.value = {
    type: "货车",
@@ -1951,6 +2210,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;
}
@@ -1988,7 +2263,7 @@
.print-page {
   width: 220mm;
   height: 90mm;
   min-height: 90mm;
   padding: 10mm;
   margin: 0 auto;
   background: white;
@@ -2049,6 +2324,7 @@
.table-section {
   margin-bottom: 4px;
   flex: 1;
  display: flex;
   
   .product-table {
      width: 100%;
@@ -2083,20 +2359,22 @@
      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;
         }