feat: 添加企业文件管理功能及相关任务类

refactor: 重构企业文件验证和移动逻辑

fix: 修复企业合规验证逻辑及路径处理问题

docs: 添加VerifyContext工具类及相关文档

style: 优化代码格式及注释
This commit is contained in:
2025-09-26 19:40:34 +08:00
parent a4db8a1644
commit 510952d72e
28 changed files with 1357 additions and 948 deletions

View File

@@ -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;
}
/**

View File

@@ -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 + "%"),

View File

@@ -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 + " 更新...");

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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;
}
/**

View File

@@ -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);
}
}

View 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);
}
}

View File

@@ -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": "任务注册信息"
}