refactor(model): 重构模型类包结构并优化序列化处理

重构模型类包结构,将模型类按功能模块划分到不同的子包中。优化序列化处理,为VO类添加serialVersionUID并实现Serializable接口。移除部分冗余的serialVersionUID字段,简化模型类代码。同时修复UITools中空值处理的问题,并更新pom版本至0.0.100-SNAPSHOT。

- 将模型类按功能模块划分到ds子包中
- 为VO类添加序列化支持
- 移除冗余的serialVersionUID字段
- 修复UITools空值处理问题
- 更新项目版本号
This commit is contained in:
2025-10-09 18:27:48 +08:00
parent 51b8c16798
commit c4eec0a9dd
457 changed files with 8426 additions and 3669 deletions

View File

@@ -10,8 +10,8 @@ import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.model.CloudRk;
import com.ecep.contract.model.Company;
import com.ecep.contract.ds.other.model.CloudRk;
import com.ecep.contract.ds.company.model.Company;
@Repository
public interface CloudRkRepository extends MyRepository<CloudRk, Integer> {

View File

@@ -1,17 +1,32 @@
package com.ecep.contract.cloud.rk;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import com.ecep.contract.BlackReasonType;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp;
import com.ecep.contract.cloud.CloudInfo;
import com.ecep.contract.ds.company.model.Company;
import com.ecep.contract.ds.company.model.CompanyBlackReason;
import com.ecep.contract.ds.company.repository.CompanyBlackReasonRepository;
import com.ecep.contract.ds.company.repository.CompanyOldNameRepository;
import com.ecep.contract.ds.company.service.CompanyService;
import com.ecep.contract.ds.other.model.CloudRk;
import com.ecep.contract.ds.other.service.SysConfService;
import com.ecep.contract.model.Bank;
import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.FileUtils;
import com.ecep.contract.util.HttpJsonUtils;
import com.ecep.contract.util.MyStringUtils;
import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.CloudRkVo;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.persistence.criteria.Path;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -26,36 +41,22 @@ import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.ecep.contract.BlackReasonType;
import com.ecep.contract.IEntityService;
import com.ecep.contract.SpringApp;
import com.ecep.contract.cloud.CloudInfo;
import com.ecep.contract.ds.company.repository.CompanyBlackReasonRepository;
import com.ecep.contract.ds.company.repository.CompanyOldNameRepository;
import com.ecep.contract.ds.company.service.CompanyService;
import com.ecep.contract.ds.other.service.SysConfService;
import com.ecep.contract.model.CloudRk;
import com.ecep.contract.model.Company;
import com.ecep.contract.model.CompanyBlackReason;
import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.FileUtils;
import com.ecep.contract.util.HttpJsonUtils;
import com.ecep.contract.util.MyStringUtils;
import com.ecep.contract.vo.CloudRkVo;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.persistence.criteria.Path;
import lombok.Data;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@Lazy
@Service
@CacheConfig(cacheNames = "cloud-rk")
public class CloudRkService implements IEntityService<CloudRk>, VoableService<CloudRk, CloudRkVo> {
public class CloudRkService implements IEntityService<CloudRk>, QueryService<CloudRkVo>, VoableService<CloudRk, CloudRkVo> {
private static final Logger logger = LoggerFactory.getLogger(CloudRkService.class);
public static final String KEY_PROXY = "cloud.rk.proxy";
@@ -99,9 +100,6 @@ public class CloudRkService implements IEntityService<CloudRk>, VoableService<Cl
private SysConfService confService;
@Autowired
private CloudRkRepository cloudRKRepository;
@Lazy
@Autowired
private CompanyService companyService;
@Autowired
private CompanyOldNameRepository companyOldNameRepository;
@Autowired
@@ -113,8 +111,20 @@ public class CloudRkService implements IEntityService<CloudRk>, VoableService<Cl
}
@Cacheable(key = "#p0")
public CloudRk findById(Integer id) {
return cloudRKRepository.findById(id).orElse(null);
public CloudRkVo findById(Integer id) {
return cloudRKRepository.findById(id).map(CloudRk::toVo).orElse(null);
}
@Override
public Page<CloudRkVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<CloudRk> spec = null;
if (paramsNode.has("searchText")) {
spec = getSpecification(paramsNode.get("searchText").asText());
}
spec = SpecificationUtils.andParam(spec, paramsNode, "company");
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "cloudId", "customerGrade", "customerScore", "vendorGrade", "vendorScore", "active", "version", "rank", "description");
// 可以根据需要添加更多参数处理
return findAll(spec, pageable).map(CloudRk::toVo);
}
public Page<CloudRk> findAll(Specification<CloudRk> spec, Pageable pageable) {
@@ -446,5 +456,7 @@ public class CloudRkService implements IEntityService<CloudRk>, VoableService<Cl
cloudRk.setCompany(company);
}
}
cloudRk.setVersion(vo.getVersion());
}
}

View File

@@ -18,12 +18,13 @@ import com.ecep.contract.SpringApp;
import com.ecep.contract.cloud.rk.ctx.CloudRkCtx;
import com.ecep.contract.constant.CloudServiceConstant;
import com.ecep.contract.ds.contract.service.ContractService;
import com.ecep.contract.model.CloudRk;
import com.ecep.contract.model.Company;
import com.ecep.contract.ds.other.model.CloudRk;
import com.ecep.contract.ds.company.model.Company;
import com.ecep.contract.ui.Tasker;
/**
* 集团相关方平台同步任务
*
*/
public class CloudRkSyncTask extends Tasker<Object> {
private static final Logger logger = LoggerFactory.getLogger(CloudRkSyncTask.class);
@@ -33,11 +34,8 @@ public class CloudRkSyncTask extends Tasker<Object> {
@Override
protected Object execute(MessageHolder holder) throws Exception {
updateTitle("集团相关方平台");
CloudRkCtx cloudRkCtx = null;
CloudRkService service = null;
try {
cloudRkCtx = new CloudRkCtx();
service = SpringApp.getBean(CloudRkService.class);
} catch (BeansException e) {
holder.error(CloudServiceConstant.RK_NAME + " 服务未启用");
@@ -49,7 +47,7 @@ public class CloudRkSyncTask extends Tasker<Object> {
holder.info("没有需要更新");
return null;
}
CloudRkCtx cloudRkCtx = new CloudRkCtx();
AtomicInteger counter = new AtomicInteger(0);
holder.info("统计需要更新的 " + total + "");

View File

@@ -5,7 +5,6 @@ import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -20,10 +19,10 @@ import org.springframework.util.StringUtils;
import com.ecep.contract.SpringApp;
import com.ecep.contract.ds.company.repository.CompanyContactRepository;
import com.ecep.contract.ds.company.service.CompanyOldNameService;
import com.ecep.contract.model.CloudRk;
import com.ecep.contract.model.Company;
import com.ecep.contract.model.CompanyContact;
import com.ecep.contract.model.CompanyOldName;
import com.ecep.contract.ds.other.model.CloudRk;
import com.ecep.contract.ds.company.model.Company;
import com.ecep.contract.ds.company.model.CompanyContact;
import com.ecep.contract.ds.company.model.CompanyOldName;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

View File

@@ -12,6 +12,8 @@ import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -34,11 +36,11 @@ import com.ecep.contract.cloud.rk.CloudRkService;
import com.ecep.contract.ds.company.service.CompanyBlackReasonService;
import com.ecep.contract.ds.company.service.CompanyContactService;
import com.ecep.contract.ds.company.service.CompanyOldNameService;
import com.ecep.contract.model.CloudRk;
import com.ecep.contract.model.Company;
import com.ecep.contract.model.CompanyBlackReason;
import com.ecep.contract.model.CompanyContact;
import com.ecep.contract.model.CompanyOldName;
import com.ecep.contract.ds.other.model.CloudRk;
import com.ecep.contract.ds.company.model.Company;
import com.ecep.contract.ds.company.model.CompanyBlackReason;
import com.ecep.contract.ds.company.model.CompanyContact;
import com.ecep.contract.ds.company.model.CompanyOldName;
import com.ecep.contract.util.FileUtils;
import com.ecep.contract.util.HttpJsonUtils;
import com.fasterxml.jackson.databind.JsonMappingException;
@@ -74,6 +76,14 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
HttpJsonUtils.post(url, data, consumer, getObjectMapper(), getSocksProxy());
}
/**
* 同步企业相关信息
*
* @param company
* @param cloudRk
* @param holder
* @return
*/
public boolean syncCompany(Company company, CloudRk cloudRk, MessageHolder holder) {
if (!StringUtils.hasText(cloudRk.getCloudId())) {
holder.warn("未定义平台编号, 尝试从平台上自动获取");
@@ -121,6 +131,7 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
message = message.substring(0, 50);
}
cloudRk.setDescription(message);
holder.error("更新发生错误:" + e.getMessage());
}
return updated;
}
@@ -471,7 +482,7 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
}
private boolean applyEnterpriseQuery(JsonNode json, Company company, CloudRk cloudRk,
List<CloudRkService.EntInfo> results, MessageHolder holder) {
List<CloudRkService.EntInfo> results, MessageHolder holder) {
if (!json.has("data")) {
// 没有数据
holder.error("数据异常返回的json中没有 data 字段");
@@ -508,9 +519,13 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
Company company, CloudRk cloudRk, MessageHolder holder) throws IOException {
String api = getConfService().getString(CloudRkService.KEY_ENT_REPORT_URL);
Proxy socksProxy = getSocksProxy();
holder.debug("更新企业工商注册信息: " + company.getName() + " @ " + api + ", proxy=" + socksProxy);
holder.debug("更新企业工商注册信息: " + company.getName());
if (socksProxy.type() != Proxy.Type.DIRECT) {
holder.debug("Use Proxy: " + socksProxy);
}
AtomicBoolean modified = new AtomicBoolean(false);
try {
holder.debug("POST " + api);
post(api, data -> {
data.put("entName", company.getName());
data.put("entid", cloudRk.getCloudId());
@@ -518,7 +533,13 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
data.put("method", "data");
data.put("nodetype", "B1001");
}, jsonNode -> {
modified.set(applyEnterpriseInfo(jsonNode, company, cloudRk, holder));
try {
if (applyEnterpriseInfo(jsonNode, company, cloudRk, holder)) {
modified.set(true);
}
} catch (Exception e) {
holder.error("更新企业信息失败:" + e.getMessage() + ", json=" + jsonNode.toString());
}
saveJsonToFile(company, jsonNode, FileUtils.FILE_B1001_JSON, holder);
});
} catch (IOException e) {
@@ -601,19 +622,32 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
updateCompanyNameHistory(company, data, holder.sub("曾用名"));
updateLegalRepresentativeContact(company, data, holder.sub("法人联系方式"));
updateLocalDateTime(cloudRk::getCloudEntUpdate, cloudRk::setCloudEntUpdate, data, "updated", holder, "更新时间");
if (updateLocalDateTime(cloudRk::getCloudEntUpdate, cloudRk::setCloudEntUpdate, data, "updated", holder, "更新时间")) {
modified = true;
}
return modified;
}
public boolean updateLocalDateTime(Supplier<LocalDateTime> getter, Consumer<LocalDateTime> setter, JsonNode data,
String field,
MessageHolder holder, String topic) {
String field,
MessageHolder holder, String topic) {
JsonNode node = data.get(field);
if (node == null || node.isNull()) {
return false;
}
LocalDateTime updated = getObjectMapper().convertValue(node, LocalDateTime.class);
updateLocalDateTime(getter, setter, updated, holder, topic);
try {
LocalDateTime updated = null;
try {
updated = LocalDateTime.parse(node.asText(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
} catch (DateTimeParseException e) {
updated = getObjectMapper().convertValue(node, LocalDateTime.class);
}
updateLocalDateTime(getter, setter, updated, holder, topic);
return true;
} catch (IllegalArgumentException e) {
holder.error("更新 " + topic + " 失败:" + e.getMessage());
}
return false;
}
@@ -732,7 +766,7 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
}
private boolean updateLocalDate(Supplier<LocalDate> getter, Consumer<LocalDate> setter, JsonNode data, String field,
MessageHolder holder, String topic, boolean allowNull) {
MessageHolder holder, String topic, boolean allowNull) {
JsonNode node = data.get(field);
if (node == null || node.isNull()) {
return false;
@@ -745,12 +779,12 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
}
private boolean updateLocalDate(Supplier<LocalDate> getter, Consumer<LocalDate> setter, JsonNode data, String field,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
return updateLocalDate(getter, setter, data, field, holder, topic, false);
}
private void updateInstant(Supplier<Instant> getter, Consumer<Instant> setter, JsonNode data, String field,
MessageHolder holder, String topic, boolean allowNull) {
MessageHolder holder, String topic, boolean allowNull) {
JsonNode node = data.get("updated");
if (node == null) {
return;
@@ -768,13 +802,15 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
}
private boolean updateText(Supplier<String> getter, Consumer<String> setter, JsonNode data, String field,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
JsonNode node = data.get(field);
if (node == null || node.isNull()) {
holder.warn(topic + "为空");
return false;
}
String text = node.asText();
if (!StringUtils.hasText(text)) {
holder.warn(topic + "为空");
return false;
}
return updateText(getter, setter, text, holder, topic);
@@ -783,11 +819,13 @@ public class CloudRkCtx extends AbstractCtx implements CloudRkContext {
private void saveJsonToFile(Company company, JsonNode json, String fileName, MessageHolder holder) {
String companyPath = company.getPath();
if (!StringUtils.hasText(companyPath)) {
holder.warn("公司路径为空");
return;
}
File dir = new File(companyPath);
if (!dir.exists()) {
holder.warn("公司路径不存在");
return;
}