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 83e42f22e..bc84b75d8 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 @@ -208,15 +208,12 @@ public class UserShipperApplicationService { @NeedSetValueMethod public List userShipperListAllOrgs(UserShipperDO userShipperDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser == null || loginUser.getUserPo() == null) { - log.warn("托运人列表查询(所有组织)- 未获取到登录用户信息"); - List userShipperList = userShipperDomainService.userShipperList(userShipperDO); - return processShipperList(userShipperList); + if (loginUser != null && loginUser.getUserPo() != null) { + userShipperDO.setPushQueryOrgId(loginUser.getUserPo().getOrganizationId()); } - userShipperDO.setPushQueryOrgId(loginUser.getUserPo().getOrganizationId()); - // 不做任何组织权限过滤,前端传了 org 就按 org 查,没传就看全部 log.info("托运人列表查询(所有组织)- organizationId={}", userShipperDO.getOrganizationId()); - List userShipperList = userShipperDomainService.userShipperList(userShipperDO); + // 直接走新 mapper 查询,不做组织权限过滤 + List userShipperList = userShipperMapper.selectListAllOrgs(userShipperDO); return processShipperList(userShipperList); } 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 0861938cc..9bfc75a90 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 @@ -24,9 +24,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.ArrayList; import java.util.Date; -import java.util.List; import java.util.concurrent.TimeUnit; @Service @@ -34,8 +32,11 @@ import java.util.concurrent.TimeUnit; public class UserShipperMasterDataSyncService { private static final String LOCK_PREFIX = "shipper:mdm:sync:"; - private static final int PAGE_SIZE = 500; + /** MDM 单页条数,不宜过大以免 MDM/Feign 超时 */ + private static final int PAGE_SIZE = 100; private static final long SYNC_LOCK_MINUTES = 30; + /** MDM desc3:是否客户 */ + private static final String MDM_FLAG_YES = "1"; @Resource private ThirdPartyServiceFeign thirdPartyServiceFeign; @@ -128,41 +129,47 @@ public class UserShipperMasterDataSyncService { String lastModifyRecordTime = syncEntity == null ? null : syncEntity.getLastModifyRecordTime(); ShipperMasterDataSyncResultVo resultVo = new ShipperMasterDataSyncResultVo(); - List allRecords = fetchAllRecords(orgNcCode, lastModifyRecordTime, - loginUser.getUserPo().getTopOrganizationId()); + log.info("开始同步MDM客商, organizationId={}, orgNcCode={}, lastModifyRecordTime={}", + organizationId, orgNcCode, lastModifyRecordTime); String maxModifyTime = lastModifyRecordTime; - for (MdmMerchantRecordDTO record : allRecords) { - if (!belongsToOrg(record, orgNcCode)) { - resultVo.setSkipCount(resultVo.getSkipCount() + 1); - continue; + int currentPage = 1; + Integer totalPages = null; + do { + MdmMerchantQueryResultDTO pageData = queryMerchantPage(orgNcCode, lastModifyRecordTime, + loginUser.getUserPo().getTopOrganizationId(), currentPage); + if (pageData == null || pageData.getDataInfo() == null) { + break; } - if (isDisabled(record)) { - resultVo.setSkipCount(resultVo.getSkipCount() + 1); - continue; - } - if (StringUtils.isEmpty(record.getCode())) { - resultVo.setSkipCount(resultVo.getSkipCount() + 1); - continue; - } - try { - UserShipperPo existing = userShipperApplicationService.findByCustomerNcCodeAndOrganizationId( - record.getCode(), organizationId); - if (existing == null) { - userShipperApplicationService.addEnterpriseShipperFromMasterData(record, loginUser); - resultVo.setAddCount(resultVo.getAddCount() + 1); - } else { - userShipperApplicationService.updateEnterpriseShipperFromMasterData(record, existing, loginUser); - resultVo.setUpdateCount(resultVo.getUpdateCount() + 1); + for (MdmMerchantRecordDTO record : pageData.getDataInfo()) { + if (!shouldSyncRecord(record, orgNcCode)) { + resultVo.setSkipCount(resultVo.getSkipCount() + 1); + continue; + } + try { + UserShipperPo existing = userShipperApplicationService.findByCustomerNcCodeAndOrganizationId( + record.getCode(), organizationId); + if (existing == null) { + userShipperApplicationService.addEnterpriseShipperFromMasterData(record, loginUser); + resultVo.setAddCount(resultVo.getAddCount() + 1); + } else { + userShipperApplicationService.updateEnterpriseShipperFromMasterData(record, existing, loginUser); + resultVo.setUpdateCount(resultVo.getUpdateCount() + 1); + } + maxModifyTime = maxTime(maxModifyTime, record.getLastModifyRecordTime()); + } catch (Exception e) { + resultVo.setFailCount(resultVo.getFailCount() + 1); + String msg = "CODE=" + record.getCode() + " 同步失败:" + e.getMessage(); + resultVo.getErrorMessages().add(msg); + log.error(msg, e); } - maxModifyTime = maxTime(maxModifyTime, record.getLastModifyRecordTime()); - } catch (Exception e) { - resultVo.setFailCount(resultVo.getFailCount() + 1); - String msg = "CODE=" + record.getCode() + " 同步失败:" + e.getMessage(); - resultVo.getErrorMessages().add(msg); - log.error(msg, e); } - } + totalPages = pageData.getTotalPages(); + if (totalPages == null || totalPages <= 0) { + break; + } + currentPage++; + } while (currentPage <= totalPages); Date now = new Date(); resultVo.setLastSyncTime(now); @@ -170,38 +177,45 @@ public class UserShipperMasterDataSyncService { return resultVo; } - private List fetchAllRecords(String orgNcCode, String lastModifyRecordTime, Long topOrganizationId) { - List allRecords = new ArrayList<>(); - int currentPage = 1; - Integer totalPages = null; - do { - MdmMerchantQueryDTO queryDTO = new MdmMerchantQueryDTO(); - queryDTO.setOrgNcCode(orgNcCode); - if (StringUtils.isNotEmpty(lastModifyRecordTime)) { - queryDTO.setLastModifyRecordTime(lastModifyRecordTime + "~"); - } - queryDTO.setCurrentPage(currentPage); - queryDTO.setCountPerPage(PAGE_SIZE); - queryDTO.setTopOrganizationId(topOrganizationId); + private MdmMerchantQueryResultDTO queryMerchantPage(String orgNcCode, String lastModifyRecordTime, + Long topOrganizationId, int currentPage) { + MdmMerchantQueryDTO queryDTO = new MdmMerchantQueryDTO(); + queryDTO.setOrgNcCode(orgNcCode); + if (StringUtils.isNotEmpty(lastModifyRecordTime)) { + queryDTO.setLastModifyRecordTime(lastModifyRecordTime + "~"); + } + queryDTO.setCurrentPage(currentPage); + queryDTO.setCountPerPage(PAGE_SIZE); + queryDTO.setTopOrganizationId(topOrganizationId); - R response = thirdPartyServiceFeign.queryMdmMerchant(queryDTO); - if (response == null || response.getCode() != Constants.SUCCESS) { - throw new ServiceException("调用MDM客商接口失败:" + (response == null ? "无响应" : response.getMsg())); - } - MdmMerchantQueryResultDTO data = response.getData(); - if (data == null) { - break; - } - if (data.getDataInfo() != null) { - allRecords.addAll(data.getDataInfo()); - } - totalPages = data.getTotalPages(); - if (totalPages == null || totalPages <= 0) { - break; - } - currentPage++; - } while (currentPage <= totalPages); - return allRecords; + R response = thirdPartyServiceFeign.queryMdmMerchant(queryDTO); + if (response == null || response.getCode() != Constants.SUCCESS) { + throw new ServiceException("调用MDM客商接口失败:" + (response == null ? "无响应" : response.getMsg())); + } + return response.getData(); + } + + /** + * 同步过滤:MDM 查询侧 DESC24 无法精确过滤,必须在应用侧严格筛选。 + */ + private boolean shouldSyncRecord(MdmMerchantRecordDTO record, String orgNcCode) { + if (record == null || StringUtils.isEmpty(record.getCode())) { + return false; + } + // 仅同步客户(desc3=是否客户) + if (!MDM_FLAG_YES.equals(trimToEmpty(record.getDesc3()))) { + return false; + } + // 对应组织编码必须等于当前组织 NC,空值不同步 + String recordOrgNc = trimToEmpty(record.getDesc24()); + if (StringUtils.isEmpty(recordOrgNc) || !orgNcCode.equals(recordOrgNc)) { + return false; + } + // 跳过本组织主体(code 与组织 NC 相同,多为内部单位而非外部客商) + if (orgNcCode.equals(trimToEmpty(record.getCode()))) { + return false; + } + return !isDisabled(record); } private void saveSyncWatermark(Long organizationId, String maxModifyTime, Date syncTime, @@ -242,16 +256,17 @@ public class UserShipperMasterDataSyncService { return orgJson.has("ncCode") ? orgJson.getString("ncCode") : null; } - private boolean belongsToOrg(MdmMerchantRecordDTO record, String orgNcCode) { - return StringUtils.isEmpty(record.getDesc24()) || orgNcCode.equals(record.getDesc24()); - } - private boolean isDisabled(MdmMerchantRecordDTO record) { if (StringUtils.isEmpty(record.getDesc30())) { return false; } String status = record.getDesc30().trim(); - return "否".equals(status) || "停用".equals(status) || "0".equals(status); + // 2=启用;0/3/否/停用 视为停用(结合 MDM 样例数据) + return "否".equals(status) || "停用".equals(status) || "0".equals(status) || "3".equals(status); + } + + private String trimToEmpty(String value) { + return value == null ? "" : value.trim(); } private String maxTime(String currentMax, String candidate) { 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 1dcfce572..2800c72df 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 @@ -15,6 +15,8 @@ public interface UserShipperMapper extends BaseMapper { List selectList(UserShipperDO userShipperDO); + List selectListAllOrgs(UserShipperDO userShipperDO); + UserShipperPo selectByUserId(Long userId); UserShipperPo findByShipperId(Long shipperId); diff --git a/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml b/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml index eb04fdb17..1dec9230b 100644 --- a/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml +++ b/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml @@ -162,14 +162,13 @@ b.tax_number, b.user_email, b.user_remark as userRemarkShipper, - b.data_source, - COALESCE(pl.push_status, 1) AS push_status, - pl.push_time, - pl.push_by, - pl.push_by_name + b.push_status, + b.push_time, + b.push_by, + b.push_by_name, + b.data_source FROM "USER" a LEFT JOIN user_shipper b ON a.user_id = b.user_id - LEFT JOIN business_partner_push_log pl ON pl.shipper_id = b.shipper_id AND pl.organization_id = #{pushQueryOrgId} left join (select user_id, LISTAGG(DISTINCT r.role_name, '&') WITHIN GROUP(ORDER BY r.role_name) AS roleName from role r left join user_role ur on r.role_id = ur.role_id and ur.del_flag = 1 @@ -182,6 +181,117 @@ AND a.role_code != 'customer' + + SELECT b.shipper_id, + a.user_id, + b.parent_shipper_id, + b.shipper_type, + b.shipper_enterprise_name, + b.shipper_enterprise_social_credit_code, + b.shipper_enterprise_phone, + b.shipper_enterprise_address, + b.shipper_enterprise_license_date_from, + b.shipper_enterprise_license_date_to, + b.shipper_enterprise_taxpayer, + b.shipper_enterprise_license_long, + b.shipper_enterprise_license_front_url, + b.shipper_corp, + b.shipper_corp_name, + b.shipper_corp_legal_name, + b.shipper_corp_idcard_number, + b.shipper_corp_idcard_number_des, + b.shipper_corp_idcard_date_from, + b.shipper_corp_idcard_date_to, + b.shipper_corp_idcard_long, + b.shipper_corp_idcard_front_url, + b.shipper_corp_idcard_back_url, + b.shipper_corp_idcard_inhand_url, + a.create_time, + a.create_by, + a.create_by_name, + a.update_time, + a.update_by, + a.update_by_name, + b.del_flag, + b.shipper_fill, + b.shipper_fill_time, + b.shipper_enterprise_fill, + b.shipper_enterprise_fill_time, + b.shipper_fill_remark, + b.shipper_enterprise_fill_remark, + b.shipper_fill_auth_id, + b.shipper_fill_auth_name, + b.shipper_enterprisel_auth_name, + b.shipper_enterprisel_auth_id, + a.user_phone, + a.user_name, + a.organization_id AS organizationId, + a.organization_name AS organizationName, + a.user_account, + a.user_member_code, + a.user_idcard_number, + a.user_idcard_date_from, + a.user_idcard_date_to, + a.user_idcard_long, + a.user_idcard_front_url, + a.user_idcard_back_url, + a.user_idcard_inhand_url, + a.user_area_county_id, + a.user_area_name, + a.user_area_address, + a.user_remark, + a.avatar, + a.user_birthday, + b.authorized_quota, + b.settlement_day, + b.remark, + b.authorized_used_amount, + r.roleName, + b.is_auto_audit_order, + b.monthly_settlement_flag, + a.user_auth_status, + b.original_receipt_flag, + b.freight_node,b.customer_nc_code,b.settlement_currency, + b.role_code as roleCodeShipper, + b.user_member_code as userMemberCodeShipper, + b.user_name_shipper as userNameShipper, + b.emergency_contact_name, + b.emergency_contact_phone, + b.user_area_county_id as userAreaCountyIdShipper, + b.user_area_name as userAreaNameShipper, + b.user_area_address as userAreaAddressShipper, + b.legal_representative, + b.unified_code, + b.registered_phone, + b.registered_address, + b.fax, + b.payment_bank, + b.payment_account, + b.invoice_title, + b.tax_number, + b.user_email, + b.user_remark as userRemarkShipper, + COALESCE(pl.push_status, 1) AS push_status, + pl.push_time, + pl.push_by, + pl.push_by_name, + b.data_source + FROM "USER" a + LEFT JOIN user_shipper b ON a.user_id = b.user_id + LEFT JOIN business_partner_push_log pl ON pl.shipper_id = b.shipper_id AND pl.organization_id = #{pushQueryOrgId} + left join (select user_id, LISTAGG(DISTINCT r.role_name, '&') WITHIN GROUP(ORDER BY r.role_name) AS roleName + from role r + left join user_role ur on r.role_id = ur.role_id and ur.del_flag = 1 + where r.del_flag = 1 + and role_code in ('shipper', 'company') + group by user_id) r on r.user_id = a.user_id + WHERE a.del_flag = 1 + AND (b.del_flag = 1 OR b.del_flag IS NULL) + AND a.business_type IN (1,3) + AND a.role_code != 'customer' + AND b.shipper_id IS NOT NULL + + + +