tuqin
5 天以前 00bc6168ba5f30a15e4ba95b992455f0045e45c6
feat(wls): 北方科技销售仓库与营销管理(销售订单)关联

需求:仓储模块的「销售仓库」之前是手工台账,改成与营销管理关联,
出库必须走 销售订单 → 发货通知 → 销售出库 的链路。

改动:
1. 发货通知页(wls/salesnotice)
- 去掉「新建发货通知单」手工台账入口
- 新增「从销售订单生成」按钮:弹销售订单选择框,选中后调用
后端 generate-from-sale-order,自动带出客户与订单明细
2. 销售出库页(wls/productsales)
- 「新建销售出库单」改为「其他出库」,保留手工录入能力,
用于样品/赠送/领用等无销售订单的出库场景

关联链路(后端已实现,本次仅补前端入口):
销售订单(erp_sale_order)
→ generate-from-sale-order → 发货通知(带 client_id/sale_order_id/明细行)
→ 提交(回写订单 out_status=已预留)
→ generate-product-sales → 销售出库(带 client_id/sale_order_id/notice_id/明细行)

已验证:后端三步链路接口调通,出库单行完整关联
sale_order_item_id / notice_line_id / item_id / quantity。
已修改2个文件
37 ■■■■■ 文件已修改
src/views/wls/productsales/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/salesnotice/index.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/productsales/index.vue
@@ -127,7 +127,7 @@
        <TableAction
          :actions="[
            {
              label: $t('ui.actionTitle.create', ['销售出库单']),
              label: '其他出库',
              type: 'primary',
              icon: ACTION_ICON.ADD,
              auth: ['mes:wm-product-sales:create'],
src/views/wls/salesnotice/index.vue
@@ -1,5 +1,6 @@
<script lang="ts" setup>
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { ErpSaleOrderApi } from '#/api/erp/sale/order';
import type { MesWmSalesNoticeApi } from '#/api/mes/wm/salesnotice';
import { Page, useVbenModal } from '@vben/common-ui';
@@ -8,16 +9,19 @@
import { Button, message, Tag } from 'ant-design-vue';
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {
  deleteSalesNotice,
  exportSalesNotice,
  generateFromSaleOrder,
  generateProductSales,
  getSalesNoticePage,
} from '#/api/mes/wm/salesnotice';
import { $t } from '#/locales';
import SaleOrderSelectDialog from '#/views/erp/sale/order/components/select-dialog.vue';
import { useGridColumns, useGridFormSchema } from './data';
import Form from './modules/form.vue';
@@ -45,9 +49,26 @@
  gridApi.query();
}
/** 创建发货通知单 */
function handleCreate() {
  formModalApi.setData({ formType: 'create' }).open();
const saleOrderSelectRef = ref<InstanceType<typeof SaleOrderSelectDialog>>();
/** 从销售订单生成发货通知单 */
function handleGenerateFromSaleOrder() {
  saleOrderSelectRef.value?.open([], { multiple: false });
}
/** 选择销售订单后生成发货通知单 */
async function handleSaleOrderSelected(rows: ErpSaleOrderApi.SaleOrder[]) {
  const order = rows[0];
  if (!order?.id) {
    return;
  }
  try {
    await generateFromSaleOrder(order.id);
    message.success('生成发货通知单成功');
    handleRefresh();
  } catch (e) {
    console.error(e);
  }
}
/** 查看发货通知单 */
@@ -128,17 +149,21 @@
<template>
  <Page auto-content-height><FormModal @success="handleRefresh" />
    <SaleOrderSelectDialog
      ref="saleOrderSelectRef"
      @selected="handleSaleOrderSelected"
    />
    <Grid table-title="发货通知单列表">
      <template #toolbar-tools>
        <TableAction
          :actions="[
            {
              label: $t('ui.actionTitle.create', ['发货通知单']),
              label: '从销售订单生成',
              type: 'primary',
              icon: ACTION_ICON.ADD,
              auth: ['mes:wm-sales-notice:create'],
              onClick: handleCreate,
              onClick: handleGenerateFromSaleOrder,
            },
            {
              label: $t('ui.actionTitle.export'),