diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java index 98358ed5d..41fde507b 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java @@ -11,7 +11,7 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017", fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017", configuration = FeignAutoConfiguration.class) public interface OmsServiceFeign { diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/SystemServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/SystemServiceFeign.java index 8db355657..066fd3c56 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/SystemServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/SystemServiceFeign.java @@ -369,4 +369,12 @@ public interface SystemServiceFeign { @GetMapping("/LeaseApi/wholeRentSynchronization") public AjaxResult wholeRentSynchronization(); + /** + * 物料主数据导入:按组织与关键词匹配物料分类,返回体含物料分类的 code 字段,供写入 material_base_info.material_classify_code。 + * 使用 basicApi 前缀,与 WMS 其他 Feign 调 system 的惯例一致(避免仅重启 WMS 时 system 上无 materialClassifyApi 新路由导致 404)。 + */ + @GetMapping("/basicApi/matchMaterialClassifyForImport") + public AjaxResult matchForMaterialImport(@RequestParam("keyword") String keyword, + @RequestParam("organizationId") Long organizationId); + } diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteSystemFeignFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteSystemFeignFallbackFactory.java index 0fd575ea6..dd89359aa 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteSystemFeignFallbackFactory.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteSystemFeignFallbackFactory.java @@ -298,6 +298,11 @@ public class RemoteSystemFeignFallbackFactory implements FallbackFactory list = materialClassifyService.list(new LambdaQueryWrapper() + .eq(MaterialClassify::getOrganizationId, organizationId) + .eq(MaterialClassify::getDelFlag, 1) + .and(n -> n.isNull(MaterialClassify::getNullify).or().eq(MaterialClassify::getNullify, 1)) + .and(w -> w.eq(MaterialClassify::getCode, kw) + .or().eq(MaterialClassify::getName, kw) + .or().eq(MaterialClassify::getNamePath, kw)) + .orderByDesc(MaterialClassify::getLevel) + .last("limit 1")); + if (list == null || list.isEmpty()) { + return null; + } + MaterialClassifyPO po = new MaterialClassifyPO(); + BeanUtils.copyProperties(list.get(0), po); + return po; + } } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/BasicAPI.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/BasicAPI.java index 58d3e6e05..c934a5691 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/BasicAPI.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/BasicAPI.java @@ -8,6 +8,7 @@ import com.mhd.basic.interfaces.assember.*; import com.mhd.basic.interfaces.dto.*; import com.mhd.basic.interfaces.facade.vo.SysAreaVO; import com.mhd.basic.application.service.common.CommonApplicationService; +import com.mhd.basic.application.service.materialClassify.MaterialClassifyApplicationService; import com.mhd.basic.domain.areaAggregate.repository.po.SysAreaPO; import com.mhd.basic.domain.areaAggregate.repository.todo.SysProvinceCityCountyDO; import com.mhd.basic.domain.common.entity.DataPermission; @@ -60,6 +61,8 @@ public class BasicAPI extends BaseController { private SysAppVersionManageApplicationService sysAppVersionManageApplicationService; @Resource private CommonApplicationService commonApplicationService; + @Resource + private MaterialClassifyApplicationService materialClassifyApplicationService; @ApiOperation("查询系统协议列表") @GetMapping("/basicAgreemenList") @@ -555,4 +558,11 @@ public class BasicAPI extends BaseController { sysMultistageDictDo.setTopParentDictCode(topCode); return AjaxResult.success(sysMultistageDictApplicationService.selectSysMultistageDictList(sysMultistageDictDo)); } + + @ApiOperation("物料主数据导入-按关键词匹配一条物料分类(返回 material_classify.code 供 WMS 写入)") + @GetMapping("/matchMaterialClassifyForImport") + public AjaxResult matchMaterialClassifyForImport(@RequestParam("keyword") String keyword, + @RequestParam("organizationId") Long organizationId) { + return AjaxResult.success(materialClassifyApplicationService.matchByKeywordForImport(keyword, organizationId)); + } } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/materialClassify/MaterialClassifyApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/materialClassify/MaterialClassifyApi.java index 6a9e97241..a09d34a6f 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/materialClassify/MaterialClassifyApi.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/materialClassify/MaterialClassifyApi.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.mhd.basic.interfaces.dto.materialClassify.MaterialClassifyDTO; @@ -108,6 +109,17 @@ public class MaterialClassifyApi extends BaseController{ { return toAjax(materialClassifyApplicationService.nullifyByIds(materialClassifyIds)); } + + /** + * 物料主数据导入:按组织与关键词匹配一条物料分类,用于回填分类编码 + */ + @ApiOperation("物料主数据导入-匹配物料分类") + @GetMapping("/matchForMaterialImport") + public AjaxResult matchForMaterialImport( + @RequestParam("keyword") String keyword, + @RequestParam("organizationId") Long organizationId) { + return AjaxResult.success(materialClassifyApplicationService.matchByKeywordForImport(keyword, organizationId)); + } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java index df7ab77b1..de8416772 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java @@ -671,7 +671,8 @@ public class ReservationStockInOrderDomainService { MaterialWarehouseControlPO materialWarehouseControlPO = reservationStockInOrderMapper.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId()); //MaterialWarehouseControlPO materialWarehouseControlPO = materialWarehouseControlService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId()); if (materialWarehouseControlPO == null){ - throw new ServiceException("物料仓库控制信息不存在"); +// throw new ServiceException("物料仓库控制信息不存在"); + materialWarehouseControlPO = new MaterialWarehouseControlPO(); } inMaterialDetailDO.setMaterialWarehouseControlId(materialWarehouseControlPO.getMaterialWarehouseControlId()); inMaterialDetailDO.setSerialNumberManage(materialWarehouseControlPO.getSerialNumberManage()); @@ -686,7 +687,8 @@ public class ReservationStockInOrderDomainService { MaterialGoodsRulePO materialGoodsRulePO = reservationStockInOrderMapper.getGoodsInfoByMaterialBaseInfoIds(inMaterialDetailDO.getMaterialBaseInfoId()); //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()); diff --git a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml index 8e94a6987..d19241f33 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml @@ -112,7 +112,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.COMPLETE_TIME,a.ORDER_DATE,a.TRANSPORT_MODE_CODE,a.TRANSPORT_MODE_NAME,a.SUPERVISION_MODE_CODE,a.SUPERVISION_MODE_NAME, a.CUSTOMS_INSPECTION_FLAG,a.NEED_DECLARE_FLAG,a.NEED_TRANSPORT_FLAG,a.picture_app,a.reservation_audit_time,a.reservation_audit_name ,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.tms_order_number, - a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME,a.BUSINESS_ORDER_NO + a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java index 37c284460..45d11776a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java @@ -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() .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> shipperList; + if (data instanceof List) { + @SuppressWarnings("unchecked") + List rawList = (List) data; + shipperList = new ArrayList<>(); + for (Object item : rawList) { + if (item instanceof Map) { + @SuppressWarnings("unchecked") + Map mapItem = (Map) item; + shipperList.add(mapItem); + } else { + Map mapItem = JSON.parseObject(JSONObject.toJSONString(item), new TypeReference>() { }); + shipperList.add(mapItem); + } + } + } else { + shipperList = JSON.parseObject(JSONObject.toJSONString(data), new TypeReference>>() { }); + } + if (shipperList == null || shipperList.isEmpty()) { + return; + } + for (Map 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() + .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 names = row.getMaterialClassifyName(); + List existing = row.getMaterialClassifyCode(); + List 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_CODE(List 中一项) */ + 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 map = JSON.parseObject(JSONObject.toJSONString(r.get("data")), + new TypeReference>() {}); + 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 buildImportBarCodeList(MaterialBaseInfoDTO row) { if (StringUtils.isBlank(row.getBarCode())) { return null; diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java index 61a041c6c..fdf823e1d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java @@ -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); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java index 650c77a30..58591ca43 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java @@ -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 reviewOrderPOList, ReviewOrderDO cmd, LoginUser loginUser) { + if (CollectionUtils.isEmpty(reviewOrderPOList) || loginUser == null) { + return 0; + } genStockOutTaskOrderForReviewDistribution(reviewOrderPOList, loginUser); genDeliveTaskForReview(reviewOrderPOList, cmd, loginUser); List 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().lambda() + return reviewOrderMapper.update(null, new UpdateWrapper().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().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; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/shiftManage/ShiftManageApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/shiftManage/ShiftManageApplicationService.java index feafe4655..b9ed3705f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/shiftManage/ShiftManageApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/shiftManage/ShiftManageApplicationService.java @@ -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); diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutTaskOrder/StockOutTaskOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutTaskOrder/StockOutTaskOrderApplicationService.java index d243ce1a2..c25727cd4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutTaskOrder/StockOutTaskOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutTaskOrder/StockOutTaskOrderApplicationService.java @@ -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); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java index 88c8f6205..525eb77f2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java @@ -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()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java index f04f71755..3b1ba6640 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java @@ -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<>()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/mobilizeManage/service/MobilizeManageDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/mobilizeManage/service/MobilizeManageDomainService.java index 35f2d2a48..b27a446b9 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/mobilizeManage/service/MobilizeManageDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/mobilizeManage/service/MobilizeManageDomainService.java @@ -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()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/noticeMaterialDetail/repository/persistence/NoticeMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/noticeMaterialDetail/repository/persistence/NoticeMaterialDetailImpl.java index 307a313c7..b6fd406ab 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/noticeMaterialDetail/repository/persistence/NoticeMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/noticeMaterialDetail/repository/persistence/NoticeMaterialDetailImpl.java @@ -174,7 +174,8 @@ public class NoticeMaterialDetailImpl extends ServiceImpl() .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结算系统,生成业务单据 //这里只有不需要复核的时候才推送,需要复核的在复核流程推送 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java index 3c395f8db..525b069a6 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java @@ -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 pickingOrders = pickingOrderService.list(new LambdaQueryWrapper() @@ -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() @@ -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() .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() - .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 reviewRows = reviewMaterialDetailMapper.selectList(new LambdaQueryWrapper() - .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 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) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewMaterialDetail.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewMaterialDetail.java index b7ed7fb08..6430dbcb6 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewMaterialDetail.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewMaterialDetail.java @@ -52,6 +52,9 @@ public class ReviewMaterialDetail extends BaseVOEntity { private BigDecimal cancelQty; + @ApiModelProperty("物料计划数量(拣货明细实际拣货数量快照,复核过程不修改)") + private BigDecimal materialPlanQty; + private String receiptOrderNumber; private String lotNo; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewOrder.java index c1de19f4f..70e507384 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewOrder.java @@ -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; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewMaterialDetailPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewMaterialDetailPO.java index 2cbf250bc..8eb89e324 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewMaterialDetailPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewMaterialDetailPO.java @@ -64,6 +64,9 @@ public class ReviewMaterialDetailPO extends BaseVOEntity { @ApiModelProperty("取消复核数量") private BigDecimal cancelQty; + @ApiModelProperty("物料计划数量(拣货实际拣货数量,生成复核明细时落库)") + private BigDecimal materialPlanQty; + @ApiModelProperty("入库单号") private String receiptOrderNumber; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewOrderPO.java index 64938e23c..8718f54f5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewOrderPO.java @@ -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 materialDetailList; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java index 832b8a7b3..6305a5000 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java @@ -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; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java index b5c4e88b0..38e23765f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java @@ -400,12 +400,12 @@ public class ShelfMaterialDetailImpl extends ServiceImpl inMaterialDetailDOChildList = shelfMaterialDetailDO.getChildren(); @@ -425,12 +425,12 @@ public class ShelfMaterialDetailImpl extends ServiceImpl 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()); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java index 9b7fe3eb7..44f73bcaf 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java @@ -631,12 +631,12 @@ public class ShiftMaterialDetailImpl extends ServiceImpl 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 shiftMaterialDetailDOChildList = shiftMaterialDetailDO.getChildren(); List shiftMaterialDetailListChild = new ArrayList<>(); @@ -655,12 +655,12 @@ public class ShiftMaterialDetailImpl extends ServiceImpl stockReceiptOrderPOList = new ArrayList<>(); - for (String inOrderNumber : inOrderNumberList) { - StockReceiptOrderDO stockReceiptOrderDOQuery = new StockReceiptOrderDO(); - stockReceiptOrderDOQuery.setInOrderNumber(inOrderNumber); - List 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()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java index 9f6425d1c..b6117ec66 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java @@ -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() .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; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java index 6a3523594..6990779be 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java @@ -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().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=2;PC 仍在上架作业时按单生成 + 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().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 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 receiptMaterialDetailPODbs = receiptMaterialDetailPOListMap.get(stockReceiptOrderPO.getReceiptOrderNumber()); if (!CollectionUtils.isEmpty(receiptMaterialDetailPODbs)) { List taskReceiptMaterialDetailDOList = JSONUtil.toList(JSONUtil.parseArray(receiptMaterialDetailPODbs), TaskReceiptMaterialDetailDO.class); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java index 144649144..67c597932 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java @@ -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=2:PDA 已在收货完成时生成;若尚未生成(如 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().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 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 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 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() + .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 rows = stockShelfOrderService.list(new LambdaQueryWrapper() + .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 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 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/taskPickingMaterialDetail/repository/persistence/TaskPickingMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/taskPickingMaterialDetail/repository/persistence/TaskPickingMaterialDetailImpl.java index d86e5ec05..278b5d53a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/taskPickingMaterialDetail/repository/persistence/TaskPickingMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/taskPickingMaterialDetail/repository/persistence/TaskPickingMaterialDetailImpl.java @@ -183,12 +183,12 @@ public class TaskPickingMaterialDetailImpl extends ServiceImpl + + + @@ -29,9 +32,9 @@ - - - + + + @@ -50,6 +53,7 @@ + @@ -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 @@ -146,6 +150,9 @@ and a.customer_name like concat('%', #{customerName}, '%') + + and a.shipper_name like concat('%', #{shipperName}, '%') + and date_format(a.create_time, '%Y-%m-%d') >= #{createTimeStart} @@ -168,12 +175,25 @@ - + - + \ No newline at end of file diff --git a/mhd_wms/src/main/resources/mapper/stockInTaskOrder/StockInTaskOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockInTaskOrder/StockInTaskOrderMapper.xml index 223c6fd88..762379dc9 100644 --- a/mhd_wms/src/main/resources/mapper/stockInTaskOrder/StockInTaskOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockInTaskOrder/StockInTaskOrderMapper.xml @@ -93,6 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - order by a.operators_end_time desc, a.create_time desc +-- 创建时间为空的排最后 + order by a.create_time is null, a.create_time desc \ No newline at end of file