编辑 | blame | 历史 | 原始文档

CRM 合同生成 ERP 销售订单 - 前端文档

概述

本次改造实现 CRM 合同审批通过后,可直接生成 ERP 销售订单,打通合同到订单的业务流程。


一、改造清单

后端改造(已完成)

文件 改动说明
yudao-module-erp-api/ 新增 ERP 销售订单 API 模块
ErpSaleOrderApi.java 销售订单 API 接口
ErpSaleOrderCreateReqDTO.java 销售订单创建请求 DTO
ErpSaleOrderRespDTO.java 销售订单响应 DTO
ErpSaleOrderApiImpl.java ERP 销售订单 API 实现
CrmContractDO.java 新增 orderId、orderNo 字段
ErpSaleOrderDO.java 新增 contractId、contractNo 字段
CrmContractService.java 新增 generateSaleOrder 方法
CrmContractServiceImpl.java 实现生成销售订单逻辑
CrmContractController.java 新增生成销售订单 API
CrmContractRespVO.java 新增 orderId、orderNo 字段

二、涉及页面

CRM 合同管理

页面 路径 改动说明
合同列表 /crm/contract/index 添加"生成销售订单"按钮
合同详情 /crm/contract/detail 显示关联的销售订单信息

ERP 销售订单管理

页面 路径 改动说明
销售订单列表 /erp/sale/order/index 显示关联合同信息
销售订单详情 /erp/sale/order/detail 显示关联合同信息

三、API 接口

CRM 合同 API

方法 路径 说明
POST /crm/contract/generate-sale-order 根据合同生成销售订单

请求参数:

参数 类型 必填 说明
id Long 合同编号

响应:

{
  "code": 0,
  "data": 12345,
  "msg": "操作成功"
}

ERP 销售订单 API(新增 RPC)

方法 路径 说明
POST /rpc-api/erp/sale-order/create 创建销售订单
GET /rpc-api/erp/sale-order/get 获取销售订单
GET /rpc-api/erp/sale-order/get-by-contract-id 根据合同编号获取订单

四、前端修改点

4.1 合同列表页面

文件路径: /src/views/crm/contract/index.vue

新增按钮:

<!-- 在合同操作列添加"生成销售订单"按钮 -->
<el-button
  v-if="row.auditStatus === 20 && !row.orderId"
  type="success"
  size="small"
  @click="handleGenerateOrder(row)"
>
  生成销售订单
</el-button>
<el-button
  v-if="row.orderId"
  type="primary"
  size="small"
  @click="handleViewOrder(row)"
>
  查看订单
</el-button>

新增方法:

methods: {
  // 生成销售订单
  async handleGenerateOrder(row) {
    try {
      await this.$confirm('确认根据该合同生成销售订单?', '提示')
      const { data } = await generateSaleOrder(row.id)
      this.$message.success('生成销售订单成功,订单号:' + data)
      this.getList() // 刷新列表
    } catch (e) {
      if (e !== 'cancel') {
        this.$message.error(e.message || '生成失败')
      }
    }
  },
  // 查看销售订单
  handleViewOrder(row) {
    this.$router.push({
      path: '/erp/sale/order/detail',
      query: { id: row.orderId }
    })
  }
}

新增 API:

// api/crm/contract.js
export function generateSaleOrder(id) {
  return request({
    url: '/crm/contract/generate-sale-order',
    method: 'post',
    params: { id }
  })
}

4.2 合同详情页面

文件路径: /src/views/crm/contract/detail.vue

新增显示字段:

<!-- 在合同基本信息区域添加 -->
<el-descriptions-item label="销售订单">
  <span v-if="contract.orderId">
    <el-link type="primary" @click="handleViewOrder">
      {{ contract.orderNo }}
    </el-link>
  </span>
  <span v-else>
    <el-button
      v-if="contract.auditStatus === 20"
      type="success"
      size="small"
      @click="handleGenerateOrder"
    >
      生成销售订单
    </el-button>
    <span v-else>未生成</span>
  </span>
</el-descriptions-item>

4.3 销售订单列表页面

文件路径: /src/views/erp/sale/order/index.vue

新增列显示:

<el-table-column label="关联合同" prop="contractNo" width="150">
  <template #default="{ row }">
    <span v-if="row.contractId">
      <el-link type="primary" @click="handleViewContract(row)">
        {{ row.contractNo }}
      </el-link>
    </span>
    <span v-else>-</span>
  </template>
</el-table-column>

4.4 销售订单详情页面

文件路径: /src/views/erp/sale/order/detail.vue

新增显示字段:

<el-descriptions-item label="关联合同">
  <span v-if="order.contractId">
    <el-link type="primary" @click="handleViewContract">
      {{ order.contractNo }}
    </el-link>
  </span>
  <span v-else>-</span>
</el-descriptions-item>

五、数据模型变更

CRM 合同表变更

ALTER TABLE `crm_contract`
ADD COLUMN `order_id` bigint DEFAULT NULL COMMENT '关联 ERP 销售订单编号' AFTER `total_price`,
ADD COLUMN `order_no` varchar(32) DEFAULT NULL COMMENT 'ERP 销售订单单号' AFTER `order_id`;

ERP 销售订单表变更

ALTER TABLE `erp_sale_order`
ADD COLUMN `contract_id` bigint DEFAULT NULL COMMENT '关联 CRM 合同编号' AFTER `customer_id`,
ADD COLUMN `contract_no` varchar(32) DEFAULT NULL COMMENT 'CRM 合同单号' AFTER `contract_id`;

六、业务规则

6.1 生成销售订单条件

  • 合同必须审批通过(auditStatus = 20)
  • 合同未关联销售订单(orderId 为空)
  • 合同必须包含产品信息

6.2 销售订单数据来源

  • 客户:合同客户
  • 产品:合同产品列表
  • 金额:合同金额(扣除折扣)
  • 备注:自动添加"由合同【xxx】自动生成"

6.3 数据关联

  • 销售订单创建后,自动回填合同 orderId、orderNo
  • 销售订单记录 contractId、contractNo 用于反向查询

七、注意事项

  1. 状态控制:只有审批通过的合同才能生成订单
  2. 唯一性:一个合同只能生成一个销售订单
  3. 数据同步:生成订单后,合同与订单双向关联
  4. 权限要求:需要有合同编辑权限才能生成订单
  5. 订单状态:生成的销售订单默认为"未审核"状态,需要在 ERP 中审批

八、后续计划

Phase 内容 状态
Phase 1 客户数据统一 - ERP 使用 CRM 客户 已完成
Phase 2 产品数据统一 - CRM/ERP 使用 MDM 物料 已完成
Phase 3 合同生成销售订单 已完成
Phase 4 销售全流程追溯 待开始
Phase 5 营销数据报表 待开始
Phase 6 数据迁移与清理 待开始