Merge remote-tracking branch 'origin/dev_WMS20260401' into dev_WMS20260401

This commit is contained in:
zhou-hongcheng
2026-04-27 09:33:32 +08:00
37 changed files with 786 additions and 257 deletions
@@ -4,12 +4,14 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.enums.DictCode;
import com.mhd.common.core.utils.poi.ExcelUtil;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.UserServiceFeign;
import com.mhd.system.api.domain.BatchFeignPO;
import com.mhd.system.api.domain.PackDetailFeignPO;
import com.mhd.system.api.domain.SysDictData;
@@ -83,6 +85,8 @@ public class MaterialBaseInfoApplicationService {
@Autowired
private SystemServiceFeign systemServiceFeign;
@Autowired
private UserServiceFeign userServiceFeign;
@Autowired
private IMaterialBaseInfoService materialBaseInfoService;
/**
@@ -483,7 +487,7 @@ public class MaterialBaseInfoApplicationService {
if (StringUtils.isBlank(row.getPackName()) && StringUtils.isNotBlank(row.getPackImport())) {
row.setPackName(row.getPackImport().trim());
}
// 货主
// 货主:先按本组织已有物料反查,再用用户中心按「货主编码/货主名称」解析 userId(与入库单 import 一致;纯数字也可作名称,例如「1449」)
if (row.getShipperId() == null && (StringUtils.isNotBlank(row.getShipperCode()) || StringUtils.isNotBlank(row.getShipperName()))) {
MaterialBaseInfo matched = materialBaseInfoService.getOne(new LambdaQueryWrapper<MaterialBaseInfo>()
.eq(MaterialBaseInfo::getDelFlag, 1)
@@ -510,6 +514,10 @@ public class MaterialBaseInfoApplicationService {
}
}
}
if (row.getShipperId() == null) {
fillShipperIdFromUserCenterForImport(row);
}
enrichShipperCodeNameFromExistingMaterialIfNeeded(row);
// 包装规格
if (row.getPackId() == null && (StringUtils.isNotBlank(row.getPackCode()) || StringUtils.isNotBlank(row.getPackName()))) {
Long packId = queryPackIdByCodeOrName(row.getPackCode(), row.getPackName(), row.getOrganizationId());
@@ -570,6 +578,174 @@ public class MaterialBaseInfoApplicationService {
}
}
/**
* 导入时按货主名称/编号从用户中心解析货主ID(与 {@link com.mhd.wms.application.service.stockInOrder.StockInOrderApplicationService#getShipperIdByNameOrCode} 一致)。
* 不将纯数字的「货主名称」当作用户ID或主键,避免与业务上以数字作为企业简称/名称的货主(如「1449」)冲突。
*/
private void fillShipperIdFromUserCenterForImport(MaterialBaseInfoDTO row) {
if (row.getShipperId() != null) {
return;
}
if (StringUtils.isBlank(row.getShipperName()) && StringUtils.isBlank(row.getShipperCode())) {
return;
}
Long importOrgId = row.getOrganizationId();
String shipperName = StringUtils.isNotBlank(row.getShipperName()) ? row.getShipperName().trim() : null;
String shipperCode = StringUtils.isNotBlank(row.getShipperCode()) ? row.getShipperCode().trim() : null;
if (StringUtils.isNotBlank(shipperName)) {
try {
AjaxResult ajaxResult = userServiceFeign.getInfoByName(shipperName);
if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) {
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
if (userPo != null && shipperUserMatchesImportOrganization(userPo, importOrgId)) {
applyUserPoToMaterialImportRow(row, userPo);
return;
}
}
} catch (Exception e) {
log.debug("物料导入: getInfoByName 货主失败: {}", e.getMessage());
}
}
try {
AjaxResult shipperListResult = userServiceFeign.userShipperListAll();
if (!"200".equals(String.valueOf(shipperListResult.get("code"))) || shipperListResult.get("data") == null) {
return;
}
Object data = shipperListResult.get("data");
List<Map<String, Object>> shipperList;
if (data instanceof List) {
@SuppressWarnings("unchecked")
List<Object> rawList = (List<Object>) data;
shipperList = new ArrayList<>();
for (Object item : rawList) {
if (item instanceof Map) {
@SuppressWarnings("unchecked")
Map<String, Object> mapItem = (Map<String, Object>) item;
shipperList.add(mapItem);
} else {
Map<String, Object> mapItem = JSON.parseObject(JSONObject.toJSONString(item), new TypeReference<Map<String, Object>>() { });
shipperList.add(mapItem);
}
}
} else {
shipperList = JSON.parseObject(JSONObject.toJSONString(data), new TypeReference<List<Map<String, Object>>>() { });
}
if (shipperList == null || shipperList.isEmpty()) {
return;
}
for (Map<String, Object> shipper : shipperList) {
if (shipper == null) {
continue;
}
Object userId = shipper.get("userId");
Object userName = shipper.get("userName");
Object userCode = shipper.get("userCode");
Object userMemberCode = shipper.get("userMemberCode");
Object entName = shipper.get("shipperEnterpriseName");
if (userName == null) {
userName = shipper.get("name");
}
if (userName == null) {
userName = shipper.get("shipperName");
}
String normalizedName = StringUtils.isNotBlank(shipperName) ? shipperName : "";
String normalizedCode = StringUtils.isNotBlank(shipperCode) ? shipperCode : "";
boolean matched = false;
if (StringUtils.isNotEmpty(normalizedCode)) {
String c1 = userCode != null ? String.valueOf(userCode).trim() : "";
String c2 = userMemberCode != null ? String.valueOf(userMemberCode).trim() : "";
if (normalizedCode.equals(c1) || normalizedCode.equals(c2)) {
matched = true;
}
}
if (!matched && StringUtils.isNotEmpty(normalizedName)) {
for (Object cand : new Object[] { userName, entName }) {
if (cand == null) {
continue;
}
String s = String.valueOf(cand).trim();
if (normalizedName.equals(s) || s.contains(normalizedName)) {
matched = true;
break;
}
}
}
if (matched && userId != null) {
try {
Long candidateId = Long.valueOf(String.valueOf(userId));
AjaxResult infoRes = userServiceFeign.getInfo(candidateId);
if (!"200".equals(String.valueOf(infoRes.get("code"))) || infoRes.get("data") == null) {
continue;
}
UserPo up = JSON.parseObject(JSONObject.toJSONString(infoRes.get("data")), UserPo.class);
if (shipperUserMatchesImportOrganization(up, importOrgId)) {
applyUserPoToMaterialImportRow(row, up);
return;
}
} catch (Exception ex) {
log.debug("物料导入: 从货主列表解析用户失败: {}", ex.getMessage());
}
}
}
} catch (Exception e) {
log.debug("物料导入: userShipperListAll 失败: {}", e.getMessage());
}
}
private void applyUserPoToMaterialImportRow(MaterialBaseInfoDTO row, UserPo userPo) {
if (userPo == null) {
return;
}
row.setShipperId(userPo.getUserId());
if (StringUtils.isBlank(row.getShipperCode()) && StringUtils.isNotBlank(userPo.getUserMemberCode())) {
row.setShipperCode(userPo.getUserMemberCode());
}
if (StringUtils.isBlank(row.getShipperName()) && StringUtils.isNotBlank(userPo.getUserName())) {
row.setShipperName(userPo.getUserName());
}
}
private boolean shipperUserMatchesImportOrganization(UserPo userPo, Long importOrganizationId) {
if (importOrganizationId == null) {
return true;
}
if (userPo == null) {
return false;
}
Long oid = userPo.getOrganizationId();
return oid != null && importOrganizationId.equals(oid);
}
/**
* 已有 shipper_id 时,从本组织任意一条带全量货主信息的物料主数据仅补全仍为空的货主编码/名称。
*/
private void enrichShipperCodeNameFromExistingMaterialIfNeeded(MaterialBaseInfoDTO row) {
if (row.getShipperId() == null || row.getOrganizationId() == null) {
return;
}
if (StringUtils.isNotBlank(row.getShipperCode()) && StringUtils.isNotBlank(row.getShipperName())) {
return;
}
MaterialBaseInfo matched = materialBaseInfoService.getOne(new LambdaQueryWrapper<MaterialBaseInfo>()
.eq(MaterialBaseInfo::getDelFlag, 1)
.eq(MaterialBaseInfo::getOrganizationId, row.getOrganizationId())
.eq(MaterialBaseInfo::getShipperId, row.getShipperId())
.isNotNull(MaterialBaseInfo::getShipperName)
.orderByDesc(MaterialBaseInfo::getMaterialBaseInfoId)
.last("limit 1"));
if (matched == null) {
return;
}
if (StringUtils.isBlank(row.getShipperCode()) && StringUtils.isNotBlank(matched.getShipperCode())) {
row.setShipperCode(matched.getShipperCode());
}
if (StringUtils.isBlank(row.getShipperName()) && StringUtils.isNotBlank(matched.getShipperName())) {
row.setShipperName(matched.getShipperName());
}
}
private void fillOrganizationName(MaterialBaseInfoDTO row, LoginUser loginUser) {
if (StringUtils.isNotBlank(row.getOrganizationName())) {
return;
@@ -597,6 +773,8 @@ public class MaterialBaseInfoApplicationService {
names.add(row.getMaterialClassifyImport().trim());
row.setMaterialClassifyName(names);
}
// 按组织从 system 主数据反查分类编码,与名称列表对齐
fillMaterialClassifyCodesFromSystem(row);
// 物料种类:可传编码或名称,统一回填编码+名称
if ((StringUtils.isBlank(row.getMaterialType()) || StringUtils.isBlank(row.getMaterialTypeName()))
@@ -668,6 +846,62 @@ public class MaterialBaseInfoApplicationService {
}
}
/**
* 导入时已有分类名称但缺少分类编码时,走 system 接口按组织+名称/编码/名称路径匹配并回填.
* Excel 已填写的编码列优先保留。
*/
private void fillMaterialClassifyCodesFromSystem(MaterialBaseInfoDTO row) {
if (CollectionUtils.isEmpty(row.getMaterialClassifyName()) || row.getOrganizationId() == null) {
return;
}
List<String> names = row.getMaterialClassifyName();
List<String> existing = row.getMaterialClassifyCode();
List<String> newCodes = new ArrayList<>();
for (int i = 0; i < names.size(); i++) {
String fromExcel = (existing != null && i < existing.size()) ? existing.get(i) : null;
if (StringUtils.isNotBlank(fromExcel)) {
newCodes.add(fromExcel.trim());
continue;
}
String n = StringUtils.trimToNull(names.get(i));
if (n == null) {
newCodes.add(null);
} else {
newCodes.add(resolveClassifyCodeByFeign(n, row.getOrganizationId()));
}
}
row.setMaterialClassifyCode(newCodes);
}
/** 取 system 返回的 material_classify.code,写入本表 MATERIAL_CLASSIFY_CODEList 中一项) */
private String resolveClassifyCodeByFeign(String keyword, Long organizationId) {
if (StringUtils.isBlank(keyword) || organizationId == null) {
return null;
}
try {
AjaxResult r = systemServiceFeign.matchForMaterialImport(keyword.trim(), organizationId);
if (r == null || !"200".equals(String.valueOf(r.get("code"))) || r.get("data") == null) {
return null;
}
Map<String, Object> map = JSON.parseObject(JSONObject.toJSONString(r.get("data")),
new TypeReference<Map<String, Object>>() {});
if (map == null) {
return null;
}
Object code = map.get("code");
if (code == null) {
code = map.get("Code");
}
if (code == null) {
return null;
}
return StringUtils.trimToNull(String.valueOf(code));
} catch (Exception e) {
log.warn("导入解析物料分类编码失败 keyword={} orgId={} err={}", keyword, organizationId, e.getMessage());
return null;
}
}
private List<MaterialBarCodeDO> buildImportBarCodeList(MaterialBaseInfoDTO row) {
if (StringUtils.isBlank(row.getBarCode())) {
return null;
@@ -662,11 +662,11 @@ public class PickingOrderApplicationService {
returnPickingMaterialDetailDO.setTotalNetWeight(outMaterialDetail.getTotalNetWeight());
}
//是否开启了序列号管理
if (pickingMaterialDetailPO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(pickingMaterialDetailDO.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + pickingMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (pickingMaterialDetailPO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(pickingMaterialDetailDO.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + pickingMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnPickingMaterialDetailDO.setMaterialDetailSerialNumberList(pickingMaterialDetailDO.getMaterialDetailSerialNumberList());
returnPickingMaterialDetailDOList.add(returnPickingMaterialDetailDO);
}
@@ -50,6 +50,7 @@ import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -244,6 +245,7 @@ public class ReviewOrderApplicationService {
reviewMaterialDetailMapper.updateById(db);
}
refreshReviewOrderStatus(cmd.getReviewOrderId());
syncStockOutTaskOrderWithReviewState(cmd.getReviewOrderId());
return true;
}
@@ -297,6 +299,7 @@ public class ReviewOrderApplicationService {
reviewMaterialDetailMapper.updateById(db);
}
refreshReviewOrderStatus(cmd.getReviewOrderId());
syncStockOutTaskOrderWithReviewState(cmd.getReviewOrderId());
return true;
}
@@ -334,6 +337,7 @@ public class ReviewOrderApplicationService {
order.setReviewStatus(3);
fillOperator(order);
reviewOrderMapper.updateById(order);
syncStockOutTaskOrderWithReviewState(reviewOrderId);
// 复核确认后,按本次确认数据生成出库交接单
genHandoverTaskOrderByReviewConfirm(reviewOrderId, loginUser);
}
@@ -494,7 +498,40 @@ public class ReviewOrderApplicationService {
if (CollectionUtils.isEmpty(reviewOrderPOList)) {
throw new ServiceException("复核单不存在或已下发,请重新选择");
}
// 复核下发时同步生成作业单(与拣货同表结构),避免下发后无作业单可做
int rows = applyReviewTaskDistribution(reviewOrderPOList, cmd, loginUser);
return rows > 0;
}
/**
* 拣货完成后已生成复核单时调用:自动执行与 PC「复核下发」相同逻辑(delive_task 复核任务 + stock_out_task_order),并置复核单已下发。
*/
@Transactional(rollbackFor = Exception.class)
public void autoDistributeReviewAfterPickingComplete(Long reviewOrderId) {
if (reviewOrderId == null) {
return;
}
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser == null || loginUser.getUserPo() == null) {
log.warn("拣货完成后自动复核下发跳过:未登录或缺少组织信息 reviewOrderId={}", reviewOrderId);
return;
}
ReviewOrderPO header = reviewOrderMapper.selectHeaderByReviewOrderId(reviewOrderId);
if (header == null || !"0".equals(header.getIssuedFlag())) {
return;
}
ReviewOrderDO cmd = new ReviewOrderDO();
cmd.setCheckOperatorsBy(loginUser.getUserid());
cmd.setCheckOperatorsName(resolveLoginDisplayName(loginUser));
applyReviewTaskDistribution(Collections.singletonList(header), cmd, loginUser);
}
/**
* 复核任务下发:生成 stock_out_task_order、写入 delive_task,并标记复核单已下发。
*/
private int applyReviewTaskDistribution(List<ReviewOrderPO> reviewOrderPOList, ReviewOrderDO cmd, LoginUser loginUser) {
if (CollectionUtils.isEmpty(reviewOrderPOList) || loginUser == null) {
return 0;
}
genStockOutTaskOrderForReviewDistribution(reviewOrderPOList, loginUser);
genDeliveTaskForReview(reviewOrderPOList, cmd, loginUser);
List<Long> toUpdateIds = reviewOrderPOList.stream()
@@ -502,14 +539,13 @@ public class ReviewOrderApplicationService {
.collect(Collectors.toList());
Date now = new Date();
String updaterName = resolveLoginDisplayName(loginUser);
int rows = reviewOrderMapper.update(null, new UpdateWrapper<ReviewOrder>().lambda()
return reviewOrderMapper.update(null, new UpdateWrapper<ReviewOrder>().lambda()
.set(ReviewOrder::getIssuedFlag, "1")
.set(ReviewOrder::getIssuedTime, now)
.set(ReviewOrder::getUpdateBy, loginUser.getUserid())
.set(ReviewOrder::getUpdateByName, updaterName != null ? updaterName : loginUser.getUsername())
.set(ReviewOrder::getUpdateTime, now)
.in(ReviewOrder::getReviewOrderId, toUpdateIds));
return rows > 0;
}
/**
@@ -584,9 +620,9 @@ public class ReviewOrderApplicationService {
taskOrderDO.setWarehouseId(reviewOrderPO.getWarehouseId());
taskOrderDO.setWarehouseCode(reviewOrderPO.getWarehouseCode());
taskOrderDO.setWarehouseName(reviewOrderPO.getWarehouseName());
// 货主与复核单客户一致(出库单货主可能与复核客户口径不同
taskOrderDO.setShipperId(reviewOrderPO.getCustomerId());
taskOrderDO.setShipperName(reviewOrderPO.getCustomerName());
// 货主与出库单/复核单主表货主一致(非客户
taskOrderDO.setShipperId(reviewOrderPO.getShipperId());
taskOrderDO.setShipperName(reviewOrderPO.getShipperName());
taskOrderDO.setOrderNumber(reviewOrderPO.getOutOrderNumber());
taskOrderDO.setPickingOrderNumber(reviewOrderPO.getReviewOrderNumber());
taskOrderDO.setSerialNumber(OrderSequence.getOrderCode("FHZYLS"));
@@ -752,6 +788,32 @@ public class ReviewOrderApplicationService {
reviewOrderMapper.updateById(order);
}
/**
* 复核单状态变更后同步出库作业单 stock_out_task_order:复核类作业单(任务号 FHZY*)与复核单 review_status 一致
* (1 待复核 / 2 复核中 / 3 已复核,见 {@link com.mhd.wms.domain.stockOutTaskOrder.service.StockOutTaskOrderDomainService#mapReviewStatusName})。
*/
private void syncStockOutTaskOrderWithReviewState(Long reviewOrderId) {
if (reviewOrderId == null) {
return;
}
ReviewOrder order = reviewOrderMapper.selectById(reviewOrderId);
if (order == null || StringUtils.isEmpty(order.getReviewOrderNumber()) || order.getReviewStatus() == null) {
return;
}
Date now = new Date();
LoginUser loginUser = SecurityUtils.getLoginUser();
boolean finished = Integer.valueOf(3).equals(order.getReviewStatus());
stockOutTaskOrderService.update(null, new UpdateWrapper<StockOutTaskOrder>().lambda()
.set(StockOutTaskOrder::getStatus, order.getReviewStatus())
.set(StockOutTaskOrder::getUpdateTime, now)
.set(finished, StockOutTaskOrder::getOperatorsEndTime, now)
.set(loginUser != null, StockOutTaskOrder::getUpdateBy, loginUser != null ? loginUser.getUserid() : null)
.set(loginUser != null, StockOutTaskOrder::getUpdateByName, loginUser != null ? resolveLoginDisplayName(loginUser) : null)
.eq(StockOutTaskOrder::getPickingOrderNumber, order.getReviewOrderNumber())
.likeRight(StockOutTaskOrder::getTaskNumber, "FHZY")
.eq(StockOutTaskOrder::getDelFlag, 1));
}
private static BigDecimal nz(BigDecimal v) {
return v == null ? BigDecimal.ZERO : v;
}
@@ -605,11 +605,11 @@ public class ShiftManageApplicationService {
returnShiftMaterialDetailDOChild.setLevel(2);
returnShiftMaterialDetailDOChild.setParentUniqueId(shiftMaterialDetailPO.getUniqueId());
//是否开启了序列号管理
if (shiftMaterialDetailPO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(shiftMaterialDetailDOChild.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + shiftMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (shiftMaterialDetailPO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(shiftMaterialDetailDOChild.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + shiftMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnShiftMaterialDetailDOChild.setMaterialDetailSerialNumberList(returnShiftMaterialDetailDOChild.getMaterialDetailSerialNumberList());
syncTotalWeightVolumeAreaToNetWeight(returnShiftMaterialDetailDOChild);
returnShiftMaterialDetailDOChildList.add(returnShiftMaterialDetailDOChild);
@@ -635,11 +635,11 @@ public class ShiftManageApplicationService {
syncTotalWeightVolumeAreaToNetWeight(returnShiftMaterialDetailDO);
//一级列表 首次收货
//是否开启了序列号管理
if (shiftMaterialDetailPO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(shiftMaterialDetailDO.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + shiftMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (shiftMaterialDetailPO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(shiftMaterialDetailDO.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + shiftMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnShiftMaterialDetailDO.setMaterialDetailSerialNumberList(shiftMaterialDetailDO.getMaterialDetailSerialNumberList());
returnShiftMaterialDetailDO.setChildren(returnShiftMaterialDetailDOChildList);
returnShiftMaterialDetailDOList.add(returnShiftMaterialDetailDO);
@@ -240,11 +240,11 @@ public class StockOutTaskOrderApplicationService {
// 抄码拣货PDA 提交的抄码 id 需透传assembleParam DB 重建 DO 时否则会丢失
returnTaskPickingMaterialDetailDO.setPickedCopyCodeReferenceIds(taskPickingMaterialDetailDO.getPickedCopyCodeReferenceIds());
//是否开启了序列号管理
if (taskPickingMaterialDetailPO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(taskPickingMaterialDetailDO.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + taskPickingMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (taskPickingMaterialDetailPO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(taskPickingMaterialDetailDO.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + taskPickingMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnTaskPickingMaterialDetailDO.setMaterialDetailSerialNumberList(taskPickingMaterialDetailDO.getMaterialDetailSerialNumberList());
returnTaskPickingMaterialDetailDOList.add(returnTaskPickingMaterialDetailDO);
}
@@ -2820,11 +2820,11 @@ public class StockReceiptOrderApplicationService {
returnReceiptMaterialDetailDOChild.setTotalGrossWeight(returnReceiptMaterialDetailDOChild.getAlreadyReceiptGrossWeight());
returnReceiptMaterialDetailDOChild.setTotalVolume(returnReceiptMaterialDetailDOChild.getAlreadyReceiptVolume());
returnReceiptMaterialDetailDOChild.setTotalArea(returnReceiptMaterialDetailDOChild.getAlreadyReceiptArea());
if (receiptMaterialDetailPO.getSerialNumberManage() == 1) {
if (CollectionUtils.isEmpty(receiptMaterialDetailDOChild.getMaterialDetailSerialNumberList())) {
throw new ServiceException("物料【" + receiptMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (receiptMaterialDetailPO.getSerialNumberManage() == 1) {
// if (CollectionUtils.isEmpty(receiptMaterialDetailDOChild.getMaterialDetailSerialNumberList())) {
// throw new ServiceException("物料【" + receiptMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnReceiptMaterialDetailDOChild.setMaterialDetailSerialNumberList(receiptMaterialDetailDOChild.getMaterialDetailSerialNumberList());
returnReceiptMaterialDetailDOChild.setMaterialMoreDetailList(receiptMaterialDetailDOChild.getMaterialMoreDetailList());
if (returnReceiptMaterialDetailDOChild.getAlreadyReceiptQuantity() != null) {
@@ -2888,11 +2888,11 @@ public class StockReceiptOrderApplicationService {
returnReceiptMaterialDetailDO.setReceiptQuantity(parentRetAlreadyQty);
preserveParentReceiptLineHierarchyFromDb(receiptMaterialDetailPO, returnReceiptMaterialDetailDO);
if (receiptMaterialDetailPO.getReceiptStatus() == 1) {
if (receiptMaterialDetailPO.getSerialNumberManage() == 1) {
if (CollectionUtils.isEmpty(receiptMaterialDetailDO.getMaterialDetailSerialNumberList())) {
throw new ServiceException("物料【" + receiptMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (receiptMaterialDetailPO.getSerialNumberManage() == 1) {
// if (CollectionUtils.isEmpty(receiptMaterialDetailDO.getMaterialDetailSerialNumberList())) {
// throw new ServiceException("物料【" + receiptMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnReceiptMaterialDetailDO.setMaterialDetailSerialNumberList(receiptMaterialDetailDO.getMaterialDetailSerialNumberList());
returnReceiptMaterialDetailDO.setMaterialMoreDetailList(receiptMaterialDetailDO.getMaterialMoreDetailList());
} else {
@@ -3144,11 +3144,11 @@ public class StockReceiptOrderApplicationService {
returnReceiptMaterialDetailDOChild.setTotalVolume(returnReceiptMaterialDetailDOChild.getAlreadyReceiptVolume());
returnReceiptMaterialDetailDOChild.setTotalArea(returnReceiptMaterialDetailDOChild.getAlreadyReceiptArea());
//是否开启了序列号管理
if (receiptMaterialDetailPO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(receiptMaterialDetailDOChild.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + receiptMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (receiptMaterialDetailPO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(receiptMaterialDetailDOChild.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + receiptMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnReceiptMaterialDetailDOChild.setMaterialDetailSerialNumberList(receiptMaterialDetailDOChild.getMaterialDetailSerialNumberList());
returnReceiptMaterialDetailDOChild.setMaterialMoreDetailList(receiptMaterialDetailDOChild.getMaterialMoreDetailList());
if (returnReceiptMaterialDetailDOChild.getAlreadyReceiptQuantity() != null) {
@@ -3261,11 +3261,11 @@ public class StockReceiptOrderApplicationService {
if (receiptMaterialDetailPO.getReceiptStatus() == 1){
//一级列表 首次收货
//是否开启了序列号管理
if (receiptMaterialDetailPO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(receiptMaterialDetailDO.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + receiptMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (receiptMaterialDetailPO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(receiptMaterialDetailDO.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + receiptMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnReceiptMaterialDetailDO.setMaterialDetailSerialNumberList(receiptMaterialDetailDO.getMaterialDetailSerialNumberList());
returnReceiptMaterialDetailDO.setMaterialMoreDetailList(receiptMaterialDetailDO.getMaterialMoreDetailList());
}else {
@@ -3390,11 +3390,11 @@ public class StockReceiptOrderApplicationService {
receiptMaterialDetailDOChildByCopy.setAlreadyReceiptQuantity(childQty);
BeanUtils.copyProperties(receiptMaterialDetailDOChildByCopy, receiptMaterialDetailDOChild);
//是否开启了序列号管理
if (receiptMaterialDetailDO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(receiptMaterialDetailDO.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + receiptMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (receiptMaterialDetailDO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(receiptMaterialDetailDO.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + receiptMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
actualQuantity = actualQuantity.add(childQty);
}
}
@@ -3406,11 +3406,11 @@ public class StockReceiptOrderApplicationService {
totalActualReceiptMaterialQuantity += 1;
//一级列表 首次收货
//是否开启了序列号管理
if (receiptMaterialDetailDO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(receiptMaterialDetailDO.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + receiptMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (receiptMaterialDetailDO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(receiptMaterialDetailDO.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + receiptMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
inMaterialDetailDO.setQuantity(receiptMaterialDetailDO.getAlreadyReceiptQuantity());
inMaterialDetailDOList.add(inMaterialDetailDO);
}
@@ -3568,7 +3568,8 @@ public class StockReceiptOrderApplicationService {
//获取仓库控制信息
MaterialWarehouseControlPO materialWarehouseControlPO = materialWarehouseControlService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId());
if (materialWarehouseControlPO == null){
throw new ServiceException("物料仓库控制信息不存在");
// throw new ServiceException("物料仓库控制信息不存在");
materialWarehouseControlPO = new MaterialWarehouseControlPO();
}
receiptMaterialDetailDO.setMaterialWarehouseControlId(materialWarehouseControlPO.getMaterialWarehouseControlId());
receiptMaterialDetailDO.setSerialNumberManage(materialWarehouseControlPO.getSerialNumberManage());
@@ -3582,7 +3583,8 @@ public class StockReceiptOrderApplicationService {
//获取商品规则信息
MaterialGoodsRulePO materialGoodsRulePO = materialGoodsRuleService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId());
if (materialGoodsRulePO == null){
throw new ServiceException("物料商品规则信息不存在");
// throw new ServiceException("物料商品规则信息不存在");
materialGoodsRulePO =new MaterialGoodsRulePO();
}
receiptMaterialDetailDO.setDistributeRuleId(materialGoodsRulePO.getMaterialGoodsRuleId());
receiptMaterialDetailDO.setDistributeRuleCode(materialGoodsRulePO.getRuleCode());
@@ -1890,11 +1890,11 @@ public class StockShelfOrderApplicationService {
returnShelfMaterialDetailDOChild.setParentUniqueId(shelfMaterialDetailPO.getUniqueId());
// 子项不维护独立计划数量计划量仅由主项承载
returnShelfMaterialDetailDOChild.setQuantity(null);
if (shelfMaterialDetailPO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(shelfMaterialDetailPO.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + shelfMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (shelfMaterialDetailPO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(shelfMaterialDetailPO.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + shelfMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnShelfMaterialDetailDOChild.setMaterialDetailSerialNumberList(shelfMaterialDetailDO.getMaterialDetailSerialNumberList());
returnShelfMaterialDetailDOChild.setActualQuantity(returnShelfMaterialDetailDOChild.getShelvesQuantity());
returnShelfMaterialDetailDOChild.setAlreadyShelvesQuantity(childShelvesQty);
@@ -2024,11 +2024,11 @@ public class StockShelfOrderApplicationService {
if (shelfMaterialDetailPO.getShelvesStatus() == 1){
//首次上架
//是否开启了序列号管理
if (shelfMaterialDetailPO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(shelfMaterialDetailDO.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + shelfMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
}
// if (shelfMaterialDetailPO.getSerialNumberManage() == 1){
// if (CollectionUtils.isEmpty(shelfMaterialDetailDO.getMaterialDetailSerialNumberList())){
// throw new ServiceException("物料【" + shelfMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
// }
// }
returnShelfMaterialDetailDO.setMaterialDetailSerialNumberList(shelfMaterialDetailDO.getMaterialDetailSerialNumberList());
}else {
returnShelfMaterialDetailDO.setMaterialDetailSerialNumberList(new ArrayList<>());
@@ -359,7 +359,8 @@ public class MobilizeManageDomainService {
//获取仓库控制信息
MaterialWarehouseControlPO materialWarehouseControlPO = materialWarehouseControlService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId());
if (materialWarehouseControlPO == null){
throw new ServiceException("物料仓库控制信息不存在");
// throw new ServiceException("物料仓库控制信息不存在");
materialWarehouseControlPO = new MaterialWarehouseControlPO();
}
mobilizeManageDetailDO.setMaterialWarehouseControlId(materialWarehouseControlPO.getMaterialWarehouseControlId());
mobilizeManageDetailDO.setSerialNumberManage(materialWarehouseControlPO.getSerialNumberManage());
@@ -174,7 +174,8 @@ public class NoticeMaterialDetailImpl extends ServiceImpl<NoticeMaterialDetailMa
//获取仓库控制信息
MaterialWarehouseControlPO materialWarehouseControlPO = materialWarehouseControlService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId());
if (materialWarehouseControlPO == null){
throw new ServiceException("物料仓库控制信息不存在");
// throw new ServiceException("物料仓库控制信息不存在");
materialWarehouseControlPO = new MaterialWarehouseControlPO();
}
noticeMaterialDetailDO.setMaterialWarehouseControlId(materialWarehouseControlPO.getMaterialWarehouseControlId());
noticeMaterialDetailDO.setSerialNumberManage(materialWarehouseControlPO.getSerialNumberManage());
@@ -208,12 +208,12 @@ public class PickingMaterialDetailImpl extends ServiceImpl<PickingMaterialDetail
pickingMaterialDetailList.add(pickingMaterialDetail);
//判断是否开启了序列号管理
if (pickingMaterialDetailDb.getSerialNumberManage() == 1) {
if (CollectionUtils.isEmpty(pickingMaterialDetailDO.getMaterialDetailSerialNumberList())) {
throw new ServiceException("物料【" + pickingMaterialDetailDb.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
outMaterialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(pickingMaterialDetailDO));
}
// if (pickingMaterialDetailDb.getSerialNumberManage() == 1) {
//// if (CollectionUtils.isEmpty(pickingMaterialDetailDO.getMaterialDetailSerialNumberList())) {
//// throw new ServiceException("物料【" + pickingMaterialDetailDb.getMaterialName() + "】开启了序列号管理的序列号不能为空");
//// }
// outMaterialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(pickingMaterialDetailDO));
// }
totalPickingQuantity = totalPickingQuantity.add(actualQuantity);
}
@@ -46,6 +46,7 @@ import com.mhd.wms.domain.pickingOrder.entity.PickingOrder;
import com.mhd.wms.domain.pickingOrder.repository.facade.IPickingOrderService;
import com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO;
import com.mhd.wms.domain.pickingOrder.repository.todo.PickingOrderDO;
import com.mhd.wms.application.service.reviewOrder.ReviewOrderApplicationService;
import com.mhd.wms.domain.pushSyncBms.PushSyncBmsDomainService;
import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO;
import com.mhd.wms.domain.stockInOrder.service.StockInOrderDomainService;
@@ -99,6 +100,8 @@ public class PickingOrderDomainService {
@Autowired
private ReviewOrderDomainService reviewOrderDomainService;
@Autowired
private ReviewOrderApplicationService reviewOrderApplicationService;
@Autowired
private IHandoverTaskOrderService handoverTaskOrderService;
@Autowired
private IOutOrderAbnormalService outOrderAbnormalService;
@@ -342,7 +345,10 @@ public class PickingOrderDomainService {
StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper<StockOutOrder>()
.eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber()));
if (stockOutOrder != null) {
reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPODb, stockOutOrder);
Long newReviewId = reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPODb, stockOutOrder);
if (newReviewId != null) {
reviewOrderApplicationService.autoDistributeReviewAfterPickingComplete(newReviewId);
}
}
}
return updated;
@@ -716,8 +722,11 @@ public class PickingOrderDomainService {
if (pickingOrderPO.getReview() != null && pickingOrderPO.getReview() == 2) {
genHandoverTaskOrder(pickingOrderPO);
}
// 需要复核且本出库下拣货全部完成时生成复核单并将出库单置为复核中(8)
reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPO, stockOutOrder);
// 需要复核且本出库下拣货全部完成时生成复核单并将出库单置为复核中(8)并自动下发 PDA 复核任务与 stock_out_task_order
Long newReviewId = reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPO, stockOutOrder);
if (newReviewId != null) {
reviewOrderApplicationService.autoDistributeReviewAfterPickingComplete(newReviewId);
}
}
//同步BMS结算系统生成业务单据
//这里只有不需要复核的时候才推送需要复核的在复核流程推送
@@ -16,11 +16,8 @@ import com.mhd.wms.domain.reviewOrder.entity.ReviewMaterialDetail;
import com.mhd.wms.domain.reviewOrder.entity.ReviewOrder;
import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewMaterialDetailMapper;
import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewOrderMapper;
import com.mhd.wms.domain.stockOutTaskOrder.repository.facade.IStockOutTaskOrderService;
import com.mhd.wms.domain.stockOutTaskOrder.repository.todo.StockOutTaskOrderDO;
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
import com.mhd.wms.domain.stockOutOrder.repository.facade.IStockOutOrderService;
import com.mhd.wms.domain.taskPickingMaterialDetail.repository.todo.TaskPickingMaterialDetailDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -55,21 +52,21 @@ public class ReviewOrderDomainService {
@Autowired
private IStockOutOrderService stockOutOrderService;
@Autowired
private IStockOutTaskOrderService stockOutTaskOrderService;
/**
* 拣货全部完成后若出库单需要复核则生成复核单头+明细并将出库单状态置为复核中(8)
* 仅处理普通拣货单type=1波次拣货type=2暂不生成避免一单多出库口径不一致
*
* @return 新生成的复核单主键未生成时返回 null调用方用于自动 PDA 复核下发与 stock_out_task_order
*/
@Transactional(rollbackFor = Exception.class)
public void tryGenerateReviewOrderAfterPickingComplete(PickingOrderPO pickingOrderPO, StockOutOrder stockOutOrder) {
public Long tryGenerateReviewOrderAfterPickingComplete(PickingOrderPO pickingOrderPO, StockOutOrder stockOutOrder) {
if (pickingOrderPO == null || stockOutOrder == null) {
return;
return null;
}
String outOrderNumber = pickingOrderPO.getOrderNumber();
if (outOrderNumber == null) {
return;
return null;
}
// 是否复核以出库单为准1- 2- StockOutOrder 一致拣货单 PO review 可能未映射或为 null
Integer needReview = stockOutOrder.getReview();
@@ -79,11 +76,11 @@ public class ReviewOrderDomainService {
if (!Integer.valueOf(1).equals(needReview)) {
log.info("跳过生成复核单:出库单未勾选需要复核(出库单 review 须为 1) outOrderNumber={} stockOutReview={} pickingReview={}",
outOrderNumber, stockOutOrder.getReview(), pickingOrderPO.getReview());
return;
return null;
}
if (!Integer.valueOf(1).equals(pickingOrderPO.getType())) {
log.info("跳过生成复核单:仅普通拣货单(type=1)生成,当前 type={} outOrderNumber={}", pickingOrderPO.getType(), outOrderNumber);
return;
return null;
}
List<PickingOrder> pickingOrders = pickingOrderService.list(new LambdaQueryWrapper<PickingOrder>()
@@ -92,13 +89,13 @@ public class ReviewOrderDomainService {
.eq(PickingOrder::getDelFlag, 1));
if (pickingOrders.isEmpty()) {
log.warn("跳过生成复核单:未找到普通拣货单记录 outOrderNumber={}", outOrderNumber);
return;
return null;
}
boolean allPickingFinished = pickingOrders.stream()
.allMatch(p -> p.getStatus() != null && p.getStatus() == 3);
if (!allPickingFinished) {
log.info("跳过生成复核单:同一出库单下尚未全部完成拣货(需全部拣货单 status=3) outOrderNumber={}", outOrderNumber);
return;
return null;
}
long exists = reviewOrderMapper.selectCount(new LambdaQueryWrapper<ReviewOrder>()
@@ -106,7 +103,7 @@ public class ReviewOrderDomainService {
.eq(ReviewOrder::getDelFlag, 1));
if (exists > 0) {
log.info("跳过生成复核单:该出库单已存在复核单 outOrderNumber={}", outOrderNumber);
return;
return null;
}
LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -149,6 +146,9 @@ public class ReviewOrderDomainService {
header.setCustomerId(stockOutOrder.getCustomerId());
header.setCustomerCode(stockOutOrder.getCustomerCode());
header.setCustomerName(stockOutOrder.getCustomerName());
header.setShipperId(stockOutOrder.getShipperId());
header.setShipperCode(stockOutOrder.getShipperCode());
header.setShipperName(stockOutOrder.getShipperName());
header.setDelFlag(1);
String operatorDisplayName = resolveLoginDisplayName(loginUser);
header.setCreateBy(loginUser.getUserid());
@@ -183,10 +183,9 @@ public class ReviewOrderDomainService {
if (detailInserted == 0) {
reviewOrderMapper.deleteById(reviewOrderId);
log.info("跳过生成复核单:拣货明细无已拣货数量>0 的行 outOrderNumber={}", outOrderNumber);
return;
return null;
}
// 复核也生成作业单同拣货作业单表结构用于作业任务跟踪
genStockOutTaskOrderForReview(header, loginUser, now);
// stock_out_task_order PDA 复核任务下发由调用方在应用层自动触发 PC 复核下发同一套逻辑
StockOutOrder statusUpdate = new StockOutOrder();
statusUpdate.setStatus(8);
@@ -196,7 +195,8 @@ public class ReviewOrderDomainService {
stockOutOrderService.update(statusUpdate, new LambdaQueryWrapper<StockOutOrder>()
.eq(StockOutOrder::getOutOrderNumber, outOrderNumber));
log.info("拣货完成已生成复核单 reviewOrderNumber={} outOrderNumber={}", reviewOrderNumber, outOrderNumber);
log.info("拣货完成已生成复核单 reviewOrderNumber={} outOrderNumber={} reviewOrderId={}", reviewOrderNumber, outOrderNumber, reviewOrderId);
return reviewOrderId;
}
private ReviewMaterialDetail buildDetailFromPicking(PickingMaterialDetail line, Long reviewOrderId, String reviewOrderNumber,
@@ -223,6 +223,7 @@ public class ReviewOrderDomainService {
if (pending == null) {
pending = BigDecimal.ZERO;
}
d.setMaterialPlanQty(pending);
d.setPendingReviewQty(pending);
d.setReviewedQty(BigDecimal.ZERO);
d.setCancelQty(BigDecimal.ZERO);
@@ -310,82 +311,6 @@ public class ReviewOrderDomainService {
return d;
}
/**
* 复核单生成后同步生成一张作业单到 stock_out_task_order结构与拣货作业单一致
*/
private void genStockOutTaskOrderForReview(ReviewOrder header, LoginUser loginUser, Date now) {
if (header == null || header.getReviewOrderNumber() == null) {
return;
}
// 防重复同一个复核单号只生成一张作业单
long exists = stockOutTaskOrderService.count(new LambdaQueryWrapper<com.mhd.wms.domain.stockOutTaskOrder.entity.StockOutTaskOrder>()
.eq(com.mhd.wms.domain.stockOutTaskOrder.entity.StockOutTaskOrder::getPickingOrderNumber, header.getReviewOrderNumber())
.eq(com.mhd.wms.domain.stockOutTaskOrder.entity.StockOutTaskOrder::getDelFlag, 1));
if (exists > 0) {
return;
}
List<ReviewMaterialDetail> reviewRows = reviewMaterialDetailMapper.selectList(new LambdaQueryWrapper<ReviewMaterialDetail>()
.eq(ReviewMaterialDetail::getReviewOrderId, header.getReviewOrderId())
.eq(ReviewMaterialDetail::getDelFlag, 1));
if (reviewRows == null || reviewRows.isEmpty()) {
return;
}
StockOutTaskOrderDO taskDO = new StockOutTaskOrderDO();
taskDO.setOrganizationId(header.getOrganizationId());
taskDO.setOrganizationName(header.getOrganizationName());
taskDO.setTopOrganizationId(header.getTopOrganizationId());
taskDO.setWarehouseId(header.getWarehouseId());
taskDO.setWarehouseCode(header.getWarehouseCode());
taskDO.setWarehouseName(header.getWarehouseName());
taskDO.setShipperId(header.getCustomerId());
taskDO.setShipperName(header.getCustomerName());
taskDO.setOrderNumber(header.getOutOrderNumber());
taskDO.setPickingOrderNumber(header.getReviewOrderNumber());
taskDO.setSerialNumber(OrderSequence.getOrderCode("FHZYLS"));
taskDO.setTaskNumber(OrderSequence.getOrderCode("FHZY"));
taskDO.setStatus(1);
// 复用字段type=1 代表按单作业与拣货任务一致口径
taskDO.setType(1);
taskDO.setOperatorsBy(loginUser != null ? loginUser.getUserid() : null);
taskDO.setOperatorsName(resolveLoginDisplayName(loginUser));
taskDO.setCreateBy(loginUser != null ? loginUser.getUserid() : null);
taskDO.setCreateByName(resolveLoginDisplayName(loginUser));
taskDO.setCreateTime(now);
taskDO.setUpdateBy(loginUser != null ? loginUser.getUserid() : null);
taskDO.setUpdateByName(resolveLoginDisplayName(loginUser));
taskDO.setUpdateTime(now);
List<TaskPickingMaterialDetailDO> detailDOList = reviewRows.stream().map(r -> {
TaskPickingMaterialDetailDO d = new TaskPickingMaterialDetailDO();
d.setMaterialDetailId(r.getMaterialDetailId());
d.setOrganizationId(header.getOrganizationId());
d.setOrganizationName(header.getOrganizationName());
d.setTopOrganizationId(header.getTopOrganizationId());
d.setMaterialBaseInfoId(r.getMaterialBaseInfoId());
d.setMaterialCode(r.getMaterialCode());
d.setMaterialName(r.getMaterialName());
d.setBarCode(r.getBarCode());
d.setQuantity(r.getPendingReviewQty());
d.setActualQuantity(r.getPendingReviewQty());
d.setPickingQuantity(BigDecimal.ZERO);
d.setPickingStatus(1);
d.setUnitCode(r.getUnitCode());
d.setUnitName(r.getUnitName());
d.setBatchNumber(r.getBatchNumber());
d.setRemark(r.getRemark());
d.setTotalNetWeight(r.getNetWeightKg());
d.setTotalGrossWeight(r.getGrossWeightKg());
d.setTotalVolume(r.getVolumeCbm());
d.setTotalArea(r.getAreaSqm());
d.setPickingUniqueId(r.getOutUniqueId());
return d;
}).collect(java.util.stream.Collectors.toList());
taskDO.setTaskPickingMaterialDetailList(detailDOList);
stockOutTaskOrderService.genStockPickingTaskOrder(java.util.Collections.singletonList(taskDO));
}
/** 与拣货领域一致:优先 userPo.userName(姓名),其次 LoginUser.realname,最后 username(账号兜底) */
private static String resolveLoginDisplayName(LoginUser loginUser) {
if (loginUser == null) {
@@ -52,6 +52,9 @@ public class ReviewMaterialDetail extends BaseVOEntity {
private BigDecimal cancelQty;
@ApiModelProperty("物料计划数量(拣货明细实际拣货数量快照,复核过程不修改)")
private BigDecimal materialPlanQty;
private String receiptOrderNumber;
private String lotNo;
@@ -50,6 +50,11 @@ public class ReviewOrder extends BaseVOEntity {
private String customerName;
/** 货主(与出库单 stock_out_order 一致;id 通常为用户中心 userId) */
private Long shipperId;
private String shipperCode;
private String shipperName;
private Date receiveTime;
private String remark;
@@ -64,6 +64,9 @@ public class ReviewMaterialDetailPO extends BaseVOEntity {
@ApiModelProperty("取消复核数量")
private BigDecimal cancelQty;
@ApiModelProperty("物料计划数量(拣货实际拣货数量,生成复核明细时落库)")
private BigDecimal materialPlanQty;
@ApiModelProperty("入库单号")
private String receiptOrderNumber;
@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@@ -67,6 +68,15 @@ public class ReviewOrderPO extends BaseVOEntity {
@ApiModelProperty("客户名称")
private String customerName;
@ApiModelProperty("货主ID")
private Long shipperId;
@ApiModelProperty("货主编码")
private String shipperCode;
@ApiModelProperty("货主名称")
private String shipperName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("下发确认时间(PDA 点击确定/接收的时间)")
@@ -75,6 +85,15 @@ public class ReviewOrderPO extends BaseVOEntity {
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("物料种类(明细中不重复的物料基础信息数量)")
private Integer materialKindCount;
@ApiModelProperty("物料总数量(各明细计划数量合计,计划量=待复核+已复核,来源于拣货数量)")
private BigDecimal totalPlanQty;
@ApiModelProperty("复核总数量(各明细已复核数量合计)")
private BigDecimal totalReviewedQty;
/** 详情与上架单一致:头字段扁平 + 明细列表 */
@ApiModelProperty("复核明细")
private List<ReviewMaterialDetailPO> materialDetailList;
@@ -41,6 +41,15 @@ public class ReviewOrderDO extends BaseVOEntity {
@ApiModelProperty("客户名称(模糊)")
private String customerName;
@ApiModelProperty("货主名称")
private String shipperName;
@ApiModelProperty("货主ID")
private Long shipperId;
@ApiModelProperty("货主代码")
private String shipperCode;
@ApiModelProperty("创建时间起(字符串,格式与库一致即可,如 yyyy-MM-dd)")
private String createTimeStart;
@@ -400,12 +400,12 @@ public class ShelfMaterialDetailImpl extends ServiceImpl<ShelfMaterialDetailMapp
//更新oms入库单信息
OMSWarehouseEntryDetails(shelfMaterialDetailDO);
//序列号
if (shelfMaterialDetailDO.getSerialNumberManage() == 1) {
if (CollectionUtils.isEmpty(shelfMaterialDetailDO.getMaterialDetailSerialNumberList())) {
throw new ServiceException("物料【" + shelfMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(shelfMaterialDetailDO));
}
// if (shelfMaterialDetailDO.getSerialNumberManage() == 1) {
//// if (CollectionUtils.isEmpty(shelfMaterialDetailDO.getMaterialDetailSerialNumberList())) {
//// throw new ServiceException("物料【" + shelfMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
//// }
// materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(shelfMaterialDetailDO));
// }
BigDecimal totalActualQuantity = shelfMaterialDetailDO.getActualQuantity() != null ? shelfMaterialDetailDO.getActualQuantity() : BigDecimal.ZERO;
//判断是否存在子项
List<ShelfMaterialDetailDO> inMaterialDetailDOChildList = shelfMaterialDetailDO.getChildren();
@@ -425,12 +425,12 @@ public class ShelfMaterialDetailImpl extends ServiceImpl<ShelfMaterialDetailMapp
shelfMaterialDetailChild.setCreateTime(new Date());
shelfMaterialDetailChildList.add(shelfMaterialDetailChild);
//序列号
if (shelfMaterialDetailDO.getSerialNumberManage() == 1) {
if (CollectionUtils.isEmpty(shelfMaterialDetailDOChild.getMaterialDetailSerialNumberList())) {
throw new ServiceException("物料【" + shelfMaterialDetailDOChild.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(shelfMaterialDetailDOChild));
}
// if (shelfMaterialDetailDO.getSerialNumberManage() == 1) {
//// if (CollectionUtils.isEmpty(shelfMaterialDetailDOChild.getMaterialDetailSerialNumberList())) {
//// throw new ServiceException("物料【" + shelfMaterialDetailDOChild.getMaterialName() + "】开启了序列号管理的序列号不能为空");
//// }
// materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(shelfMaterialDetailDOChild));
// }
BigDecimal childActualQuantity = shelfMaterialDetailDOChild.getActualQuantity() != null ? shelfMaterialDetailDOChild.getActualQuantity() : BigDecimal.ZERO;
totalActualQuantity = totalActualQuantity.add(childActualQuantity);
}
@@ -243,13 +243,13 @@ public class ShiftManageImpl extends ServiceImpl<ShiftManageMapper, ShiftManage>
shiftMaterialDetailDO.setUnitName(packDetailFeignPO.getName());
shiftMaterialDetailDO.setUnitNumber(packDetailFeignPO.getNumber());
//获取仓库控制信息
MaterialWarehouseControlPO materialWarehouseControlPO = materialWarehouseControlService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId());
if (materialWarehouseControlPO == null){
throw new ServiceException("物料仓库控制信息不存在");
}
shiftMaterialDetailDO.setMaterialWarehouseControlId(materialWarehouseControlPO.getMaterialWarehouseControlId());
shiftMaterialDetailDO.setSerialNumberManage(materialWarehouseControlPO.getSerialNumberManage());
// //获取仓库控制信息
// MaterialWarehouseControlPO materialWarehouseControlPO = materialWarehouseControlService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId());
// if (materialWarehouseControlPO == null){
// throw new ServiceException("物料仓库控制信息不存在");
// }
// shiftMaterialDetailDO.setMaterialWarehouseControlId(materialWarehouseControlPO.getMaterialWarehouseControlId());
// shiftMaterialDetailDO.setSerialNumberManage(materialWarehouseControlPO.getSerialNumberManage());
}
@@ -631,12 +631,12 @@ public class ShiftMaterialDetailImpl extends ServiceImpl<ShiftMaterialDetailMapp
List<OutMaterialDetailSerialNumber> materialDetailSerialNumberList = new ArrayList<>();
for (ShiftMaterialDetailDO shiftMaterialDetailDO : shiftMaterialDetailDOList){
//序列号
if (shiftMaterialDetailDO.getSerialNumberManage() == 1) {
if (CollectionUtils.isEmpty(shiftMaterialDetailDO.getMaterialDetailSerialNumberList())) {
throw new ServiceException("物料【" + shiftMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(shiftMaterialDetailDO));
}
// if (shiftMaterialDetailDO.getSerialNumberManage() == 1) {
//// if (CollectionUtils.isEmpty(shiftMaterialDetailDO.getMaterialDetailSerialNumberList())) {
//// throw new ServiceException("物料【" + shiftMaterialDetailDO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
//// }
// materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(shiftMaterialDetailDO));
// }
//判断是否存在子项
List<ShiftMaterialDetailDO> shiftMaterialDetailDOChildList = shiftMaterialDetailDO.getChildren();
List<ShiftMaterialDetail> shiftMaterialDetailListChild = new ArrayList<>();
@@ -655,12 +655,12 @@ public class ShiftMaterialDetailImpl extends ServiceImpl<ShiftMaterialDetailMapp
}
shiftMaterialDetailListChild.add(shiftMaterialDetailChild);
//序列号
if (shiftMaterialDetailDO.getSerialNumberManage() == 1) {
if (CollectionUtils.isEmpty(shiftMaterialDetailDOChild.getMaterialDetailSerialNumberList())) {
throw new ServiceException("物料【" + shiftMaterialDetailDOChild.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(shiftMaterialDetailDOChild));
}
// if (shiftMaterialDetailDO.getSerialNumberManage() == 1) {
//// if (CollectionUtils.isEmpty(shiftMaterialDetailDOChild.getMaterialDetailSerialNumberList())) {
//// throw new ServiceException("物料【" + shiftMaterialDetailDOChild.getMaterialName() + "】开启了序列号管理的序列号不能为空");
//// }
// materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(shiftMaterialDetailDOChild));
// }
}
}
ShiftMaterialDetail shiftMaterialDetail = new ShiftMaterialDetail();
@@ -517,19 +517,7 @@ public class StockInOrderDomainService {
if (!batchInsertResult) {
throw new ServiceException("生成收货单失败");
}
//生成收货任务根据入库单号查询刚生成收货单
List<StockReceiptOrderPO> stockReceiptOrderPOList = new ArrayList<>();
for (String inOrderNumber : inOrderNumberList) {
StockReceiptOrderDO stockReceiptOrderDOQuery = new StockReceiptOrderDO();
stockReceiptOrderDOQuery.setInOrderNumber(inOrderNumber);
List<StockReceiptOrderPO> receiptOrderList = stockReceiptOrderDomainService.queryList(stockReceiptOrderDOQuery);
if (!CollectionUtils.isEmpty(receiptOrderList)) {
stockReceiptOrderPOList.addAll(receiptOrderList);
}
}
if (!CollectionUtils.isEmpty(stockReceiptOrderPOList)) {
stockReceiptOrderDomainService.genStockReceiptTaskOrder(stockReceiptOrderPOList);
}
// 入库作业单收货 type=1收货任务下发时生成审核通过仅生成收货单与质检等此处不再落 stock_in_task_order
return batchInsertResult;
}
@@ -605,7 +593,8 @@ public class StockInOrderDomainService {
//获取商品规则信息
MaterialGoodsRulePO materialGoodsRulePO = materialGoodsRuleService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId());
if (materialGoodsRulePO == null){
throw new ServiceException("物料商品规则信息不存在");
// throw new ServiceException("物料商品规则信息不存在");
materialGoodsRulePO =new MaterialGoodsRulePO();
}
inMaterialDetailDO.setDistributeRuleId(materialGoodsRulePO.getMaterialGoodsRuleId());
inMaterialDetailDO.setDistributeRuleCode(materialGoodsRulePO.getRuleCode());
@@ -34,6 +34,7 @@ import com.mhd.wms.domain.pickingOrder.entity.PickingOrder;
import com.mhd.wms.domain.pickingOrder.repository.facade.IPickingOrderService;
import com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO;
import com.mhd.wms.domain.pickingOrder.repository.todo.PickingOrderDO;
import com.mhd.wms.application.service.reviewOrder.ReviewOrderApplicationService;
import com.mhd.wms.domain.pickingOrder.service.ReviewOrderDomainService;
import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO;
import com.mhd.wms.domain.stockInOrder.service.StockInOrderDomainService;
@@ -110,6 +111,8 @@ public class StockOutTaskOrderDomainService {
private CopyCodeReferenceDomainService copyCodeReferenceDomainService;
@Autowired
private ReviewOrderDomainService reviewOrderDomainService;
@Autowired
private ReviewOrderApplicationService reviewOrderApplicationService;
@Resource
private OutMaterialDetailMapper outMaterialDetailMapper;
@@ -892,7 +895,10 @@ public class StockOutTaskOrderDomainService {
StockOutOrder so = stockOutOrderService.getOne(new LambdaQueryWrapper<StockOutOrder>()
.eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber()));
if (so != null) {
reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPODb, so);
Long newReviewId = reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPODb, so);
if (newReviewId != null) {
reviewOrderApplicationService.autoDistributeReviewAfterPickingComplete(newReviewId);
}
}
}
return stockOutUpdated;
@@ -55,6 +55,7 @@ import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetai
import com.mhd.wms.domain.stockInOrder.entity.StockInOrder;
import com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService;
import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO;
import com.mhd.wms.domain.stockInTaskOrder.entity.StockInTaskOrder;
import com.mhd.wms.domain.stockInTaskOrder.repository.facade.IStockInTaskOrderService;
import com.mhd.wms.domain.stockInTaskOrder.repository.todo.StockInTaskOrderDO;
import com.mhd.wms.domain.stockReceiptOrder.entity.StockReceiptOrder;
@@ -396,6 +397,8 @@ public class StockReceiptOrderDomainService {
}
//收货生成任务下发
genDeliveTask(stockReceiptOrderPOList, stockReceiptOrderDO);
// 下发时生成收货入库作业单 type=1作业人/完成时间在 PDA/PC 实际完成收货时回写
genStockReceiptTaskOrder(stockReceiptOrderPOList);
//标记收货单任务已下发
return stockReceiptOrderService.update(null, new UpdateWrapper<StockReceiptOrder>().lambda()
.set(StockReceiptOrder::getTaskDistribution, 1)
@@ -444,8 +447,7 @@ public class StockReceiptOrderDomainService {
receiptMaterialDetailService.batchReceiptUpdate(stockReceiptOrderDO);
// 同步更新入库单明细的收货数量入库单 totalNetWeight/totalGrossWeight/totalVolume/totalArea 不因收货改库 sync 内注释
syncUpdateInMaterialDetailFromReceipt(stockReceiptOrderDO, stockReceiptOrderPO);
//生成 收货作业单
genStockReceiptTaskOrderByReceivingGoods(stockReceiptOrderPO,stockReceiptOrderDO);
// 收货类入库作业单在任务下发时生成此处不再生成 type=1 作业单
//收货后上架前 生成质检
genQualityInspectionByReceivingGoods(stockReceiptOrderDO);
//saveAmount(stockReceiptOrderDO);
@@ -856,6 +858,10 @@ public class StockReceiptOrderDomainService {
}
//根据收货数量生成上架PDA=是否下发是PC=是否下发否
genStockShelfOrder(stockReceiptOrderPO, fromPda);
// PDA 收货完成时生成上架入库作业单 type=2PC 仍在上架作业时按单生成
if (Boolean.TRUE.equals(fromPda)) {
stockShelfOrderDomainService.tryGenStockShelfInTaskOrderAfterPdaReceiptComplete(stockReceiptOrderPO.getReceiptOrderNumber());
}
//生成上架单后更新入库单状态为4上架中
if (StringUtils.isNotBlank(stockReceiptOrderPO.getInOrderNumber())) {
@@ -889,11 +895,34 @@ public class StockReceiptOrderDomainService {
.set(StockReceiptOrder::getUpdateByName, loginUser.getUsername())
.set(StockReceiptOrder::getUpdateTime, new Date())
.eq(StockReceiptOrder::getReceiptOrderId, receiptOrderId));
if (update) {
markReceiptTypeStockInTaskOrderOnComplete(stockReceiptOrderPO.getReceiptOrderNumber(), loginUser, userRealName);
}
//推送bms
//wholeRentSynchronizationZXF(receiptOrderId);
return update;
}
/**
* 收货实际完成时回写收货类入库作业单type=1的作业人作业完成时间下发/生成时不下发填写
*/
private void markReceiptTypeStockInTaskOrderOnComplete(String receiptOrderNumber, LoginUser loginUser, String userRealName) {
if (StringUtils.isBlank(receiptOrderNumber) || loginUser == null) {
return;
}
Date now = new Date();
stockInTaskOrderService.update(null, new UpdateWrapper<StockInTaskOrder>().lambda()
.set(StockInTaskOrder::getOperatorsBy, loginUser.getUserid())
.set(StockInTaskOrder::getOperatorsName, userRealName)
.set(StockInTaskOrder::getOperatorsEndTime, now)
.set(StockInTaskOrder::getUpdateBy, loginUser.getUserid())
.set(StockInTaskOrder::getUpdateByName, userRealName)
.set(StockInTaskOrder::getUpdateTime, now)
.eq(StockInTaskOrder::getReceiptOrderNumber, receiptOrderNumber)
.eq(StockInTaskOrder::getType, 1)
.eq(StockInTaskOrder::getDelFlag, 1));
}
public void updateInOrder(StockReceiptOrderDTO stockReceiptOrderDTO) {
String inOrderNumber = stockReceiptOrderDTO.getInOrderNumber();
Long receiptOrderId = stockReceiptOrderDTO.getReceiptOrderId();
@@ -1072,8 +1101,19 @@ public class StockReceiptOrderDomainService {
receiptMaterialUpdateWrapper.setSql("already_receipt_quantity = quantity ");
receiptMaterialUpdateWrapper.setSql("receipt_quantity = quantity ");
receiptMaterialDetailService.update(receiptMaterialUpdateWrapper);
//整单收获生成 收获作业单
genStockReceiptTaskOrder(stockReceiptOrderPOList);
// 整单收货完成回写收货类入库作业单 type=1 的作业人/完成时间
final String userRealNameEntire = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
&& !loginUser.getUserPo().getUserName().trim().isEmpty())
? loginUser.getUserPo().getUserName()
: (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty())
? loginUser.getRealname()
: loginUser.getUsername();
for (StockReceiptOrderPO p : stockReceiptOrderPOList) {
if (p != null && StringUtils.isNotBlank(p.getReceiptOrderNumber())) {
markReceiptTypeStockInTaskOrderOnComplete(p.getReceiptOrderNumber(), loginUser, userRealNameEntire);
}
}
// 整单收货不再在此处生成收货入库作业单由后续任务下发生成 type=1 作业单
//完成收货 生成上架单
return genStockShelfOrderByEntireReceipt(stockReceiptOrderPOList);
}
@@ -1124,8 +1164,7 @@ public class StockReceiptOrderDomainService {
public Boolean saveReceiptOrder(StockReceiptOrderDO stockReceiptOrderDO) {
//保存收货单及物料明细信息
receiptMaterialDetailService.noOrderReceiptInsert(stockReceiptOrderDO);
//生成 收货作业单
genStockReceiptTaskOrderByReceivingGoods(null, stockReceiptOrderDO);
// 无单收货的收货类入库作业单在任务下发时统一生成
//收货后上架前 生成质检
genQualityInspectionByReceivingGoods(stockReceiptOrderDO);
//根据收货数量生成上架
@@ -1572,14 +1611,9 @@ public class StockReceiptOrderDomainService {
stockInTaskOrderDO.setSerialNumber(OrderSequence.getOrderCode("SHZYLS"));
stockInTaskOrderDO.setTaskNumber(OrderSequence.getOrderCode("SHZY"));
stockInTaskOrderDO.setType(1);//收货
if (ObjectUtil.isNotNull(stockReceiptOrderPO)){
stockInTaskOrderDO.setOperatorsBy(stockReceiptOrderPO.getOperatorsBy());
stockInTaskOrderDO.setOperatorsName(stockReceiptOrderPO.getOperatorsName());
}else {
stockInTaskOrderDO.setOperatorsBy(SecurityUtils.getLoginUser().getUserPo().getUserId());
stockInTaskOrderDO.setOperatorsName(SecurityUtils.getLoginUser().getUserPo().getUserName());
}
stockInTaskOrderDO.setOperatorsEndTime(new Date());
stockInTaskOrderDO.setOperatorsBy(null);
stockInTaskOrderDO.setOperatorsName(null);
stockInTaskOrderDO.setOperatorsEndTime(null);
BigDecimal actualQuantity = BigDecimal.ZERO;
List<TaskReceiptMaterialDetailDO> taskReceiptMaterialDetailDOList = new ArrayList<>();
for (ReceiptMaterialDetailDO receiptMaterialDetailDO : stockReceiptOrderDO.getMaterialDetailList()){
@@ -1632,7 +1666,9 @@ public class StockReceiptOrderDomainService {
stockInTaskOrderDO.setTaskNumber(OrderSequence.getOrderCode("SHZY"));
stockInTaskOrderDO.setType(1);//收货
stockInTaskOrderDO.setActualQuantity(stockReceiptOrderPO.getQuantity());
stockInTaskOrderDO.setOperatorsEndTime(new Date());
stockInTaskOrderDO.setOperatorsBy(null);
stockInTaskOrderDO.setOperatorsName(null);
stockInTaskOrderDO.setOperatorsEndTime(null);
List<ReceiptMaterialDetailPO> receiptMaterialDetailPODbs = receiptMaterialDetailPOListMap.get(stockReceiptOrderPO.getReceiptOrderNumber());
if (!CollectionUtils.isEmpty(receiptMaterialDetailPODbs)) {
List<TaskReceiptMaterialDetailDO> taskReceiptMaterialDetailDOList = JSONUtil.toList(JSONUtil.parseArray(receiptMaterialDetailPODbs), TaskReceiptMaterialDetailDO.class);
@@ -6,6 +6,7 @@ import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -67,6 +68,7 @@ import com.mhd.wms.domain.shelfMaterialDetail.repository.po.ShelfMaterialDetailP
import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO;
import com.mhd.wms.domain.stockInOrder.entity.StockInOrder;
import com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService;
import com.mhd.wms.domain.stockInTaskOrder.entity.StockInTaskOrder;
import com.mhd.wms.domain.stockInTaskOrder.repository.facade.IStockInTaskOrderService;
import com.mhd.wms.domain.stockInTaskOrder.repository.todo.StockInTaskOrderDO;
import com.mhd.wms.domain.stockShelfOrder.entity.StockShelfOrder;
@@ -357,8 +359,10 @@ public class StockShelfOrderDomainService {
userRealNameUpShelf);
//同步更新入库单明细的上架数量/上架状态
syncShelvesQuantityToInMaterialDetail(stockShelfOrderDO);
//生成 上架作业单
genStockShelfTaskOrderByUpShelf(stockShelfOrderDO);
// 上架类入库作业单 type=2PDA 已在收货完成时生成若尚未生成 PC 路径则在本环节补生成
if (countShelfTypeInTaskOrder(stockShelfOrderPO.getShelfOrderNumber()) == 0) {
genStockShelfTaskOrderByUpShelf(stockShelfOrderDO);
}
//修改入库单状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库
updateStockInOrder(stockShelfOrderPO, 4);
//保存库存序列号数据
@@ -696,6 +700,7 @@ public class StockShelfOrderDomainService {
}
String userRealNameComplete = resolveUserRealNameForShelf(loginUser);
updateShelfMaterialDetailShelvesStatusWhenOrderCompleted(stockShelfOrderPO, loginUser, userRealNameComplete);
markShelfTypeStockInTaskOrderOnComplete(stockShelfOrderPO.getShelfOrderNumber(), loginUser, userRealNameComplete);
//推送业务数据到BMS系统
// pushSyncBmsDomainService.pushInShelfOrder(stockShelfOrderPO.getInOrderNumber());
stockShelfOrderService.updateOmsOrder(stockShelfOrderPO.getInOrderNumber(), 4,
@@ -915,6 +920,26 @@ public class StockShelfOrderDomainService {
return loginUser.getUsername() != null ? loginUser.getUsername() : "";
}
/**
* 上架实际完成时回写上架类入库作业单type=2的作业人作业完成时间下发/生成时不下发填写
*/
private void markShelfTypeStockInTaskOrderOnComplete(String shelfOrderNumber, LoginUser loginUser, String userRealName) {
if (StringUtils.isBlank(shelfOrderNumber) || loginUser == null) {
return;
}
Date now = new Date();
stockInTaskOrderService.update(null, new UpdateWrapper<StockInTaskOrder>().lambda()
.set(StockInTaskOrder::getOperatorsBy, loginUser.getUserid())
.set(StockInTaskOrder::getOperatorsName, userRealName)
.set(StockInTaskOrder::getOperatorsEndTime, now)
.set(StockInTaskOrder::getUpdateBy, loginUser.getUserid())
.set(StockInTaskOrder::getUpdateByName, userRealName)
.set(StockInTaskOrder::getUpdateTime, now)
.eq(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumber)
.eq(StockInTaskOrder::getType, 2)
.eq(StockInTaskOrder::getDelFlag, 1));
}
private synchronized void stockIn(List<ShelfMaterialDetail> shelfMaterialDetailDOList, StockShelfOrderDO stockReceiptOrderDO) {
for (ShelfMaterialDetail shelfMaterialDetail : shelfMaterialDetailDOList) {
Long materialBaseInfoId = shelfMaterialDetail.getMaterialBaseInfoId();
@@ -1435,13 +1460,104 @@ public class StockShelfOrderDomainService {
stockInTaskOrderDO.setSerialNumber(OrderSequence.getOrderCode("SHZYLS"));
stockInTaskOrderDO.setTaskNumber(OrderSequence.getOrderCode("SHZY"));
stockInTaskOrderDO.setType(2);//上架
stockInTaskOrderDO.setOperatorsBy(null);
stockInTaskOrderDO.setOperatorsName(null);
stockInTaskOrderDO.setOperatorsEndTime(null);
// 作业单作业数量对应 stock_in_task_order.actual_quantity上架单汇总在 receipt_quantity字段名不一致不会从 copyProperties 带入需按实际收货量赋值
BigDecimal workQty = stockInTaskOrderDO.getActualQuantity();
if (workQty == null || workQty.compareTo(BigDecimal.ZERO) == 0) {
workQty = stockShelfOrderDO.getReceiptQuantity();
}
if ((workQty == null || workQty.compareTo(BigDecimal.ZERO) == 0)
&& !CollectionUtils.isEmpty(stockShelfOrderDO.getMaterialDetailList())) {
workQty = sumShelfMaterialDetailQuantities(stockShelfOrderDO.getMaterialDetailList());
}
stockInTaskOrderDO.setActualQuantity(workQty != null ? workQty : BigDecimal.ZERO);
List<TaskShelfMaterialDetailDO> taskReceiptMaterialDetailDOList = stockShelfOrderDO.getMaterialDetailList().stream()
.map(shelfMaterialDetailDO -> JSONUtil.toBean(JSONUtil.toJsonStr(shelfMaterialDetailDO), TaskShelfMaterialDetailDO.class))
.collect(Collectors.toList());
for (TaskShelfMaterialDetailDO d : taskReceiptMaterialDetailDOList) {
if (d.getChildren() == null) {
d.setChildren(new ArrayList<>());
}
}
stockInTaskOrderDO.setTaskShelfMaterialDetailList(taskReceiptMaterialDetailDOList);
return stockInTaskOrderService.genStockShelfTaskOrder(Collections.singletonList(stockInTaskOrderDO));
}
/** 汇总上架明细计划数量(与收货实际量一致),含子行树 */
private static BigDecimal sumShelfMaterialDetailQuantities(List<ShelfMaterialDetailDO> lines) {
if (CollectionUtils.isEmpty(lines)) {
return BigDecimal.ZERO;
}
BigDecimal sum = BigDecimal.ZERO;
for (ShelfMaterialDetailDO line : lines) {
if (line == null) {
continue;
}
if (line.getQuantity() != null) {
sum = sum.add(line.getQuantity());
}
if (!CollectionUtils.isEmpty(line.getChildren())) {
sum = sum.add(sumShelfMaterialDetailQuantities(line.getChildren()));
}
}
return sum;
}
private long countShelfTypeInTaskOrder(String shelfOrderNumber) {
if (StringUtils.isBlank(shelfOrderNumber)) {
return 0L;
}
return stockInTaskOrderService.count(new LambdaQueryWrapper<StockInTaskOrder>()
.eq(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumber)
.eq(StockInTaskOrder::getType, 2)
.eq(StockInTaskOrder::getDelFlag, 1));
}
/**
* PDA 收货完成已生成上架单后落库上架入库作业单type=2 {@link #genStockShelfTaskOrderByUpShelf} 同结构避免在上架操作时再生成一条上架环节仅在上尚未存在时补生成 PC 使用
*/
@Transactional(rollbackFor = Exception.class)
public void tryGenStockShelfInTaskOrderAfterPdaReceiptComplete(String receiptOrderNumber) {
if (StringUtils.isBlank(receiptOrderNumber)) {
return;
}
List<StockShelfOrder> rows = stockShelfOrderService.list(new LambdaQueryWrapper<StockShelfOrder>()
.eq(StockShelfOrder::getReceiptOrderNumber, receiptOrderNumber)
.eq(StockShelfOrder::getDelFlag, 1));
if (CollectionUtils.isEmpty(rows)) {
return;
}
rows.sort(Comparator.comparing(StockShelfOrder::getShelfOrderId, Comparator.nullsLast(Comparator.naturalOrder())).reversed());
StockShelfOrder head = rows.get(0);
if (countShelfTypeInTaskOrder(head.getShelfOrderNumber()) > 0) {
return;
}
StockShelfOrderPO full = getInfo(head.getShelfOrderId());
if (full == null || CollectionUtils.isEmpty(full.getMaterialDetailList())) {
return;
}
StockShelfOrderDO d = new StockShelfOrderDO();
BeanUtils.copyProperties(full, d);
List<ShelfMaterialDetailDO> dlist = full.getMaterialDetailList().stream()
.map(po -> {
ShelfMaterialDetailDO m = JSONUtil.toBean(JSONUtil.toJsonStr(po), ShelfMaterialDetailDO.class);
if (m.getChildren() == null && !CollectionUtils.isEmpty(po.getChildren())) {
m.setChildren(po.getChildren().stream()
.map(c -> JSONUtil.toBean(JSONUtil.toJsonStr(c), ShelfMaterialDetailDO.class))
.collect(Collectors.toList()));
}
if (m.getChildren() == null) {
m.setChildren(new ArrayList<>());
}
return m;
})
.collect(Collectors.toList());
d.setMaterialDetailList(dlist);
genStockShelfTaskOrderByUpShelf(d);
}
/**
* @description 生成上架追溯记录
* @author ZhouGY
@@ -183,12 +183,12 @@ public class TaskPickingMaterialDetailImpl extends ServiceImpl<TaskPickingMateri
}
taskPickingMaterialDetailList.add(taskPickingMaterialDetail);
//判断是否开启了序列号管理
if (taskPickingMaterialDetailDb.getSerialNumberManage() == 1) {
if (CollectionUtils.isEmpty(taskPickingMaterialDetailDO.getMaterialDetailSerialNumberList())) {
throw new ServiceException("物料【" + taskPickingMaterialDetailDb.getMaterialName() + "】开启了序列号管理的序列号不能为空");
}
outMaterialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(taskPickingMaterialDetailDO));
}
// if (taskPickingMaterialDetailDb.getSerialNumberManage() == 1) {
//// if (CollectionUtils.isEmpty(taskPickingMaterialDetailDO.getMaterialDetailSerialNumberList())) {
//// throw new ServiceException("物料【" + taskPickingMaterialDetailDb.getMaterialName() + "】开启了序列号管理的序列号不能为空");
//// }
// outMaterialDetailSerialNumberList.addAll(genMaterialDetailSerialNumber(taskPickingMaterialDetailDO));
// }
Long pickingUniqueId = taskPickingMaterialDetailDb.getPickingUniqueId();
BigDecimal qty = taskPickingMaterialDetailDO.getActualQuantity() != null ? taskPickingMaterialDetailDO.getActualQuantity() : BigDecimal.ZERO;
String basePickedCsv = pickedCsvByPickingUnique.get(pickingUniqueId);
@@ -41,6 +41,21 @@ public class ReviewOrderDTO extends BaseVOEntity {
@ApiModelProperty("客户名称(模糊)")
private String customerName;
@ApiModelProperty("客户ID")
private Long customerId;
@ApiModelProperty("客户代码(模糊)")
private String customerCode;
@ApiModelProperty("货主名称")
private String shipperName;
@ApiModelProperty("货主ID")
private Long shipperId;
@ApiModelProperty("货主代码")
private String shipperCode;
@ApiModelProperty("创建时间起 yyyy-MM-dd")
private String createTimeStart;
@@ -69,4 +84,6 @@ public class ReviewOrderDTO extends BaseVOEntity {
@ApiModelProperty("PDA 列表 Tab:2=历史(已复核),其它=待办(待复核/复核中)")
private Integer tabType;
}
@@ -20,6 +20,9 @@
<result property="customerId" column="customer_id"/>
<result property="customerCode" column="customer_code"/>
<result property="customerName" column="customer_name"/>
<result property="shipperId" column="shipper_id"/>
<result property="shipperCode" column="shipper_code"/>
<result property="shipperName" column="shipper_name"/>
<result property="receiveTime" column="receive_time"/>
<result property="remark" column="remark"/>
<result property="createBy" column="create_by"/>
@@ -29,9 +32,9 @@
<result property="updateByName" column="update_by_name"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
<result property="shipperId" column="SHIPPER_ID"/>
<result property="shipperCode" column="SHIPPER_CODE"/>
<result property="shipperName" column="SHIPPER_NAME"/>
<result property="materialKindCount" column="material_kind_count"/>
<result property="totalPlanQty" column="total_plan_qty"/>
<result property="totalReviewedQty" column="total_reviewed_qty"/>
</resultMap>
<resultMap type="com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO" id="ReviewMaterialDetailResult">
@@ -50,6 +53,7 @@
<result property="pendingReviewQty" column="pending_review_qty"/>
<result property="reviewedQty" column="reviewed_qty"/>
<result property="cancelQty" column="cancel_qty"/>
<result property="materialPlanQty" column="material_plan_qty"/>
<result property="receiptOrderNumber" column="receipt_order_number"/>
<result property="lotNo" column="lot_no"/>
<result property="batchNumber" column="batch_number"/>
@@ -95,6 +99,9 @@
a.customer_id,
a.customer_code,
a.customer_name,
a.shipper_id,
a.shipper_code,
a.shipper_name,
a.receive_time,
a.remark,
a.create_by,
@@ -103,10 +110,7 @@
a.update_by,
a.update_by_name,
a.update_time,
a.del_flag,
a.SHIPPER_ID,
a.SHIPPER_CODE,
a.SHIPPER_NAME
a.del_flag
</sql>
<sql id="reviewOrderWhere">
@@ -146,6 +150,9 @@
<if test="customerName != null and customerName != ''">
and a.customer_name like concat('%', #{customerName}, '%')
</if>
<if test="shipperName != null and shipperName != ''">
and a.shipper_name like concat('%', #{shipperName}, '%')
</if>
<if test="createTimeStart != null and createTimeStart != ''">
and date_format(a.create_time, '%Y-%m-%d') &gt;= #{createTimeStart}
</if>
@@ -168,12 +175,25 @@
</choose>
</sql>
<!-- 复核单列表查询 -->
<!-- 复核单列表查询(头表 + 明细聚合:种类数、计划总量、已复核总量) -->
<select id="queryList" parameterType="com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO"
resultMap="ReviewOrderResult">
select
<include refid="reviewOrderSelectColumns"/>
<include refid="reviewOrderSelectColumns"/>,
ifnull(agg.material_kind_count, 0) as material_kind_count,
ifnull(agg.total_plan_qty, 0) as total_plan_qty,
ifnull(agg.total_reviewed_qty, 0) as total_reviewed_qty
from review_order a
left join (
select
d.review_order_id,
count(distinct d.material_base_info_id) as material_kind_count,
sum(ifnull(d.material_plan_qty, ifnull(d.pending_review_qty, 0) + ifnull(d.reviewed_qty, 0))) as total_plan_qty,
sum(ifnull(d.reviewed_qty, 0)) as total_reviewed_qty
from review_material_detail d
where d.del_flag = 1
group by d.review_order_id
) agg on a.review_order_id = agg.review_order_id
<where>
<include refid="reviewOrderWhere"/>
</where>
@@ -214,6 +234,7 @@
d.pending_review_qty,
d.reviewed_qty,
d.cancel_qty,
d.material_plan_qty,
d.receipt_order_number,
d.lot_no,
d.batch_number,
@@ -262,4 +283,4 @@
and d.del_flag = 1
order by d.review_material_detail_id asc
</select>
</mapper>
</mapper>
@@ -93,6 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<where>
<include refid="selectStockInTaskOrderPo1"/>
</where>
order by a.operators_end_time desc, a.create_time desc
-- 创建时间为空的排最后
order by a.create_time is null, a.create_time desc
</select>
</mapper>