feat(oms/wms): WMS上架状态回传OMS入库业务单,修复入库状态不同步
- WMS上架推进入库状态后回传OMS(OmsServiceFeign新增returnInResult) - OMS回传接收加固:无登录上下文判空、已入库同步issueStatus=4 - 已入库联动同步预约入库单(入库业务单)状态
This commit is contained in:
@@ -12,6 +12,7 @@ import org.springframework.scheduling.annotation.Async;
|
|||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
@@ -28,6 +29,10 @@ public interface OmsServiceFeign {
|
|||||||
@PostMapping(value = "/reservationStockInOrderApi/pushInOrderDetail")
|
@PostMapping(value = "/reservationStockInOrderApi/pushInOrderDetail")
|
||||||
public AjaxResult pushInOrderDetail(@RequestBody InMaterialDetailTZPD inMaterialDetail);
|
public AjaxResult pushInOrderDetail(@RequestBody InMaterialDetailTZPD inMaterialDetail);
|
||||||
|
|
||||||
|
@ApiOperation("wms回传入库结果:按入库单号同步入库状态(3-收货中 4-上架中 5-已入库)到OMS入库业务单,type非1为入库")
|
||||||
|
@GetMapping(value = "/executionStockInOrderApi/returnResult")
|
||||||
|
public AjaxResult returnInResult(@RequestParam("orderNumber") String orderNumber, @RequestParam("status") Long status, @RequestParam("type") String type);
|
||||||
|
|
||||||
|
|
||||||
@ApiOperation("wms推送入库单")
|
@ApiOperation("wms推送入库单")
|
||||||
@PostMapping(value = "/reservationStockOutOrderApi/pushOutOrder")
|
@PostMapping(value = "/reservationStockOutOrderApi/pushOutOrder")
|
||||||
|
|||||||
+5
@@ -41,6 +41,11 @@ public class RemoteOmsFeignFallbackFactory implements FallbackFactory<OmsService
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AjaxResult returnInResult(String orderNumber, Long status, String type) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AjaxResult pushOutOrder(StockOutOrderTZPD stockOutOrder) {
|
public AjaxResult pushOutOrder(StockOutOrderTZPD stockOutOrder) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
+84
-15
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
|
|||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.mhd.common.core.exception.ServiceException;
|
import com.mhd.common.core.exception.ServiceException;
|
||||||
import com.mhd.common.core.utils.OrderSequence;
|
import com.mhd.common.core.utils.OrderSequence;
|
||||||
@@ -32,6 +33,8 @@ import com.mhd.oms.domain.executionStockInOrder.repository.po.ExecutionStockInOr
|
|||||||
import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO;
|
import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO;
|
||||||
import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder;
|
import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder;
|
||||||
import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService;
|
import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService;
|
||||||
|
import com.mhd.oms.domain.reservationStockInOrder.entity.ReservationStockInOrder;
|
||||||
|
import com.mhd.oms.domain.reservationStockInOrder.repository.facade.IReservationStockInOrderService;
|
||||||
import com.mhd.oms.domain.reservationStockInOrder.repository.mapper.ReservationStockInOrderMapper;
|
import com.mhd.oms.domain.reservationStockInOrder.repository.mapper.ReservationStockInOrderMapper;
|
||||||
import com.mhd.oms.domain.reserveStockInOrder.repository.mapper.ReserveStockInOrderMapper;
|
import com.mhd.oms.domain.reserveStockInOrder.repository.mapper.ReserveStockInOrderMapper;
|
||||||
import com.mhd.system.api.SystemServiceFeign;
|
import com.mhd.system.api.SystemServiceFeign;
|
||||||
@@ -70,6 +73,8 @@ public class ExecutionStockInOrderDomainService {
|
|||||||
private IExecutionInMaterialDetailService materialDetailService;
|
private IExecutionInMaterialDetailService materialDetailService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IExecutionStockOutOrderService stockOutOrderService;
|
private IExecutionStockOutOrderService stockOutOrderService;
|
||||||
|
@Autowired
|
||||||
|
private IReservationStockInOrderService reservationStockInOrderService;
|
||||||
// @Autowired
|
// @Autowired
|
||||||
// private ReservationStockReceiptOrderDomainService stockReceiptOrderDomainService;
|
// private ReservationStockReceiptOrderDomainService stockReceiptOrderDomainService;
|
||||||
// @Autowired
|
// @Autowired
|
||||||
@@ -710,24 +715,88 @@ public class ExecutionStockInOrderDomainService {
|
|||||||
* @return Boolean
|
* @return Boolean
|
||||||
*/
|
*/
|
||||||
public Boolean returnResult(String orderNumber, Long status, String type) {
|
public Boolean returnResult(String orderNumber, Long status, String type) {
|
||||||
|
// WMS内部Feign回传可能无登录上下文(如PDA异步完成上架),SecurityUtils.getLoginUser()会返回null,
|
||||||
|
// 更新人信息判空兜底:无用户时只更新状态,不覆盖原有更新人字段
|
||||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||||
String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
|
String userRealName = null;
|
||||||
? loginUser.getUserPo().getUserName()
|
Long updateBy = null;
|
||||||
: (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername());
|
if (loginUser != null) {
|
||||||
|
userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
|
||||||
|
? loginUser.getUserPo().getUserName()
|
||||||
|
: (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername());
|
||||||
|
updateBy = loginUser.getUserid();
|
||||||
|
}
|
||||||
if (type != null && type.equals("1")) {
|
if (type != null && type.equals("1")) {
|
||||||
return stockOutOrderService.update(null, new UpdateWrapper<ExecutionStockOutOrder>().lambda()
|
LambdaUpdateWrapper<ExecutionStockOutOrder> wrapper = new LambdaUpdateWrapper<ExecutionStockOutOrder>()
|
||||||
.set(ExecutionStockOutOrder::getStatus, status)
|
.set(ExecutionStockOutOrder::getStatus, status);
|
||||||
.set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid())
|
if (updateBy != null) {
|
||||||
.set(ExecutionStockOutOrder::getUpdateByName, userRealName)
|
wrapper.set(ExecutionStockOutOrder::getUpdateBy, updateBy)
|
||||||
.set(ExecutionStockOutOrder::getUpdateTime, new Date())
|
.set(ExecutionStockOutOrder::getUpdateByName, userRealName)
|
||||||
.in(ExecutionStockOutOrder::getOutOrderNumber, orderNumber));
|
.set(ExecutionStockOutOrder::getUpdateTime, new Date());
|
||||||
|
}
|
||||||
|
wrapper.in(ExecutionStockOutOrder::getOutOrderNumber, orderNumber);
|
||||||
|
return stockOutOrderService.update(null, wrapper);
|
||||||
} else {
|
} else {
|
||||||
return stockInOrderService.update(null, new UpdateWrapper<ExecutionStockInOrder>().lambda()
|
LambdaUpdateWrapper<ExecutionStockInOrder> wrapper = new LambdaUpdateWrapper<ExecutionStockInOrder>()
|
||||||
.set(ExecutionStockInOrder::getStatus, status)
|
.set(ExecutionStockInOrder::getStatus, status);
|
||||||
.set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid())
|
// 已入库(5)时同步issueStatus=4,供前端"入库执行单"列表入库状态列展示"已入库"
|
||||||
.set(ExecutionStockInOrder::getUpdateByName, userRealName)
|
if (status != null && status == 5L) {
|
||||||
.set(ExecutionStockInOrder::getUpdateTime, new Date())
|
wrapper.set(ExecutionStockInOrder::getIssueStatus, 4);
|
||||||
.in(ExecutionStockInOrder::getInOrderNumber, orderNumber));
|
}
|
||||||
|
if (updateBy != null) {
|
||||||
|
wrapper.set(ExecutionStockInOrder::getUpdateBy, updateBy)
|
||||||
|
.set(ExecutionStockInOrder::getUpdateByName, userRealName)
|
||||||
|
.set(ExecutionStockInOrder::getUpdateTime, new Date());
|
||||||
|
}
|
||||||
|
wrapper.in(ExecutionStockInOrder::getInOrderNumber, orderNumber);
|
||||||
|
boolean updated = stockInOrderService.update(null, wrapper);
|
||||||
|
// 同步预约入库单(前端"入库业务单"列表)状态
|
||||||
|
syncReservationStatus(orderNumber, status, updateBy, userRealName);
|
||||||
|
return updated;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入库执行单状态回传后同步预约入库单:
|
||||||
|
* 执行单通过business_in_order_number关联预约单,已入库(5)且该预约单名下关联执行单全部完成时,
|
||||||
|
* 预约单同步置为已入库;同步失败只记日志,不影响执行单状态更新结果
|
||||||
|
*/
|
||||||
|
private void syncReservationStatus(String orderNumber, Long status, Long updateBy, String userRealName) {
|
||||||
|
try {
|
||||||
|
if (status == null || status != 5L) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ExecutionStockInOrder execution = stockInOrderService.getOne(new QueryWrapper<ExecutionStockInOrder>().lambda()
|
||||||
|
.eq(ExecutionStockInOrder::getInOrderNumber, orderNumber)
|
||||||
|
.eq(ExecutionStockInOrder::getDelFlag, 1)
|
||||||
|
.last("limit 1"));
|
||||||
|
if (execution == null || execution.getBusinessInOrderNumber() == null
|
||||||
|
|| execution.getBusinessInOrderNumber().trim().isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 多仓库拆单时存在多个关联执行单,全部已入库才同步预约单
|
||||||
|
long unfinished = stockInOrderService.count(new QueryWrapper<ExecutionStockInOrder>().lambda()
|
||||||
|
.eq(ExecutionStockInOrder::getBusinessInOrderNumber, execution.getBusinessInOrderNumber())
|
||||||
|
.eq(ExecutionStockInOrder::getDelFlag, 1)
|
||||||
|
.and(w -> w.isNull(ExecutionStockInOrder::getStatus).or().lt(ExecutionStockInOrder::getStatus, 5)));
|
||||||
|
if (unfinished > 0) {
|
||||||
|
log.info("预约入库单[{}]名下仍有{}张执行单未完成,暂不同步已入库状态", execution.getBusinessInOrderNumber(), unfinished);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LambdaUpdateWrapper<ReservationStockInOrder> reservationWrapper = new LambdaUpdateWrapper<ReservationStockInOrder>()
|
||||||
|
.set(ReservationStockInOrder::getStatus, 5)
|
||||||
|
// issueStatus=4 为前端"入库业务单"列表入库状态列的"已入库"展示值
|
||||||
|
.set(ReservationStockInOrder::getIssueStatus, 4);
|
||||||
|
if (updateBy != null) {
|
||||||
|
reservationWrapper.set(ReservationStockInOrder::getUpdateBy, updateBy)
|
||||||
|
.set(ReservationStockInOrder::getUpdateByName, userRealName)
|
||||||
|
.set(ReservationStockInOrder::getUpdateTime, new Date());
|
||||||
|
}
|
||||||
|
reservationWrapper.in(ReservationStockInOrder::getInOrderNumber, execution.getBusinessInOrderNumber());
|
||||||
|
reservationStockInOrderService.update(reservationWrapper);
|
||||||
|
log.info("预约入库单[{}]已同步为已入库", execution.getBusinessInOrderNumber());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("同步预约入库单状态失败: orderNumber={}, status={}", orderNumber, status, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-1
@@ -810,8 +810,21 @@ public class StockShelfOrderDomainService {
|
|||||||
stockInOrder.setUpdateBy(loginUser.getUserid());
|
stockInOrder.setUpdateBy(loginUser.getUserid());
|
||||||
stockInOrder.setUpdateByName(loginUser.getUsername());
|
stockInOrder.setUpdateByName(loginUser.getUsername());
|
||||||
stockInOrder.setUpdateTime(new Date());
|
stockInOrder.setUpdateTime(new Date());
|
||||||
return stockInOrderService.update(stockInOrder,
|
boolean updated = stockInOrderService.update(stockInOrder,
|
||||||
new QueryWrapper<StockInOrder>().lambda().eq(StockInOrder::getInOrderNumber, stockShelfOrderPO.getInOrderNumber()));
|
new QueryWrapper<StockInOrder>().lambda().eq(StockInOrder::getInOrderNumber, stockShelfOrderPO.getInOrderNumber()));
|
||||||
|
if (updated) {
|
||||||
|
// 上架推进入库状态(4-上架中/5-已入库)后回传OMS入库业务单,保证OMS入库状态与WMS一致;
|
||||||
|
// OMS不可用或回传失败只记日志,不影响WMS上架主流程
|
||||||
|
try {
|
||||||
|
AjaxResult notifyResult = omsServiceFeign.returnInResult(stockShelfOrderPO.getInOrderNumber(), Long.valueOf(status), "0");
|
||||||
|
if (notifyResult == null || !"200".equals(String.valueOf(notifyResult.get("code")))) {
|
||||||
|
log.warn("回传OMS入库状态失败: orderNumber={}, status={}, result={}", stockShelfOrderPO.getInOrderNumber(), status, notifyResult);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("回传OMS入库状态异常: orderNumber={}, status={}", stockShelfOrderPO.getInOrderNumber(), status, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return updated;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @description 完成上架
|
* @description 完成上架
|
||||||
|
|||||||
Reference in New Issue
Block a user