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] =?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 --- .../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;