feat: 添加企业文件管理功能及相关任务类
refactor: 重构企业文件验证和移动逻辑 fix: 修复企业合规验证逻辑及路径处理问题 docs: 添加VerifyContext工具类及相关文档 style: 优化代码格式及注释
This commit is contained in:
@@ -27,6 +27,7 @@ import org.springframework.util.StringUtils;
|
||||
|
||||
import com.ecep.contract.CompanyFileType;
|
||||
import com.ecep.contract.IEntityService;
|
||||
import com.ecep.contract.MessageHolder;
|
||||
import com.ecep.contract.MyDateTimeUtils;
|
||||
import com.ecep.contract.QueryService;
|
||||
import com.ecep.contract.SpringApp;
|
||||
@@ -148,10 +149,11 @@ public class CompanyFileService
|
||||
* @see CompanyFile
|
||||
* @see CompanyFileType
|
||||
*/
|
||||
public void verify(Company company, LocalDate verifyDate, Consumer<String> status) {
|
||||
public boolean verify(Company company, LocalDate verifyDate, MessageHolder holder) {
|
||||
if (verifyDate.isBefore(LocalDate.of(2023, 1, 1))) {
|
||||
// 不检查2023-01-01之前的资信评估报告
|
||||
return;
|
||||
holder.warn(company.getName() + " 2023-01-01 前不检查资信评估报告");
|
||||
return true;
|
||||
}
|
||||
|
||||
// 查询公司的资信评估报告
|
||||
@@ -160,30 +162,33 @@ public class CompanyFileService
|
||||
.filter(v -> v.getApplyDate() != null && v.getExpiringDate() != null)
|
||||
.filter(v -> MyDateTimeUtils.dateValidFilter(verifyDate, v.getApplyDate(), v.getExpiringDate(), 30))
|
||||
.findFirst().orElse(null);
|
||||
if (companyFile == null) {
|
||||
List<LocalDate> dates = new ArrayList<>();
|
||||
|
||||
files.stream()
|
||||
.filter(v -> v.getApplyDate() != null && !verifyDate.isBefore(v.getApplyDate()))
|
||||
.max(Comparator.comparing(CompanyFile::getApplyDate))
|
||||
.map(CompanyFile::getApplyDate)
|
||||
.ifPresent(dates::add);
|
||||
|
||||
files.stream()
|
||||
.filter(v -> v.getExpiringDate() != null && !verifyDate.isAfter(v.getExpiringDate()))
|
||||
.min(Comparator.comparing(CompanyFile::getApplyDate))
|
||||
.map(CompanyFile::getApplyDate)
|
||||
.ifPresent(dates::add);
|
||||
|
||||
if (dates.isEmpty()) {
|
||||
status.accept("未匹配到资信评估报告");
|
||||
} else if (dates.size() == 1) {
|
||||
status.accept("未匹配到资信评估报告, 最接近日期:" + dates.getFirst());
|
||||
} else {
|
||||
LocalDate localDate = dates.stream().max(LocalDate::compareTo).orElse(null);
|
||||
status.accept("未匹配到资信评估报告, 最接近日期:" + localDate);
|
||||
}
|
||||
if (companyFile != null) {
|
||||
holder.info(" 在 " + verifyDate + " 找到资信评估报告 " + companyFile.getFilePath());
|
||||
return true;
|
||||
}
|
||||
|
||||
List<LocalDate> dates = new ArrayList<>();
|
||||
files.stream()
|
||||
.filter(v -> v.getApplyDate() != null && !verifyDate.isBefore(v.getApplyDate()))
|
||||
.max(Comparator.comparing(CompanyFile::getApplyDate))
|
||||
.map(CompanyFile::getApplyDate)
|
||||
.ifPresent(dates::add);
|
||||
|
||||
files.stream()
|
||||
.filter(v -> v.getExpiringDate() != null && !verifyDate.isAfter(v.getExpiringDate()))
|
||||
.min(Comparator.comparing(CompanyFile::getApplyDate))
|
||||
.map(CompanyFile::getApplyDate)
|
||||
.ifPresent(dates::add);
|
||||
|
||||
if (dates.isEmpty()) {
|
||||
holder.error(" 在 " + verifyDate + " 未找到资信评估报告");
|
||||
} else if (dates.size() == 1) {
|
||||
holder.error("未匹配到资信评估报告, 最接近日期:" + dates.getFirst());
|
||||
} else {
|
||||
LocalDate localDate = dates.stream().max(LocalDate::compareTo).orElse(null);
|
||||
holder.error("未匹配到资信评估报告, 最接近日期:" + localDate);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
package com.ecep.contract.ds.company.service;
|
||||
|
||||
import com.ecep.contract.EntityService;
|
||||
import com.ecep.contract.IEntityService;
|
||||
import com.ecep.contract.MyDateTimeUtils;
|
||||
import com.ecep.contract.QueryService;
|
||||
import com.ecep.contract.*;
|
||||
import com.ecep.contract.cloud.rk.CloudRkService;
|
||||
import com.ecep.contract.cloud.tyc.CloudTycService;
|
||||
import com.ecep.contract.cloud.u8.YongYouU8Service;
|
||||
@@ -420,25 +417,26 @@ public class CompanyService extends EntityService<Company, Integer>
|
||||
* @param verifyDate 验证日期
|
||||
* @param status 状态输出
|
||||
*/
|
||||
public void verifyEnterpriseStatus(Company company, LocalDate verifyDate, Consumer<String> status) {
|
||||
public boolean verifyEnterpriseStatus(Company company, LocalDate verifyDate, MessageHolder holder) {
|
||||
// 检查营业状态
|
||||
String entStatus = company.getEntStatus();
|
||||
if (StringUtils.hasText(entStatus)) {
|
||||
if (entStatus.contains("注销")) {
|
||||
LocalDate end = company.getOperationPeriodEnd();
|
||||
LocalDate begin = company.getOperationPeriodBegin();
|
||||
if (begin == null || end == null) {
|
||||
// 注销时间未知,无法判断是否在 verifyDate 之后注销
|
||||
status.accept("营业状态异常:" + entStatus);
|
||||
} else {
|
||||
if (!MyDateTimeUtils.dateValidFilter(verifyDate, begin, end, 0)) {
|
||||
status.accept("营业状态异常:" + entStatus);
|
||||
}
|
||||
if (!StringUtils.hasText(entStatus)) {
|
||||
holder.warn("营业状态异常:未设置");
|
||||
return false;
|
||||
}
|
||||
if (entStatus.contains("注销")) {
|
||||
LocalDate end = company.getOperationPeriodEnd();
|
||||
LocalDate begin = company.getOperationPeriodBegin();
|
||||
if (begin == null || end == null) {
|
||||
// 注销时间未知,无法判断是否在 verifyDate 之后注销
|
||||
holder.error("营业状态异常:" + entStatus);
|
||||
} else {
|
||||
if (!MyDateTimeUtils.dateValidFilter(verifyDate, begin, end, 0)) {
|
||||
holder.error("营业状态异常:" + entStatus);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
status.accept("营业状态异常:未设置");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -495,7 +493,7 @@ public class CompanyService extends EntityService<Company, Integer>
|
||||
}
|
||||
|
||||
public Predicate buildSearchPredicate(String searchText, Path<Company> root, CriteriaQuery<?> query,
|
||||
CriteriaBuilder builder) {
|
||||
CriteriaBuilder builder) {
|
||||
return builder.or(
|
||||
builder.like(root.get("name"), "%" + searchText + "%"),
|
||||
builder.like(root.get("shortName"), "%" + searchText + "%"),
|
||||
|
||||
@@ -21,14 +21,16 @@ import com.ecep.contract.constant.CloudServiceConstant;
|
||||
import com.ecep.contract.model.CloudRk;
|
||||
import com.ecep.contract.model.CloudYu;
|
||||
import com.ecep.contract.model.Company;
|
||||
import com.ecep.contract.service.WebSocketServerTasker;
|
||||
import com.ecep.contract.ui.Tasker;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
|
||||
import lombok.Setter;
|
||||
|
||||
/**
|
||||
* 合并更新
|
||||
*/
|
||||
public class CompanyCompositeUpdateTasker extends Tasker<Object> {
|
||||
public class CompanyCompositeUpdateTasker extends Tasker<Object> implements WebSocketServerTasker {
|
||||
private static final Logger logger = LoggerFactory.getLogger(CompanyCompositeUpdateTasker.class);
|
||||
|
||||
CloudRkCtx cloudRkCtx = new CloudRkCtx();
|
||||
@@ -43,17 +45,25 @@ public class CompanyCompositeUpdateTasker extends Tasker<Object> {
|
||||
private Company company;
|
||||
|
||||
@Override
|
||||
protected Object execute(MessageHolder holder) throws Exception {
|
||||
|
||||
updateProgress(0.1, 1);
|
||||
syncFromCloudRk(holder);
|
||||
updateProgress(0.3, 1);
|
||||
syncFromYongYouU8(holder);
|
||||
updateProgress(0.6, 1);
|
||||
syncFromCloudTyc(holder);
|
||||
return null;
|
||||
public void init(JsonNode argsNode) {
|
||||
int companyId = argsNode.get(0).asInt();
|
||||
company = getCachedBean(com.ecep.contract.ds.company.service.CompanyService.class).findById(companyId);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object execute(MessageHolder holder) throws Exception {
|
||||
|
||||
holder.debug("1. 从 " + CloudServiceConstant.RK_NAME + " 更新...");
|
||||
updateProgress(0.1, 1);
|
||||
syncFromCloudRk(holder);
|
||||
holder.debug("2. 从 " + CloudServiceConstant.U8_NAME + " 更新...");
|
||||
updateProgress(0.3, 1);
|
||||
syncFromYongYouU8(holder);
|
||||
holder.debug("3. 从 " + CloudServiceConstant.TYC_NAME + " 更新...");
|
||||
syncFromCloudTyc(holder);
|
||||
updateProgress(0.9, 1);
|
||||
return null;
|
||||
}
|
||||
|
||||
private void syncFromCloudRk(MessageHolder holder) {
|
||||
holder.debug("1. 从 " + CloudServiceConstant.RK_NAME + " 更新...");
|
||||
|
||||
@@ -8,61 +8,33 @@ import java.util.logging.Level;
|
||||
|
||||
import com.ecep.contract.MessageHolder;
|
||||
import com.ecep.contract.ds.company.service.CompanyService;
|
||||
import com.ecep.contract.ds.contract.service.ContractService;
|
||||
import com.ecep.contract.ds.contract.tasker.ContractVerifyComm;
|
||||
import com.ecep.contract.model.Company;
|
||||
import com.ecep.contract.model.Contract;
|
||||
import com.ecep.contract.ui.MessageHolderImpl;
|
||||
import com.ecep.contract.service.WebSocketServerTasker;
|
||||
import com.ecep.contract.ui.Tasker;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class CompanyVerifyTasker extends Tasker<Object> {
|
||||
@Setter
|
||||
private CompanyService companyService;
|
||||
public class CompanyVerifyTasker extends Tasker<Object> implements WebSocketServerTasker {
|
||||
@Getter
|
||||
@Setter
|
||||
private Company company;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
boolean passed = false;
|
||||
|
||||
ContractVerifyComm comm = new ContractVerifyComm();
|
||||
AtomicBoolean verified = new AtomicBoolean(true);
|
||||
|
||||
public CompanyService getCompanyService() {
|
||||
if (companyService == null) {
|
||||
companyService = getBean(CompanyService.class);
|
||||
}
|
||||
return companyService;
|
||||
return getCachedBean(CompanyService.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object call() throws Exception {
|
||||
comm.setVerifyCompanyPath(false);
|
||||
comm.setVerifyCompanyStatus(false);
|
||||
comm.setVerifyCompanyCredit(false);
|
||||
return execute(new MessageHolderImpl(this) {
|
||||
@Override
|
||||
public void addMessage(Level level, String message) {
|
||||
super.addMessage(level, message);
|
||||
if (level.intValue() > Level.INFO.intValue()) {
|
||||
verified.set(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object execute(MessageHolder holder) throws Exception {
|
||||
updateTitle("验证企业是否符合合规要求");
|
||||
|
||||
verify(company, holder);
|
||||
|
||||
if (verified.get()) {
|
||||
updateMessage(Level.CONFIG, "合规验证通过");
|
||||
} else {
|
||||
updateMessage(Level.SEVERE, "合规验证不通过");
|
||||
}
|
||||
return null;
|
||||
public ContractService getContractService() {
|
||||
return getCachedBean(ContractService.class);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -71,22 +43,52 @@ public class CompanyVerifyTasker extends Tasker<Object> {
|
||||
* @param company 公司
|
||||
* @param holder 输出
|
||||
*/
|
||||
@Override
|
||||
public void init(JsonNode argsNode) {
|
||||
int companyId = argsNode.get(0).asInt();
|
||||
company = getCompanyService().findById(companyId);
|
||||
comm.setVerifyCompanyPath(false);
|
||||
comm.setVerifyCompanyStatus(false);
|
||||
comm.setVerifyCompanyCredit(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object execute(MessageHolder holder) throws Exception {
|
||||
updateTitle("验证企业是否符合合规要求");
|
||||
|
||||
verify(company, holder);
|
||||
|
||||
if (passed) {
|
||||
holder.info("合规验证通过");
|
||||
} else {
|
||||
holder.error("合规验证不通过");
|
||||
}
|
||||
|
||||
updateProperty("passed", passed);
|
||||
return null;
|
||||
}
|
||||
|
||||
private void verify(Company company, MessageHolder holder) {
|
||||
LocalDate now = LocalDate.now();
|
||||
getCompanyService().verifyEnterpriseStatus(company, now, holder::info);
|
||||
if (getCompanyService().verifyEnterpriseStatus(company, now, holder)) {
|
||||
passed = false;
|
||||
}
|
||||
|
||||
// 验证所有的合同
|
||||
List<Contract> list = comm.getContractService().findAllByCompany(company);
|
||||
List<Contract> list = getContractService().findAllByCompany(company);
|
||||
if (list.isEmpty()) {
|
||||
holder.debug("!没有相关合同!");
|
||||
return;
|
||||
}
|
||||
holder.debug("检索到相关合同 " + list.size() + " 个");
|
||||
|
||||
AtomicInteger counter = new AtomicInteger(0);
|
||||
long total = list.size();
|
||||
for (Contract contract : list) {
|
||||
holder.debug("核验合同:" + contract.getCode() + ", " + contract.getName());
|
||||
comm.verify(company, contract, holder.sub("-- "));
|
||||
if (!comm.verify(company, contract, holder.sub("-- "))) {
|
||||
passed = false;
|
||||
}
|
||||
updateProgress(counter.incrementAndGet(), total);
|
||||
}
|
||||
updateProgress(1, 1);
|
||||
|
||||
@@ -189,8 +189,9 @@ public class ContractService extends EntityService<Contract, Integer>
|
||||
Matcher matcher = pattern.matcher(contractCode);
|
||||
if (matcher.find()) {
|
||||
catalogCode = matcher.group(1);
|
||||
System.out.println("字母部分: " + matcher.group(1));
|
||||
System.out.println("数字部分: " + matcher.group(2));
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("{} -> 字母:{}, 数字:{}", contractCode, matcher.group(1), matcher.group(2));
|
||||
}
|
||||
}
|
||||
if (catalogCode == null) {
|
||||
if (logger.isInfoEnabled()) {
|
||||
@@ -376,7 +377,7 @@ public class ContractService extends EntityService<Contract, Integer>
|
||||
if (contract == null || vo == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
contract.setCode(vo.getCode());
|
||||
contract.setName(vo.getName());
|
||||
contract.setGuid(vo.getGuid());
|
||||
@@ -393,7 +394,7 @@ public class ContractService extends EntityService<Contract, Integer>
|
||||
contract.setExecAmount(vo.getExecAmount());
|
||||
contract.setExecUnTaxAmount(vo.getExecUnTaxAmount());
|
||||
contract.setPayWay(vo.getPayWay());
|
||||
|
||||
|
||||
if (vo.getCompanyId() == null) {
|
||||
contract.setCompany(null);
|
||||
} else {
|
||||
|
||||
@@ -18,35 +18,24 @@ import org.hibernate.Hibernate;
|
||||
import org.springframework.security.core.userdetails.User;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import com.ecep.contract.CustomerFileType;
|
||||
import com.ecep.contract.ContractFileType;
|
||||
import com.ecep.contract.ContractPayWay;
|
||||
import com.ecep.contract.CustomerFileType;
|
||||
import com.ecep.contract.MessageHolder;
|
||||
import com.ecep.contract.MyDateTimeUtils;
|
||||
import com.ecep.contract.SpringApp;
|
||||
import com.ecep.contract.ds.company.CompanyFileUtils;
|
||||
import com.ecep.contract.ds.company.service.CompanyExtendInfoService;
|
||||
import com.ecep.contract.ds.company.service.CompanyFileService;
|
||||
import com.ecep.contract.ds.company.service.CompanyService;
|
||||
import com.ecep.contract.ds.contract.service.ContractBidVendorService;
|
||||
import com.ecep.contract.ds.contract.service.ContractFileService;
|
||||
import com.ecep.contract.ds.contract.service.ContractFileTypeService;
|
||||
import com.ecep.contract.ds.contract.service.ContractService;
|
||||
import com.ecep.contract.ds.contract.service.ExtendVendorInfoService;
|
||||
import com.ecep.contract.ds.converter.NumberStringConverter;
|
||||
import com.ecep.contract.ds.customer.service.CompanyCustomerFileService;
|
||||
import com.ecep.contract.ds.customer.service.CompanyCustomerService;
|
||||
import com.ecep.contract.ds.other.service.EmployeeService;
|
||||
import com.ecep.contract.ds.project.ProjectCostImportItemsFromContractsTasker;
|
||||
import com.ecep.contract.ds.project.service.ProjectBidService;
|
||||
import com.ecep.contract.ds.project.service.ProjectCostService;
|
||||
import com.ecep.contract.ds.project.service.ProjectQuotationService;
|
||||
import com.ecep.contract.ds.project.service.ProjectSaleTypeRequireFileTypeService;
|
||||
import com.ecep.contract.ds.project.service.ProjectService;
|
||||
import com.ecep.contract.ds.project.service.ProjectSaleTypeService;
|
||||
import com.ecep.contract.ds.vendor.service.VendorService;
|
||||
import com.ecep.contract.ds.vendor.service.VendorGroupRequireFileTypeService;
|
||||
import com.ecep.contract.ds.vendor.service.VendorGroupService;
|
||||
import com.ecep.contract.model.Company;
|
||||
import com.ecep.contract.model.CompanyCustomer;
|
||||
import com.ecep.contract.model.CompanyCustomerFile;
|
||||
@@ -66,184 +55,48 @@ import com.ecep.contract.model.ProjectSaleTypeRequireFileType;
|
||||
import com.ecep.contract.model.VendorGroup;
|
||||
import com.ecep.contract.model.VendorGroupRequireFileType;
|
||||
import com.ecep.contract.util.SecurityUtils;
|
||||
import com.ecep.contract.util.VerifyContext;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ContractVerifyComm {
|
||||
// Project
|
||||
private ProjectService projectService;
|
||||
private ProjectSaleTypeRequireFileTypeService saleTypeRequireFileTypeService;
|
||||
private ProjectSaleTypeService projectSaleTypeService;
|
||||
private ProjectCostService projectCostService;
|
||||
private ProjectQuotationService projectQuotationService;
|
||||
private ProjectBidService projectBidService;
|
||||
// Contract
|
||||
private ContractService contractService;
|
||||
private ContractFileService contractFileService;
|
||||
private ContractFileTypeService contractFileTypeService;
|
||||
private ContractBidVendorService contractBidVendorService;
|
||||
|
||||
// Company
|
||||
private CompanyService companyService;
|
||||
private CompanyFileService companyFileService;
|
||||
// Vendor
|
||||
private VendorService vendorService;
|
||||
private VendorGroupService vendorGroupService;
|
||||
private VendorGroupRequireFileTypeService vendorGroupRequireFileTypeService;
|
||||
private ExtendVendorInfoService extendVendorInfoService;
|
||||
// Customer
|
||||
private CompanyCustomerService companyCustomerService;
|
||||
private CompanyCustomerFileService companyCustomerFileService;
|
||||
private CompanyExtendInfoService companyExtendInfoService;
|
||||
// Employee
|
||||
private EmployeeService employeeService;
|
||||
|
||||
private ProjectService getProjectService() {
|
||||
if (projectService == null) {
|
||||
projectService = SpringApp.getBean(ProjectService.class);
|
||||
}
|
||||
return projectService;
|
||||
}
|
||||
|
||||
public class ContractVerifyComm extends VerifyContext {
|
||||
private ProjectSaleTypeService getProjectSaleTypeService() {
|
||||
if (projectSaleTypeService == null) {
|
||||
projectSaleTypeService = SpringApp.getBean(ProjectSaleTypeService.class);
|
||||
}
|
||||
return projectSaleTypeService;
|
||||
return getBean(ProjectSaleTypeService.class);
|
||||
}
|
||||
|
||||
ProjectCostService getProjectCostService() {
|
||||
if (projectCostService == null) {
|
||||
projectCostService = SpringApp.getBean(ProjectCostService.class);
|
||||
}
|
||||
return projectCostService;
|
||||
return getBean(ProjectCostService.class);
|
||||
}
|
||||
|
||||
ProjectQuotationService getProjectQuotationService() {
|
||||
if (projectQuotationService == null) {
|
||||
projectQuotationService = SpringApp.getBean(ProjectQuotationService.class);
|
||||
}
|
||||
return projectQuotationService;
|
||||
return getBean(ProjectQuotationService.class);
|
||||
}
|
||||
|
||||
ProjectBidService getProjectBidService() {
|
||||
if (projectBidService == null) {
|
||||
projectBidService = SpringApp.getBean(ProjectBidService.class);
|
||||
}
|
||||
return projectBidService;
|
||||
return getBean(ProjectBidService.class);
|
||||
}
|
||||
|
||||
private ProjectSaleTypeRequireFileTypeService getSaleTypeRequireFileTypeService() {
|
||||
if (saleTypeRequireFileTypeService == null) {
|
||||
saleTypeRequireFileTypeService = SpringApp.getBean(ProjectSaleTypeRequireFileTypeService.class);
|
||||
}
|
||||
return saleTypeRequireFileTypeService;
|
||||
}
|
||||
|
||||
public ContractService getContractService() {
|
||||
if (contractService == null) {
|
||||
contractService = SpringApp.getBean(ContractService.class);
|
||||
}
|
||||
return contractService;
|
||||
}
|
||||
|
||||
private ContractFileService getContractFileService() {
|
||||
if (contractFileService == null) {
|
||||
contractFileService = SpringApp.getBean(ContractFileService.class);
|
||||
}
|
||||
return contractFileService;
|
||||
}
|
||||
|
||||
private ContractFileTypeService getContractFileTypeService() {
|
||||
if (contractFileTypeService == null) {
|
||||
contractFileTypeService = SpringApp.getBean(ContractFileTypeService.class);
|
||||
}
|
||||
return contractFileTypeService;
|
||||
}
|
||||
|
||||
private ContractBidVendorService getContractBidVendorService() {
|
||||
if (contractBidVendorService == null) {
|
||||
contractBidVendorService = SpringApp.getBean(ContractBidVendorService.class);
|
||||
}
|
||||
return contractBidVendorService;
|
||||
}
|
||||
|
||||
private CompanyService getCompanyService() {
|
||||
if (companyService == null) {
|
||||
companyService = SpringApp.getBean(CompanyService.class);
|
||||
}
|
||||
return companyService;
|
||||
}
|
||||
|
||||
private CompanyFileService getCompanyFileService() {
|
||||
if (companyFileService == null) {
|
||||
companyFileService = SpringApp.getBean(CompanyFileService.class);
|
||||
}
|
||||
return companyFileService;
|
||||
}
|
||||
|
||||
private VendorGroupService getVendorGroupService() {
|
||||
if (vendorGroupService == null) {
|
||||
vendorGroupService = SpringApp.getBean(VendorGroupService.class);
|
||||
}
|
||||
return vendorGroupService;
|
||||
return getBean(ProjectSaleTypeRequireFileTypeService.class);
|
||||
}
|
||||
|
||||
private VendorGroupRequireFileTypeService getVendorGroupRequireFileTypeService() {
|
||||
if (vendorGroupRequireFileTypeService == null) {
|
||||
vendorGroupRequireFileTypeService = SpringApp.getBean(VendorGroupRequireFileTypeService.class);
|
||||
}
|
||||
return vendorGroupRequireFileTypeService;
|
||||
return getBean(VendorGroupRequireFileTypeService.class);
|
||||
}
|
||||
|
||||
private ExtendVendorInfoService getExtendVendorInfoService() {
|
||||
if (extendVendorInfoService == null) {
|
||||
extendVendorInfoService = SpringApp.getBean(ExtendVendorInfoService.class);
|
||||
}
|
||||
return extendVendorInfoService;
|
||||
}
|
||||
|
||||
private VendorService getVendorService() {
|
||||
if (vendorService == null) {
|
||||
vendorService = SpringApp.getBean(VendorService.class);
|
||||
}
|
||||
return vendorService;
|
||||
}
|
||||
|
||||
private CompanyCustomerService getCompanyCustomerService() {
|
||||
if (companyCustomerService == null) {
|
||||
companyCustomerService = SpringApp.getBean(CompanyCustomerService.class);
|
||||
}
|
||||
return companyCustomerService;
|
||||
}
|
||||
|
||||
private CompanyCustomerFileService getCompanyCustomerFileService() {
|
||||
if (companyCustomerFileService == null) {
|
||||
companyCustomerFileService = SpringApp.getBean(CompanyCustomerFileService.class);
|
||||
}
|
||||
return companyCustomerFileService;
|
||||
return getBean(ExtendVendorInfoService.class);
|
||||
}
|
||||
|
||||
private CompanyExtendInfoService getCompanyExtendInfoService() {
|
||||
if (companyExtendInfoService == null) {
|
||||
companyExtendInfoService = SpringApp.getBean(CompanyExtendInfoService.class);
|
||||
}
|
||||
return companyExtendInfoService;
|
||||
}
|
||||
|
||||
private EmployeeService getEmployeeService() {
|
||||
if (employeeService == null) {
|
||||
employeeService = SpringApp.getBean(EmployeeService.class);
|
||||
}
|
||||
return employeeService;
|
||||
return getBean(CompanyExtendInfoService.class);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private Map<ContractFileType, ContractFileTypeLocal> fileTypeLocalMap = null;
|
||||
private Locale locale = Locale.getDefault();
|
||||
private Contract contract;
|
||||
|
||||
/**
|
||||
@@ -285,69 +138,95 @@ public class ContractVerifyComm {
|
||||
* @param contract 要验证的合同对象
|
||||
* @param holder 输出
|
||||
*/
|
||||
public void verify(Contract contract, MessageHolder holder) {
|
||||
public boolean verify(Contract contract, MessageHolder holder) {
|
||||
boolean passed = true;
|
||||
LocalDate setupDate = contract.getSetupDate();
|
||||
if (setupDate == null) {
|
||||
holder.error("未设置合同提交日期");
|
||||
return;
|
||||
passed = false;
|
||||
}
|
||||
|
||||
Company company = contract.getCompany();
|
||||
if (company == null) {
|
||||
holder.error("未关联企业");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
if (!Hibernate.isInitialized(company)) {
|
||||
company = getCompanyService().findById(company.getId());
|
||||
}
|
||||
verify(company, contract, holder);
|
||||
if (!verify(company, contract, holder)) {
|
||||
passed = false;
|
||||
}
|
||||
return passed;
|
||||
}
|
||||
|
||||
public void verify(Company company, Contract contract, MessageHolder holder) {
|
||||
public boolean verify(Company company, LocalDate verifyDate, MessageHolder holder) {
|
||||
CompanyExtendInfo companyExtendInfo = getCompanyExtendInfoService().findByCompany(company);
|
||||
if (companyExtendInfo.isDisableVerify()) {
|
||||
holder.debug("公司设定不做校验");
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean passed = true;
|
||||
MessageHolder subHolder = holder.sub(company.getName() + " -> ");
|
||||
if (verifyCompanyPath) {
|
||||
if (!CompanyFileUtils.exists(company.getPath())) {
|
||||
subHolder.error("公司目录未设置");
|
||||
passed = false;
|
||||
} else {
|
||||
File basePath = getCompanyService().getBasePath();
|
||||
if (!company.getPath().startsWith(basePath.getAbsolutePath())) {
|
||||
subHolder.warn("公司目录未在规定目录下");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (verifyCompanyStatus) {
|
||||
if (!getCompanyService().verifyEnterpriseStatus(company, verifyDate, subHolder)) {
|
||||
passed = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (verifyCompanyCredit) {
|
||||
if (!getCompanyFileService().verify(company, verifyDate, subHolder)) {
|
||||
passed = false;
|
||||
}
|
||||
}
|
||||
return passed;
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证合同是否合规
|
||||
*
|
||||
* @param company
|
||||
* @param contract
|
||||
* @param holder
|
||||
* @return
|
||||
*/
|
||||
public boolean verify(Company company, Contract contract, MessageHolder holder) {
|
||||
boolean passed = true;
|
||||
LocalDate setupDate = contract.getSetupDate();
|
||||
|
||||
Employee employee = contract.getEmployee();
|
||||
if (employee == null) {
|
||||
holder.error("未关联业务员");
|
||||
passed = false;
|
||||
}
|
||||
|
||||
if (contract.getAmount() == null || contract.getAmount() <= 0) {
|
||||
holder.error("合同金额小于等于0");
|
||||
passed = false;
|
||||
}
|
||||
|
||||
CompanyExtendInfo companyExtendInfo = getCompanyExtendInfoService().findByCompany(company);
|
||||
|
||||
if (companyExtendInfo.isDisableVerify()) {
|
||||
holder.debug("公司设定不做校验");
|
||||
} else {
|
||||
if (verifyCompanyPath) {
|
||||
if (!CompanyFileUtils.exists(company.getPath())) {
|
||||
holder.error("公司目录未设置");
|
||||
} else {
|
||||
File basePath = getCompanyService().getBasePath();
|
||||
if (!company.getPath().startsWith(basePath.getAbsolutePath())) {
|
||||
holder.error("公司目录未在规定目录下");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (verifyCompanyStatus) {
|
||||
getCompanyService().verifyEnterpriseStatus(company, setupDate, msg -> {
|
||||
holder.error(company.getName() + ":" + msg);
|
||||
});
|
||||
}
|
||||
|
||||
if (verifyCompanyCredit) {
|
||||
getCompanyFileService().verify(company, contract.getSetupDate(), msg -> {
|
||||
holder.error(company.getName() + ":" + msg);
|
||||
});
|
||||
}
|
||||
if (!verify(company, setupDate, holder)) {
|
||||
passed = false;
|
||||
}
|
||||
|
||||
// 合同类型
|
||||
switch (contract.getPayWay()) {
|
||||
case RECEIVE -> {
|
||||
// 销售合同
|
||||
CompanyExtendInfo companyExtendInfo = getCompanyExtendInfoService().findByCompany(company);
|
||||
verifyAsCustomer(company, companyExtendInfo, contract, holder);
|
||||
|
||||
// 销售合同下的采购合同
|
||||
@@ -356,20 +235,24 @@ public class ContractVerifyComm {
|
||||
for (Contract v : list) {
|
||||
MessageHolder subHolder = holder.sub(v.getCode() + " -> ");
|
||||
subHolder.info("采购合同 : " + v.getName());
|
||||
verify(v, subHolder);
|
||||
if (!verify(v, subHolder)) {
|
||||
passed = false;
|
||||
}
|
||||
if (CompanyFileUtils.exists(v.getPath())) {
|
||||
if (!v.getPath().startsWith(contract.getPath())) {
|
||||
holder.error("合同目录未在规定目录下");
|
||||
passed = false;
|
||||
}
|
||||
} else {
|
||||
holder.error("合同目录未设置");
|
||||
passed = false;
|
||||
}
|
||||
}
|
||||
|
||||
DoubleSummaryStatistics statistics = list.stream().mapToDouble(c -> {
|
||||
return Objects.requireNonNullElse(c.getAmount(), 0.0);
|
||||
}).summaryStatistics();
|
||||
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);
|
||||
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(getLocale());
|
||||
|
||||
holder.debug("采购合同金额合计:" + numberFormat.format(statistics.getSum()));
|
||||
holder.debug("采购合同金额平均值:" + numberFormat.format(statistics.getAverage()));
|
||||
@@ -394,6 +277,7 @@ public class ContractVerifyComm {
|
||||
holder.error("合同付款类型:未设置");
|
||||
}
|
||||
}
|
||||
return passed;
|
||||
}
|
||||
|
||||
private void verifyAsVendor(Company company, Contract contract, MessageHolder holder) {
|
||||
@@ -535,9 +419,9 @@ public class ContractVerifyComm {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void verifyAsCustomer(Company company, CompanyExtendInfo companyExtendInfo, Contract contract,
|
||||
private boolean verifyAsCustomer(Company company, CompanyExtendInfo companyExtendInfo, Contract contract,
|
||||
MessageHolder holder) {
|
||||
boolean valiad = true;
|
||||
boolean passed = true;
|
||||
Project project = contract.getProject();
|
||||
if (project == null) {
|
||||
// 收款的合同时,检查是否关联了项目,如果没有则创建
|
||||
@@ -586,16 +470,17 @@ public class ContractVerifyComm {
|
||||
|
||||
if (!companyExtendInfo.isDisableVerify()) {
|
||||
if (!verifyCustomerContract(contract, holder)) {
|
||||
valiad = false;
|
||||
passed = false;
|
||||
}
|
||||
|
||||
if (verifyCustomerFiles) {
|
||||
holder.debug("核验文件...");
|
||||
if (!verifyContractFileAsCustomer(project, contract, holder)) {
|
||||
valiad = false;
|
||||
passed = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return passed;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,17 +1,14 @@
|
||||
package com.ecep.contract.ds.contract.tasker;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import com.ecep.contract.MessageHolder;
|
||||
import com.ecep.contract.ds.contract.service.ContractService;
|
||||
import com.ecep.contract.model.Contract;
|
||||
import com.ecep.contract.service.WebSocketServerTasker;
|
||||
import com.ecep.contract.ui.MessageHolderImpl;
|
||||
import com.ecep.contract.ui.Tasker;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@@ -20,39 +17,25 @@ public class ContractVerifyTasker extends Tasker<Object> implements WebSocketSer
|
||||
@Setter
|
||||
private Contract contract;
|
||||
ContractVerifyComm comm = new ContractVerifyComm();
|
||||
|
||||
AtomicBoolean verified = new AtomicBoolean(true);
|
||||
|
||||
@Override
|
||||
public Object call() throws Exception {
|
||||
updateTitle("验证合同 " + contract.getCode() + " 及其子合同是否符合合规要求");
|
||||
return execute(new MessageHolderImpl(this) {
|
||||
@Override
|
||||
public void addMessage(Level level, String message) {
|
||||
super.addMessage(level, message);
|
||||
if (level.intValue() > Level.INFO.intValue()) {
|
||||
verified.set(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@Getter
|
||||
@Setter
|
||||
boolean passed = true;
|
||||
|
||||
@Override
|
||||
protected Object execute(MessageHolder holder) {
|
||||
comm.verify(contract, holder);
|
||||
if (verified.get()) {
|
||||
updateMessage(Level.CONFIG, "合规验证通过");
|
||||
updateTitle("验证合同 " + contract.getCode() + " 及其子合同是否符合合规要求");
|
||||
if (!comm.verify(contract, holder)) {
|
||||
passed = false;
|
||||
}
|
||||
|
||||
if (passed) {
|
||||
holder.info("合规验证通过");
|
||||
} else {
|
||||
updateMessage(Level.SEVERE, "合规验证不通过");
|
||||
holder.error("合规验证不通过");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public void setContractService(ContractService contractService) {
|
||||
comm.setContractService(contractService);
|
||||
}
|
||||
|
||||
public Locale getLocale() {
|
||||
return comm.getLocale();
|
||||
}
|
||||
@@ -67,5 +50,4 @@ public class ContractVerifyTasker extends Tasker<Object> implements WebSocketSer
|
||||
contract = getCachedBean(ContractService.class).findById(contractId);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
123
server/src/main/java/com/ecep/contract/util/VerifyContext.java
Normal file
123
server/src/main/java/com/ecep/contract/util/VerifyContext.java
Normal file
@@ -0,0 +1,123 @@
|
||||
package com.ecep.contract.util;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
|
||||
import com.ecep.contract.SpringApp;
|
||||
import com.ecep.contract.ds.company.service.CompanyFileService;
|
||||
import com.ecep.contract.ds.company.service.CompanyFileTypeService;
|
||||
import com.ecep.contract.ds.company.service.CompanyService;
|
||||
import com.ecep.contract.ds.contract.service.ContractBidVendorService;
|
||||
import com.ecep.contract.ds.contract.service.ContractFileService;
|
||||
import com.ecep.contract.ds.contract.service.ContractFileTypeService;
|
||||
import com.ecep.contract.ds.contract.service.ContractService;
|
||||
import com.ecep.contract.ds.customer.service.CompanyCustomerFileService;
|
||||
import com.ecep.contract.ds.customer.service.CompanyCustomerFileTypeService;
|
||||
import com.ecep.contract.ds.customer.service.CompanyCustomerService;
|
||||
import com.ecep.contract.ds.other.service.EmployeeService;
|
||||
import com.ecep.contract.ds.project.service.ProjectFileService;
|
||||
import com.ecep.contract.ds.project.service.ProjectFileTypeService;
|
||||
import com.ecep.contract.ds.project.service.ProjectService;
|
||||
import com.ecep.contract.ds.vendor.service.VendorFileService;
|
||||
import com.ecep.contract.ds.vendor.service.VendorFileTypeService;
|
||||
import com.ecep.contract.ds.vendor.service.VendorGroupService;
|
||||
import com.ecep.contract.ds.vendor.service.VendorService;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class VerifyContext {
|
||||
@Getter
|
||||
@Setter
|
||||
private Locale locale = Locale.getDefault();
|
||||
private HashMap<Class<?>, Object> cachedMap = new HashMap<>();
|
||||
|
||||
public <K> K getBean(Class<K> requiredType) {
|
||||
@SuppressWarnings("unchecked")
|
||||
K bean = (K) cachedMap.get(requiredType);
|
||||
if (bean == null) {
|
||||
bean = SpringApp.getBean(requiredType);
|
||||
cachedMap.put(requiredType, bean);
|
||||
}
|
||||
return bean;
|
||||
}
|
||||
|
||||
// Employee
|
||||
protected EmployeeService getEmployeeService() {
|
||||
return getBean(EmployeeService.class);
|
||||
}
|
||||
|
||||
// Project
|
||||
protected ProjectService getProjectService() {
|
||||
return getBean(ProjectService.class);
|
||||
}
|
||||
|
||||
protected ProjectFileService getProjectFileService() {
|
||||
return getBean(ProjectFileService.class);
|
||||
}
|
||||
|
||||
protected ProjectFileTypeService getProjectFileTypeService() {
|
||||
return getBean(ProjectFileTypeService.class);
|
||||
}
|
||||
|
||||
// Contract
|
||||
protected ContractService getContractService() {
|
||||
return getBean(ContractService.class);
|
||||
}
|
||||
|
||||
protected ContractFileTypeService getContractFileTypeService() {
|
||||
return getBean(ContractFileTypeService.class);
|
||||
}
|
||||
|
||||
protected ContractFileService getContractFileService() {
|
||||
return getBean(ContractFileService.class);
|
||||
}
|
||||
|
||||
protected ContractBidVendorService getContractBidVendorService() {
|
||||
return getBean(ContractBidVendorService.class);
|
||||
}
|
||||
|
||||
// Company
|
||||
protected CompanyService getCompanyService() {
|
||||
return getBean(CompanyService.class);
|
||||
}
|
||||
|
||||
protected CompanyFileTypeService getCompanyFileTypeService() {
|
||||
return getBean(CompanyFileTypeService.class);
|
||||
}
|
||||
|
||||
protected CompanyFileService getCompanyFileService() {
|
||||
return getBean(CompanyFileService.class);
|
||||
}
|
||||
|
||||
// Vendor
|
||||
protected VendorService getVendorService() {
|
||||
return getBean(VendorService.class);
|
||||
}
|
||||
|
||||
protected VendorGroupService getVendorGroupService() {
|
||||
return getBean(VendorGroupService.class);
|
||||
}
|
||||
|
||||
protected VendorFileTypeService getVendorFileTypeService() {
|
||||
return getBean(VendorFileTypeService.class);
|
||||
}
|
||||
|
||||
protected VendorFileService getVendorFileService() {
|
||||
return getBean(VendorFileService.class);
|
||||
}
|
||||
|
||||
// Customer
|
||||
|
||||
protected CompanyCustomerService getCompanyCustomerService() {
|
||||
return getBean(CompanyCustomerService.class);
|
||||
}
|
||||
|
||||
protected CompanyCustomerFileTypeService getCompanyCustomerFileTypeService() {
|
||||
return getBean(CompanyCustomerFileTypeService.class);
|
||||
}
|
||||
|
||||
protected CompanyCustomerFileService getCompanyCustomerFileService() {
|
||||
return getBean(CompanyCustomerFileService.class);
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,9 @@
|
||||
"CompanyCustomerEvaluationFormUpdateTask": "com.ecep.contract.ds.customer.tasker.CompanyCustomerEvaluationFormUpdateTask",
|
||||
"CompanyCustomerNextSignDateTask": "com.ecep.contract.ds.customer.tasker.CompanyCustomerNextSignDateTask",
|
||||
"CompanyCustomerRebuildFilesTasker": "com.ecep.contract.ds.customer.tasker.CompanyCustomerRebuildFilesTasker",
|
||||
"CustomerFileMoveTasker": "com.ecep.contract.ds.customer.tasker.CustomerFileMoveTasker"
|
||||
"CustomerFileMoveTasker": "com.ecep.contract.ds.customer.tasker.CustomerFileMoveTasker",
|
||||
"CompanyCompositeUpdateTasker": "com.ecep.contract.ds.company.tasker.CompanyCompositeUpdateTasker",
|
||||
"CompanyVerifyTasker": "com.ecep.contract.ds.company.tasker.CompanyVerifyTasker"
|
||||
},
|
||||
"descriptions": "任务注册信息"
|
||||
}
|
||||
Reference in New Issue
Block a user