From 72e54bb21994b6519664e078fbffc3cce561dbe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Sat, 13 Jun 2026 15:39:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E5=95=86=E4=B8=BB=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thirdparty/MdmMerchantQueryDTO.java | 3 + .../thirdparty/MdmMerchantSyncFilter.java | 53 ++++++++++++++- .../UserShipperApplicationService.java | 24 ++++--- .../UserShipperMasterDataSyncService.java | 65 ++++++++++++++++--- .../MdmMasterDataApplicationService.java | 7 +- 5 files changed, 131 insertions(+), 21 deletions(-) diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantQueryDTO.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantQueryDTO.java index 69ccb3cbd..8a597732c 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantQueryDTO.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/thirdparty/MdmMerchantQueryDTO.java @@ -27,4 +27,7 @@ public class MdmMerchantQueryDTO implements Serializable { @ApiModelProperty("一级组织ID,用于读取三方接口配置") private Long topOrganizationId; + + @ApiModelProperty("当前同步组织ID,用于 desc24 为空时判定南光组织体系") + private Long syncOrganizationId; } 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 bc3d6152b..6b152d649 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 @@ -9,6 +9,9 @@ public final class MdmMerchantSyncFilter { private static final String MDM_FLAG_YES = "1"; + /** 南光组织 ID,仅南光本组织(2827)同步时 desc24 为空写入该组织 */ + public static final Long NANGUANG_ORGANIZATION_ID = 2827L; + private MdmMerchantSyncFilter() { } @@ -22,10 +25,44 @@ public final class MdmMerchantSyncFilter { } public static boolean belongsToOrg(String recordDesc24, String orgNcCode) { + return belongsToOrg(recordDesc24, orgNcCode, null, null); + } + + /** + * desc24 与 orgNcCode 一致则匹配;desc24 为空仅当同步组织为南光(2827)时匹配。 + */ + public static boolean belongsToOrg(String recordDesc24, String orgNcCode, + Long syncOrganizationId, Long topOrganizationId) { if (StringUtils.isEmpty(orgNcCode)) { return true; } - return orgNcCode.equals(trim(recordDesc24)); + String desc24 = trim(recordDesc24); + if (orgNcCode.equals(desc24)) { + return true; + } + if (StringUtils.isEmpty(desc24)) { + return isNanguangOrganization(syncOrganizationId); + } + return false; + } + + /** 是否南光本组织(不含下级组织) */ + public static boolean isNanguangOrganization(Long syncOrganizationId) { + return NANGUANG_ORGANIZATION_ID.equals(syncOrganizationId); + } + + public static boolean isEmptyDesc24(String recordDesc24) { + return StringUtils.isEmpty(trim(recordDesc24)); + } + + /** + * desc24 为空且由南光本组织(2827)发起同步时,写入南光组织;否则写入当前同步组织。 + */ + public static Long resolveSaveOrganizationId(MdmMerchantRecordDTO record, Long syncOrganizationId) { + if (record != null && isEmptyDesc24(record.getDesc24()) && isNanguangOrganization(syncOrganizationId)) { + return NANGUANG_ORGANIZATION_ID; + } + return syncOrganizationId; } public static boolean isCustomer(MdmMerchantRecordDTO record) { @@ -44,10 +81,20 @@ public final class MdmMerchantSyncFilter { * 判断是否应同步到委托方列表 */ public static boolean shouldSync(MdmMerchantRecordDTO record, String orgNcCode) { - return resolveSkipReason(record, orgNcCode) == null; + return resolveSkipReason(record, orgNcCode, null, null) == null; + } + + public static boolean shouldSync(MdmMerchantRecordDTO record, String orgNcCode, + Long syncOrganizationId, Long topOrganizationId) { + return resolveSkipReason(record, orgNcCode, syncOrganizationId, topOrganizationId) == null; } public static SkipReason resolveSkipReason(MdmMerchantRecordDTO record, String orgNcCode) { + return resolveSkipReason(record, orgNcCode, null, null); + } + + public static SkipReason resolveSkipReason(MdmMerchantRecordDTO record, String orgNcCode, + Long syncOrganizationId, Long topOrganizationId) { if (record == null || StringUtils.isEmpty(record.getCode())) { return SkipReason.EMPTY_CODE; } @@ -57,7 +104,7 @@ public final class MdmMerchantSyncFilter { if (StringUtils.isNotEmpty(orgNcCode) && orgNcCode.equals(trim(record.getCode()))) { return SkipReason.INTERNAL_ORG; } - if (!belongsToOrg(record.getDesc24(), orgNcCode)) { + if (!belongsToOrg(record.getDesc24(), orgNcCode, syncOrganizationId, topOrganizationId)) { return SkipReason.ORG_MISMATCH; } if (StringUtils.isEmpty(trim(record.getDesc1()))) { 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 4ae04a124..2c24e056d 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 @@ -1341,14 +1341,17 @@ public class UserShipperApplicationService { } @Transactional(rollbackFor = Exception.class) - public void addEnterpriseShipperFromMasterData(MdmMerchantRecordDTO record, LoginUser loginUser) { + public void addEnterpriseShipperFromMasterData(MdmMerchantRecordDTO record, LoginUser loginUser, + Long targetOrganizationId, String targetOrganizationName, + Long targetTopOrganizationId) { validateMasterDataRecord(record); UserConfigSwitchPo configSwitch = commonApplicationService.getUserConfigSwitch(); if (ObjectUtil.isNull(configSwitch)) { throw new ServiceException("获取组织配置失败"); } - UserShipperDO userShipperDO = buildShipperDOFromMasterData(record, loginUser); + UserShipperDO userShipperDO = buildShipperDOFromMasterData(record, loginUser, + targetOrganizationId, targetOrganizationName, targetTopOrganizationId); userShipperDO.setDataSource(1); userShipperDO.setShipperType(2); userShipperDO.setBusinessType(1); @@ -1382,9 +1385,12 @@ public class UserShipperApplicationService { } @Transactional(rollbackFor = Exception.class) - public void updateEnterpriseShipperFromMasterData(MdmMerchantRecordDTO record, UserShipperPo existing, LoginUser loginUser) { + public void updateEnterpriseShipperFromMasterData(MdmMerchantRecordDTO record, UserShipperPo existing, + LoginUser loginUser, Long targetOrganizationId, + String targetOrganizationName, Long targetTopOrganizationId) { validateMasterDataRecord(record); - UserShipperDO userShipperDO = buildShipperDOFromMasterData(record, loginUser); + UserShipperDO userShipperDO = buildShipperDOFromMasterData(record, loginUser, + targetOrganizationId, targetOrganizationName, targetTopOrganizationId); userShipperDO.setDataSource(1); userShipperDO.setShipperId(existing.getShipperId()); userShipperDO.setUserId(existing.getUserId()); @@ -1418,7 +1424,9 @@ public class UserShipperApplicationService { } } - private UserShipperDO buildShipperDOFromMasterData(MdmMerchantRecordDTO record, LoginUser loginUser) { + private UserShipperDO buildShipperDOFromMasterData(MdmMerchantRecordDTO record, LoginUser loginUser, + Long targetOrganizationId, String targetOrganizationName, + Long targetTopOrganizationId) { UserShipperDO userShipperDO = new UserShipperDO(); userShipperDO.setCustomerNcCode(record.getCode()); userShipperDO.setUserMemberCode(record.getCode()); @@ -1436,9 +1444,9 @@ public class UserShipperApplicationService { userShipperDO.setShipperCorpIdcardNumber(record.getDesc23()); userShipperDO.setRegisteredAddress(record.getDesc13()); userShipperDO.setRegisteredPhone(record.getDesc15()); - userShipperDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); - userShipperDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); - userShipperDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + userShipperDO.setOrganizationId(targetOrganizationId); + userShipperDO.setOrganizationName(targetOrganizationName); + userShipperDO.setTopOrganizationId(targetTopOrganizationId); return userShipperDO; } 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 4f7e1ebe9..02754c6d2 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 @@ -120,6 +120,7 @@ public class UserShipperMasterDataSyncService { private ShipperMasterDataSyncResultVo doSync(LoginUser loginUser) { Long organizationId = loginUser.getUserPo().getOrganizationId(); + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); String orgNcCode = resolveOrgNcCode(organizationId); if (StringUtils.isEmpty(orgNcCode)) { throw new ServiceException("当前组织未配置NC编码,请先在组织管理中维护"); @@ -129,8 +130,8 @@ public class UserShipperMasterDataSyncService { String lastModifyRecordTime = syncEntity == null ? null : syncEntity.getLastModifyRecordTime(); ShipperMasterDataSyncResultVo resultVo = new ShipperMasterDataSyncResultVo(); - log.info("开始同步MDM客商, organizationId={}, orgNcCode={}, lastModifyRecordTime={}", - organizationId, orgNcCode, lastModifyRecordTime); + log.info("开始同步MDM客商, organizationId={}, topOrganizationId={}, orgNcCode={}, lastModifyRecordTime={}", + organizationId, topOrganizationId, orgNcCode, lastModifyRecordTime); Map existingMap = userShipperApplicationService.loadMasterDataSyncShipperMap(organizationId); String maxModifyTime = lastModifyRecordTime; @@ -143,12 +144,13 @@ public class UserShipperMasterDataSyncService { Integer totalPages = null; do { MdmMerchantQueryResultDTO pageData = queryMerchantPage(orgNcCode, lastModifyRecordTime, - loginUser.getUserPo().getTopOrganizationId(), currentPage); + topOrganizationId, organizationId, currentPage); if (pageData == null || pageData.getDataInfo() == null) { break; } for (MdmMerchantRecordDTO record : pageData.getDataInfo()) { - MdmMerchantSyncFilter.SkipReason skipReason = MdmMerchantSyncFilter.resolveSkipReason(record, orgNcCode); + MdmMerchantSyncFilter.SkipReason skipReason = MdmMerchantSyncFilter.resolveSkipReason( + record, orgNcCode, organizationId, topOrganizationId); if (skipReason != null) { resultVo.setSkipCount(resultVo.getSkipCount() + 1); switch (skipReason) { @@ -174,17 +176,24 @@ public class UserShipperMasterDataSyncService { String ncCode = trimToEmpty(record.getCode()); String companyName = trimToEmpty(record.getDesc1()); String matchKey = UserShipperApplicationService.buildMasterDataMatchKey(ncCode, companyName); + Long targetOrganizationId = MdmMerchantSyncFilter.resolveSaveOrganizationId(record, organizationId); + MasterDataSaveTarget saveTarget = resolveSaveTarget( + targetOrganizationId, organizationId, topOrganizationId, loginUser); UserShipperPo existing = existingMap.get(matchKey); if (existing == null) { - userShipperApplicationService.addEnterpriseShipperFromMasterData(record, loginUser); + userShipperApplicationService.addEnterpriseShipperFromMasterData( + record, loginUser, saveTarget.getOrganizationId(), + saveTarget.getOrganizationName(), saveTarget.getTopOrganizationId()); resultVo.setAddCount(resultVo.getAddCount() + 1); UserShipperPo added = userShipperApplicationService.findByCustomerNcCodeAndCompanyName( - ncCode, companyName, organizationId); + ncCode, companyName, saveTarget.getOrganizationId()); if (added != null) { existingMap.put(matchKey, added); } } else { - userShipperApplicationService.updateEnterpriseShipperFromMasterData(record, existing, loginUser); + userShipperApplicationService.updateEnterpriseShipperFromMasterData( + record, existing, loginUser, saveTarget.getOrganizationId(), + saveTarget.getOrganizationName(), saveTarget.getTopOrganizationId()); resultVo.setUpdateCount(resultVo.getUpdateCount() + 1); } maxModifyTime = maxTime(maxModifyTime, record.getLastModifyRecordTime()); @@ -210,7 +219,8 @@ public class UserShipperMasterDataSyncService { } private MdmMerchantQueryResultDTO queryMerchantPage(String orgNcCode, String lastModifyRecordTime, - Long topOrganizationId, int currentPage) { + Long topOrganizationId, Long syncOrganizationId, + int currentPage) { MdmMerchantQueryDTO queryDTO = new MdmMerchantQueryDTO(); queryDTO.setOrgNcCode(orgNcCode); if (StringUtils.isNotEmpty(lastModifyRecordTime)) { @@ -219,6 +229,7 @@ public class UserShipperMasterDataSyncService { queryDTO.setCurrentPage(currentPage); queryDTO.setCountPerPage(PAGE_SIZE); queryDTO.setTopOrganizationId(topOrganizationId); + queryDTO.setSyncOrganizationId(syncOrganizationId); R response = thirdPartyServiceFeign.queryMdmMerchant(queryDTO); if (response == null || response.getCode() != Constants.SUCCESS) { @@ -273,6 +284,44 @@ public class UserShipperMasterDataSyncService { return orgJson.has("ncCode") ? orgJson.getString("ncCode") : null; } + private MasterDataSaveTarget resolveSaveTarget(Long targetOrganizationId, Long syncOrganizationId, + Long topOrganizationId, LoginUser loginUser) { + if (MdmMerchantSyncFilter.NANGUANG_ORGANIZATION_ID.equals(targetOrganizationId)) { + return new MasterDataSaveTarget( + MdmMerchantSyncFilter.NANGUANG_ORGANIZATION_ID, + loginUser.getUserPo().getOrganizationName(), + MdmMerchantSyncFilter.NANGUANG_ORGANIZATION_ID); + } + return new MasterDataSaveTarget( + syncOrganizationId, + loginUser.getUserPo().getOrganizationName(), + topOrganizationId); + } + + private static final class MasterDataSaveTarget { + private final Long organizationId; + private final String organizationName; + private final Long topOrganizationId; + + private MasterDataSaveTarget(Long organizationId, String organizationName, Long topOrganizationId) { + this.organizationId = organizationId; + this.organizationName = organizationName; + this.topOrganizationId = topOrganizationId; + } + + private Long getOrganizationId() { + return organizationId; + } + + private String getOrganizationName() { + return organizationName; + } + + private Long getTopOrganizationId() { + return topOrganizationId; + } + } + private String trimToEmpty(String value) { return value == null ? "" : value.trim(); } 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 6fb4e435f..fe8a28f10 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 @@ -60,11 +60,14 @@ public class MdmMasterDataApplicationService { String orgNcCode = queryDTO.getOrgNcCode().trim(); int rawCount = result.getDataInfo().size(); List filtered = result.getDataInfo().stream() - .filter(record -> MdmMerchantSyncFilter.belongsToOrg(record.getDesc24(), orgNcCode)) + .filter(record -> MdmMerchantSyncFilter.belongsToOrg( + record.getDesc24(), orgNcCode, + queryDTO.getSyncOrganizationId(), queryDTO.getTopOrganizationId())) .collect(Collectors.toList()); result.setDataInfo(filtered); if (rawCount != filtered.size()) { - String note = String.format("(MDM原始%d条,按DESC24=%s过滤后%d条;MDM总条数totalNumber为未过滤全库统计)", + String note = String.format( + "(MDM原始%d条,按DESC24=%s或南光本组织空DESC24过滤后%d条;MDM总条数totalNumber为未过滤全库统计)", rawCount, orgNcCode, filtered.size()); result.setDesc(StringUtils.isEmpty(result.getDesc()) ? note : result.getDesc() + note); log.info("MDM客商查询应用侧过滤 orgNcCode={}, rawPageSize={}, filteredPageSize={}, mdmTotalNumber={}",