feat(REQ-2040): 同步逻辑调整,采用全量覆盖

This commit is contained in:
chenwenjian 2024-01-05 14:57:42 +08:00
parent 85ae5531f3
commit 632b5b579d
4 changed files with 26 additions and 28 deletions

View File

@ -92,7 +92,7 @@ public interface BlackAndWhiteListApi {
/**
* 平台同步黑白名单
* <p>
* 每次最多同步1000条记录且整体上同步策略采用增量更新策略
* 每次最多同步1000条记录且整体上同步策略采用全量覆盖策略
* 若总记录数超过1000条请自行分片多次调用
* </p>
*

View File

@ -6,6 +6,7 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ -45,10 +46,11 @@ public class BlackAndWhiteListPlatformSyncReq {
private List<Map<String, Object>> params;
/**
* 同步时使用的业务唯一字段名username
* 分片号从1开始默认是1若等于1则先删除所有上次同步的名单然后新增本次的名单若大于1时则直接新增到黑白名单中
*/
@NotBlank(message = "同步时使用的业务唯一字段名")
private String businessUniqueField;
@Min(value = 1, message = "分片号必须大于1")
@NotNull(message = "分片大小不能为空")
private Long fragment = 1L;
/**
* 是否同步至登录黑名单

View File

@ -5,7 +5,11 @@ import cn.axzo.framework.data.mybatisplus.model.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.Map;
@ -16,7 +20,11 @@ import java.util.Map;
* @modifiedBy
* @version: 1.0
*/
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@TableName(value = "saas_black_white_list",autoResultMap = true)
public class SaasBlackWhiteList extends BaseEntity<SaasBlackWhiteList> {

View File

@ -173,29 +173,17 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService {
if (req.getParams().size() > fragmentSize) {
throw new ServiceException("请主动进行分片多次同步,单次同步数小于" + fragmentSize + "条数据");
}
// 存入本次同步的黑/白名单记录
req.getParams().forEach(param -> {
HashMap<String, Object> map = new HashMap<>();
map.put(req.getBusinessUniqueField(), param.get(req.getBusinessUniqueField()));
List<BlackAndWhiteListResp> detail = detail(BlackAndWhiteListReq.builder()
.type(req.getType())
.module(req.getModule())
.param(map)
.build());
// 该记录原来不存在即未同步过直接新增一条
if (detail.size() == 0) {
create(BlackAndWhiteListReq.builder()
.type(req.getType())
.module(req.getModule())
.param(param)
.build());
} else if (detail.size() == 1) {
updateParamById(detail.get(0).getId(), param);
} else {
log.warn("指定唯一字段:{},不唯一记录:{}", req.getBusinessUniqueField(), JSONUtil.toJsonStr(detail));
throw new ServiceException("请检查指定的【业务唯一字段名:" + req.getBusinessUniqueField() + "】是否正确,记录中存在不唯一值");
}
});
// 第一个分片需要先删除所有对应模块的名单再新增
if (req.getFragment() == 1 ){
deleteByModule(req.getType(),req.getModule());
}
// 新增
List<SaasBlackWhiteList> collect = req.getParams().stream().map(param -> SaasBlackWhiteList.builder()
.type(req.getType().getValue())
.module(req.getModule())
.param(param)
.build()).collect(Collectors.toList());
boolean saved = blackAndWhiteListRepository.saveBatch(collect);
// 同步至登录黑名单
if (Objects.nonNull(req.getIsSyncLogin()) && req.getIsSyncLogin()){
internalSync(BlackAndWhiteListInternalSyncReq.builder()
@ -212,7 +200,7 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService {
.sourceFields(Collections.singletonList(req.getSyncRegisterField()))
.targetModule(BlackAndWhiteListConstant.OU_REGISTER_BLACK_LIST).build());
}
return true;
return saved;
}
/**