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] =?UTF-8?q?=E7=89=A9=E6=96=99=E5=AF=BC=E5=85=A5=E5=88=86?= =?UTF-8?q?=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;