chenhj
7 小时以前 ed94f308b3fb345eb7238b8836a61d0b8bbaa98c
feat(salesLedger): 添加批号字段和销售出库单打印功能

- 在销售台账表格中新增批号列显示
- 添加销售出库单打印按钮及导出功能
- 新增批号选择下拉框表单项并设置必填验证
- 集成生产订单批号选项数据接口
- 完善响应拦截器支持blob类型文件下载
- 添加构建打包命令说明文档
已修改5个文件
112 ■■■■■ 文件已修改
README.md 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/productionManagement/productionOrder.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/salesManagement/salesLedger.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md
@@ -31,6 +31,9 @@
# 启动服务
yarn dev
#打包命令
yarn build:prod -- --company="JCCK"
# 构建测试环境 yarn build:stage
# 构建生产环境 yarn build:prod
# 构建生产环境 yarn build:prod -- --company="AAA"
src/api/productionManagement/productionOrder.js
@@ -145,4 +145,11 @@
    method: "patch",
    data: data,
  });
}
export function getProductOrderBatchNoOptions() {
  return request({
    url: "/productOrder/getProductOrderBatchNo",
    method: "get",
  });
}
src/api/salesManagement/salesLedger.js
@@ -116,4 +116,14 @@
        method: "get",
        params: query,
    });
}
// 导出
export function saleOutboundExport(query) {
  return request({
    url: '/sales/ledger/exportSaleOutbound',
    method: 'post',
    data: query,
    responseType: 'blob'
  })
}
src/utils/request.js
@@ -72,7 +72,24 @@
})
// 响应拦截器
service.interceptors.response.use(res => {
service.interceptors.response.use(async res => {
      const isBlob = res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer'
      if (isBlob) {
        const contentType = res.headers['content-type']
        if (contentType && contentType.includes('application/json')) {
          const text = await new Response(res.data).text()
          const data = JSON.parse(text)
          const msg = data.msg || '导出失败'
          ElMessage.error(msg)
          return Promise.reject(new Error(msg))
        }
        return res.data
      }
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200
    // 获取错误信息
src/views/salesManagement/salesLedger/index.vue
@@ -46,6 +46,7 @@
              <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="batchNo" />
              <el-table-column label="单位" prop="unit" />
                            <el-table-column label="产品状态"
                                                             width="100px"
@@ -124,6 +125,7 @@
            <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="exportSaleOutbound(scope.row)">打印销售出库单</el-button>
<!--            <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">发货</el-button>-->
          </template>
        </el-table-column>
@@ -228,6 +230,7 @@
                    <el-table-column label="产品大类" prop="productCategory" />
                    <el-table-column label="规格型号" prop="specificationModel" />
                    <el-table-column label="UID码" prop="uidNo" />
                    <el-table-column label="批号" prop="batchNo" />
                    <el-table-column label="单位" prop="unit" />
                    <el-table-column label="数量" prop="quantity" />
                    <el-table-column label="税率(%)" prop="taxRate" />
@@ -362,6 +365,15 @@
                        </el-form-item>
                    </el-col>
                </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="批号:" prop="batchNo">
              <el-select v-model="productForm.batchNo" placeholder="请选择" clearable filterable>
                <el-option v-for="item in batchNoOptions" :key="item.value" :label="item.label" :value="item.value" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
                <el-row :gutter="30">
                    <el-col :span="12">
                        <el-form-item label="单位:" prop="unit">
@@ -667,20 +679,22 @@
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
import {
    ledgerListPage,
    productList,
    customerList,
    addOrUpdateSalesLedger,
    getSalesLedgerWithProducts,
    delLedger,
    addOrUpdateSalesLedgerProduct,
    delProduct,
    delLedgerFile, getProductInventory,
  ledgerListPage,
  productList,
  customerList,
  addOrUpdateSalesLedger,
  getSalesLedgerWithProducts,
  delLedger,
  addOrUpdateSalesLedgerProduct,
  delProduct,
  delLedgerFile, getProductInventory, saleOutboundExport,
} from "@/api/salesManagement/salesLedger.js";
import { modelList, productTreeList } from "@/api/basicData/product.js";
import useFormData from "@/hooks/useFormData.js";
import dayjs from "dayjs";
import { getCurrentDate } from "@/utils/index.js";
import {getProductOrderBatchNoOptions} from "@/api/productionManagement/productionOrder.js";
import {safeTrainingExport} from "@/api/safeProduction/safetyTrainingAssessment.js";
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
@@ -748,10 +762,12 @@
        taxInclusiveTotalPrice: "",
        taxExclusiveTotalPrice: "",
        invoiceType: "",
    batchNo: "",
    },
    productRules: {
        productCategory: [{ required: true, message: "请选择", trigger: "change" }],
        productModelId: [{ required: true, message: "请选择", trigger: "change" }],
    batchNo: [{ required: true, message: "请选择", trigger: "change" }],
        specificationModel: [
            { required: true, message: "请选择", trigger: "change" },
        ],
@@ -1245,6 +1261,12 @@
            });
        }
    });
};
const batchNoOptions = ref([]);
const fetchBatchNoOptions = async () => {
    const res = await getProductOrderBatchNoOptions();
    batchNoOptions.value = res.data;
};
// 关闭弹框
const closeDia = () => {
@@ -2183,8 +2205,41 @@
    let res = await userStore.getInfo();
    currentFactoryName.value = res.user.currentFactoryName;
};
const exportSaleOutbound = row => {
  saleOutboundExport({id: row.id})
      .then(res => {
        // 创建Blob对象
        const blob = new Blob([res], {
          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        });
        // 创建下载链接
        const url = window.URL.createObjectURL(blob);
        const link = document.createElement("a");
        link.href = url;
        link.download = `销售出库单.docx`;
        // 模拟点击下载
        document.body.appendChild(link);
        link.click();
        // 清理临时对象
        setTimeout(() => {
          document.body.removeChild(link);
          window.URL.revokeObjectURL(url);
        }, 100);
        ElMessage.success("导出成功");
      })
      .catch(err => {
        console.error("导出失败:", err);
        ElMessage.error("导出失败,请重试");
      });
};
onMounted(() => {
    getList();
  fetchBatchNoOptions();
    userListNoPage().then(res => {
        userList.value = res.data;
    })