|
|
|
@ -112,10 +112,18 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> i |
|
|
|
if(model.getId() != null){ |
|
|
|
// 编辑保存:更新 c_edit(修改时间)和 c_end_planner(修改人) |
|
|
|
PODetail existing = baseMapper.selectById(model.getId()); |
|
|
|
if (existing == null) { |
|
|
|
throw new RuntimeException("未找到订单明细,无法保存"); |
|
|
|
} |
|
|
|
applyCrdOriOnUpdate(existing, model, poDetail); |
|
|
|
poDetail.setEdit(currentTimeStr); |
|
|
|
poDetail.setEndPlanner(currentUserName); |
|
|
|
baseMapper.updateById(poDetail); |
|
|
|
if (StringUtils.hasText(poDetail.getStatus()) |
|
|
|
&& !poDetail.getStatus().equals(existing.getStatus())) { |
|
|
|
// 订单管理当前为 header/detail 1:1,明细状态变化时必须同步头状态 |
|
|
|
syncPoHeaderStatus(existing.getSite(), existing.getOrderNo(), poDetail.getStatus()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// 新增保存:设置 create_time(创建时间) |
|
|
|
applyCrdOriOnCreate(model, poDetail); |
|
|
|
@ -471,7 +479,6 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> i |
|
|
|
} |
|
|
|
validateNeedSubmitTestBeforeShip(existingDetail); |
|
|
|
updatePoDetailStatus(existingDetail, "已发货"); |
|
|
|
syncPoHeaderStatusForShip(existingDetail); |
|
|
|
} |
|
|
|
|
|
|
|
private void validateNewProductAuditBeforeIssue(PODetail detail) { |
|
|
|
@ -590,38 +597,43 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> i |
|
|
|
update.setEdit(currentTimeStr); |
|
|
|
update.setEndPlanner(currentUserName); |
|
|
|
baseMapper.updateById(update); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
baseMapper.update(null, new LambdaUpdateWrapper<PODetail>() |
|
|
|
.eq(PODetail::getOrderNo, existingDetail.getOrderNo()) |
|
|
|
.eq(PODetail::getSite, existingDetail.getSite()) |
|
|
|
.eq(PODetail::getItemNo, existingDetail.getItemNo()) |
|
|
|
.set(PODetail::getStatus, newStatus) |
|
|
|
.set(PODetail::getEdit, currentTimeStr) |
|
|
|
.set(PODetail::getEndPlanner, currentUserName)); |
|
|
|
} else { |
|
|
|
baseMapper.update(null, new LambdaUpdateWrapper<PODetail>() |
|
|
|
.eq(PODetail::getOrderNo, existingDetail.getOrderNo()) |
|
|
|
.eq(PODetail::getSite, existingDetail.getSite()) |
|
|
|
.eq(PODetail::getItemNo, existingDetail.getItemNo()) |
|
|
|
.set(PODetail::getStatus, newStatus) |
|
|
|
.set(PODetail::getEdit, currentTimeStr) |
|
|
|
.set(PODetail::getEndPlanner, currentUserName)); |
|
|
|
} |
|
|
|
// 订单管理当前为 header/detail 1:1,统一在状态变更后同步头状态 |
|
|
|
syncPoHeaderStatus(existingDetail.getSite(), existingDetail.getOrderNo(), newStatus); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @Description 发货动作后同步更新订单头状态 |
|
|
|
* @Title syncPoHeaderStatusForShip |
|
|
|
* @param detail 当前被发货的订单行(必须包含 site、orderNo) |
|
|
|
* @Description 按订单号同步 POHeader 状态 |
|
|
|
* @Title syncPoHeaderStatus |
|
|
|
* @param site 站点 |
|
|
|
* @param orderNo 订单号 |
|
|
|
* @param status 目标状态 |
|
|
|
* @author rqrq |
|
|
|
* @date 2026/07/23 |
|
|
|
* @date 2026/07/31 |
|
|
|
* |
|
|
|
* 业务说明: |
|
|
|
* 1) 用户从明细行执行 shipped 时,除了 PODetail.status 变更为「已发货」外,POHeader.status 也必须同步为「已发货」。 |
|
|
|
* 2) 此处只处理 shipped 场景,不改变下达/关闭/打开等其他状态流转逻辑,避免引入额外业务口径变化。 |
|
|
|
* 1) 当前订单管理按 header/detail 1:1 维护,任意明细状态变更都要同步头状态; |
|
|
|
* 2) 统一收口到该方法,避免关闭/打开/下达/发货等动作出现状态不一致; |
|
|
|
* 3) 更新条件按 site + orderNo 精确命中,保证仅影响当前订单头记录。 |
|
|
|
*/ |
|
|
|
private void syncPoHeaderStatusForShip(PODetail detail) { |
|
|
|
if (detail == null || !StringUtils.hasText(detail.getSite()) || !StringUtils.hasText(detail.getOrderNo())) { |
|
|
|
private void syncPoHeaderStatus(String site, String orderNo, String status) { |
|
|
|
if (!StringUtils.hasText(site) |
|
|
|
|| !StringUtils.hasText(orderNo) |
|
|
|
|| !StringUtils.hasText(status)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
poHeaderMapper.update(null, new LambdaUpdateWrapper<POHeader>() |
|
|
|
.eq(POHeader::getSite, detail.getSite()) |
|
|
|
.eq(POHeader::getOrderNo, detail.getOrderNo()) |
|
|
|
.set(POHeader::getStatus, "已发货")); |
|
|
|
.eq(POHeader::getSite, site) |
|
|
|
.eq(POHeader::getOrderNo, orderNo) |
|
|
|
.set(POHeader::getStatus, status)); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@ -856,6 +868,7 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> i |
|
|
|
|| model.getBuyer() != null |
|
|
|
|| model.getCustomer() != null |
|
|
|
|| model.getPoNo() != null |
|
|
|
|| StringUtils.hasText(model.getStatus()) |
|
|
|
|| model.getDeparture() != null |
|
|
|
|| model.getDestination() != null |
|
|
|
|| model.getShipVia() != null |
|
|
|
@ -876,6 +889,7 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> i |
|
|
|
header.setBuyer(model.getBuyer()); |
|
|
|
header.setCustomer(model.getCustomer()); |
|
|
|
header.setPoNo(model.getPoNo()); |
|
|
|
header.setStatus(model.getStatus()); |
|
|
|
header.setDeparture(model.getDeparture()); |
|
|
|
header.setDestination(model.getDestination()); |
|
|
|
header.setShipVia(model.getShipVia()); |
|
|
|
|