diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java index e18484e8d..91f2f8a11 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.109:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface BmsServiceFeign { 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 e34bb9cd4..03d48d2f4 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@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.33.0.99:8017", fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface OmsServiceFeign { diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java index e4a817238..ba9a45148 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java @@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; -@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.30:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.33.0.129:8014",configuration = FeignAutoConfiguration.class) public interface WlhyServiceFeign { /** diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java index 743be7c29..688e5ea7c 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java @@ -21,7 +21,7 @@ import java.util.Map; * @description: TODO * @date 2024/5/10 8:58 **/ -@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.3:8016", fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.33.0.109:8016", fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface WmsServiceFeign { /** diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java index dfac7337f..48d76d01e 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java @@ -9,7 +9,7 @@ import com.mhd.system.api.feign.FeignAutoConfiguration; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; -@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,fallbackFactory = RemoteBmsFeignFallbackFactory.class,url = "http://10.102.192.4:8018", configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,fallbackFactory = RemoteBmsFeignFallbackFactory.class,url = "http://10.33.0.99:8018", configuration = FeignAutoConfiguration.class) public interface YmsServiceFeign { /** diff --git a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkMacaoServiceZoneVO.java b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkMacaoServiceZoneVO.java index a599232c9..11ba6df8a 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkMacaoServiceZoneVO.java +++ b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkMacaoServiceZoneVO.java @@ -1,5 +1,6 @@ package com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -17,6 +18,7 @@ import java.util.List; @Builder @NoArgsConstructor @AllArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) @ApiModel("BI-港澳服务专区") public class HkMacaoServiceZoneVO { diff --git a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkMapPointVO.java b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkMapPointVO.java index ea243f5d8..c309d4b00 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkMapPointVO.java +++ b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkMapPointVO.java @@ -1,5 +1,6 @@ package com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -11,6 +12,7 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) @ApiModel("BI-港澳服务专区-地图点位") public class HkMapPointVO { diff --git a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkVehicleDetailsVO.java b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkVehicleDetailsVO.java index 5a289efe3..3d8721293 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkVehicleDetailsVO.java +++ b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/hkMacaoZone/HkVehicleDetailsVO.java @@ -1,5 +1,6 @@ package com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -38,4 +39,24 @@ public class HkVehicleDetailsVO { @JsonProperty("update_time") @ApiModelProperty("更新时间") private String updateTime; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("运输方向") + private String direction; + + @ApiModelProperty("货物类型") + private String cargo; + + @ApiModelProperty("预计到达时间") + private String eta; + + @JsonProperty("transportion_number") + @ApiModelProperty("运单号") + private String transportionNumber; + + @JsonProperty("cargo_source") + @ApiModelProperty("货源") + private String cargoSource; } diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantRecordDTO.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantRecordDTO.java index 6bcf227d5..e78dcde85 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantRecordDTO.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantRecordDTO.java @@ -46,6 +46,9 @@ public class MdmMerchantRecordDTO implements Serializable { @ApiModelProperty("电子邮件") private String desc16; + @ApiModelProperty("nc编码") + private String desc17; + @ApiModelProperty("身份证号") private String desc23; diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantSyncFilter.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantSyncFilter.java index e6b62e6b5..63e9ec2eb 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantSyncFilter.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantSyncFilter.java @@ -95,21 +95,12 @@ public final class MdmMerchantSyncFilter { public static SkipReason resolveSkipReason(MdmMerchantRecordDTO record, String orgNcCode, Long syncOrganizationId, Long topOrganizationId) { - if (record == null || StringUtils.isEmpty(record.getCode())) { + if (StringUtils.isEmpty(trim(record.getDesc17()))) { return SkipReason.EMPTY_CODE; } - if (!isCustomer(record)) { - return SkipReason.NOT_CUSTOMER; - } - if (StringUtils.isNotEmpty(orgNcCode) && !orgNcCode.equals(trim(record.getCode()))) { - return SkipReason.ORG_MISMATCH; - } if (StringUtils.isEmpty(trim(record.getDesc1()))) { return SkipReason.MISSING_NAME; } - if (isDisabled(record)) { - return SkipReason.DISABLED; - } return null; } diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/AsyncUserShipperMasterDataSyncService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/AsyncUserShipperMasterDataSyncService.java index 64f370c75..d7d33133c 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/AsyncUserShipperMasterDataSyncService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/AsyncUserShipperMasterDataSyncService.java @@ -21,7 +21,7 @@ public class AsyncUserShipperMasterDataSyncService { @Resource private RedisLock redisLock; - @Async + @Async("taskScheduler") public void syncMasterDataAsync(LoginUser loginUser, String lockKey) { Long organizationId = loginUser.getUserPo().getOrganizationId(); try { diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperApplicationService.java index e56af2e41..f70783dd3 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperApplicationService.java @@ -1349,6 +1349,82 @@ public class UserShipperApplicationService { organizationId); } + /** + * 按公司名跨组织查询第一个未删除的委托方(包含 orgCode)。 + * 用于 MDM 同步时:同公司名可能在不同组织下 nc 编码不同,但本地是同一条委托方记录。 + */ + public UserShipperEntity findFirstByShipperEnterpriseNameAcrossOrgs(String shipperEnterpriseName) { + if (StringUtils.isEmpty(shipperEnterpriseName)) { + return null; + } + return userShipperMapper.findFirstByShipperEnterpriseNameAcrossOrgs(shipperEnterpriseName.trim()); + } + + /** + * 在已存在的同公司名委托方(可能属于其他组织)的 orgCode JSON 数组中追加当前组织信息。 + * 若目标组织已存在于数组中则跳过(不重复追加)。 + * + * @param existingShipper 本地已存在的同公司名委托方 + * @param targetOrganizationId 当前同步组织 ID + * @param targetOrganizationName 当前同步组织名称 + * @param ncCustomerCode MDM 客商 code(作为该组织下的 ncCustomer 记录) + * @param loginUser 登录用户(用于写入 updateBy) + * @return true 表示实际写入(新增组织或已存在都返回 true,方便调用方统计),false 表示参数无效 + */ + public boolean appendOrganizationToExistingShipper(UserShipperEntity existingShipper, + Long targetOrganizationId, String targetOrganizationName, + String ncCustomerCode, LoginUser loginUser) { + if (existingShipper == null) { + return false; + } + String existingOrgCode = existingShipper.getOrgCode(); + + boolean hasOrg = false; + com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray(); + if (StringUtils.isNotEmpty(existingOrgCode)) { + try { + orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(existingOrgCode); + // 检查是否已包含当前组织 + for (int i = 0; i < orgCodeArray.size(); i++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i); + Long itemCode = orgItem.getLong("code"); + if (targetOrganizationId != null && targetOrganizationId.equals(itemCode)) { + hasOrg = true; + break; + } + } + } catch (Exception e) { + log.error("解析orgCode失败,shipperId={}", existingShipper.getShipperId(), e); + } + } + + if (!hasOrg) { + // 添加新组织到orgCode数组 + com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject(); + newOrgItem.put("name", targetOrganizationName); + newOrgItem.put("code", targetOrganizationId); + newOrgItem.put("ncCustomer", ncCustomerCode); + newOrgItem.put("names", targetOrganizationId); + orgCodeArray.add(newOrgItem); + + // 更新委托方的orgCode字段 + existingShipper.setOrgCode(orgCodeArray.toJSONString()); + if (loginUser != null && loginUser.getUserPo() != null) { + existingShipper.setUpdateBy(loginUser.getUserPo().getUserId()); + existingShipper.setUpdateByName(loginUser.getUserPo().getUserName()); + } + existingShipper.setUpdateTime(new Date()); + userShipperMapper.updateById(existingShipper); + + log.info("委托方已存在,添加新组织到orgCode,customerNcCode={},新增组织code={},name={}", + ncCustomerCode, targetOrganizationId, targetOrganizationName); + } else { + log.info("委托方已存在且已包含该组织,跳过添加,customerNcCode={},组织code={}", + ncCustomerCode, targetOrganizationId); + } + return true; + } + public static String buildMasterDataMatchKey(String ncCode, String companyName) { return normalizeMasterDataKey(ncCode) + "|" + normalizeMasterDataKey(companyName); } @@ -1374,61 +1450,8 @@ public class UserShipperApplicationService { throw new ServiceException("获取组织配置失败"); } - // 检查是否已存在相同customerNcCode的委托方(可能在不同组织) - List existingShippers = userShipperMapper.selectList( - new LambdaQueryWrapper() - .eq(UserShipperEntity::getShipperEnterpriseName, record.getDesc1()) - .eq(UserShipperEntity::getDelFlag, 1)); - - if (CollUtil.isNotEmpty(existingShippers)) { - // 找到已存在的委托方,检查是否已经有该组织 - UserShipperEntity existingShipper = existingShippers.get(0); - String existingOrgCode = existingShipper.getOrgCode(); - - boolean hasOrg = false; - com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray(); - if (StringUtils.isNotEmpty(existingOrgCode)) { - try { - orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(existingOrgCode); - // 检查是否已包含当前组织 - for (int i = 0; i < orgCodeArray.size(); i++) { - com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i); - Long itemCode = orgItem.getLong("code"); - if (targetOrganizationId.equals(itemCode)) { - hasOrg = true; - break; - } - } - } catch (Exception e) { - log.error("解析orgCode失败,shipperId={}", existingShipper.getShipperId(), e); - } - } - - if (!hasOrg) { - // 添加新组织到orgCode数组 - com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject(); - newOrgItem.put("name", targetOrganizationName); - newOrgItem.put("code", targetOrganizationId); - newOrgItem.put("ncCustomer", record.getCode()); - newOrgItem.put("names", targetOrganizationId); - orgCodeArray.add(newOrgItem); - - // 更新委托方的orgCode字段 - existingShipper.setOrgCode(orgCodeArray.toJSONString()); - existingShipper.setUpdateBy(loginUser.getUserPo().getUserId()); - existingShipper.setUpdateByName(loginUser.getUserPo().getUserName()); - existingShipper.setUpdateTime(new Date()); - userShipperMapper.updateById(existingShipper); - - log.info("委托方已存在,添加新组织到orgCode,customerNcCode={},新增组织code={},name={}", - record.getCode(), targetOrganizationId, targetOrganizationName); - } else { - log.info("委托方已存在且已包含该组织,跳过添加,customerNcCode={},组织code={}", - record.getCode(), targetOrganizationId); - } - return; // 不新增,直接返回 - } - + // 按公司名跨组织匹配已存在委托方的逻辑已迁移到 doSync 层(先调用 appendOrganizationToExistingShipper), + // 走到这里说明按 ncCode+companyName 与公司名均未匹配到,本方法只负责"新增"。 // 不存在相同的委托方,执行新增逻辑 UserShipperDO userShipperDO = buildShipperDOFromMasterData(record, loginUser, targetOrganizationId, targetOrganizationName, targetTopOrganizationId); @@ -1441,6 +1464,16 @@ public class UserShipperApplicationService { userShipperDO.setAuthType(2); userShipperDO.setShipperAuthStatus(3); + // 初始化 orgCode:新加的客商属于当前组织,将当前组织信息写入 orgCode JSON 数组 + com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray(); + com.alibaba.fastjson.JSONObject orgItem = new com.alibaba.fastjson.JSONObject(); + orgItem.put("name", targetOrganizationName); + orgItem.put("code", targetOrganizationId); + orgItem.put("ncCustomer", record.getCode()); + orgItem.put("names", targetOrganizationId); + orgCodeArray.add(orgItem); + userShipperDO.setOrgCode(orgCodeArray.toJSONString()); + String userAccount = buildMasterDataUserAccount(record.getCode()); checkUserAccountUnique(userAccount, null, configSwitch.getTopOrganizationId()); userShipperDO.setUserAccount(userAccount); @@ -1556,7 +1589,7 @@ public class UserShipperApplicationService { Long targetOrganizationId, String targetOrganizationName, Long targetTopOrganizationId) { UserShipperDO userShipperDO = new UserShipperDO(); - userShipperDO.setCustomerNcCode(record.getCode()); + userShipperDO.setCustomerNcCode(record.getDesc17()); // NC编码用desc17,与匹配Key一致 userShipperDO.setUserMemberCode(record.getCode()); userShipperDO.setShipperEnterpriseName(record.getDesc1()); userShipperDO.setUserNameShipper(record.getDesc1()); diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperMasterDataSyncService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperMasterDataSyncService.java index cd79a3a0a..242a913de 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperMasterDataSyncService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperMasterDataSyncService.java @@ -13,6 +13,7 @@ import com.mhd.common.core.utils.StringUtils; import com.mhd.common.redis.service.RedisLock; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.model.LoginUser; +import com.mhd.user.domain.userAggregate.entity.UserShipperEntity; import com.mhd.user.domain.userAggregate.repository.po.UserShipperPo; import com.mhd.user.domain.userShipperMdmSync.entity.UserShipperMdmSyncEntity; import com.mhd.user.domain.userShipperMdmSync.mapper.UserShipperMdmSyncMapper; @@ -69,13 +70,28 @@ public class UserShipperMasterDataSyncService { public void syncMasterData() { LoginUser loginUser = requireLoginUser(); Long organizationId = loginUser.getUserPo().getOrganizationId(); - String lockKey = LOCK_PREFIX + organizationId; - boolean locked = redisLock.tryLock(lockKey, SYNC_LOCK_MINUTES, TimeUnit.MINUTES); - if (!locked) { - throw new ServiceException("当前组织正在同步主数据,请稍后再试"); - } - markSyncInProgress(organizationId); - asyncUserShipperMasterDataSyncService.syncMasterDataAsync(loginUser, lockKey); + new Thread(() -> { + String lockKey = LOCK_PREFIX + organizationId; + try { + boolean locked = redisLock.tryLock(lockKey, SYNC_LOCK_MINUTES, TimeUnit.MINUTES); + if (!locked) { + log.warn("当前组织正在同步主数据,跳过本次同步"); + return; + } + markSyncInProgress(organizationId); + try { + ShipperMasterDataSyncResultVo resultVo = doSync(loginUser); + log.info("MDM同步完成: {}", resultVo); + } catch (Exception e) { + log.error("同步主数据失败, organizationId={}", organizationId, e); + markSyncFailed(organizationId, e.getMessage()); + } finally { + redisLock.unlock(lockKey); + } + } catch (Exception e) { + log.error("获取同步锁失败", e); + } + }, "mdm-sync-thread").start(); } public ShipperMasterDataSyncResultVo executeSync(LoginUser loginUser) { @@ -184,14 +200,31 @@ public class UserShipperMasterDataSyncService { targetOrganizationId, organizationId, topOrganizationId, loginUser); UserShipperPo existing = existingMap.get(matchKey); if (existing == null) { - userShipperApplicationService.addEnterpriseShipperFromMasterData( - record, loginUser, saveTarget.getOrganizationId(), - saveTarget.getOrganizationName(), saveTarget.getTopOrganizationId()); - resultVo.setAddCount(resultVo.getAddCount() + 1); - UserShipperPo added = userShipperApplicationService.findByCustomerNcCodeAndCompanyName( - ncCode, companyName, saveTarget.getOrganizationId()); - if (added != null) { - existingMap.put(matchKey, added); + // 按 ncCode+companyName 未匹配到时,再按公司名跨组织查询已存在的同公司名委托方。 + // 同一个客商在 MDM 中可能属于不同组织(nc 编码不同),但本地是同一条委托方记录。 + // 如果匹配到的委托方属于“另外的组织”(非当前同步组织),则不新增, + // 而是在其 orgCode 上追加当前同步组织的信息(连同本组织下的 ncCustomer)。 + UserShipperEntity existingByName = userShipperApplicationService + .findFirstByShipperEnterpriseNameAcrossOrgs(companyName); + if (existingByName != null + && saveTarget.getOrganizationId() != null + && !saveTarget.getOrganizationId().equals(existingByName.getOrganizationId())) { + userShipperApplicationService.appendOrganizationToExistingShipper( + existingByName, saveTarget.getOrganizationId(), + saveTarget.getOrganizationName(), ncCode, loginUser); + resultVo.setLinkCount(resultVo.getLinkCount() + 1); + log.info("MDM同步按公司名跨组织合并:customerNcCode={},companyName={},本组织code={},已存在委托方shipperId={}(其他组织)", + ncCode, companyName, saveTarget.getOrganizationId(), existingByName.getShipperId()); + } else { + userShipperApplicationService.addEnterpriseShipperFromMasterData( + record, loginUser, saveTarget.getOrganizationId(), + saveTarget.getOrganizationName(), saveTarget.getTopOrganizationId()); + resultVo.setAddCount(resultVo.getAddCount() + 1); + UserShipperPo added = userShipperApplicationService.findByCustomerNcCodeAndCompanyName( + ncCode, companyName, saveTarget.getOrganizationId()); + if (added != null) { + existingMap.put(matchKey, added); + } } } else { userShipperApplicationService.updateEnterpriseShipperFromMasterData( @@ -261,8 +294,9 @@ public class UserShipperMasterDataSyncService { entity.setLastSyncTime(syncTime); entity.setSyncStatus(resultVo.getFailCount() > 0 ? 2 : 1); String syncMessage = String.format( - "新增%d,更新%d,跳过%d,失败%d;组织NC=%s;跳过明细[组织不匹配:%d,非客户:%d,内部单位:%d,停用:%d,其他:%d]", - resultVo.getAddCount(), resultVo.getUpdateCount(), resultVo.getSkipCount(), resultVo.getFailCount(), + "新增%d,更新%d,关联%d,跳过%d,失败%d;组织NC=%s;跳过明细[组织不匹配:%d,非客户:%d,内部单位:%d,停用:%d,其他:%d]", + resultVo.getAddCount(), resultVo.getUpdateCount(), resultVo.getLinkCount(), + resultVo.getSkipCount(), resultVo.getFailCount(), orgNcCode, skipOrgMismatch, skipNotCustomer, skipInternalOrg, skipDisabled, skipOther); if (resultVo.getFailCount() > 0 && !resultVo.getErrorMessages().isEmpty()) { syncMessage += ";" + resultVo.getErrorMessages().get(0); diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/mapper/UserShipperMapper.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/mapper/UserShipperMapper.java index 940d9010c..464419a71 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/mapper/UserShipperMapper.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/mapper/UserShipperMapper.java @@ -52,5 +52,11 @@ public interface UserShipperMapper extends BaseMapper { @Param("companyName") String companyName, @Param("organizationId") Long organizationId); + /** + * 按公司名跨组织查询第一个未删除的委托方(包含 orgCode 字段)。 + * 用于 MDM 同步时按"公司名"匹配已存在的委托方(可能是其他组织的),以便在其 orgCode 上追加新组织。 + */ + UserShipperEntity findFirstByShipperEnterpriseNameAcrossOrgs(@Param("shipperEnterpriseName") String shipperEnterpriseName); + String getOrgNcCode(Long organizationId); } \ No newline at end of file diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/vo/ShipperMasterDataSyncResultVo.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/vo/ShipperMasterDataSyncResultVo.java index b48920026..420dea40d 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/interfaces/vo/ShipperMasterDataSyncResultVo.java +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/vo/ShipperMasterDataSyncResultVo.java @@ -18,6 +18,9 @@ public class ShipperMasterDataSyncResultVo { @ApiModelProperty("更新条数") private int updateCount; + @ApiModelProperty("关联到已存在委托方条数(按公司名跨组织匹配到同公司名委托方,仅在 orgCode 上追加新组织,不新增委托方)") + private int linkCount; + @ApiModelProperty("跳过条数") private int skipCount; diff --git a/mhd-user-center/src/main/resources/bootstrap.yml b/mhd-user-center/src/main/resources/bootstrap.yml index b557f1f16..7b6baaea4 100644 --- a/mhd-user-center/src/main/resources/bootstrap.yml +++ b/mhd-user-center/src/main/resources/bootstrap.yml @@ -42,4 +42,13 @@ spring: max-request-size: 50MB mybatis-plus: configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +feign: + client: + config: + default: + connectTimeout: 10000 + readTimeout: 120000 + mhd-third-party-service: + connectTimeout: 10000 + readTimeout: 120000 \ No newline at end of file diff --git a/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml b/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml index 20f663b17..f9bffc4e9 100644 --- a/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml +++ b/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml @@ -629,6 +629,22 @@ AND a.organization_id = #{organizationId} LIMIT 1 + + + diff --git a/mhd_finance/src/main/resources/bootstrap.yml b/mhd_finance/src/main/resources/bootstrap.yml index ad4cca1eb..cf943f83f 100644 --- a/mhd_finance/src/main/resources/bootstrap.yml +++ b/mhd_finance/src/main/resources/bootstrap.yml @@ -21,14 +21,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_finance/src/main/resources/mapper/reconciliation/ReconciliationMapper.xml b/mhd_finance/src/main/resources/mapper/reconciliation/ReconciliationMapper.xml index dd6ee79f1..1285aa1b0 100644 --- a/mhd_finance/src/main/resources/mapper/reconciliation/ReconciliationMapper.xml +++ b/mhd_finance/src/main/resources/mapper/reconciliation/ReconciliationMapper.xml @@ -85,7 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.inner_number like concat('%', #{innerNumber}, '%') - and a.inner_number like concat('%', #{partyName}, '%') + and a.party_name like concat('%', #{partyName}, '%') and a.bill_remark like concat('%', #{billRemark}, '%') diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java index 0ee86bf18..ee11a2413 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java @@ -293,6 +293,9 @@ public class ReservationStockInOrderImpl extends ServiceImpl queryOutStockNoticePrintDetail(ReservationStockOutOrderDO stockOutOrderDO); + + Long queryShipperId(@Param("userMemberCode") String userMemberCode,@Param("organizationId") Long organizationId); } \ No newline at end of file diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 08923fbaf..09ef96b56 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml index fa77182c2..33dfef60e 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml @@ -466,4 +466,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + \ No newline at end of file diff --git a/mhd_thrid_party/src/main/java/com/linke/thirdParty/application/server/MdmMasterDataApplicationService.java b/mhd_thrid_party/src/main/java/com/linke/thirdParty/application/server/MdmMasterDataApplicationService.java index 7d2164e26..82fcc68e2 100644 --- a/mhd_thrid_party/src/main/java/com/linke/thirdParty/application/server/MdmMasterDataApplicationService.java +++ b/mhd_thrid_party/src/main/java/com/linke/thirdParty/application/server/MdmMasterDataApplicationService.java @@ -8,7 +8,6 @@ import com.linke.thirdParty.domain.departInterfaceInfo.repository.mapper.SysDepa import com.mhd.common.core.domain.thirdparty.MdmMerchantQueryDTO; import com.mhd.common.core.domain.thirdparty.MdmMerchantQueryResultDTO; import com.mhd.common.core.domain.thirdparty.MdmMerchantRecordDTO; -import com.mhd.common.core.domain.thirdparty.MdmMerchantSyncFilter; import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.utils.StringUtils; import lombok.extern.slf4j.Slf4j; @@ -24,7 +23,6 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; /** * 北京三维天地 MDM 客商主数据查询 @@ -42,35 +40,10 @@ public class MdmMasterDataApplicationService { public MdmMerchantQueryResultDTO queryMerchant(MdmMerchantQueryDTO queryDTO) { MdmConfig config = loadConfig(); String requestBody = buildRequestBody(queryDTO); - log.info("MDM客商查询请求 orgNcCode={}, page={}, lastTime={}", - queryDTO.getOrgNcCode(), queryDTO.getCurrentPage(), queryDTO.getLastModifyRecordTime()); + log.info("MDM客商查询请求 orgNcCode={}, page={}, lastTime={}, body={}", + queryDTO.getOrgNcCode(), queryDTO.getCurrentPage(), queryDTO.getLastModifyRecordTime(), requestBody); String responseBody = doPost(config.url, config.usercode, config.password, requestBody); MdmMerchantQueryResultDTO result = parseResponse(responseBody); - return applyOrgFilter(queryDTO, result); - } - - /** - * 按组织NC编码匹配客商CODE,过滤无关数据并修正分页描述。 - */ - private MdmMerchantQueryResultDTO applyOrgFilter(MdmMerchantQueryDTO queryDTO, MdmMerchantQueryResultDTO result) { - if (result == null || StringUtils.isEmpty(queryDTO.getOrgNcCode()) - || result.getDataInfo() == null || result.getDataInfo().isEmpty()) { - return result; - } - String orgNcCode = queryDTO.getOrgNcCode().trim(); - int rawCount = result.getDataInfo().size(); - List filtered = result.getDataInfo().stream() - .filter(record -> orgNcCode.equals(record.getCode())) - .collect(Collectors.toList()); - result.setDataInfo(filtered); - if (rawCount != filtered.size()) { - String note = String.format( - "(MDM原始%d条,按CODE=%s过滤后%d条;MDM总条数totalNumber为未过滤全库统计)", - rawCount, orgNcCode, filtered.size()); - result.setDesc(StringUtils.isEmpty(result.getDesc()) ? note : result.getDesc() + note); - log.info("MDM客商查询应用侧过滤 orgNcCode={}, rawPageSize={}, filteredPageSize={}, mdmTotalNumber={}", - orgNcCode, rawCount, filtered.size(), result.getTotalNumber()); - } return result; } @@ -112,6 +85,10 @@ public class MdmMasterDataApplicationService { if (StringUtils.isNotEmpty(queryDTO.getLastModifyRecordTime())) { dataInfoItem.put("LASTMODIFYRECORDTIME", queryDTO.getLastModifyRecordTime()); } + // 按单位编码模糊过滤(MDM的DESC17支持LIKE语法) + if (StringUtils.isNotEmpty(queryDTO.getOrgNcCode())) { + dataInfoItem.put("DESC17", "%%" + queryDTO.getOrgNcCode().trim() + "%%"); + } JSONArray dataInfoArray = new JSONArray(); dataInfoArray.add(dataInfoItem); @@ -142,7 +119,7 @@ public class MdmMasterDataApplicationService { conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(30000); - conn.setReadTimeout(60000); + conn.setReadTimeout(300000); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); @@ -233,6 +210,7 @@ public class MdmMasterDataApplicationService { record.setDesc14(item.getString("DESC14")); record.setDesc15(item.getString("DESC15")); record.setDesc16(item.getString("DESC16")); + record.setDesc17(item.getString("DESC17")); record.setDesc23(item.getString("DESC23")); record.setDesc24(item.getString("DESC24")); record.setDesc25(item.getString("DESC25")); diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index e8f169bf2..b97ce9a79 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -14,18 +14,18 @@ spring: nacos: discovery: # server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 +# server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: # server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 +# server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境