refactor(vo): 重构VO对象结构,统一字段命名和接口实现

重构所有VO对象,统一字段命名规范,移除冗余字段,优化接口实现
新增Voable接口用于VO对象转换
调整BaseViewModel和ProjectBasedViewModel接口定义
更新相关服务和控制器以适应VO对象变更
This commit is contained in:
2025-09-21 17:47:52 +08:00
parent 07c3f39a95
commit 039d753bab
408 changed files with 6602 additions and 4800 deletions

View File

@@ -13,8 +13,7 @@ import java.util.Locale;
import java.util.Objects;
import java.util.stream.Collectors;
import com.ecep.contract.controller.project.cost.ProjectCostImportItemsFromContractsTasker;
import com.ecep.contract.util.ProxyUtils;
import com.ecep.contract.vo.*;
import org.springframework.util.StringUtils;
import com.ecep.contract.CompanyCustomerFileType;
@@ -23,23 +22,10 @@ import com.ecep.contract.ContractPayWay;
import com.ecep.contract.MessageHolder;
import com.ecep.contract.MyDateTimeUtils;
import com.ecep.contract.SpringApp;
import com.ecep.contract.model.Company;
import com.ecep.contract.model.CompanyCustomer;
import com.ecep.contract.model.CompanyCustomerFile;
import com.ecep.contract.model.CompanyExtendInfo;
import com.ecep.contract.controller.project.cost.ProjectCostImportItemsFromContractsTasker;
import com.ecep.contract.model.Contract;
import com.ecep.contract.model.ContractBidVendor;
import com.ecep.contract.model.ContractFile;
import com.ecep.contract.model.ContractFileTypeLocal;
import com.ecep.contract.model.Employee;
import com.ecep.contract.model.ExtendVendorInfo;
import com.ecep.contract.model.Project;
import com.ecep.contract.model.ProjectBid;
import com.ecep.contract.model.ProjectCost;
import com.ecep.contract.model.ProjectQuotation;
import com.ecep.contract.model.ProjectSaleType;
import com.ecep.contract.model.ProjectSaleTypeRequireFileType;
import com.ecep.contract.model.VendorGroup;
import com.ecep.contract.model.VendorGroupRequireFileType;
import com.ecep.contract.service.CompanyCustomerFileService;
import com.ecep.contract.service.CompanyCustomerService;
@@ -284,38 +270,51 @@ public class ContractVerifyComm {
* @param contract 要验证的合同对象
* @param holder 输出
*/
public void verify(Contract contract, MessageHolder holder) {
public void verify(ContractVo contract, MessageHolder holder) {
LocalDate setupDate = contract.getSetupDate();
if (setupDate == null) {
holder.error("未设置合同提交日期");
return;
}
Company company = contract.getCompany();
if (company == null) {
Integer companyId = contract.getCompanyId();
if (companyId == null) {
holder.error("未关联企业");
return;
}
CompanyVo company = getCompanyService().findById(companyId);
if (company == null) {
holder.error("合同关联公司 #" + companyId + " 异常,无法读取");
return;
}
company = getCompanyService().findById(company.getId());
verify(company, contract, holder);
}
public void verify(Company company, Contract contract, MessageHolder holder) {
public void verify(CompanyVo company, ContractVo contract, MessageHolder holder) {
LocalDate setupDate = contract.getSetupDate();
Integer handlerId = contract.getHandlerId();
if (handlerId == null) {
handlerId = contract.getEmployeeId();
}
if (handlerId == null) {
holder.error("未关联处理人");
return;
}
Employee employee = contract.getEmployee();
EmployeeVo employee = getEmployeeService().findById(handlerId);
if (employee == null) {
holder.error("关联业务员");
holder.error("关联处理人 #" + handlerId + " 异常,无法读取");
return;
}
if (contract.getAmount() == null || contract.getAmount() <= 0) {
holder.error("合同金额小于等于0");
}
CompanyExtendInfo companyExtendInfo = getCompanyExtendInfoService().findByCompany(company);
CompanyExtendInfoVo companyExtendInfo = getCompanyExtendInfoService().findByCompany(company);
if (companyExtendInfo == null) {
CompanyExtendInfo extendInfo = new CompanyExtendInfo();
extendInfo.setCompany(company);
CompanyExtendInfoVo extendInfo = new CompanyExtendInfoVo();
extendInfo.setCompanyId(company.getId());
extendInfo.setDisableVerify(false);
companyExtendInfo = getCompanyExtendInfoService().save(extendInfo);
}
@@ -349,9 +348,9 @@ public class ContractVerifyComm {
verifyAsCustomer(company, companyExtendInfo, contract, holder);
// 销售合同下的采购合同
List<Contract> list = getContractService().findAllBySaleContract(contract);
List<ContractVo> list = getContractService().findAllBySaleContract(contract);
if (!list.isEmpty()) {
for (Contract v : list) {
for (ContractVo v : list) {
MessageHolder subHolder = holder.sub(v.getCode() + " -> ");
subHolder.info("采购合同 " + v.getName());
verify(v, subHolder);
@@ -394,30 +393,31 @@ public class ContractVerifyComm {
}
}
private void verifyAsVendor(Company company, Contract contract, MessageHolder holder) {
private void verifyAsVendor(CompanyVo company, ContractVo contract, MessageHolder holder) {
// 供应商,检查评价表
ExtendVendorInfo vendorInfo = getExtendVendorInfoService().findByContract(contract);
ExtendVendorInfoVo vendorInfo = getExtendVendorInfoService().findByContract(contract);
if (vendorInfo == null) {
ExtendVendorInfo info = getExtendVendorInfoService().newInstanceByContract(contract);
ExtendVendorInfoVo info = getExtendVendorInfoService().newInstanceByContract(contract);
vendorInfo = getExtendVendorInfoService().save(info);
holder.info("创建供应商信息 #" + vendorInfo.getId());
}
VendorGroup group = vendorInfo.getGroup();
Integer groupId = vendorInfo.getGroupId();
VendorGroupVo group = vendorGroupService.findById(groupId);
boolean assignedProvider = vendorInfo.isAssignedProvider();
if (assignedProvider) {
holder.debug("采购信息中设定为指定供应商");
}
if (group != null) {
group = getVendorGroupService().findById(group.getId());
vendorInfo.setGroup(group);
group = getVendorGroupService().findById(groupId);
vendorInfo.setGroupId(group.getId());
}
if (verifyCustomerSubContractDate.get()) {
// 检查子合同日期是否在销售合同之后
if (!vendorInfo.isPrePurchase()) {
String parentCode = contract.getParentCode();
if (StringUtils.hasText(parentCode)) {
Contract parent = getContractService().findByCode(parentCode);
ContractVo parent = getContractService().findByCode(parentCode);
if (parent != null) {
if (contract.getSetupDate().isBefore(parent.getSetupDate())) {
holder.warn("采购合同:" + contract.getCode() + " 提交日期在销售合同之前");
@@ -436,13 +436,14 @@ public class ContractVerifyComm {
}
}
private void verifyVendorFile(VendorGroup group, boolean assignedProvider, Contract contract,
private void verifyVendorFile(VendorGroupVo group, boolean assignedProvider, ContractVo contract,
MessageHolder holder) {
if (group == null) {
return;
}
boolean loseFile = false;
List<ContractFile> files = getContractFileService().findAllByContract(contract);
ContractFileService fileService = getContractFileService();
List<ContractFileVo> files = fileService.findAllByContract(contract);
List<VendorGroupRequireFileType> list = getVendorGroupRequireFileTypeService().findByGroupId(group.getId());
if (list != null && !list.isEmpty()) {
for (VendorGroupRequireFileType item : list) {
@@ -473,16 +474,16 @@ public class ContractVerifyComm {
holder.error("未上报供应商比价");
} else {
for (ContractBidVendor bidVendor : bidVendors) {
ContractFile contractFile = bidVendor.getQuotationSheet();
ContractFileVo contractFile = fileService.findById(bidVendor.getQuotationSheet().getId());
if (contractFile == null) {
if (requireQuotation && bidVendor.getCompany().equals(contract.getCompany())) {
if (requireQuotation && bidVendor.getCompany().getId().equals(contract.getCompanyId())) {
holder.debug("供应商类型启用了允许选中供应商不必须要有报价表");
} else {
holder.error("供应商比价:" + bidVendor.getCompany().getName() + " 未上传/关联报价表");
loseFile = true;
}
} else {
contractFile = getContractFileService().findById(contractFile.getId());
contractFile = fileService.findById(contractFile.getId());
ContractFileType type = contractFile.getType();
if (type != ContractFileType.QuotationSheet) {
holder.error("供应商比价:" + contractFile.getFileName() + " 报价表记录异常,类型错误");
@@ -518,11 +519,11 @@ public class ContractVerifyComm {
return fileTypeLocal.getValue();
}
private boolean hasFileType(List<ContractFile> files, ContractFileType fileType) {
private boolean hasFileType(List<ContractFileVo> files, ContractFileType fileType) {
if (files == null || files.isEmpty()) {
return false;
}
for (ContractFile file : files) {
for (ContractFileVo file : files) {
if (file.getType() == fileType) {
return true;
}
@@ -530,11 +531,12 @@ public class ContractVerifyComm {
return false;
}
private void verifyAsCustomer(Company company, CompanyExtendInfo companyExtendInfo, Contract contract,
private void verifyAsCustomer(CompanyVo company, CompanyExtendInfoVo companyExtendInfo, ContractVo contract,
MessageHolder holder) {
boolean valiad = true;
Project project = contract.getProject();
if (project == null) {
ProjectVo project = null;
Integer projectId = contract.getProject();
if (projectId == null) {
// 收款的合同时,检查是否关联了项目,如果没有则创建
if (contract.getPayWay() == ContractPayWay.RECEIVE) {
project = getProjectService().findByCode(contract.getCode());
@@ -548,30 +550,28 @@ public class ContractVerifyComm {
throw new RuntimeException("code=" + contract.getCode(), e);
}
}
contract.setProject(project);
contract.setProject(project.getId());
contract = getContractService().save(contract);
}
}
if (project != null) {
project = getProjectService().findById(project.getId());
// fixed
contract.setProject(project);
} else {
project = getProjectService().findById(projectId);
}
if (project != null) {
holder.info("验证项目信息:" + project.getCode() + " " + project.getName());
verifyProject(contract, project, holder.sub("项目"));
ProjectSaleType saleType = project.getSaleType();
if (!ProxyUtils.isInitialized(saleType)) {
saleType = getSaleTypeService().findById(saleType.getId());
}
if (saleType != null) {
if (getContractService().existsContractPath(contract)) {
saleType = getSaleTypeService().findById(saleType.getId());
project.setSaleType(saleType);
if (!contract.getPath().startsWith(saleType.getPath())) {
holder.error("合同目录未在销售类型目录下");
Integer saleTypeId = project.getSaleTypeId();
if (saleTypeId != null) {
ProjectSaleTypeVo saleType = getSaleTypeService().findById(saleTypeId);
if (saleType != null) {
if (getContractService().existsContractPath(contract)) {
saleType = getSaleTypeService().findById(saleType.getId());
project.setSaleTypeId(saleType.getId());
if (!contract.getPath().startsWith(saleType.getPath())) {
holder.error("合同目录未在销售类型目录下");
}
}
}
}
@@ -594,18 +594,19 @@ public class ContractVerifyComm {
/**
* 客户,检查评估表
*/
private boolean verifyCustomerContract(Contract contract, MessageHolder holder) {
private boolean verifyCustomerContract(ContractVo contract, MessageHolder holder) {
if (!verifyCustomer.get()) {
return false;
}
boolean valid = true;
Company company = contract.getCompany();
Integer companyId = contract.getCompanyId();
CompanyVo company = getCompanyService().findById(companyId);
if (company == null) {
holder.warn("合同未关联公司");
valid = false;
}
CompanyCustomer companyCustomer = getCompanyCustomerService().findByCompany(company);
CompanyCustomerVo companyCustomer = getCompanyCustomerService().findByCompany(company);
if (companyCustomer == null) {
holder.warn("合同未关联客户");
valid = false;
@@ -626,7 +627,7 @@ public class ContractVerifyComm {
return valid;
}
private boolean verifyCustomerFileByContract(CompanyCustomer companyCustomer, Contract contract,
private boolean verifyCustomerFileByContract(CompanyCustomerVo companyCustomer, ContractVo contract,
MessageHolder holder) {
List<LocalDate> verifyDates = new ArrayList<>();
LocalDate minDate = LocalDate.of(2022, 1, 1);
@@ -679,14 +680,14 @@ public class ContractVerifyComm {
}
// 客户
List<CompanyCustomerFile> files = getCompanyCustomerFileService().findAllByCustomer(companyCustomer);
List<CompanyCustomerFileVo> files = getCompanyCustomerFileService().findAllByCustomer(companyCustomer);
if (files == null || files.isEmpty()) {
holder.warn("未见客户评估表");
return false;
}
for (LocalDate verifyDate : verifyDates) {
CompanyCustomerFile customerFile = files.stream()
CompanyCustomerFileVo customerFile = files.stream()
.filter(v -> v.getSignDate() != null && v.isValid())
.filter(v -> v.getType() == CompanyCustomerFileType.EvaluationForm)
.filter(v -> MyDateTimeUtils.dateValidFilter(verifyDate, v.getSignDate(),
@@ -697,10 +698,10 @@ public class ContractVerifyComm {
}
}
CompanyCustomerFile latestFile = files.stream()
CompanyCustomerFileVo latestFile = files.stream()
.filter(v -> v.getSignDate() != null && v.isValid())
.filter(v -> v.getType() == CompanyCustomerFileType.EvaluationForm)
.max(Comparator.comparing(CompanyCustomerFile::getSignDate))
.max(Comparator.comparing(CompanyCustomerFileVo::getSignDate))
.orElse(null);
if (latestFile == null) {
@@ -713,13 +714,20 @@ public class ContractVerifyComm {
return false;
}
private void verifyProject(Contract contract, Project project, MessageHolder holder) {
ProjectSaleType saleType = project.getSaleType();
if (saleType == null) {
private void verifyProject(ContractVo contract, ProjectVo project, MessageHolder holder) {
Integer saleTypeId = project.getSaleTypeId();
ProjectSaleTypeVo saleType = null;
if (saleTypeId == null) {
String code = contract.getCode();
if (code != null && code.length() > 5) {
saleType = getSaleTypeService().findByCode(code.substring(0, 1));
if (saleType != null) {
project.setSaleTypeId(saleType.getId());
holder.info("根据合同代码设置项目销售类型:" + saleType.getName());
}
}
} else {
saleType = getSaleTypeService().findById(saleTypeId);
}
if (saleType == null) {
@@ -733,12 +741,12 @@ public class ContractVerifyComm {
boolean needImport = false;
ProjectCostService projectCostService = getProjectCostService();
ProjectCost autoCost = projectCostService.findAutoCostByProject(project);
ProjectCostVo autoCost = projectCostService.findAutoCostByProject(project);
if (autoCost == null) {
// 创建 V0 项目成本
ProjectCost cost = projectCostService.newInstanceByProject(project);
ProjectCostVo cost = projectCostService.newInstanceByProject(project);
cost.setVersion(0);
cost.setApplicant(getEmployeeService().findById(EmployeeService.DEFAULT_SYSTEM_EMPLOYEE_ID));
cost.setApplicantId(EmployeeService.DEFAULT_SYSTEM_EMPLOYEE_ID);
cost.setApplyTime(LocalDateTime.now());
cost.setDescription("自动导入");
autoCost = projectCostService.save(cost);
@@ -756,7 +764,7 @@ public class ContractVerifyComm {
if (needImport && !autoCost.isImportLock()) {
holder.debug("更新V0项目成本");
ProjectCost cost = projectCostService.findAutoCostByProject(project);
ProjectCostVo cost = projectCostService.findAutoCostByProject(project);
if (cost == null) {
cost = projectCostService.newInstanceByProject(project);
cost.setVersion(0);
@@ -768,15 +776,15 @@ public class ContractVerifyComm {
}
// 检查最新的项目成本,默认 V1
ProjectCost latestCost = projectCostService.findLatestByProject(project);
ProjectCostVo latestCost = projectCostService.findLatestByProject(project);
if (latestCost == null) {
ProjectCost cost = projectCostService.newInstanceByProject(project);
ProjectCostVo cost = projectCostService.newInstanceByProject(project);
cost.setVersion(1);
Employee applicant = project.getApplicant();
if (applicant == null) {
applicant = contract.getEmployee();
Integer applicantId = project.getApplicantId();
if (applicantId == null) {
applicantId = contract.getEmployeeId();
}
cost.setApplicant(applicant);
cost.setApplicantId(applicantId);
cost.setApplyTime(project.getCreated().atTime(LocalTime.now()));
latestCost = projectCostService.save(cost);
} else {
@@ -797,22 +805,22 @@ public class ContractVerifyComm {
}
if (project.isUseBid()) {
List<ProjectBid> bids = getProjectBidService().findAllByProject(project);
List<ProjectBidVo> bids = getProjectBidService().findAllByProject(project);
if (bids.isEmpty()) {
holder.warn("投标未创建");
}
}
if (project.isUseOffer()) {
List<ProjectQuotation> quotations = getProjectQuotationService().findAllByProject(project);
List<ProjectQuotationVo> quotations = getProjectQuotationService().findAllByProject(project);
if (quotations.isEmpty()) {
holder.warn("报价未创建");
}
}
}
private boolean verifyContractFileAsCustomer(Project project, Contract contract, MessageHolder holder) {
private boolean verifyContractFileAsCustomer(ProjectVo project, ContractVo contract, MessageHolder holder) {
boolean loseFile = false;
List<ContractFile> files = getContractFileService().findAllByContract(contract);
List<ContractFileVo> files = getContractFileService().findAllByContract(contract);
if (project != null) {
// 投标
if (project.isUseBid()) {
@@ -834,12 +842,12 @@ public class ContractVerifyComm {
loseFile = true;
}
}
ProjectSaleType saleType = project.getSaleType();
Integer saleTypeId = project.getSaleTypeId();
ProjectSaleTypeVo saleType = getSaleTypeService().findById(saleTypeId);
if (saleType != null) {
List<ProjectSaleTypeRequireFileType> list = getSaleTypeRequireFileTypeService()
List<ProjectSaleTypeRequireFileTypeVo> list = getSaleTypeRequireFileTypeService()
.findBySaleTypeId(saleType.getId());
for (ProjectSaleTypeRequireFileType item : list) {
for (ProjectSaleTypeRequireFileTypeVo item : list) {
ContractFileType fileType = item.getFileType();
if (fileType != null) {
if (!hasFileType(files, fileType)) {