From a468ba33e707e78d269e9ef71c034c75ba1d3983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Wed, 22 Apr 2026 20:12:41 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feign=E8=B0=83=E7=94=A8=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E4=BF=AE=E6=94=B9;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mhd/system/api/OmsServiceFeign.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e7797e82a..74b14a737 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 { From 4559bbc121dd9d99486408afbff6be5316c8216b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Wed, 22 Apr 2026 20:55:27 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=8D=95=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8A=A5=E9=94=99;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reservationStockOutOrder/ReservationStockOutOrderMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 60874e7322f1b4c1f87777fa2d16618cca8e6e58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Wed, 22 Apr 2026 22:44:39 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E7=89=A9=E6=96=99=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mhd/system/api/SystemServiceFeign.java | 8 +++ .../RemoteSystemFeignFallbackFactory.java | 5 ++ .../MaterialClassifyApplicationService.java | 7 +++ .../MaterialClassifyDomainService.java | 26 +++++++++ .../mhd/basic/interfaces/facade/BasicAPI.java | 10 ++++ .../materialClassify/MaterialClassifyApi.java | 12 ++++ .../MaterialBaseInfoApplicationService.java | 58 +++++++++++++++++++ 7 files changed, 126 insertions(+) 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_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..34627b5b3 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 @@ -597,6 +597,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 +670,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; From 4ff74f36649527d03ce999b8474c7d1a06e8ad32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Wed, 22 Apr 2026 23:00:59 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E7=89=A9=E6=96=99=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MaterialBaseInfoApplicationService.java | 178 +++++++++++++++++- 1 file changed, 177 insertions(+), 1 deletion(-) 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 34627b5b3..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; From 40d63d6fd887fd8126c67bc3c2e8c408ecabe2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Thu, 23 Apr 2026 01:11:54 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E4=BB=93=E5=BA=93=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReservationStockInOrderDomainService.java | 6 ++++-- .../reviewOrder/ReviewOrderApplicationService.java | 6 +++--- .../StockReceiptOrderApplicationService.java | 6 ++++-- .../service/MobilizeManageDomainService.java | 3 ++- .../persistence/NoticeMaterialDetailImpl.java | 3 ++- .../service/ReviewOrderDomainService.java | 13 ++++++++----- .../wms/domain/reviewOrder/entity/ReviewOrder.java | 5 +++++ .../reviewOrder/repository/po/ReviewOrderPO.java | 9 +++++++++ .../repository/persistence/ShiftManageImpl.java | 14 +++++++------- .../service/StockInOrderDomainService.java | 3 ++- .../mapper/reviewOrder/ReviewOrderMapper.xml | 6 ++++++ 11 files changed, 52 insertions(+), 22 deletions(-) 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_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..21b575e07 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 @@ -584,9 +584,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")); 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 8d4cdc70b..e579e0584 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 @@ -3564,7 +3564,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()); @@ -3578,7 +3579,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/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 ServiceImpl0 的行 outOrderNumber={}", outOrderNumber); return; } - // 复核也生成作业单(同拣货作业单表结构),用于作业任务跟踪 - genStockOutTaskOrderForReview(header, loginUser, now); + // 复核也生成作业单(同拣货作业单表结构),用于作业任务跟踪;货主须来自出库单,不能误用客户字段 + genStockOutTaskOrderForReview(header, stockOutOrder, loginUser, now); StockOutOrder statusUpdate = new StockOutOrder(); statusUpdate.setStatus(8); @@ -313,7 +316,7 @@ public class ReviewOrderDomainService { /** * 复核单生成后,同步生成一张作业单到 stock_out_task_order(结构与拣货作业单一致)。 */ - private void genStockOutTaskOrderForReview(ReviewOrder header, LoginUser loginUser, Date now) { + private void genStockOutTaskOrderForReview(ReviewOrder header, StockOutOrder stockOutOrder, LoginUser loginUser, Date now) { if (header == null || header.getReviewOrderNumber() == null) { return; } @@ -338,8 +341,8 @@ public class ReviewOrderDomainService { taskDO.setWarehouseId(header.getWarehouseId()); taskDO.setWarehouseCode(header.getWarehouseCode()); taskDO.setWarehouseName(header.getWarehouseName()); - taskDO.setShipperId(header.getCustomerId()); - taskDO.setShipperName(header.getCustomerName()); + taskDO.setShipperId(stockOutOrder != null ? stockOutOrder.getShipperId() : null); + taskDO.setShipperName(stockOutOrder != null ? stockOutOrder.getShipperName() : null); taskDO.setOrderNumber(header.getOutOrderNumber()); taskDO.setPickingOrderNumber(header.getReviewOrderNumber()); taskDO.setSerialNumber(OrderSequence.getOrderCode("FHZYLS")); 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/ReviewOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewOrderPO.java index 5cc84a142..b463a38d9 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 @@ -67,6 +67,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 点击确定/接收的时间)") diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/repository/persistence/ShiftManageImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/repository/persistence/ShiftManageImpl.java index 3dd7c6647..00184e218 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/repository/persistence/ShiftManageImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/repository/persistence/ShiftManageImpl.java @@ -243,13 +243,13 @@ public class ShiftManageImpl 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/stockInOrder/service/StockInOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java index 04940b8c3..950f5d3d0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java @@ -605,7 +605,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/resources/mapper/reviewOrder/ReviewOrderMapper.xml b/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml index 45e447da6..258829902 100644 --- a/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml @@ -20,6 +20,9 @@ + + + @@ -92,6 +95,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, From 9484bc5e8dd9ec22967fec21d1c96c80f98d91b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Thu, 23 Apr 2026 01:50:11 +0800 Subject: [PATCH 6/8] =?UTF-8?q?PDA=E5=A4=8D=E6=A0=B8=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ReviewOrderDomainService.java | 1 + .../entity/ReviewMaterialDetail.java | 3 +++ .../repository/po/ReviewMaterialDetailPO.java | 3 +++ .../repository/po/ReviewOrderPO.java | 10 +++++++++ .../mapper/reviewOrder/ReviewOrderMapper.xml | 22 +++++++++++++++++-- 5 files changed, 37 insertions(+), 2 deletions(-) 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 8bcf0ba28..5ebedd8a5 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 @@ -226,6 +226,7 @@ public class ReviewOrderDomainService { if (pending == null) { pending = BigDecimal.ZERO; } + d.setMaterialPlanQty(pending); d.setPendingReviewQty(pending); d.setReviewedQty(BigDecimal.ZERO); d.setCancelQty(BigDecimal.ZERO); 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/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 b463a38d9..6317e37ea 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; @@ -84,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/resources/mapper/reviewOrder/ReviewOrderMapper.xml b/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml index 258829902..934daca48 100644 --- a/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml @@ -32,6 +32,9 @@ + + + @@ -50,6 +53,7 @@ + @@ -168,12 +172,25 @@ - + \ No newline at end of file