fix: 人员数据治理迁移功能优化5

This commit is contained in:
2026-11-12 18:48:43 +08:00
parent b7194ecf7b
commit d474992752
3 changed files with 14 additions and 13 deletions
@@ -168,16 +168,17 @@ public class PersonApiConfigServiceImpl extends BaseServiceImpl<PersonApiConfig>
// 历史配置未设置同步类型时保留全部追加行为;去重模式必须有唯一的有效业务标识。 // 历史配置未设置同步类型时保留全部追加行为;去重模式必须有唯一的有效业务标识。
if (Strings.isBlank(config.getSyncMode())) config.setSyncMode("APPEND"); if (Strings.isBlank(config.getSyncMode())) config.setSyncMode("APPEND");
Assert.isTrue(List.of("APPEND", "UPSERT", "INSERT_NEW").contains(config.getSyncMode()), "同步类型不正确"); Assert.isTrue(List.of("APPEND", "UPSERT", "INSERT_NEW").contains(config.getSyncMode()), "同步类型不正确");
if (!"APPEND".equals(config.getSyncMode())) { boolean unitTarget = "sys_unit".equalsIgnoreCase(config.getTargetTable());
if (unitTarget || !"APPEND".equals(config.getSyncMode())) {
Assert.isTrue(mappings.stream().filter(v -> Boolean.TRUE.equals(v.getIdentityFlag())).count() == 1 Assert.isTrue(mappings.stream().filter(v -> Boolean.TRUE.equals(v.getIdentityFlag())).count() == 1
&& identity != null && Strings.isNotBlank(identity.getSourceField()) && identity != null && Strings.isNotBlank(identity.getSourceField())
&& Strings.isNotBlank(identity.getTargetField()) && Strings.isNotBlank(identity.getTargetField())
&& !"pullTime".equals(identity.getTargetField()) && !"pullTime".equals(identity.getTargetField())
&& (!"id".equals(identity.getTargetField()) || isUnitConfig(config)), "请选择一个有效的业务唯一标识映射"); && (!"id".equals(identity.getTargetField()) || isUnitConfig(config)), "请选择一个有效的业务唯一标识映射");
} }
if ("sys_unit".equalsIgnoreCase(config.getTargetTable())) { if (unitTarget) {
Assert.isTrue(isUnitConfig(config) && "UPSERT".equals(config.getSyncMode()) Assert.isTrue(isUnitConfig(config) && "id".equals(config.getIdentityField()),
&& "id".equals(config.getIdentityField()), "单位API配置必须使用存在即修改模式,并将来源单位编码映射到id作为唯一标识"); "单位API配置必须将来源单位编码映射到id作为唯一标识");
Assert.isTrue(mappings.stream().anyMatch(mapping -> "name".equals(mapping.getTargetField()) Assert.isTrue(mappings.stream().anyMatch(mapping -> "name".equals(mapping.getTargetField())
&& hasMappingValue(mapping, defaults)), "单位API配置必须映射单位名称name"); && hasMappingValue(mapping, defaults)), "单位API配置必须映射单位名称name");
} }
@@ -355,7 +356,7 @@ public class PersonApiConfigServiceImpl extends BaseServiceImpl<PersonApiConfig>
.addv("dicts", dictionaries) .addv("dicts", dictionaries)
.addv("unitConfigs", dao().query(PersonApiConfig.class, .addv("unitConfigs", dao().query(PersonApiConfig.class,
Cnd.where("sourceType", "=", "HTTP_API").and("targetTable", "=", "sys_unit") Cnd.where("sourceType", "=", "HTTP_API").and("targetTable", "=", "sys_unit")
.and("syncMode", "=", "UPSERT").and("identityField", "=", "id") .and("identityField", "=", "id")
.and(Cnd.exps("delFlag", "=", false).or("delFlag", "is", null)).asc("configName")).stream() .and(Cnd.exps("delFlag", "=", false).or("delFlag", "is", null)).asc("configName")).stream()
.map(item -> NutMap.NEW().addv("id", item.getId()).addv("configName", item.getConfigName())).toList()); .map(item -> NutMap.NEW().addv("id", item.getId()).addv("configName", item.getConfigName())).toList());
} }
@@ -385,7 +386,7 @@ public class PersonApiConfigServiceImpl extends BaseServiceImpl<PersonApiConfig>
PersonApiConfig unitConfig = fetch(options.getUnitConfigId()); PersonApiConfig unitConfig = fetch(options.getUnitConfigId());
Assert.isTrue(!"sys_unit".equalsIgnoreCase(config.getTargetTable()) && unitConfig != null Assert.isTrue(!"sys_unit".equalsIgnoreCase(config.getTargetTable()) && unitConfig != null
&& !Boolean.TRUE.equals(unitConfig.getDelFlag()) && isUnitConfig(unitConfig) && !Boolean.TRUE.equals(unitConfig.getDelFlag()) && isUnitConfig(unitConfig)
&& "UPSERT".equals(unitConfig.getSyncMode()) && "id".equals(unitConfig.getIdentityField()), && "id".equals(unitConfig.getIdentityField()),
"请选择有效的单位API配置"); "请选择有效的单位API配置");
} }
Assert.notNull(options.getRules(), "字段配置不能为空"); Assert.notNull(options.getRules(), "字段配置不能为空");
@@ -386,8 +386,8 @@ public class PersonGovernanceSyncServiceImpl implements PersonGovernanceSyncServ
Assert.isTrue(fields.containsKey("id") && (unitTarget || userTarget || fields.containsKey("pullTime")), Assert.isTrue(fields.containsKey("id") && (unitTarget || userTarget || fields.containsKey("pullTime")),
"目标中间表必须包含id和pullTime字段"); "目标中间表必须包含id和pullTime字段");
if (unitTarget) { if (unitTarget) {
Assert.isTrue("HTTP_API".equals(config.getSourceType()) && "UPSERT".equals(config.getSyncMode()) Assert.isTrue("HTTP_API".equals(config.getSourceType()) && "id".equals(config.getIdentityField()),
&& "id".equals(config.getIdentityField()), "单位API必须按来源单位id新增或更新"); "单位API配置必须将来源单位编码映射到id作为唯一标识");
Assert.isTrue(mappings.stream().anyMatch(mapping -> "name".equals(mapping.getTargetField()) Assert.isTrue(mappings.stream().anyMatch(mapping -> "name".equals(mapping.getTargetField())
&& (Strings.isNotBlank(mapping.getSourceField()) || fieldDefaults.containsKey("name"))), && (Strings.isNotBlank(mapping.getSourceField()) || fieldDefaults.containsKey("name"))),
"单位API配置必须映射单位名称name"); "单位API配置必须映射单位名称name");
@@ -403,7 +403,7 @@ public class PersonGovernanceSyncServiceImpl implements PersonGovernanceSyncServ
Assert.isTrue(targets.add(mapping.getTargetField()), "系统字段不能重复映射:" + mapping.getTargetField()); Assert.isTrue(targets.add(mapping.getTargetField()), "系统字段不能重复映射:" + mapping.getTargetField());
} }
String mode = syncMode(config); String mode = syncMode(config);
if (!"APPEND".equals(mode)) { if (unitTarget || !"APPEND".equals(mode)) {
Assert.hasText(config.getIdentityField(), "去重同步必须配置唯一标识"); Assert.hasText(config.getIdentityField(), "去重同步必须配置唯一标识");
Assert.isTrue(targets.contains(config.getIdentityField()) Assert.isTrue(targets.contains(config.getIdentityField())
&& !"pullTime".equals(config.getIdentityField()) && !"pullTime".equals(config.getIdentityField())
@@ -481,7 +481,7 @@ public class PersonGovernanceSyncServiceImpl implements PersonGovernanceSyncServ
throw new IllegalArgumentException("字段类型转换失败:" + mapping.getSourceField() + " -> " + mapping.getTargetField()); throw new IllegalArgumentException("字段类型转换失败:" + mapping.getSourceField() + " -> " + mapping.getTargetField());
} }
} }
if (!"APPEND".equals(mode)) { if (unitTarget || !"APPEND".equals(mode)) {
Object identity = values.get(config.getIdentityField()); Object identity = values.get(config.getIdentityField());
Assert.isTrue(identity != null && Strings.isNotBlank(String.valueOf(identity)), "唯一标识不能为空:" + config.getIdentityField()); Assert.isTrue(identity != null && Strings.isNotBlank(String.valueOf(identity)), "唯一标识不能为空:" + config.getIdentityField());
} }
@@ -1182,9 +1182,9 @@
this.notifyWarning('请选择单位API配置') this.notifyWarning('请选择单位API配置')
return return
} }
if (unitTarget && (this.form.sourceType !== 'HTTP_API' || this.form.syncMode !== 'UPSERT' if (unitTarget && (this.form.sourceType !== 'HTTP_API' || !this.isIdentityMapping(this.identityRow)
|| !this.identityRow || this.identityRow.targetField !== 'id')) { || this.identityRow.targetField !== 'id')) {
this.notifyWarning('单位API配置请选择全量同步(存在即修改),并将单位编码映射到 id 作为唯一标识') this.notifyWarning('单位API配置请将单位编码映射到 id,并设为唯一标识')
this.$set(this, 'activeTab', 'mapping') this.$set(this, 'activeTab', 'mapping')
return return
} }