feat(controller): 批量导入支持新增企业查询条件定制功能

- 在 BatchImportSupport 中添加了新的重载方法 refreshCompanyIdByCompanyNameContainedInText
- 新增 companyQueryCustomizer 参数用于自定义 CreditCompany 查询条件
- 在 CreditJudgmentDebtorController 中添加 topLevelOnly 参数控制是否只匹配一级企业
- 支持通过 parentId 条件过滤一级企业(parentId=0 或 NULL)
- 优化了企业名称匹配逻辑,专注于 name 字段进行匹配
This commit is contained in:
2026-02-08 13:15:58 +08:00
parent 7841fa0bba
commit 15744e668b
2 changed files with 57 additions and 8 deletions

View File

@@ -2,6 +2,7 @@ package com.gxwebsoft.credit.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gxwebsoft.credit.entity.CreditCompany;
import com.gxwebsoft.credit.service.CreditCompanyService;
@@ -363,6 +364,44 @@ public class BatchImportSupport {
SFunction<T, Integer> tenantIdGetter,
Supplier<T> patchFactory,
SFunction<T, String>... textGetters) {
return refreshCompanyIdByCompanyNameContainedInText(
service,
creditCompanyService,
currentTenantId,
onlyNull,
limit,
idGetter,
idSetter,
companyIdGetter,
companyIdSetter,
hasDataGetter,
hasDataSetter,
tenantIdGetter,
patchFactory,
null,
textGetters
);
}
/**
* refreshCompanyIdByCompanyNameContainedInText 的增强版:支持对 CreditCompany 查询追加条件(例如仅匹配一级企业)。
*/
@SafeVarargs
public final <T> CompanyIdRefreshStats refreshCompanyIdByCompanyNameContainedInText(IService<T> service,
CreditCompanyService creditCompanyService,
Integer currentTenantId,
Boolean onlyNull,
Integer limit,
SFunction<T, Integer> idGetter,
BiConsumer<T, Integer> idSetter,
SFunction<T, Integer> companyIdGetter,
BiConsumer<T, Integer> companyIdSetter,
SFunction<T, Boolean> hasDataGetter,
BiConsumer<T, Boolean> hasDataSetter,
SFunction<T, Integer> tenantIdGetter,
Supplier<T> patchFactory,
Consumer<LambdaQueryChainWrapper<CreditCompany>> companyQueryCustomizer,
SFunction<T, String>... textGetters) {
boolean onlyNullFlag = (onlyNull == null) || Boolean.TRUE.equals(onlyNull);
if (textGetters == null || textGetters.length == 0) {
return new CompanyIdRefreshStats(false, 0, 0, 0, 0);
@@ -433,10 +472,14 @@ public class BatchImportSupport {
}
// 2.1) 构建当前租户的企业名匹配器
List<CreditCompany> companies = creditCompanyService.lambdaQuery()
LambdaQueryChainWrapper<CreditCompany> companyQuery = creditCompanyService.lambdaQuery()
.select(CreditCompany::getId, CreditCompany::getName, CreditCompany::getMatchName, CreditCompany::getTenantId)
.eq(CreditCompany::getTenantId, tenantId)
.list();
;
if (companyQueryCustomizer != null) {
companyQueryCustomizer.accept(companyQuery);
}
List<CreditCompany> companies = companyQuery.list();
CompanyNameMatcher matcher = CompanyNameMatcher.build(companies);
// 2.2) 匹配并回填

View File

@@ -164,12 +164,13 @@ public class CreditJudgmentDebtorController extends BaseController {
@PostMapping("/company-id/refresh")
public ApiResult<Map<String, Object>> refreshCompanyIdByCompanyName(
@RequestParam(value = "onlyNull", required = false, defaultValue = "true") Boolean onlyNull,
@RequestParam(value = "limit", required = false) Integer limit
@RequestParam(value = "limit", required = false) Integer limit,
@RequestParam(value = "topLevelOnly", required = false, defaultValue = "true") Boolean topLevelOnly
) {
User loginUser = getLoginUser();
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
// Party columns may contain multiple roles/names; match if any company name is contained in the text.
// Match only on "name" column: debtor.name contains a (top-level) CreditCompany name/matchName.
BatchImportSupport.CompanyIdRefreshStats stats = batchImportSupport.refreshCompanyIdByCompanyNameContainedInText(
creditJudgmentDebtorService,
creditCompanyService,
@@ -184,10 +185,15 @@ public class CreditJudgmentDebtorController extends BaseController {
CreditJudgmentDebtor::setHasData,
CreditJudgmentDebtor::getTenantId,
CreditJudgmentDebtor::new,
// Priority: 原告/上诉人 > 被告/被上诉人 > 其他当事人/第三人; fall back to "name" if party columns are empty.
CreditJudgmentDebtor::getPlaintiffAppellant,
CreditJudgmentDebtor::getAppellee,
CreditJudgmentDebtor::getOtherPartiesThirdParty,
q -> {
if (!Boolean.TRUE.equals(topLevelOnly)) {
return;
}
// "一级企业"parentId=0部分历史数据可能为 NULL兼容处理
q.and(w -> w.eq(com.gxwebsoft.credit.entity.CreditCompany::getParentId, 0)
.or()
.isNull(com.gxwebsoft.credit.entity.CreditCompany::getParentId));
},
CreditJudgmentDebtor::getName
);