本次改造实现 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/contract/index |
添加"生成销售订单"按钮 |
| 合同详情 | /crm/contract/detail |
显示关联的销售订单信息 |
| 页面 | 路径 | 改动说明 |
|---|---|---|
| 销售订单列表 | /erp/sale/order/index |
显示关联合同信息 |
| 销售订单详情 | /erp/sale/order/detail |
显示关联合同信息 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /crm/contract/generate-sale-order | 根据合同生成销售订单 |
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | Long | 是 | 合同编号 |
响应:
{
"code": 0,
"data": 12345,
"msg": "操作成功"
}
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /rpc-api/erp/sale-order/create | 创建销售订单 |
| GET | /rpc-api/erp/sale-order/get | 获取销售订单 |
| GET | /rpc-api/erp/sale-order/get-by-contract-id | 根据合同编号获取订单 |
文件路径: /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 }
})
}
文件路径: /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>
文件路径: /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>
文件路径: /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>
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`;
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`;
| Phase | 内容 | 状态 |
|---|---|---|
| Phase 1 | 客户数据统一 - ERP 使用 CRM 客户 | 已完成 |
| Phase 2 | 产品数据统一 - CRM/ERP 使用 MDM 物料 | 已完成 |
| Phase 3 | 合同生成销售订单 | 已完成 |
| Phase 4 | 销售全流程追溯 | 待开始 |
| Phase 5 | 营销数据报表 | 待开始 |
| Phase 6 | 数据迁移与清理 | 待开始 |