huminmin
2 天以前 a1eff60449d20fb54bfdf04690cfa23b3d8e7812
src/views/salesManagement/salesLedger/index.vue
@@ -1,151 +1,174 @@
<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.salesContractNo" 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="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%"
                        :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 21em)">
            <el-table-column align="center" type="selection" width="55" />
            <el-table-column type="expand">
               <template #default="props">
                  <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
                     <el-table-column align="center" label="序号" type="index" width="60" />
                     <el-table-column label="产品大类" prop="productCategory" />
                     <el-table-column label="规格型号" prop="specificationModel" />
                     <el-table-column label="单位" prop="unit" />
                     <el-table-column label="数量" prop="quantity" />
                     <el-table-column label="税率(%)" prop="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" />
  <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" 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="产品状态"
                                              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>
                </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>
                  </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>
                     <el-table-column Width="60px"
                                              label="操作"
                                              align="center">
                        <template #default="scope">
                           <el-button
                                           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" show-overflow-tooltip />
            <el-table-column label="客户名称" prop="customerName" show-overflow-tooltip />
            <el-table-column label="业务员" prop="salesman" width="100" 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="executionDate" width="120" show-overflow-tooltip />
            <el-table-column label="录入日期" prop="entryDate" width="120" show-overflow-tooltip />
            <el-table-column fixed="right" label="操作" width="120" 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="downLoadFile(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 !== 'view'">
               <el-col :span="24" style="display:flex; justify-content:flex-end; gap:10px; margin-bottom: 6px;">
                  <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"
                                     filterable
                                     :reserve-keyword="false" 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'" filterable>
                        <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>
                  </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="scope.row.approveStatus !== 1 || !!scope.row.shippingDate || !!scope.row.shippingCarNumber"
                    @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>
    <FormDialog v-model="dialogFormVisible" :title="operationType === 'add' ? '新增销售台账页面' : '编辑销售台账页面'" :width="'70%'"
      :operation-type="operationType" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="销售合同号:" prop="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>
               <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"
@@ -222,7 +245,7 @@
            </el-row>
         </el-form>
      </FormDialog>
      <!-- 从报价单导入(仅审批通过) -->
      <el-dialog
         v-model="quotationDialogVisible"
@@ -363,6 +386,12 @@
            </el-row>
         </el-form>
      </FormDialog>
      <!-- 附件列表弹窗 -->
      <FileListDialog
         ref="fileListRef"
         v-model="fileListDialogVisible"
         title="附件列表"
      />
      <!-- 打印预览弹窗 -->
      <el-dialog
         v-model="printPreviewVisible"
@@ -802,7 +831,7 @@
   const params = { ...rest, ...page };
   // 移除录入日期的默认值设置,只保留范围日期字段
   delete params.entryDate;
   ledgerListPage(params)
   return ledgerListPage(params)
      .then((res) => {
         tableLoading.value = false;
         tableData.value = res.records;
@@ -810,6 +839,7 @@
            item.children = [];
         });
         total.value = res.total;
         return res;
      })
      .catch(() => {
         tableLoading.value = false;
@@ -1824,13 +1854,21 @@
   getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
      if (fileListRef.value) {
         fileListRef.value.open(res.salesLedgerFiles)
         fileListDialogVisible.value = true
      }
   });
}
// 打开发货弹框
const openDeliveryForm = (row) => {
   // 校验:只有产品状态为充足且未发货时才能发货
   if (row.approveStatus !== 1) {
      proxy.$modal.msgWarning("产品状态不足,无法发货");
      return;
   }
   if (row.shippingDate || row.shippingCarNumber) {
      proxy.$modal.msgWarning("该产品已发货,无法重复发货");
      return;
   }
   currentDeliveryRow.value = row;
  deliveryForm.value = {
    type: "货车",
@@ -1852,8 +1890,11 @@
        return;
      }
      const approveUserIds = approverNodes.value.map(node => node.userId).join(",");
      // 保存当前展开的行ID,以便发货后重新加载子表格数据
      const currentExpandedKeys = [...expandedRowKeys.value];
      const salesLedgerId = currentDeliveryRow.value.salesLedgerId;
      addShippingInfo({
        salesLedgerId: currentDeliveryRow.value.salesLedgerId,
        salesLedgerId: salesLedgerId,
        salesLedgerProductId: currentDeliveryRow.value.id,
        type: deliveryForm.value.type,
            approveUserIds,
@@ -1861,7 +1902,25 @@
        .then(() => {
          proxy.$modal.msgSuccess("发货成功");
          closeDeliveryDia();
          getList();
          // 刷新主表数据
          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;
              });
            }
          });
        })
    }
  });