相对方批量同步

This commit is contained in:
2026-06-29 10:36:10 +08:00
parent cc6e368f44
commit c22aa559f6
6 changed files with 116 additions and 6 deletions
@@ -71,4 +71,11 @@ public class PartnerManageController {
public R<PartnerManageDto> mockSync(@PathVariable("customerSysid") Long customerSysid) { public R<PartnerManageDto> mockSync(@PathVariable("customerSysid") Long customerSysid) {
return R.success(partnerManageService.mockSyncPartner(customerSysid)); return R.success(partnerManageService.mockSyncPartner(customerSysid));
} }
/** 批量模拟同步到法务系统(法务接口支持一次传多个,最多500条) */
@PostMapping("/batch-sync")
public R<Integer> batchSync(@RequestBody List<Long> customerSysids) {
int count = partnerManageService.batchSyncPartner(customerSysids);
return R.success(Integer.valueOf(count));
}
} }
@@ -27,6 +27,9 @@ public interface PartnerManageMapper {
/** 根据主键查询单条相对方详情 */ /** 根据主键查询单条相对方详情 */
PartnerManageDto selectPartnerById(@Param("customerSysid") Long customerSysid); PartnerManageDto selectPartnerById(@Param("customerSysid") Long customerSysid);
/** 根据主键列表批量查询相对方(用于批量同步) */
List<PartnerManageDto> selectPartnerByIds(@Param("customerSysids") List<Long> customerSysids);
/** 新增相对方 */ /** 新增相对方 */
int insertPartner(PartnerManageDto partner); int insertPartner(PartnerManageDto partner);
@@ -28,4 +28,14 @@ public interface PartnerManageService {
/** 模拟同步到法务系统 */ /** 模拟同步到法务系统 */
PartnerManageDto mockSyncPartner(Long customerSysid); PartnerManageDto mockSyncPartner(Long customerSysid);
/**
* 批量同步相对方到法务系统。
* 模拟实现:逐条构造法务 oppositeId 并回写同步状态,打印批量报文日志。
* 后续联调时替换为调用 collectOpposites 批量接口(一次最多500条)。
*
* @param customerSysids 待同步的相对方ID列表
* @return 成功同步的条数
*/
int batchSyncPartner(List<Long> customerSysids);
} }
@@ -149,7 +149,6 @@ public class PartnerManageServiceImpl implements PartnerManageService {
PartnerManageConstants.PARTNER_IS_DELETED_DELETED); PartnerManageConstants.PARTNER_IS_DELETED_DELETED);
} }
/** 同步相对方到法务系统 */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public PartnerManageDto mockSyncPartner(Long customerSysid) { public PartnerManageDto mockSyncPartner(Long customerSysid) {
@@ -224,6 +223,74 @@ public class PartnerManageServiceImpl implements PartnerManageService {
return selectPartnerById(customerSysid); return selectPartnerById(customerSysid);
} }
/**
* 批量模拟同步相对方到法务系统。
*
* 法务 collectOpposites 接口支持一次传多个(最多500条),这里构造数组报文。
* 当前法务接口不可用,逐条模拟回写 oppositeId 和同步状态。
* 真实联调时打开注释的 collectOpposites 调用,用法务返回的 jtId 回写。
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int batchSyncPartner(List<Long> customerSysids) {
if (customerSysids == null || customerSysids.isEmpty()) {
return 0;
}
List<PartnerManageDto> partners = partnerManageMapper.selectPartnerByIds(customerSysids);
if (partners.isEmpty()) {
return 0;
}
attachContacts(partners);
LocalDateTime now = LocalDateTime.now();
// 构造批量报文(法务接口要求 JSON 数组 [{...},{...}]
List<Map<String, Object>> batchPayload = PartnerSyncPayloadBuilder.buildCollectOppositesBatchPayload(partners);
log.info("法务系统批量同步参数,共 {} 条: {}", partners.size(), JsonUtils.toJson(batchPayload));
// TODO: 真实联调时打开以下调用
// PushPayloadDTO requestDTO = new PushPayloadDTO();
// requestDTO.setPayload(Map.of("opposites", batchPayload)); // 或直接传 List,取决于 collectOpposites 签名
// Map<String, Object> response = dataCollectionPushService.collectOpposites(requestDTO);
// 解析法务返回结果(响应格式: { "code": "200", "data": [{ "o_id": "4083", "jtId": "10256" }, ...], "msg": "接收成功" }
// Object codeObj = response.get("code");
// if (codeObj != null && ("200".equals(String.valueOf(codeObj)) || Integer.valueOf(200).equals(codeObj))) {
// List<?> dataList = (List<?>) response.get("data");
// if (dataList != null) {
// for (Object item : dataList) {
// if (item instanceof Map) {
// Map<?, ?> map = (Map<?, ?>) item;
// Long oId = Long.valueOf(String.valueOf(map.get("o_id")));
// String jtId = map.get("jtId") != null ? String.valueOf(map.get("jtId")) : null;
// partnerManageMapper.updatePartnerSyncInfo(oId, jtId, SYNC_STATUS_SYNCED, now, "批量同步成功", operator, now);
// }
// }
// }
// }
// 模拟同步:逐条回写
String syncMessage = "批量模拟同步成功。TODO:后续调用 collectOpposites 批量接口。";
int successCount = 0;
for (PartnerManageDto partner : partners) {
String finalOppositeId = StrUtilHelper.hasText(partner.getOppositeId())
? partner.getOppositeId()
: PartnerIdUtils.buildGroupPartnerId();
partnerManageMapper.updatePartnerSyncInfo(
partner.getCustomerSysid(),
finalOppositeId,
PartnerManageConstants.SYNC_STATUS_SYNCED,
now,
syncMessage,
PartnerManageConstants.DEFAULT_OPERATOR,
now);
successCount++;
}
return successCount;
}
/** 批量查询并填充联系人(避免 N+1,一次查完再分组赋值) */ /** 批量查询并填充联系人(避免 N+1,一次查完再分组赋值) */
private void attachContacts(List<PartnerManageDto> partnerList) { private void attachContacts(List<PartnerManageDto> partnerList) {
if (partnerList == null || partnerList.isEmpty()) { if (partnerList == null || partnerList.isEmpty()) {
@@ -19,8 +19,25 @@ public final class PartnerSyncPayloadBuilder {
private PartnerSyncPayloadBuilder() { private PartnerSyncPayloadBuilder() {
} }
/** 构建相对方信息采集报文(数据采集接口规范 V3.0 格式) */ /** 构建相对方信息采集报文(数据采集接口规范 V3.0 格式,单条 */
public static PushPayloadDTO buildCollectOppositesPayload(PartnerManageDto partner) { public static PushPayloadDTO buildCollectOppositesPayload(PartnerManageDto partner) {
PushPayloadDTO requestDTO = new PushPayloadDTO();
requestDTO.setPayload(buildSingleOppositePayload(partner));
return requestDTO;
}
/**
* 构建相对方信息采集批量报文(数据采集接口规范 V3.0 格式,支持一次传多个,每次最多500条)。
* 文档要求请求体为 JSON 数组 [{...},{...}],直接返回 List 供调用方自行序列化。
*/
public static List<Map<String, Object>> buildCollectOppositesBatchPayload(List<PartnerManageDto> partners) {
return partners.stream()
.map(PartnerSyncPayloadBuilder::buildSingleOppositePayload)
.collect(Collectors.toList());
}
/** 构建单个相对方的报文体(复用于单条和批量) */
private static Map<String, Object> buildSingleOppositePayload(PartnerManageDto partner) {
Map<String, Object> payload = new LinkedHashMap<>(); Map<String, Object> payload = new LinkedHashMap<>();
payload.put("o_id", partner.getCustomerSysid() == null ? null : String.valueOf(partner.getCustomerSysid())); payload.put("o_id", partner.getCustomerSysid() == null ? null : String.valueOf(partner.getCustomerSysid()));
payload.put("o_name", partner.getCustomerNameC()); payload.put("o_name", partner.getCustomerNameC());
@@ -49,10 +66,7 @@ public final class PartnerSyncPayloadBuilder {
partner.getCreateTime().format(DATE_TIME_FORMATTER) partner.getCreateTime().format(DATE_TIME_FORMATTER)
); );
payload.put("o_contacts", buildContactList(partner.getContacts())); payload.put("o_contacts", buildContactList(partner.getContacts()));
return payload;
PushPayloadDTO requestDTO = new PushPayloadDTO();
requestDTO.setPayload(payload);
return requestDTO;
} }
/** 构建联系人列表报文 */ /** 构建联系人列表报文 */
@@ -114,6 +114,15 @@
and IS_DELETED = 'N' and IS_DELETED = 'N'
</select> </select>
<select id="selectPartnerByIds" resultMap="PartnerManageResult">
<include refid="selectPartnerColumns"/>
where IS_DELETED = 'N'
and CUSTOMER_SYSID in
<foreach collection="customerSysids" item="customerSysid" open="(" separator="," close=")">
#{customerSysid}
</foreach>
</select>
<insert id="insertPartner" parameterType="com.nbport.zgwl.partner.dto.PartnerManageDto"> <insert id="insertPartner" parameterType="com.nbport.zgwl.partner.dto.PartnerManageDto">
insert into ILDM_FEE_CUSTOMER_INFO insert into ILDM_FEE_CUSTOMER_INFO
( (