Merge remote-tracking branch 'origin/dev_WMS20260401' into dev_WMS20260401
This commit is contained in:
+4
-7
@@ -208,15 +208,12 @@ public class UserShipperApplicationService {
|
||||
@NeedSetValueMethod
|
||||
public List<UserShipperPo> userShipperListAllOrgs(UserShipperDO userShipperDO) {
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
if (loginUser == null || loginUser.getUserPo() == null) {
|
||||
log.warn("托运人列表查询(所有组织)- 未获取到登录用户信息");
|
||||
List<UserShipperPo> 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<UserShipperPo> userShipperList = userShipperDomainService.userShipperList(userShipperDO);
|
||||
// 直接走新 mapper 查询,不做组织权限过滤
|
||||
List<UserShipperPo> userShipperList = userShipperMapper.selectListAllOrgs(userShipperDO);
|
||||
return processShipperList(userShipperList);
|
||||
}
|
||||
|
||||
|
||||
+84
-69
@@ -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<MdmMerchantRecordDTO> 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<MdmMerchantRecordDTO> fetchAllRecords(String orgNcCode, String lastModifyRecordTime, Long topOrganizationId) {
|
||||
List<MdmMerchantRecordDTO> 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<MdmMerchantQueryResultDTO> 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<MdmMerchantQueryResultDTO> 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) {
|
||||
|
||||
+2
@@ -15,6 +15,8 @@ public interface UserShipperMapper extends BaseMapper<UserShipperEntity> {
|
||||
|
||||
List<UserShipperPo> selectList(UserShipperDO userShipperDO);
|
||||
|
||||
List<UserShipperPo> selectListAllOrgs(UserShipperDO userShipperDO);
|
||||
|
||||
UserShipperPo selectByUserId(Long userId);
|
||||
|
||||
UserShipperPo findByShipperId(Long shipperId);
|
||||
|
||||
@@ -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'
|
||||
</sql>
|
||||
|
||||
<sql id="selectShipperVoWithPushLog">
|
||||
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
|
||||
</sql>
|
||||
|
||||
<select id="selectList" parameterType="com.mhd.user.domain.userAggregate.repository.todo.UserShipperDO"
|
||||
resultType="com.mhd.user.domain.userAggregate.repository.po.UserShipperPo">
|
||||
<include refid="selectShipperVo1"/>
|
||||
@@ -190,6 +300,16 @@
|
||||
ORDER BY a.create_time DESC
|
||||
</select>
|
||||
|
||||
<select id="selectListAllOrgs" parameterType="com.mhd.user.domain.userAggregate.repository.todo.UserShipperDO"
|
||||
resultType="com.mhd.user.domain.userAggregate.repository.po.UserShipperPo">
|
||||
SELECT * FROM (
|
||||
<include refid="selectShipperVoWithPushLog"/>
|
||||
<include refid="common_where"></include>
|
||||
GROUP BY a.user_id
|
||||
ORDER BY a.create_time DESC
|
||||
) t
|
||||
</select>
|
||||
|
||||
<select id="selectByUserId" parameterType="java.lang.Long"
|
||||
resultType="com.mhd.user.domain.userAggregate.repository.po.UserShipperPo">
|
||||
<include refid="selectShipperVo"/>
|
||||
|
||||
Reference in New Issue
Block a user