feat(order): 订单变更时同步更新钢卷的业务员和合同编号

- 在 CrmOrderServiceImpl 中查询旧订单时同时获取原合同编号
- 当销售员或合同编号变更时同步更新关联钢卷的业务员名称和合同编号
- 在 WmsCoilContractRelMapper 中新增批量更新钢卷业务员和合同编号的方法
- 为钢卷相关实体类添加 contractNo 字段支持
- 修改数据库表结构为 wms_material_coil 表添加 contract_no 字段
- 更新钢卷导出功能以包含合同编号字段
- 实现根据合同ID查询业务员和合同编号信息的功能
This commit is contained in:
2026-06-22 13:25:31 +08:00
parent 119b9105c7
commit 26c834780c
12 changed files with 96 additions and 31 deletions

View File

@@ -285,23 +285,33 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
*/
@Override
public Boolean updateByBo(CrmOrderBo bo) {
// 查询旧订单获取原销售员,用于判断是否需要同步钢卷
// 查询旧订单获取原销售员和原合同编号,用于判断是否需要同步钢卷
CrmOrder oldOrder = null;
String oldSalesman = null;
String oldContractCode = null;
if (bo.getOrderId() != null) {
oldOrder = baseMapper.selectById(bo.getOrderId());
oldSalesman = oldOrder != null ? oldOrder.getSalesman() : null;
if (oldOrder != null) {
oldSalesman = oldOrder.getSalesman();
oldContractCode = oldOrder.getContractCode();
}
}
CrmOrder update = BeanUtil.toBean(bo, CrmOrder.class);
validEntityBeforeSave(update);
boolean result = baseMapper.updateById(update) > 0;
// 如果销售员变更,同步更新所有关联钢卷的业务员名称
// 如果销售员或合同编号变更,同步更新所有关联钢卷
if (result && oldOrder != null) {
String newSalesman = update.getSalesman();
if (!Objects.equals(oldSalesman, newSalesman) && StringUtils.isNotBlank(newSalesman)) {
coilContractRelMapper.updateCoilSaleNameByOrderId(bo.getOrderId(), newSalesman);
String newContractCode = update.getContractCode();
boolean salesmanChanged = !Objects.equals(oldSalesman, newSalesman);
boolean contractCodeChanged = !Objects.equals(oldContractCode, newContractCode);
if (salesmanChanged || contractCodeChanged) {
coilContractRelMapper.updateCoilSaleNameByOrderId(
bo.getOrderId(),
StringUtils.isNotBlank(newSalesman) ? newSalesman : oldSalesman,
StringUtils.isNotBlank(newContractCode) ? newContractCode : oldContractCode);
}
}

View File

@@ -233,5 +233,10 @@ public class WmsMaterialCoil extends BaseEntity {
* 镀铬卷号
*/
private String chromePlateCoilNo;
/**
* 合同编号
*/
private String contractNo;
}

View File

@@ -412,6 +412,11 @@ public class WmsMaterialCoilBo extends BaseEntity {
*/
private String chromePlateCoilNo;
/**
* 合同编号
*/
private String contractNo;
/**
* 是否按计划创建时间倒序排序已绑定钢卷列表无planId时按计划新旧排列
*/

View File

@@ -215,4 +215,10 @@ public class WmsMaterialCoilAllExportVo {
*/
@ExcelProperty(value = "调拨类型")
private String transferType;
/**
* 合同编号
*/
@ExcelProperty(value = "合同编号")
private String contractNo;
}

View File

@@ -233,4 +233,10 @@ public class WmsMaterialCoilExportVo {
*/
@ExcelProperty(value = "镀铬卷号")
private String chromePlateCoilNo;
/**
* 合同编号
*/
@ExcelProperty(value = "合同编号")
private String contractNo;
}

View File

@@ -359,5 +359,10 @@ public class WmsMaterialCoilVo extends BaseEntity {
* 镀铬卷号
*/
private String chromePlateCoilNo;
/**
* 合同编号
*/
private String contractNo;
}

View File

@@ -26,12 +26,12 @@ public interface WmsCoilContractRelMapper extends BaseMapperPlus<WmsCoilContract
List<WmsCoilContractRelVo> selectOrdersByCoilIds(@Param("coilIds") List<Long> coilIds);
/**
* 根据订单ID查询销售员业务员姓名
* 批量更新关联钢卷的业务员名称和合同编号(当订单变更时同步)
*/
String selectSalesmanByOrderId(@Param("orderId") Long orderId);
int updateCoilSaleNameByOrderId(@Param("orderId") Long orderId, @Param("saleName") String saleName, @Param("contractCode") String contractCode);
/**
* 批量更新关联钢卷的业务员名称(当订单销售员变更时同步
* 根据订单ID查询合同信息业务员姓名 + 合同编号
*/
int updateCoilSaleNameByOrderId(@Param("orderId") Long orderId, @Param("saleName") String saleName);
java.util.Map<String, String> selectContractInfoByOrderId(@Param("orderId") Long orderId);
}

View File

@@ -88,18 +88,30 @@ public class WmsCoilContractRelServiceImpl implements IWmsCoilContractRelService
}
/**
* 同步钢卷的业务员名称根据合同ID查询销售员并更新到钢卷
* 同步钢卷的业务员名称和合同编号根据合同ID查询并更新到钢卷
*/
private void syncCoilSaleName(Long coilId, Long contractId) {
if (coilId == null || contractId == null) {
return;
}
String saleName = baseMapper.selectSalesmanByOrderId(contractId);
if (StringUtils.isNotBlank(saleName)) {
java.util.Map<String, String> contractInfo = baseMapper.selectContractInfoByOrderId(contractId);
if (contractInfo != null) {
String saleName = contractInfo.get("salesman");
String contractCode = contractInfo.get("contractCode");
LambdaUpdateWrapper<WmsMaterialCoil> updateWrapper = Wrappers.lambdaUpdate();
updateWrapper.set(WmsMaterialCoil::getSaleName, saleName)
.eq(WmsMaterialCoil::getCoilId, coilId);
coilMapper.update(null, updateWrapper);
boolean needUpdate = false;
if (StringUtils.isNotBlank(saleName)) {
updateWrapper.set(WmsMaterialCoil::getSaleName, saleName);
needUpdate = true;
}
if (StringUtils.isNotBlank(contractCode)) {
updateWrapper.set(WmsMaterialCoil::getContractNo, contractCode);
needUpdate = true;
}
if (needUpdate) {
updateWrapper.eq(WmsMaterialCoil::getCoilId, coilId);
coilMapper.update(null, updateWrapper);
}
}
}

View File

@@ -901,6 +901,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
qw.eq(bo.getIsRelatedToOrder() != null, "mc.is_related_to_order", bo.getIsRelatedToOrder());
// 加上remark的模糊匹配
qw.like(StringUtils.isNotBlank(bo.getRemark()), "mc.remark", bo.getRemark());
// 合同号的模糊查询
qw.like(StringUtils.isNotBlank(bo.getContractNo()), "mc.contract_no", bo.getContractNo());
//逻辑删除
qw.eq("mc.del_flag", 0);
// 统一处理 warehouseId 与 warehouseIds
@@ -3079,13 +3081,20 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
/**
* 根据合同ID从订单中获取业务员姓名并设置到钢卷实体
* 根据合同ID从订单中获取业务员姓名和合同编号并设置到钢卷实体
*/
private void setSaleNameFromContract(WmsMaterialCoil coil, Long contractId) {
if (contractId != null) {
String saleName = coilContractRelMapper.selectSalesmanByOrderId(contractId);
if (StringUtils.isNotBlank(saleName)) {
coil.setSaleName(saleName);
java.util.Map<String, String> contractInfo = coilContractRelMapper.selectContractInfoByOrderId(contractId);
if (contractInfo != null) {
String saleName = contractInfo.get("salesman");
String contractCode = contractInfo.get("contractCode");
if (StringUtils.isNotBlank(saleName)) {
coil.setSaleName(saleName);
}
if (StringUtils.isNotBlank(contractCode)) {
coil.setContractNo(contractCode);
}
}
}
}

View File

@@ -137,20 +137,21 @@
AND rel.del_flag = 0
</select>
<!-- 根据订单ID查询销售员业务员姓名 -->
<select id="selectSalesmanByOrderId" resultType="String">
SELECT co.salesman
<!-- 批量更新关联钢卷的业务员名称和合同编号(当订单变更时同步) -->
<update id="updateCoilSaleNameByOrderId">
UPDATE wms_material_coil mc
INNER JOIN wms_coil_contract_rel rel ON mc.coil_id = rel.coil_id AND rel.del_flag = 0
SET mc.sale_name = #{saleName},
mc.contract_no = #{contractCode}
WHERE rel.contract_id = #{orderId} AND mc.del_flag = 0
</update>
<!-- 根据订单ID查询合同信息业务员 + 合同编号) -->
<select id="selectContractInfoByOrderId" resultType="java.util.Map">
SELECT co.salesman, co.contract_code AS contractCode
FROM crm_order co
WHERE co.order_id = #{orderId} AND co.del_flag = 0
LIMIT 1
</select>
<!-- 批量更新关联钢卷的业务员名称(当订单销售员变更时同步) -->
<update id="updateCoilSaleNameByOrderId">
UPDATE wms_material_coil mc
INNER JOIN wms_coil_contract_rel rel ON mc.coil_id = rel.coil_id AND rel.del_flag = 0
SET mc.sale_name = #{saleName}
WHERE rel.contract_id = #{orderId} AND mc.del_flag = 0
</update>
</mapper>
</mapper>

View File

@@ -46,6 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="scheduleThickness" column="schedule_thickness"/>
<result property="theoreticalLength" column="theoretical_length"/>
<result property="chromePlateCoilNo" column="chrome_plate_coil_no"/>
<result property="contractNo" column="contract_no"/>
</resultMap>
@@ -136,6 +137,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
mc.theoretical_length,
mc.chrome_plate_coil_no,
mc.sale_name AS saleName,
mc.contract_no AS contractNo,
w.warehouse_name AS warehouseName,
nw.warehouse_name AS nextWarehouseName,
aw.actual_warehouse_name AS actualWarehouseName,
@@ -505,6 +507,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
mc.packing_status AS packingStatus,
-- 销售
mc.sale_name AS saleName,
-- 合同
mc.contract_no AS contractNo,
-- 调拨类型
mc.transfer_type AS transferType,
-- 理论厚度
@@ -601,6 +605,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
mc.quality_status AS qualityStatus,
mc.packing_status AS packingStatus,
mc.sale_name AS saleName,
mc.contract_no AS contractNo,
mc.transfer_type AS transferType,
mc.theoretical_thickness AS theoreticalThickness,
mc.schedule_thickness AS scheduleThickness,

View File

@@ -4220,6 +4220,7 @@ CREATE TABLE `wms_material_coil` (
`reserved_width` decimal(10, 3) NULL DEFAULT NULL COMMENT '预留宽度(单位:毫米)',
`coil_surface_treatment` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '钢卷表面处理',
`transfer_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '调拨类型',
`contract_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '合同编号',
PRIMARY KEY (`coil_id`) USING BTREE,
INDEX `fk_coil_next_warehouse`(`next_warehouse_id` ASC) USING BTREE,
INDEX `fk_coil_qrcode`(`qrcode_record_id` ASC) USING BTREE,