feat(credit): 优化信用消限记录导入功能支持多模板兼容
- 新增 application-glt.yml 生产环境配置文件 - 重构 CreditXgxf 实体类字段顺序和命名规范 - 添加上游多公司导出模板的备用字段映射支持 - 实现 Excel 表头括号后缀清理和标准化逻辑 - 增加备用字段(申请执行人、被执行人)的兼容性处理 - 完善导入参数转换逻辑确保模板兼容性 - 添加单元测试验证多模板字段映射正确性
This commit is contained in:
@@ -478,20 +478,28 @@ public class CreditXgxfController extends BaseController {
|
|||||||
private CreditXgxf convertImportParamToEntity(CreditXgxfImportParam param) {
|
private CreditXgxf convertImportParamToEntity(CreditXgxfImportParam param) {
|
||||||
CreditXgxf entity = new CreditXgxf();
|
CreditXgxf entity = new CreditXgxf();
|
||||||
|
|
||||||
|
// Template compatibility: some upstream multi-company exports use alternate headers for the same columns.
|
||||||
|
String plaintiffAppellant = !ImportHelper.isBlank(param.getPlaintiffAppellant())
|
||||||
|
? param.getPlaintiffAppellant()
|
||||||
|
: param.getPlaintiffAppellant2();
|
||||||
|
String appellee = !ImportHelper.isBlank(param.getAppellee())
|
||||||
|
? param.getAppellee()
|
||||||
|
: param.getAppellee2();
|
||||||
|
String courtName = !ImportHelper.isBlank(param.getCourtName())
|
||||||
|
? param.getCourtName()
|
||||||
|
: param.getCourtName2();
|
||||||
|
|
||||||
entity.setCaseNumber(param.getCaseNumber());
|
entity.setCaseNumber(param.getCaseNumber());
|
||||||
entity.setType(param.getType());
|
entity.setType(param.getType());
|
||||||
entity.setDataType(param.getDataType());
|
entity.setDataType(param.getDataType());
|
||||||
entity.setPlaintiffAppellant(param.getPlaintiffAppellant());
|
entity.setPlaintiffAppellant(plaintiffAppellant);
|
||||||
entity.setAppellee(param.getAppellee());
|
entity.setAppellee(appellee);
|
||||||
entity.setOtherPartiesThirdParty(param.getOtherPartiesThirdParty());
|
entity.setOtherPartiesThirdParty(param.getOtherPartiesThirdParty());
|
||||||
entity.setPlaintiffAppellant(param.getPlaintiffAppellant());
|
|
||||||
entity.setDataStatus(param.getDataStatus());
|
entity.setDataStatus(param.getDataStatus());
|
||||||
entity.setAppellee(param.getAppellee());
|
|
||||||
|
|
||||||
// 兼容不同模板字段:如果 *2 有值则以 *2 为准写入主字段
|
|
||||||
entity.setInvolvedAmount(param.getInvolvedAmount());
|
entity.setInvolvedAmount(param.getInvolvedAmount());
|
||||||
entity.setOccurrenceTime(param.getOccurrenceTime());
|
entity.setOccurrenceTime(param.getOccurrenceTime());
|
||||||
entity.setCourtName(param.getCourtName());
|
entity.setCourtName(courtName);
|
||||||
entity.setReleaseDate(param.getReleaseDate());
|
entity.setReleaseDate(param.getReleaseDate());
|
||||||
entity.setComments(param.getComments());
|
entity.setComments(param.getComments());
|
||||||
|
|
||||||
|
|||||||
@@ -330,7 +330,7 @@ public class ExcelImportSupport {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// Remove common invisible whitespace characters, including full-width space.
|
// Remove common invisible whitespace characters, including full-width space.
|
||||||
return text
|
String normalized = text
|
||||||
.replace("/", "/")
|
.replace("/", "/")
|
||||||
.replace(" ", "")
|
.replace(" ", "")
|
||||||
.replace("\t", "")
|
.replace("\t", "")
|
||||||
@@ -339,6 +339,10 @@ public class ExcelImportSupport {
|
|||||||
.replace("\u00A0", "")
|
.replace("\u00A0", "")
|
||||||
.replace(" ", "")
|
.replace(" ", "")
|
||||||
.trim();
|
.trim();
|
||||||
|
// Some upstream templates append explanations in brackets, e.g. "原告/上诉人(申请执行人)".
|
||||||
|
// Strip bracketed suffixes so Easypoi can match the canonical header name.
|
||||||
|
normalized = normalized.replaceAll("[\\((【\\[].*?[\\))】\\]]", "");
|
||||||
|
return normalized.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T> List<T> filterEmptyRows(List<T> rawList, Predicate<T> emptyRowPredicate) {
|
private static <T> List<T> filterEmptyRows(List<T> rawList, Predicate<T> emptyRowPredicate) {
|
||||||
|
|||||||
@@ -30,51 +30,51 @@ public class CreditXgxf implements Serializable {
|
|||||||
@TableId(value = "id", type = IdType.AUTO)
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
@Schema(description = "案号")
|
|
||||||
private String caseNumber;
|
|
||||||
|
|
||||||
@Schema(description = "链接地址")
|
@Schema(description = "链接地址")
|
||||||
private String url;
|
private String url;
|
||||||
|
|
||||||
@Schema(description = "数据类型")
|
@Schema(description = "数据类型")
|
||||||
private String type;
|
private String type;
|
||||||
|
|
||||||
@Schema(description = "限消令对象")
|
@Schema(description = "原告/上诉人")
|
||||||
private String dataType;
|
|
||||||
|
|
||||||
@Schema(description = "限制法定代表人")
|
|
||||||
private String plaintiffAppellant;
|
private String plaintiffAppellant;
|
||||||
|
|
||||||
@Schema(description = "申请人")
|
|
||||||
private String appellee;
|
|
||||||
|
|
||||||
@Schema(description = "原告/上诉人")
|
|
||||||
private String plaintiffUser;
|
|
||||||
|
|
||||||
@Schema(description = "被告/被上诉人")
|
@Schema(description = "被告/被上诉人")
|
||||||
private String defendantUser;
|
private String appellee;
|
||||||
|
|
||||||
@Schema(description = "涉案金额(元)")
|
|
||||||
private String involvedAmount;
|
|
||||||
|
|
||||||
@Schema(description = "立案日期")
|
|
||||||
private String occurrenceTime;
|
|
||||||
|
|
||||||
@Schema(description = "执行法院")
|
|
||||||
private String courtName;
|
|
||||||
|
|
||||||
@Schema(description = "发布日期")
|
|
||||||
private String releaseDate;
|
|
||||||
|
|
||||||
@Schema(description = "其他当事人/第三人")
|
@Schema(description = "其他当事人/第三人")
|
||||||
private String otherPartiesThirdParty;
|
private String otherPartiesThirdParty;
|
||||||
|
|
||||||
@Schema(description = "案由")
|
@Schema(description = "发生时间")
|
||||||
private String causeOfAction;
|
private String occurrenceTime;
|
||||||
|
|
||||||
|
@Schema(description = "案号")
|
||||||
|
private String caseNumber;
|
||||||
|
|
||||||
|
@Schema(description = "涉案金额")
|
||||||
|
private String involvedAmount;
|
||||||
|
|
||||||
|
@Schema(description = "法院")
|
||||||
|
private String courtName;
|
||||||
|
|
||||||
@Schema(description = "数据状态")
|
@Schema(description = "数据状态")
|
||||||
private String dataStatus;
|
private String dataStatus;
|
||||||
|
|
||||||
|
@Schema(description = "限消令对象")
|
||||||
|
private String dataType;
|
||||||
|
|
||||||
|
@Schema(description = "原告/上诉人2")
|
||||||
|
private String plaintiffUser;
|
||||||
|
|
||||||
|
@Schema(description = "被告/被上诉人2")
|
||||||
|
private String defendantUser;
|
||||||
|
|
||||||
|
@Schema(description = "发布日期")
|
||||||
|
private String releaseDate;
|
||||||
|
|
||||||
|
@Schema(description = "案由")
|
||||||
|
private String causeOfAction;
|
||||||
|
|
||||||
@Schema(description = "企业ID")
|
@Schema(description = "企业ID")
|
||||||
private Integer companyId;
|
private Integer companyId;
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,21 @@ public class CreditXgxfImportParam implements Serializable {
|
|||||||
@Excel(name = "限消令对象")
|
@Excel(name = "限消令对象")
|
||||||
private String dataType;
|
private String dataType;
|
||||||
|
|
||||||
@Schema(description = "原告/上诉人")
|
@Excel(name = "原告/上诉人")
|
||||||
private String plaintiffAppellant;
|
private String plaintiffAppellant;
|
||||||
|
|
||||||
@Schema(description = "被告/被上诉人")
|
// Some upstream multi-company exports use "申请执行人" instead of "原告/上诉人".
|
||||||
|
@Excel(name = "申请执行人")
|
||||||
|
private String plaintiffAppellant2;
|
||||||
|
|
||||||
|
@Excel(name = "被告/被上诉人")
|
||||||
private String appellee;
|
private String appellee;
|
||||||
|
|
||||||
@Schema(description = "其他当事人/第三人")
|
// Some upstream multi-company exports use "被执行人" instead of "被告/被上诉人".
|
||||||
|
@Excel(name = "被执行人")
|
||||||
|
private String appellee2;
|
||||||
|
|
||||||
|
@Excel(name = "其他当事人/第三人")
|
||||||
private String otherPartiesThirdParty;
|
private String otherPartiesThirdParty;
|
||||||
|
|
||||||
@Excel(name = "涉案金额")
|
@Excel(name = "涉案金额")
|
||||||
@@ -49,7 +57,7 @@ public class CreditXgxfImportParam implements Serializable {
|
|||||||
@Excel(name = "数据状态")
|
@Excel(name = "数据状态")
|
||||||
private String dataStatus;
|
private String dataStatus;
|
||||||
|
|
||||||
@Excel(name = "法院")
|
@Excel(name = "执行法院")
|
||||||
private String courtName2;
|
private String courtName2;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
83
src/main/resources/application-glt.yml
Normal file
83
src/main/resources/application-glt.yml
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
# 生产环境配置
|
||||||
|
|
||||||
|
# 数据源配置
|
||||||
|
spring:
|
||||||
|
datasource:
|
||||||
|
url: jdbc:mysql://1Panel-mysql-XsWW:3306/modules?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
|
||||||
|
username: modules
|
||||||
|
password: tYmmMGh5wpwXR3ae
|
||||||
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
type: com.alibaba.druid.pool.DruidDataSource
|
||||||
|
druid:
|
||||||
|
remove-abandoned: true
|
||||||
|
|
||||||
|
# redis
|
||||||
|
redis:
|
||||||
|
database: 0
|
||||||
|
host: 1Panel-redis-GmNr
|
||||||
|
port: 6379
|
||||||
|
password: redis_t74P8C
|
||||||
|
|
||||||
|
# 日志配置
|
||||||
|
logging:
|
||||||
|
file:
|
||||||
|
name: websoft-modules.log
|
||||||
|
level:
|
||||||
|
root: WARN
|
||||||
|
com.gxwebsoft: ERROR
|
||||||
|
com.baomidou.mybatisplus: ERROR
|
||||||
|
|
||||||
|
socketio:
|
||||||
|
host: 0.0.0.0 #IP地址
|
||||||
|
|
||||||
|
# MQTT配置
|
||||||
|
mqtt:
|
||||||
|
enabled: true # 启用MQTT服务
|
||||||
|
host: tcp://132.232.214.96:1883
|
||||||
|
username: swdev
|
||||||
|
password: Sw20250523
|
||||||
|
client-id-prefix: hjm_car_
|
||||||
|
topic: /SW_GPS/#
|
||||||
|
qos: 2
|
||||||
|
connection-timeout: 10
|
||||||
|
keep-alive-interval: 20
|
||||||
|
auto-reconnect: true
|
||||||
|
|
||||||
|
# 框架配置
|
||||||
|
config:
|
||||||
|
# 文件服务器
|
||||||
|
file-server: https://file-s209.shoplnk.cn
|
||||||
|
# 生产环境接口
|
||||||
|
server-url: https://glt-server.websoft.top/api
|
||||||
|
upload-path: /www/wwwroot/file.ws
|
||||||
|
|
||||||
|
# 阿里云OSS云存储
|
||||||
|
endpoint: https://oss-cn-shenzhen.aliyuncs.com
|
||||||
|
accessKeyId: LTAI4GKGZ9Z2Z8JZ77c3GNZP
|
||||||
|
accessKeySecret: BiDkpS7UXj72HWwDWaFZxiXjNFBNCM
|
||||||
|
bucketName: oss-gxwebsoft
|
||||||
|
bucketDomain: https://oss.wsdns.cn
|
||||||
|
aliyunDomain: https://oss-gxwebsoft.oss-cn-shenzhen.aliyuncs.com
|
||||||
|
|
||||||
|
# 生产环境证书配置
|
||||||
|
certificate:
|
||||||
|
load-mode: VOLUME # 生产环境从Docker挂载卷加载
|
||||||
|
cert-root-path: /www/wwwroot/file.ws
|
||||||
|
|
||||||
|
# 支付配置缓存
|
||||||
|
payment:
|
||||||
|
cache:
|
||||||
|
# 支付配置缓存键前缀,生产环境使用 Payment:1* 格式
|
||||||
|
key-prefix: "Payment:1"
|
||||||
|
# 缓存过期时间(小时)
|
||||||
|
expire-hours: 24
|
||||||
|
# 阿里云翻译配置
|
||||||
|
aliyun:
|
||||||
|
translate:
|
||||||
|
access-key-id: LTAI5tEsyhW4GCKbds1qsopg
|
||||||
|
access-key-secret: zltFlQrYVAoq2KMFDWgLa3GhkMNeyO
|
||||||
|
endpoint: mt.cn-hangzhou.aliyuncs.com
|
||||||
|
wechatpay:
|
||||||
|
transfer:
|
||||||
|
scene-id: 1005
|
||||||
|
scene-report-infos-json: '[{"info_type":"岗位类型","info_content":"配送员"},{"info_type":"报酬说明","info_content":"12月份配送费"}]'
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package com.gxwebsoft.credit.controller;
|
||||||
|
|
||||||
|
import com.gxwebsoft.credit.entity.CreditXgxf;
|
||||||
|
import com.gxwebsoft.credit.param.CreditXgxfImportParam;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class CreditXgxfImportMappingTest {
|
||||||
|
|
||||||
|
private static CreditXgxf convert(CreditXgxfImportParam param) throws Exception {
|
||||||
|
CreditXgxfController controller = new CreditXgxfController();
|
||||||
|
Method m = CreditXgxfController.class.getDeclaredMethod("convertImportParamToEntity", CreditXgxfImportParam.class);
|
||||||
|
m.setAccessible(true);
|
||||||
|
return (CreditXgxf) m.invoke(controller, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void mapsAlternateUpstreamHeadersForParties() throws Exception {
|
||||||
|
CreditXgxfImportParam param = new CreditXgxfImportParam();
|
||||||
|
param.setCaseNumber("(2024)示例案号");
|
||||||
|
param.setPlaintiffAppellant2("申请执行人A");
|
||||||
|
param.setAppellee2("被执行人B");
|
||||||
|
param.setCourtName2("执行法院C");
|
||||||
|
|
||||||
|
CreditXgxf entity = convert(param);
|
||||||
|
assertEquals("申请执行人A", entity.getPlaintiffAppellant());
|
||||||
|
assertEquals("被执行人B", entity.getAppellee());
|
||||||
|
assertEquals("执行法院C", entity.getCourtName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void prefersCanonicalHeadersWhenBothPresent() throws Exception {
|
||||||
|
CreditXgxfImportParam param = new CreditXgxfImportParam();
|
||||||
|
param.setCaseNumber("(2024)示例案号");
|
||||||
|
param.setPlaintiffAppellant("原告A");
|
||||||
|
param.setPlaintiffAppellant2("申请执行人A");
|
||||||
|
param.setAppellee("被告B");
|
||||||
|
param.setAppellee2("被执行人B");
|
||||||
|
param.setCourtName("法院C");
|
||||||
|
param.setCourtName2("执行法院C");
|
||||||
|
|
||||||
|
CreditXgxf entity = convert(param);
|
||||||
|
assertEquals("原告A", entity.getPlaintiffAppellant());
|
||||||
|
assertEquals("被告B", entity.getAppellee());
|
||||||
|
assertEquals("法院C", entity.getCourtName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user