diff --git a/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostTabSkinBase.java b/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostTabSkinBase.java index 6bd109e..7b8b8be 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostTabSkinBase.java +++ b/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostTabSkinBase.java @@ -38,17 +38,13 @@ public class ProjectCostTabSkinBase implements TabSkin { @Setter LocalDateTimeStringConverter localDateTimeStringConverter; - ProjectService projectService; public ProjectCostTabSkinBase(ProjectCostWindowController controller) { super(controller); } ProjectService getProjectService() { - if (projectService == null) { - projectService = getBean(ProjectService.class); - } - return projectService; + return getCachedBean(ProjectService.class); } private LocalDateTimeStringConverter getLocalDateTimeStringConverter() { diff --git a/client/src/main/java/com/ecep/contract/converter/InventoryStringConverter.java b/client/src/main/java/com/ecep/contract/converter/InventoryStringConverter.java new file mode 100644 index 0000000..a4d0a02 --- /dev/null +++ b/client/src/main/java/com/ecep/contract/converter/InventoryStringConverter.java @@ -0,0 +1,46 @@ +package com.ecep.contract.converter; + +import com.ecep.contract.service.InventoryService; +import com.ecep.contract.vo.InventoryVo; +import javafx.util.StringConverter; + +/** + * 存货字符串转换器 + * 用于在UI组件中显示存货信息并支持从字符串还原存货对象 + */ +public class InventoryStringConverter extends StringConverter { + + /** 存货服务,用于从字符串查找对应的存货对象 */ + private final InventoryService service; + + /** + * 构造函数 + * + * @param service 存货服务实例 + */ + public InventoryStringConverter(InventoryService service) { + this.service = service; + } + + /** + * 将存货对象转换为字符串表示 + * + * @param object 存货对象 + * @return 存货的名称,如果对象为null则返回空字符串 + */ + @Override + public String toString(InventoryVo object) { + return object == null ? "" : (object.getName()+"-"+ object.getSpecification()); + } + + /** + * 从字符串还原存货对象 + * + * @param string 存货名称 + * @return 对应的存货对象,如果未找到则返回null + */ + @Override + public InventoryVo fromString(String string) { + return service.findByName(string); + } +} \ No newline at end of file diff --git a/client/src/main/java/com/ecep/contract/service/InventoryService.java b/client/src/main/java/com/ecep/contract/service/InventoryService.java index fe40e3b..5fcdc2f 100644 --- a/client/src/main/java/com/ecep/contract/service/InventoryService.java +++ b/client/src/main/java/com/ecep/contract/service/InventoryService.java @@ -2,6 +2,10 @@ package com.ecep.contract.service; import java.time.LocalDate; +import com.ecep.contract.converter.CustomerFileTypeStringConverter; +import com.ecep.contract.converter.InventoryStringConverter; +import com.ecep.contract.vo.CustomerFileTypeLocalVo; +import javafx.util.StringConverter; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -13,7 +17,7 @@ import com.ecep.contract.vo.InventoryVo; @Service public class InventoryService extends QueryService { - + private final StringConverter stringConverter = new InventoryStringConverter(this); @Override public InventoryVo createNewEntity() { InventoryVo inventory = new InventoryVo(); @@ -44,4 +48,8 @@ public class InventoryService extends QueryService getStringConverter() { + return stringConverter; + } } diff --git a/server/src/main/java/com/ecep/contract/cloud/AbstractCtx.java b/server/src/main/java/com/ecep/contract/cloud/AbstractCtx.java index 4156e04..c2e481f 100644 --- a/server/src/main/java/com/ecep/contract/cloud/AbstractCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/AbstractCtx.java @@ -21,13 +21,14 @@ import com.ecep.contract.SpringApp; import com.ecep.contract.ds.company.service.CompanyService; import com.ecep.contract.ds.other.service.EmployeeService; import com.ecep.contract.ds.other.service.SysConfService; +import com.ecep.contract.util.ContextUtils; import com.ecep.contract.util.MyStringUtils; import com.ecep.contract.util.NumberUtils; import lombok.Getter; import lombok.Setter; -public class AbstractCtx { +public class AbstractCtx implements ContextUtils { @Setter @Getter Locale locale = Locale.getDefault(); @@ -60,7 +61,7 @@ public class AbstractCtx { } public boolean updateText(Supplier getter, Consumer setter, String text, MessageHolder holder, - String topic) { + String topic) { if (!Objects.equals(getter.get(), text)) { setter.accept(text); holder.info(topic + "修改为: " + text); @@ -70,7 +71,7 @@ public class AbstractCtx { } public boolean updateAppendText(Supplier getter, Consumer setter, String text, MessageHolder holder, - String topic) { + String topic) { if (StringUtils.hasText(text)) { String str = MyStringUtils.appendIfAbsent(getter.get(), text); if (!Objects.equals(getter.get(), str)) { @@ -83,7 +84,7 @@ public class AbstractCtx { } public boolean updateLocalDate(Supplier getter, Consumer setter, java.sql.Date date, - MessageHolder holder, String topic) { + MessageHolder holder, String topic) { if (date != null) { return updateLocalDate(getter, setter, date.toLocalDate(), holder, topic); } @@ -91,12 +92,12 @@ public class AbstractCtx { } public boolean updateLocalDate(Supplier getter, Consumer setter, LocalDate date, - MessageHolder holder, String topic) { + MessageHolder holder, String topic) { return updateLocalDate(getter, setter, date, holder, topic, false); } public boolean updateLocalDate(Supplier getter, Consumer setter, LocalDate date, - MessageHolder holder, String topic, boolean allowNull) { + MessageHolder holder, String topic, boolean allowNull) { if (date == null && !allowNull) { return false; } @@ -109,7 +110,7 @@ public class AbstractCtx { } public boolean updateLocalDate(Supplier getter, Consumer setter, String strDate, - MessageHolder holder, String topic) { + MessageHolder holder, String topic) { LocalDate date = null; if (StringUtils.hasText(strDate)) { try { @@ -122,7 +123,7 @@ public class AbstractCtx { } public boolean updateLocalDate(Supplier getter, Consumer setter, Timestamp timestamp, - MessageHolder holder, String topic) { + MessageHolder holder, String topic) { LocalDate date = null; if (timestamp != null) { @@ -136,7 +137,7 @@ public class AbstractCtx { } public boolean updateLocalDateTime(Supplier getter, Consumer setter, - Timestamp timestamp, MessageHolder holder, String topic) { + Timestamp timestamp, MessageHolder holder, String topic) { LocalDateTime dateTime = null; if (timestamp != null) { @@ -152,7 +153,7 @@ public class AbstractCtx { } public boolean updateLocalDateTime(Supplier getter, Consumer setter, - LocalDateTime dateTime, MessageHolder holder, String topic) { + LocalDateTime dateTime, MessageHolder holder, String topic) { if (!Objects.equals(getter.get(), dateTime)) { setter.accept(dateTime); holder.info(topic + "修改为: " + dateTime); @@ -162,7 +163,7 @@ public class AbstractCtx { } public boolean updateInstant(Supplier getter, Consumer setter, Instant instant, - MessageHolder holder, String topic) { + MessageHolder holder, String topic) { if (!Objects.equals(getter.get(), instant)) { setter.accept(instant); holder.info(topic + "修改为: " + instant); @@ -172,13 +173,13 @@ public class AbstractCtx { } public boolean updateNumber(Supplier getter, Consumer setter, BigDecimal value, - MessageHolder holder, String topic) { + MessageHolder holder, String topic) { double val = value.doubleValue(); return updateNumber(getter, setter, val, holder, topic); } public boolean updateNumber(Supplier getter, Consumer setter, double value, MessageHolder holder, - String topic) { + String topic) { if (getter.get() == null || !NumberUtils.equals(getter.get(), value)) { setter.accept(value); holder.info(topic + "修改为: " + value); @@ -188,7 +189,7 @@ public class AbstractCtx { } public boolean updateNumber(Supplier getter, Consumer setter, float value, MessageHolder holder, - String topic) { + String topic) { if (getter.get() == null || !NumberUtils.equals(getter.get(), value)) { setter.accept(value); holder.info(topic + "修改为: " + value); @@ -198,7 +199,7 @@ public class AbstractCtx { } public boolean updateNumber(Supplier getter, Consumer setter, Integer value, MessageHolder holder, - String topic) { + String topic) { if (getter.get() == null || !NumberUtils.equals(getter.get(), value)) { setter.accept(value); holder.info(topic + "修改为: " + value); diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/AbstractYongYouU8Ctx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/AbstractYongYouU8Ctx.java index fc69b2b..7b53f21 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/AbstractYongYouU8Ctx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/AbstractYongYouU8Ctx.java @@ -19,8 +19,6 @@ import com.ecep.contract.ds.vendor.service.VendorEntityService; import com.ecep.contract.ds.vendor.service.VendorService; import com.ecep.contract.ds.company.model.Company; import com.ecep.contract.model.Employee; -import com.ecep.contract.ds.vendor.model.Vendor; -import com.ecep.contract.ds.vendor.model.VendorEntity; import lombok.Getter; import lombok.Setter; @@ -72,6 +70,36 @@ public class AbstractYongYouU8Ctx extends AbstractCtx { return false; } + boolean updateEmployeeId(Supplier getter, Consumer setter, EmployeeVo employee, + MessageHolder holder, String topic) { + if (employee == null) { + return false; + } + var v1 = getter.get(); + if (v1 == null) { + setter.accept(employee.getId()); + holder.info(topic + "更新为 " + employee.getName()); + return true; + } + if (!Objects.equals(v1, employee.getId())) { + setter.accept(employee.getId()); + holder.info(topic + "更新为 " + employee.getName()); + return true; + } + return false; + } + + boolean updateEmployeeIdByCode(Supplier getter, Consumer setter, String code, + MessageHolder holder, String topic) { + if (StringUtils.hasText(code)) { + var employee = getEmployeeService().findByCode(code); + if (employee != null) { + return updateEmployeeId(getter, setter, employee, holder, topic); + } + } + return false; + } + boolean updateEmployee(Supplier getter, Consumer setter, EmployeeVo employee, MessageHolder holder, String topic) { if (employee == null) { @@ -106,6 +134,17 @@ public class AbstractYongYouU8Ctx extends AbstractCtx { return false; } + boolean updateEmployeeIdByName(Supplier getter, Consumer setter, String name, + MessageHolder holder, String topic) { + if (StringUtils.hasText(name)) { + EmployeeVo employee = getEmployeeService().findByName(name); + if (employee != null) { + return updateEmployeeId(getter, setter, employee, holder, topic); + } + } + return false; + } + boolean updateCompanyByCustomerCode(Supplier getter, Consumer setter, String customerCode, MessageHolder holder, String topic) { Company company = null; diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java index a81d8a8..f2525dc 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java @@ -14,6 +14,8 @@ import java.util.Objects; import java.util.Optional; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -148,11 +150,11 @@ public class ContractCtx extends AbstractYongYouU8Ctx { List list = getContractService().findAllByCompany(company); for (int i = 0; i < list.size(); i++) { Contract contract = list.get(i); - syncContract(contract, holder); + syncContract(contract.toVo(), holder); } } - public void syncContract(Contract contract, MessageHolder holder) { + public void syncContract(ContractVo contract, MessageHolder holder) { boolean modified = updateContractDetailByGuid(contract, contract.getGuid(), holder); if (updateContractExec(contract, holder)) { modified = true; @@ -169,7 +171,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } } - public boolean updateContractDetailByGuid(Contract contract, String guid, MessageHolder holder) { + public boolean updateContractDetailByGuid(ContractVo contract, String guid, MessageHolder holder) { if (repository == null) { return false; } @@ -185,7 +187,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { /** * 应用合同数据 */ - public boolean applyContractDetail(Contract contract, Map rs, MessageHolder holder) { + public boolean applyContractDetail(ContractVo contract, Map rs, MessageHolder holder) { if (rs == null || rs.isEmpty()) { holder.warn("CM_Contract_B 中未检索到合同数据"); return false; @@ -259,15 +261,15 @@ public class ContractCtx extends AbstractYongYouU8Ctx { "变更日期")) { modified = true; } - if (updateEmployeeByName(contract::getSetupPerson, contract::setSetupPerson, (String) rs.get("strSetupPerson"), + if (updateEmployeeIdByName(contract::getSetupPersonId, contract::setSetupPersonId, (String) rs.get("strSetupPerson"), holder, "提交人")) { modified = true; } - if (updateEmployeeByName(contract::getInurePerson, contract::setInurePerson, (String) rs.get("strInurePerson"), + if (updateEmployeeIdByName(contract::getInurePersonId, contract::setInurePersonId, (String) rs.get("strInurePerson"), holder, "生效人")) { modified = true; } - if (updateEmployeeByName(contract::getVaryPerson, contract::setVaryPerson, (String) rs.get("strVaryPerson"), + if (updateEmployeeIdByName(contract::getVaryPersonId, contract::setVaryPersonId, (String) rs.get("strVaryPerson"), holder, "修改人")) { modified = true; } @@ -301,28 +303,19 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } } - if (contract.getType() != null && contract.getPayWay() != null) { - ContractType type = contract.getType(); - if (!Hibernate.isInitialized(type)) { - type = getCachedBean(ContractTypeService.class).getById(type.getId()); - contract.setType(type); - } + if (contract.getTypeId() != null && contract.getPayWay() != null) { + var typeId = contract.getTypeId(); + var type = getCachedBean(ContractTypeService.class).findById(typeId); if (!type.getDirection().equals(contract.getPayWay().getText())) { holder.warn("合同类型:" + type.getName() + "的付款方向与付款方式不一致:" + contract.getPayWay().getText()); } } - if (contract.getKind() != null && contract.getType() != null) { - ContractKind kind = contract.getKind(); - if (!Hibernate.isInitialized(kind)) { - kind = getCachedBean(ContractKindService.class).getById(kind.getId()); - contract.setKind(kind); - } - ContractType type = contract.getType(); - if (!Hibernate.isInitialized(type)) { - type = getCachedBean(ContractTypeService.class).getById(type.getId()); - contract.setType(type); - } + if (contract.getKindId() != null && contract.getTypeId() != null) { + var kindId = contract.getKindId(); + var kind = getCachedBean(ContractKindService.class).findById(kindId); + var typeId = contract.getTypeId(); + var type = getCachedBean(ContractTypeService.class).findById(typeId); if (!kind.getName().equals(type.getTitle())) { holder.warn("合同分类的名称:" + kind.getName() + "与合同类型的标题:" + type.getName() + "不一致"); } @@ -337,8 +330,8 @@ public class ContractCtx extends AbstractYongYouU8Ctx { * @param unit 合同对应的单位代码 * @param holder 消息处理对象 */ - private boolean updateCompanyByVendorUnitCode(Contract contract, String unit, MessageHolder holder) { - Company company = contract.getCompany(); + private boolean updateCompanyByVendorUnitCode(ContractVo contract, String unit, MessageHolder holder) { + var companyId = contract.getCompanyId(); boolean modified = false; boolean vendorModified = false; VendorService vendorService = getCompanyVendorService(); @@ -353,31 +346,33 @@ public class ContractCtx extends AbstractYongYouU8Ctx { entity = save(entity); - Vendor vendor = getCompanyVendorService().getById(entity.getVendorId()); + var vendor = getCompanyVendorService().findById(entity.getVendorId()); if (vendor == null) { - if (company != null) { + if (companyId != null) { + var company = getCompanyService().findById(companyId); vendor = vendorService.findByCompany(company); } } else { - if (!Hibernate.isInitialized(vendor)) { - vendor = vendorService.getById(vendor.getId()); - } - if (vendor.getCompany() == null) { - vendor.setCompany(company); + if (vendor.getCompanyId() == null) { + vendor.setCompanyId(companyId); vendorModified = true; } else { - if (company == null) { - company = vendor.getCompany(); - } else if (!Objects.equals(company, vendor.getCompany())) { + if (companyId == null) { + companyId = vendor.getCompanyId(); + } else if (!Objects.equals(companyId, vendor.getCompanyId())) { + var contractCompany = getCompanyService().findById(companyId); + var vendorCompany = getCompanyService().findById(vendor.getCompanyId()); holder.error( - "供应商的企业和合同的企业不一致, 供应商的企业:" + vendor.getCompany().getId() + ",合同的企业:" + company.getId()); + "供应商的企业和合同的企业不一致, 供应商的企业:" + vendorCompany.getName() + ",合同的企业:" + contractCompany.getName()); } } } if (vendor == null) { - vendor = new Vendor(); - vendor.setCompany(company); - vendorModified = true; + var v0 = new Vendor(); + v0.setCompany(getCompanyService().getById(companyId)); + v0.setCreated(LocalDateTime.now()); + v0.setVersion(0); + vendor = getCompanyVendorService().save(v0).toVo(); } if (vendor.getDevelopDate() == null || (entity.getDevelopDate() != null && vendor.getDevelopDate().isAfter(entity.getDevelopDate()))) { @@ -386,16 +381,17 @@ public class ContractCtx extends AbstractYongYouU8Ctx { holder.info("供应商的开发日期修改为:" + entity.getDevelopDate()); } if (vendorModified) { - vendor = vendorService.save(vendor); + vendor = getVendorCtx().save(vendor); } // 确定 company - if (company == null) { - company = getCompanyCtx().findOrCreateByNameOrAbbName(entity.getName(), entity.getAbbName(), + if (companyId == null) { + var company = getCompanyCtx().findOrCreateByNameOrAbbName(entity.getName(), entity.getAbbName(), entity.getDevelopDate(), holder); + companyId = company.getId(); } - if (updateCompany(contract, company, holder)) { + if (updateCompanyId(contract, companyId, holder)) { modified = true; } @@ -424,6 +420,19 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return true; } + private boolean updateCompanyId(ContractVo contract, Integer companyId, MessageHolder holder) { + if (companyId == null) { + return false; + } + if (Objects.equals(contract.getCompanyId(), companyId)) { + return false; + } + contract.setCompanyId(companyId); + var company = getCompanyService().getById(companyId); + holder.info("关联至 " + company.getName()); + return true; + } + private VendorEntityVo updateVendorEntityDetailByCode(VendorEntityVo entity, String unitCode, MessageHolder holder) { if (vendorEntityUpdateDelayDays > 0) { @@ -458,8 +467,8 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return getCustomerCtx().updateCustomerEntityDetailByCode(entity, unitCode, holder); } - private boolean updateCompanyByCustomerUnitCode(Contract contract, String unit, MessageHolder holder) { - Company company = contract.getCompany(); + private boolean updateCompanyByCustomerUnitCode(ContractVo contract, String unit, MessageHolder holder) { + var companyId = contract.getCompanyId(); boolean modified = false; boolean customerModified = false; CompanyCustomerEntityService customerEntityService = getCompanyCustomerEntityService(); @@ -474,28 +483,27 @@ public class ContractCtx extends AbstractYongYouU8Ctx { CustomerVo customer = customerService.findById(entity.getCustomerId()); if (customer == null) { - if (company != null) { - customer = customerService.findByCompany(company).toVo(); + if (companyId != null) { + customer = customerService.findByCompany(getCompanyService().findById(companyId)); } } else { if (customer.getCompanyId() == null) { - customer.setCompanyId(company.getId()); + customer.setCompanyId(companyId); customerModified = true; } else { - if (company == null) { - customer.setCompanyId(company.getId()); - } else if (!Objects.equals(company.getId(), customer.getCompanyId())) { + if (companyId == null) { + customer.setCompanyId(null); + } else if (!Objects.equals(companyId, customer.getCompanyId())) { holder.error( - "客户的企业和合同的企业不一致, 客户的企业:" + customer.getCompanyId() + ",合同的企业:" + company.getId()); + "客户的企业和合同的企业不一致, 客户的企业:#" + customer.getCompanyId() + ",合同的企业:#" + companyId); } } } if (customer == null) { CompanyCustomer v1 = new CompanyCustomer(); - if (company != null && !Hibernate.isInitialized(company)) { - company = getCompanyService().getById(company.getId()); - } - v1.setId(getCachedBean(OldVersionService.class).newCompanyCustomer(company == null ? unit : company.getName())); + var company = getCompanyService().getById(companyId); + v1.setId(getCachedBean(OldVersionService.class) + .newCompanyCustomer(companyId == null ? unit : company.getName())); v1.setCompany(company); customer = customerService.save(v1).toVo(); @@ -512,19 +520,20 @@ public class ContractCtx extends AbstractYongYouU8Ctx { customer = customerService.save(v0).toVo(); } // 确定 company - if (company == null) { - company = getCompanyCtx().findOrCreateByNameOrAbbName(entity.getName(), entity.getAbbName(), + if (companyId == null) { + var company = getCompanyCtx().findOrCreateByNameOrAbbName(entity.getName(), entity.getAbbName(), entity.getDevelopDate(), holder); + companyId = company.getId(); } - if (updateCompany(contract, company, holder)) { + if (updateCompanyId(contract, companyId, holder)) { modified = true; } return modified; } - private boolean updatePayWay(Contract contract, String way, MessageHolder holder) { + private boolean updatePayWay(ContractVo contract, String way, MessageHolder holder) { if (!StringUtils.hasText(way)) { holder.warn("无付款方向"); return false; @@ -542,69 +551,85 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return false; } - private boolean updateTypeByCode(Contract contract, String typeCode, MessageHolder holder) { + private boolean updateTypeByCode(ContractVo contract, String typeCode, MessageHolder holder) { var service = getCachedBean(ContractTypeService.class); var type = service.findByCode(typeCode); if (type == null) { - contract.setType(null); + contract.setTypeId(null); } else { - if (contract.getType() == null || !Objects.equals(contract.getType().getId(), type.getId())) { - contract.setType(service.getById(type.getId())); + if (contract.getTypeId() == null) { + contract.setTypeId(type.getId()); holder.info("合同类型修改为: " + type.getName()); + return true; + } + if (!Objects.equals(contract.getTypeId(), type.getId())) { + contract.setTypeId(type.getId()); + holder.info("合同类型修改为: " + type.getName()); + return true; } } return false; } - private boolean updateGroupByCode(Contract contract, String groupCode, MessageHolder holder) { + private boolean updateGroupByCode(ContractVo contract, String groupCode, MessageHolder holder) { var service = getCachedBean(ContractGroupService.class); var group = service.findByCode(groupCode); if (group == null) { - contract.setGroup(null); + contract.setGroupId(null); } else { - if (contract.getGroup() == null || !Objects.equals(contract.getGroup().getId(), group.getId())) { - contract.setGroup(service.getById(group.getId())); + if (contract.getGroupId() == null) { + contract.setGroupId(group.getId()); holder.info("合同分组修改为: " + group.getName()); + return true; + } + if (!Objects.equals(contract.getGroupId(), group.getId())) { + contract.setGroupId(group.getId()); + holder.info("合同分组修改为: " + group.getName()); + return true; } } return false; } - private boolean updateKindByCode(Contract contract, String kindName, MessageHolder holder) { + private boolean updateKindByCode(ContractVo contract, String kindName, MessageHolder holder) { var service = getCachedBean(ContractKindService.class); var kind = service.findByName(kindName); - if (!Objects.equals(contract.getKind(), kind)) { - contract.setKind(kind); - holder.info("合同分类修改为: " + kind.getName()); - return true; + if (kind == null) { + contract.setKindId(null); + } else { + if (contract.getKindId() == null) { + contract.setKindId(kind.getId()); + holder.info("合同分类修改为: " + kind.getName()); + return true; + } + if (!Objects.equals(contract.getKindId(), kind.getId())) { + contract.setKindId(kind.getId()); + holder.info("合同分类修改为: " + kind.getName()); + return true; + } } return false; } - private boolean updateEmployeeByCode(Contract contract, String personId, MessageHolder holder) { - boolean updated = updateEmployeeByCode(contract::getEmployee, contract::setEmployee, personId, holder, "业务员"); - Employee employee = contract.getEmployee(); - if (employee == null) { + private boolean updateEmployeeByCode(ContractVo contract, String personId, MessageHolder holder) { + boolean updated = updateEmployeeIdByCode(contract::getEmployeeId, contract::setEmployeeId, personId, holder, + "业务员"); + Integer employeeId = contract.getEmployeeId(); + if (employeeId == null) { holder.warn("* 合同业务员:" + personId + " 未导入"); } else { - if (!Hibernate.isInitialized(employee)) { - employee = getEmployeeService().getById(employee.getId()); - } - if (!employee.isActive()) { - holder.warn("业务员 " + employee.getName() + " 已经不可用,其离职日期:" + employee.getLeaveDate()); + var v1 = getEmployeeService().findById(employeeId); + if (!v1.isActive()) { + holder.warn("业务员 " + v1.getName() + " 已经不可用,其离职日期:" + v1.getLeaveDate()); } } return updated; } - public Contract findContractByCode(String contractCode) { + + public ContractVo findContractByCode(String contractCode) { var service = getContractService(); - var vo = service.findByCode(contractCode); - if (vo == null) { - // holder.warn("合同 " + contractCode + " 未导入"); - return null; - } - return service.getById(vo.getId()); + return service.findByCode(contractCode); } public boolean syncByVendorEntity(Vendor vendor, VendorEntity entity, MessageHolder holder) { @@ -654,17 +679,17 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } public boolean updateContract(String contractID, String guid, MessageHolder holder) { - Contract contract = findOrCreatByGuidOrContractId(guid, contractID, holder); + ContractVo contract = findOrCreatByGuidOrContractId(guid, contractID, holder); boolean updated = false; boolean modified = applyContractDetail(contract, repository.queryContractDetail(guid), holder); if (modified) { - contract = getContractService().save(contract); + contract = save(contract); updated = true; } return false; } - public Contract findOrCreatByGuidOrContractId(String guid, String contractId, MessageHolder holder) { + public ContractVo findOrCreatByGuidOrContractId(String guid, String contractId, MessageHolder holder) { ContractService service = getContractService(); UUID.fromString(guid); ContractVo contract = service.findByGuid(guid); @@ -678,29 +703,26 @@ public class ContractCtx extends AbstractYongYouU8Ctx { v0.setCode(contractId); v0 = service.save(v0); holder.info("新建合同:" + contractId + ", GUID: " + guid); - return v0; - } else { - return service.getById(contract.getId()); + return v0.toVo(); } - } else { - return service.getById(contract.getId()); } + return contract; } private boolean updateContract(Map rs, MessageHolder holder) { String contractID = (String) rs.get("strContractID"); String guid = (String) rs.get("GUID"); boolean updated = false; - Contract contract = findOrCreatByGuidOrContractId(guid, contractID, holder); + ContractVo contract = findOrCreatByGuidOrContractId(guid, contractID, holder); boolean modified = applyContractDetail(contract, rs, holder); if (modified) { - contract = getContractService().save(contract); + contract = save(contract); updated = true; } return updated; } - public boolean updateParentContract(Contract contract, MessageHolder holder) { + public boolean updateParentContract(ContractVo contract, MessageHolder holder) { // 如果已经由父合同编号,跳过 if (StringUtils.hasText(contract.getParentCode())) { return false; @@ -715,7 +737,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return false; } - String parentCode = getContractService().getParentCode(contract); + String parentCode = getContractService().getParentCode(contract.getCode()); holder.info("尝试查找主合同:" + parentCode); List list = getContractService().findByCodeStartsWith(ContractPayWay.RECEIVE, parentCode); if (list.isEmpty()) { @@ -732,7 +754,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return updateText(contract::getCode, contract::setParentCode, parent.getCode(), holder, "主合同"); } - public boolean updateContractExec(Contract contract, MessageHolder holder) { + public boolean updateContractExec(ContractVo contract, MessageHolder holder) { if (repository == null) { return false; } @@ -764,7 +786,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { * @param contract 合同 * @param holder 消息 */ - public boolean syncContractItems(Contract contract, MessageHolder holder) { + public boolean syncContractItems(ContractVo contract, MessageHolder holder) { if (repository == null) { return false; } @@ -788,7 +810,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { boolean modified = false; if (contractItem == null) { contractItem = new ContractItem(); - contractItem.setContract(contract); + contractItem.setContract(getContractService().getById(contract.getId())); contractItem.setRefId(refId); modified = true; @@ -928,7 +950,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return modified; } - private boolean sumItems(Contract contract, Collection items, MessageHolder holder) { + private boolean sumItems(ContractVo contract, Collection items, MessageHolder holder) { if (items == null || items.isEmpty()) { return false; } @@ -952,7 +974,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return modified; } - public boolean updateContractPath(Contract contract, MessageHolder holder) { + public boolean updateContractPath(ContractVo contract, MessageHolder holder) { // 如果合同路径存在 if (CompanyFileUtils.exists(contract.getPath())) { File dir = new File(contract.getPath()); @@ -998,17 +1020,15 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } else if (contract.getPayWay() == ContractPayWay.RECEIVE) { // 销售合同 File contractPath = null; - Project project = contract.getProject(); - if (project != null) { - project = getProjectCtx().initialize(project); - ProjectSaleType saleType = project.getSaleType(); - if (saleType != null) { - if (!Hibernate.isInitialized(saleType)) { - saleType = getSaleTypeService().getById(saleType.getId()); - } + Integer projectId = contract.getProject(); + if (projectId != null) { + var projectVo = getProjectCtx().getProjectService().findById(projectId); + var saleTypeId = projectVo.getSaleTypeId(); + if (saleTypeId != null) { + ProjectSaleTypeVo saleType = getSaleTypeService().findById(saleTypeId); File dir = new File(saleType.getPath()); if (saleType.isStoreByYear()) { - dir = new File(dir, "20" + project.getCodeYear()); + dir = new File(dir, "20" + projectVo.getCodeYear()); if (!dir.exists()) { if (dir.mkdir()) { holder.info("新建目录 " + dir.getAbsolutePath()); @@ -1021,7 +1041,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { // 从关联项目上未取得合同目录,尝试根据合同编码来确定合同目录 if (contractPath == null) { - ContractCatalog catalog = getContractService().findContractCatalogByContract(contract.getCode()); + ContractCatalogVo catalog = getContractService().findContractCatalogByContract(contract.getCode()); if (catalog != null) { contractPath = getContractService().getContractCatalogPath(catalog, contract); } @@ -1048,7 +1068,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return false; } - public boolean updateContractAmount(Contract contract, MessageHolder holder) { + public boolean updateContractAmount(ContractVo contract, MessageHolder holder) { if (contract.getAmount() == null || contract.getAmount() == 0.0d) { if (contract.getTotalAmount() > 0) { contract.setAmount(contract.getTotalAmount()); @@ -1059,17 +1079,22 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return false; } - public boolean updateContractProject(Contract contract, Project project, MessageHolder holder) { + public boolean updateContractProject(ContractVo contract, ProjectVo project, MessageHolder holder) { if (project == null) { + holder.warn("合同所属项目更新失败,项目不存在"); return false; } - if (Objects.equals(contract.getProject(), project)) { - return false; + if (contract.getProject() == null) { + contract.setProject(project.getId()); + holder.info("合同所属项目更新为:" + project.getName()); + return true; } - project = getProjectCtx().initialize(project); - holder.info("合同所属项目更新为:" + project.getName()); - contract.setProject(project); - return true; + if (!Objects.equals(contract.getProject(), project.getId())) { + holder.info("合同所属项目更新为:" + project.getName()); + contract.setProject(project.getId()); + return true; + } + return false; } /** @@ -1079,14 +1104,15 @@ public class ContractCtx extends AbstractYongYouU8Ctx { * @param holder * @return */ - public boolean updateContractProject(Contract contract, Contract parent, MessageHolder holder) { - Project project = contract.getProject(); - if (project == null && parent != null) { + public boolean updateContractProject(ContractVo contract, ContractVo parent, MessageHolder holder) { + Integer projectId = contract.getProject(); + if (projectId == null && parent != null) { // 尝试从父合同中获取项目对象 - project = parent.getProject(); + projectId = parent.getProject(); } - if (project == null) { + if (projectId == null) { + holder.debug("合同没有关联项目"); return false; } @@ -1095,41 +1121,43 @@ public class ContractCtx extends AbstractYongYouU8Ctx { ProjectCtx ctx = getProjectCtx(); - project = ctx.initialize(project); - if (project.getAmount() == null || project.getAmount() == 0) { - if (ctx.updateNumber(project::getAmount, project::setAmount, contract.getAmount().intValue(), holder, + var projectVo = getProjectCtx().getProjectService().findById(projectId); + if (projectVo.getAmount() == null || projectVo.getAmount() == 0) { + if (ctx.updateNumber(projectVo::getAmount, projectVo::setAmount, contract.getAmount().intValue(), holder, "项目金额")) { projectModified = true; } } // 检查项目的客户 - Company customer = project.getCustomer(); - if (customer == null) { + Integer customerId = projectVo.getCustomerId(); + if (customerId == null) { // 查询合同关联的客户(主合同上的是客户) if (parent == null) { // 主合同时,parent 为 null if (contract.getPayWay() == ContractPayWay.RECEIVE) { - customer = contract.getCompany(); + customerId = contract.getCompanyId(); } } else { - customer = parent.getCompany(); - if (customer == null) { + customerId = parent.getCompanyId(); + if (customerId == null) { holder.warn("合同:" + parent.getCode() + " 没有关联的客户"); } } - if (customer != null) { - if (ctx.updateCustomer(project, customer, holder)) { + if (customerId != null) { + if (ctx.updateCustomerId(projectVo, customerId, holder)) { projectModified = true; } } } if (projectModified) { - project = ctx.save(project); - contract.setProject(project); + projectVo = ctx.save(projectVo); } - - if (updateContractProject(contract, project, holder)) { + if (!Objects.equals(contract.getProject(), projectId)) { + contract.setProject(projectId); + contractModified = true; + } + if (updateContractProject(contract, projectVo, holder)) { // 更新项目客户 contractModified = true; } @@ -1137,7 +1165,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return contractModified; } - public boolean syncContractFiles(Contract contract, MessageHolder holder) { + public boolean syncContractFiles(ContractVo contract, MessageHolder holder) { String contractPath = contract.getPath(); if (!StringUtils.hasText(contractPath)) { return false; @@ -1193,7 +1221,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } // 未记录的文件,存储到 retrieveFiles ContractFile contractFile = new ContractFile(); - contractFile.setContract(contract); + contractFile.setContract(getContractService().getById(contract.getId())); contractFile.setType(ContractFileType.General); contractFile.setFileName(file.getName()); syncContractFile(contractFile, file, holder); @@ -1279,11 +1307,8 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return Math.max(suggestFileName.length(), value.length()); } - public Contract save(Contract contract) { - return getContractService().save(contract); - } - public boolean syncContractPayPlan(Contract contract, MessageHolder holder) { + public boolean syncContractPayPlan(ContractVo contract, MessageHolder holder) { if (repository == null) { return false; } @@ -1307,7 +1332,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { boolean modified = false; if (plan == null) { plan = new ContractPayPlan(); - plan.setContract(contract); + plan.setContract(getContractService().getById(contract.getId())); plan.setRefId(refId); modified = true; @@ -1367,4 +1392,15 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } return modified; } -} + + public Contract save(Contract contract) { + return getContractService().save(contract); + } + + public ContractVo save(ContractVo contract) { + ContractService service = getContractService(); + Contract v0 = service.getById(contract.getId()); + service.updateByVo(v0, contract); + return service.save(v0).toVo(); + } +} \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/InventoryCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/InventoryCtx.java index a0f1fc6..8e40eb6 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/InventoryCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/InventoryCtx.java @@ -7,6 +7,7 @@ import java.util.Objects; import java.util.function.Consumer; import java.util.function.Supplier; +import com.ecep.contract.vo.InventoryCatalogVo; import org.hibernate.Hibernate; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.dao.EmptyResultDataAccessException; @@ -158,8 +159,8 @@ public class InventoryCtx extends AbstractYongYouU8Ctx { * @return 是否更新 */ private boolean updateInventoryCatalog(Supplier getter, Consumer setter, - String catalogCode, MessageHolder holder, String topic) { - InventoryCatalog catalog = null; + String catalogCode, MessageHolder holder, String topic) { + InventoryCatalogVo catalog = null; if (StringUtils.hasText(catalogCode)) { catalog = getInventoryCatalogService().findByCode(catalogCode); } @@ -168,11 +169,14 @@ public class InventoryCtx extends AbstractYongYouU8Ctx { holder.warn("无效" + topic + ":" + catalogCode); return true; } else { - if (!Objects.equals(getter.get(), catalog)) { - if (!Hibernate.isInitialized(catalog)) { - catalog = getInventoryCatalogService().findByCode(catalogCode); - } - setter.accept(catalog); + InventoryCatalog v1 = getter.get(); + if (v1 == null) { + setter.accept(getInventoryCatalogService().getById(catalog.getId())); + holder.info(topic + "修改为: " + catalog.getName()); + return true; + } + if (!Objects.equals(v1.getId(), catalog.getId())) { + setter.accept(getInventoryCatalogService().getById(catalog.getId())); holder.info(topic + "修改为: " + catalog.getName()); return true; } @@ -191,7 +195,7 @@ public class InventoryCtx extends AbstractYongYouU8Ctx { * @return 是否更新 */ public boolean syncInventoryDetailByCode(Supplier getter, Consumer setter, - String inventoryCode, MessageHolder holder, String topic) { + String inventoryCode, MessageHolder holder, String topic) { if (!StringUtils.hasText(inventoryCode)) { return false; } diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseBillVoucherCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseBillVoucherCtx.java index 3abbacb..d34e53d 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseBillVoucherCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseBillVoucherCtx.java @@ -12,6 +12,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; +import com.ecep.contract.vo.ContractVo; import com.ecep.contract.vo.PurchaseOrderItemVo; import org.springframework.data.domain.Sort; @@ -33,6 +34,7 @@ import com.ecep.contract.ds.vendor.model.PurchaseOrder; import com.ecep.contract.ds.vendor.model.PurchaseOrderItem; import lombok.Setter; +import org.springframework.util.StringUtils; public class PurchaseBillVoucherCtx extends AbstractYongYouU8Ctx { @Setter @@ -197,12 +199,10 @@ public class PurchaseBillVoucherCtx extends AbstractYongYouU8Ctx { } } - public void syncByContract(Contract contract, MessageHolder holder) { + public void syncByContract(ContractVo contract, MessageHolder holder) { PurchaseBillVoucherService voucherService = getPurchaseBillVoucherService(); PurchaseBillVoucherItemService voucherItemService = getPurchaseBillVoucherItemService(); - List items = voucherItemService.findAll((root, q, cb) -> { - return cb.equal(root.get("contract"), contract); - }, Sort.unsorted()); + List items = voucherItemService.findAllByContract(contract); Map itemMap = items.stream() .collect(Collectors.toMap(PurchaseBillVoucherItem::getRefId, item -> item)); @@ -376,7 +376,7 @@ public class PurchaseBillVoucherCtx extends AbstractYongYouU8Ctx { holder.info(topic + "修改为: " + item.getRefId()); return true; } - + if (!Objects.equals(v1.getId(), item.getId())) { setter.accept(getPurchaseOrderItemService().getById(item.getId())); holder.info(topic + "修改为: " + item.getRefId()); @@ -408,20 +408,27 @@ public class PurchaseBillVoucherCtx extends AbstractYongYouU8Ctx { boolean updateContractByContractCode(Supplier getter, Consumer setter, String contractCode, MessageHolder holder, String topic) { - Contract contract = null; - if (contractCode != null) { + ContractVo contract = null; + if (StringUtils.hasText(contractCode)) { contract = getContractCtx().findContractByCode(contractCode); - } - if (contract == null) { - setter.accept(null); - holder.warn("无效" + topic + ":" + contractCode); - return true; - } else { - if (!Objects.equals(getter.get(), contract)) { - setter.accept(contract); - holder.info(topic + "修改为: " + contract.getCode()); - return true; + if (contract == null) { + holder.warn("无相关记录, " + topic + ":" + contractCode); + return false; } + } else { + holder.warn("无效 " + topic + ":" + contractCode); + return false; + } + Contract v1 = getter.get(); + if (v1 == null) { + setter.accept(getContractCtx().getContractService().getById(contract.getId())); + holder.info(topic + "修改为: " + contract.getCode()); + return true; + } + if (!Objects.equals(v1.getId(), contract.getId())) { + setter.accept(getContractCtx().getContractService().getById(contract.getId())); + holder.info(topic + "修改为: " + contract.getCode()); + return true; } return false; } diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseOrderCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseOrderCtx.java index dcd38e2..33abeac 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseOrderCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseOrderCtx.java @@ -10,9 +10,11 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; +import com.ecep.contract.vo.ContractVo; import org.hibernate.Hibernate; import org.springframework.data.domain.Sort; @@ -77,25 +79,21 @@ public class PurchaseOrderCtx extends AbstractYongYouU8Ctx { return purchaseOrderItemService; } - public List syncByContract(Contract contract, MessageHolder holder) { + public List syncByContract(ContractVo contract, MessageHolder holder) { PurchaseOrdersService ordersService = getPurchaseOrdersService(); PurchaseOrderItemService itemService = getPurchaseOrderItemService(); - List orders = ordersService.findAll((root, q, cb) -> { - return cb.equal(root.get("contract"), contract); - }, Sort.unsorted()); + List orders = ordersService.findAllByContract(contract); holder.debug("查找到 " + orders.size() + " 条采购订单记录在数据库中"); Map ordersMap = orders.stream() .collect(Collectors.toMap(PurchaseOrder::getRefId, item -> item)); - List items = itemService.findAll((root, q, cb) -> { - return cb.equal(root.get("order").get("contract"), contract); - }, Sort.unsorted()); - // 按 order 分组 - Map> itemMap = items.stream() - .collect(Collectors.groupingBy(PurchaseOrderItem::getOrder, - Collectors.toMap(PurchaseOrderItem::getRefId, item -> item))); + Map> itemMap = orders.stream() + .collect(Collectors.toMap(Function.identity(), order -> itemService.findAllByOrder(order).stream().collect( + Collectors.toMap(PurchaseOrderItem::getRefId, item -> item) + )) + ); // 查询 U8 数据库 List> ds = repository.findAllPurchaseOrderItemByContractCode(contract.getCode()); @@ -111,7 +109,7 @@ public class PurchaseOrderCtx extends AbstractYongYouU8Ctx { PurchaseOrder order = ordersMap.get(poId); if (order == null) { order = new PurchaseOrder(); - order.setContract(contract); + order.setContract(getCachedBean(ContractService.class).getById(contract.getId())); order.setRefId(poId); order = ordersService.save(order); @@ -263,7 +261,7 @@ public class PurchaseOrderCtx extends AbstractYongYouU8Ctx { } private boolean applyPurchaseOrderItemDetail(PurchaseOrderItem item, Map map, - MessageHolder holder) { + MessageHolder holder) { Integer refId = (Integer) map.get("ID"); String inventoryCode = (String) map.get("cInvCode"); String contractCode = (String) map.get("ContractCode"); @@ -326,7 +324,7 @@ public class PurchaseOrderCtx extends AbstractYongYouU8Ctx { } boolean updateInventory(Supplier getter, Consumer setter, String inventoryCode, - MessageHolder holder, String topic) { + MessageHolder holder, String topic) { return getInventoryCtx().syncInventoryDetailByCode(getter, setter, inventoryCode, holder, topic); } } diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/SalesOrderCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/SalesOrderCtx.java index bbe1ed7..64fff4f 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/SalesOrderCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/SalesOrderCtx.java @@ -10,8 +10,11 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.function.Function; import java.util.stream.Collectors; +import com.ecep.contract.ds.contract.service.ContractService; +import com.ecep.contract.vo.ContractVo; import org.springframework.data.domain.Sort; import com.ecep.contract.MessageHolder; @@ -47,23 +50,21 @@ public class SalesOrderCtx extends AbstractYongYouU8Ctx { } - public List syncByContract(Contract contract, MessageHolder holder) { + public List syncByContract(ContractVo contract, MessageHolder holder) { SaleOrdersService saleOrdersService = getSaleOrdersService(); SalesOrderItemService orderItemService = getOrderItemService(); - List orders = saleOrdersService.findAll((root, q, cb) -> { - return cb.equal(root.get("contract"), contract); - }, Sort.unsorted()); + List orders = saleOrdersService.findAllByContract(contract); holder.debug("查找到 " + orders.size() + " 条销售订单记录在数据库中"); Map ordersMap = orders.stream().collect(Collectors.toMap(SalesOrder::getCode, item -> item)); - - List items = orderItemService.findAll((root, q, cb) -> { - return cb.equal(root.get("order").get("contract"), contract); - }, Sort.unsorted()); - // 按 order 分组 - Map> itemMap = items.stream().collect(Collectors.groupingBy(SalesOrderItem::getOrder, - Collectors.toMap(SalesOrderItem::getCode, item -> item))); + Map> itemMap = orders.stream() + .collect( + Collectors.toMap(Function.identity(), order -> orderItemService.findAllBySaleOrder(order).stream().collect( + Collectors.toMap(SalesOrderItem::getCode, item -> item) + )) + ); + // 查询 U8 数据库 List> ds = repository.findAllSalesOrderItemByContractCode(contract.getCode()); @@ -79,7 +80,7 @@ public class SalesOrderCtx extends AbstractYongYouU8Ctx { SalesOrder order = ordersMap.get(orderCode); if (order == null) { order = new SalesOrder(); - order.setContract(contract); + order.setContract(getCachedBean(ContractService.class).getById(contract.getId())); order.setCode(orderCode); order = saleOrdersService.save(order); diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/VendorCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/VendorCtx.java index 0e63f2f..4cce2d1 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/VendorCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/VendorCtx.java @@ -11,6 +11,7 @@ import java.util.function.Supplier; import com.ecep.contract.ds.vendor.service.VendorCatalogService; import com.ecep.contract.vo.VendorCatalogVo; import com.ecep.contract.vo.VendorEntityVo; +import com.ecep.contract.vo.VendorVo; import org.hibernate.Hibernate; import org.springframework.util.StringUtils; @@ -332,4 +333,10 @@ public class VendorCtx extends AbstractYongYouU8Ctx { } + public VendorVo save(VendorVo vendor) { + VendorService service = getCompanyVendorService(); + Vendor v0 = service.getById(vendor.getId()); + service.updateByVo(v0, vendor); + return service.save(v0).toVo(); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/repository/ContractFileRepository.java b/server/src/main/java/com/ecep/contract/ds/contract/repository/ContractFileRepository.java index 8606f5a..cd8b926 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/repository/ContractFileRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/repository/ContractFileRepository.java @@ -15,6 +15,8 @@ public interface ContractFileRepository extends JpaRepository findByContract(Contract contract); List findAllByContract(Contract contract); + + List findAllByContractId(Integer contractId); List findAllByContractAndType(Contract contract, ContractFileType type); } \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/ds/contract/repository/PurchaseBillVoucherItemRepository.java b/server/src/main/java/com/ecep/contract/ds/contract/repository/PurchaseBillVoucherItemRepository.java index 1fa44c5..4750eea 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/repository/PurchaseBillVoucherItemRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/repository/PurchaseBillVoucherItemRepository.java @@ -1,5 +1,6 @@ package com.ecep.contract.ds.contract.repository; +import com.ecep.contract.ds.MyRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.CrudRepository; @@ -8,12 +9,11 @@ import org.springframework.stereotype.Repository; import com.ecep.contract.ds.vendor.model.PurchaseBillVoucherItem; +import java.util.List; + @Repository public interface PurchaseBillVoucherItemRepository extends - // JDBC interfaces - CrudRepository, - PagingAndSortingRepository, - // JPA interfaces - JpaRepository, JpaSpecificationExecutor { + MyRepository { + List findAllByContractId(Integer contractId); } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/repository/PurchaseOrderRepository.java b/server/src/main/java/com/ecep/contract/ds/contract/repository/PurchaseOrderRepository.java index acf808f..d4ca118 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/repository/PurchaseOrderRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/repository/PurchaseOrderRepository.java @@ -24,6 +24,7 @@ public interface PurchaseOrderRepository extends Optional findByRefId(Integer refId); List findAllByContract(Contract contract); + List findAllByContractId(Integer contractId); List findByCodeStartsWith(String code); } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderRepository.java b/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderRepository.java index 94812c8..48fa9b7 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderRepository.java @@ -15,6 +15,7 @@ public interface SalesOrderRepository extends MyRepository Optional findByCode(String code); List findAllByContract(Contract contract); + List findAllByContractId(Integer contractId); List findByCodeStartsWith(String code); } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractCatalogService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractCatalogService.java index 2e42265..a2972e9 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractCatalogService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractCatalogService.java @@ -52,13 +52,13 @@ public class ContractCatalogService implements IEntityService, } @Cacheable(key = "'code-'+#p0") - public ContractCatalog findByCode(String code) { - return repository.findByCode(code).orElse(null); + public ContractCatalogVo findByCode(String code) { + return repository.findByCode(code).map(ContractCatalog::toVo).orElse(null); } @Cacheable(key = "'catalogs'") - public List findAll() { - return repository.findAll(); + public List findAll() { + return repository.findAll().stream().map(ContractCatalog::toVo).toList(); } @Caching(evict = { diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileService.java index b61cb42..d006b48 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileService.java @@ -3,6 +3,7 @@ package com.ecep.contract.ds.contract.service; import java.util.List; import java.util.function.Consumer; +import com.ecep.contract.vo.ContractVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -166,6 +167,11 @@ public class ContractFileService implements IEntityService, QueryS return contractFileRepository.findAllByContract(contract).stream().map(ContractFile::toVo).toList(); } + @Cacheable(key = "'allbycontract-'+#p0.id") + public List findAllByContract(ContractVo contract) { + return contractFileRepository.findAllByContractId(contract.getId()).stream().map(ContractFile::toVo).toList(); + } + public List searchByContract(Contract contract, String userText) { Specification spec = (root, query, builder) -> { return builder.and( diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractItemService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractItemService.java index 2f17be7..1d58dc0 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractItemService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractItemService.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.vo.ContractVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -98,6 +99,10 @@ public class ContractItemService implements IEntityService, QueryS return itemRepository.findByContractId(contract.getId()); } + public List findAllByContract(ContractVo contract) { + return itemRepository.findByContractId(contract.getId()); + } + public List findAllByInventory(Inventory inventory) { return itemRepository.findByInventoryId(inventory.getId()); } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractPayPlanService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractPayPlanService.java index b3ee3d8..bfcc616 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractPayPlanService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractPayPlanService.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.vo.ContractVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -74,8 +75,8 @@ public class ContractPayPlanService implements IEntityService, return findAll(spec, pageable).map(ContractPayPlan::toVo); } - public List findAllByContract(Contract contract) { - return repository.findAllByContract(contract); + public List findAllByContract(ContractVo contract) { + return repository.findAllByContractId(contract.getId()); } @Caching(evict = { diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractService.java index 4bde7a1..711b275 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractService.java @@ -9,6 +9,7 @@ import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.ecep.contract.vo.ContractCatalogVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -149,7 +150,7 @@ public class ContractService extends EntityService findAllByParent(ContractVo contract) { + return contractRepository.findAllByParentCode(contract.getCode()); + } + public List findByCodeStartsWith(ContractPayWay payWay, String parentCode) { return contractRepository.findByPayWayAndCodeStartsWith(payWay, parentCode); } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherItemService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherItemService.java index d3ddaf9..d1563fc 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherItemService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherItemService.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.vo.ContractVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -100,4 +101,8 @@ public class PurchaseBillVoucherItemService model.setPrice(vo.getPrice()); model.setDescription(vo.getDescription()); } + + public List findAllByContract(ContractVo contract) { + return repository.findAllByContractId(contract.getId()); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseOrderItemService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseOrderItemService.java index 63d61a5..10c8a2a 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseOrderItemService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseOrderItemService.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.ds.vendor.model.PurchaseOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -142,4 +143,8 @@ public class PurchaseOrderItemService implements IEntityService findAllByOrder(PurchaseOrder order) { + return repository.findAllByOrder(order); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseOrdersService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseOrdersService.java index a9f568b..824fd11 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseOrdersService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseOrdersService.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.vo.ContractVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -137,6 +138,10 @@ public class PurchaseOrdersService implements IEntityService, Que return repository.findAllByContract(contract); } + public List findAllByContract(ContractVo contract) { + return repository.findAllByContractId(contract.getId()); + } + public List search(String searchText) { Specification spec = (root, query, builder) -> { return builder.or( diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/SaleOrdersService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/SaleOrdersService.java index ee90a3a..84af057 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/SaleOrdersService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/SaleOrdersService.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.vo.ContractVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -143,4 +144,8 @@ public class SaleOrdersService extends EntityService findAllByContract(Contract contract) { return repository.findAllByContract(contract); } + + public List findAllByContract(ContractVo contract) { + return repository.findAllByContractId(contract.getId()); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/SalesOrderItemService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/SalesOrderItemService.java index 109c187..ce1d47c 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/SalesOrderItemService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/SalesOrderItemService.java @@ -1,11 +1,14 @@ package com.ecep.contract.ds.contract.service; +import com.ecep.contract.ds.customer.model.SalesOrder; +import com.ecep.contract.vo.ContractVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; @@ -21,6 +24,8 @@ import com.ecep.contract.util.SpecificationUtils; import com.ecep.contract.vo.SalesOrderItemVo; import com.fasterxml.jackson.databind.JsonNode; +import java.util.List; + @Lazy @Service @CacheConfig(cacheNames = "contract-sale-order-item") @@ -108,4 +113,14 @@ public class SalesOrderItemService extends EntityService findAllByContract(ContractVo contract) { + return repository.findAll((root, q, cb) -> { + return cb.equal(root.get("order").get("contract").get("id"), contract.getId()); + }, Sort.unsorted()); + } + + public List findAllBySaleOrder(SalesOrder order) { + return repository.findAllByOrder(order); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/AbstContractRepairTasker.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/AbstContractRepairTasker.java index c1160f0..0206015 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/AbstContractRepairTasker.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/AbstContractRepairTasker.java @@ -6,6 +6,8 @@ import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import com.ecep.contract.ds.project.service.ProjectService; +import com.ecep.contract.ds.vendor.model.PurchaseOrder; import org.hibernate.Hibernate; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.jdbc.CannotGetJdbcConnectionException; @@ -106,7 +108,7 @@ public abstract class AbstContractRepairTasker extends Tasker { String state = (String) rs.get("strState"); holder.info("同步合同 " + contractID + " " + contractName); - Contract contract = contractCtx.findOrCreatByGuidOrContractId(guid, contractID, holder); + ContractVo contract = contractCtx.findOrCreatByGuidOrContractId(guid, contractID, holder); if (contract == null) { holder.warn("未知合同" + contractID + ", " + rs.get("strContractName")); return false; @@ -143,17 +145,17 @@ public abstract class AbstContractRepairTasker extends Tasker { } if (modified) { - contract = contractCtx.save(contract); + contract = save(contract); } - Contract parent = null; + ContractVo parent = null; if (contract.getPayWay() == ContractPayWay.PAY) { if (StringUtils.hasText(contract.getParentCode())) { parent = contractCtx.findContractByCode(contract.getParentCode()); } } - AtomicReference refer = new AtomicReference<>(contract); + AtomicReference refer = new AtomicReference<>(contract); try { return repair(refer, parent, holder, progress -> { }); @@ -163,6 +165,10 @@ public abstract class AbstContractRepairTasker extends Tasker { } } + protected ContractVo save(ContractVo contract) { + return contractCtx.save(contract); + } + /** * @param contractProperty * @param holder @@ -170,11 +176,11 @@ public abstract class AbstContractRepairTasker extends Tasker { * @return */ public boolean repair( - AtomicReference contractProperty, - Contract parent, MessageHolder holder, Consumer progress) { + AtomicReference contractProperty, + ContractVo parent, MessageHolder holder, Consumer progress) { boolean repaired = false; boolean modified = false; - Contract contract = contractProperty.get(); + ContractVo contract = contractProperty.get(); progress.accept(0.1); if (contractCtx.updateContractDetailByGuid(contract, contract.getGuid(), holder)) { @@ -197,7 +203,7 @@ public abstract class AbstContractRepairTasker extends Tasker { } progress.accept(0.5); if (modified) { - contract = contractCtx.save(contract); + contract = save(contract); contractProperty.set(contract); modified = false; repaired = true; @@ -216,7 +222,7 @@ public abstract class AbstContractRepairTasker extends Tasker { modified = true; } if (modified) { - contract = contractCtx.save(contract); + contract = save(contract); contractProperty.set(contract); modified = false; repaired = true; @@ -239,38 +245,38 @@ public abstract class AbstContractRepairTasker extends Tasker { return repaired; } - private void syncChildrenContract(Contract parent, MessageHolder holder, Consumer progress) { + private void syncChildrenContract(ContractVo parent, MessageHolder holder, Consumer progress) { ContractService contractService = contractCtx.getContractService(); + ProjectService projectService = getCachedBean(ProjectService.class); List list = contractService.findAllByParent(parent); for (int i = 0; i < list.size(); i++) { - Contract v = list.get(i); - holder.info("子合同 : " + v.getCode() + " " + v.getName()); + Contract v0 = list.get(i); + ContractVo v1 = v0.toVo(); + holder.info("子合同 : " + v1.getCode() + " " + v1.getName()); MessageHolder subHolder = holder.sub(" -- "); boolean modified = false; - Project project = parent.getProject(); - if (project == null) { - project = v.getProject(); + Integer projectId = parent.getProject(); + if (projectId == null) { + projectId = v1.getProject(); } - AtomicReference contractProperty = new AtomicReference<>(v); + AtomicReference contractProperty = new AtomicReference<>(v1); try { repair(contractProperty, parent, subHolder, p -> { }); + v1 = contractProperty.get(); - v = contractProperty.get(); - if (contractCtx.updateContractProject(v, project, subHolder)) { + var projectVo = projectService.findById(projectId); + if (contractCtx.updateContractProject(v1, projectVo, subHolder)) { modified = true; } } catch (Exception e) { - if (!Hibernate.isInitialized(v)) { - v = contractService.getById(v.getId()); - } - throw new RuntimeException("同步子合同失败, contract=" + v.toPrettyString(), e); + throw new RuntimeException("同步子合同失败, 合同b编号:" + v1.getCode(), e); } if (modified) { try { - v = contractCtx.save(v); + v1 = save(v1); } catch (Exception e) { - throw new RuntimeException("#" + v.getId() + ", v=" + v.getVersion(), e); + throw new RuntimeException("#" + v1.getId() + ", ver=" + v1.getVersion(), e); } modified = false; } @@ -284,7 +290,7 @@ public abstract class AbstContractRepairTasker extends Tasker { * @param contract 合同 * @param holder 消息 */ - private void syncSaleOrder(Contract contract, MessageHolder holder) { + private void syncSaleOrder(ContractVo contract, MessageHolder holder) { SalesOrderCtx ctx = getSalesOrderCtx(); if (ctx.getRepository() == null) { return; @@ -305,10 +311,13 @@ public abstract class AbstContractRepairTasker extends Tasker { * @param contract 合同 * @param holder 消息 */ - private void syncPurchaseOrder(Contract contract, MessageHolder holder) { + private void syncPurchaseOrder(ContractVo contract, MessageHolder holder) { PurchaseOrderCtx ctx1 = getPurchaseOrderCtx(); if (ctx1.getRepository() != null) { - ctx1.syncByContract(contract, holder); + List orders = ctx1.syncByContract(contract, holder); + if (orders == null) { + holder.warn("没有采购订单异常"); + } } PurchaseBillVoucherCtx ctx2 = getPurchaseBillVoucherCtx(); diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractFilesRebuildAllTasker.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractFilesRebuildAllTasker.java index cd3f593..f58957e 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractFilesRebuildAllTasker.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractFilesRebuildAllTasker.java @@ -69,7 +69,7 @@ public class ContractFilesRebuildAllTasker extends Tasker { } MessageHolder subHolder = holder.sub( counter.get() + " / " + total + "> " + contract.getCode() + " #" + contract.getId() + "> "); - getContractCtx().syncContractFiles(contract, subHolder); + getContractCtx().syncContractFiles(contract.toVo(), subHolder); updateProgress(counter.incrementAndGet(), total); } if (!page.hasNext()) { diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractFilesRebuildTasker.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractFilesRebuildTasker.java index 92f3d33..f596dee 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractFilesRebuildTasker.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractFilesRebuildTasker.java @@ -31,7 +31,7 @@ public class ContractFilesRebuildTasker extends Tasker { updateTitle("遍历合同的文件进行“重置”操作"); ContractCtx contractCtx = new ContractCtx(); - if (contractCtx.syncContractFiles(contract, holder)) { + if (contractCtx.syncContractFiles(contract.toVo(), holder)) { repaired = true; } return null; diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairAllTasker.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairAllTasker.java index 62abb5d..f738e09 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairAllTasker.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairAllTasker.java @@ -7,6 +7,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; import java.util.stream.Collectors; +import com.ecep.contract.vo.ContractVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; @@ -70,21 +71,22 @@ public class ContractRepairAllTasker extends AbstContractRepairTasker { break; } - for (Contract contract : page) { + for (Contract c : page) { if (isCancelled()) { break; } + var contract = c.toVo(); MessageHolder subHolder = holder.sub( counter.get() + " / " + total + "> " + contract.getCode() + " #" + contract.getId() + "> "); MessageHolderImpl messageHolder = new MessageHolderImpl(); try { - Contract parent = null; + ContractVo parent = null; if (contract.getPayWay() == ContractPayWay.PAY) { if (StringUtils.hasText(contract.getParentCode())) { parent = contractCtx.findContractByCode(contract.getParentCode()); } } - AtomicReference contractProperty = new AtomicReference<>(contract); + AtomicReference contractProperty = new AtomicReference<>(contract); boolean repaired = repair(contractProperty, parent, messageHolder, progress -> { }); String msg = messageHolder.messages.stream() diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairComm.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairComm.java index a7fe986..5409943 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairComm.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairComm.java @@ -4,6 +4,7 @@ import static com.ecep.contract.SpringApp.getBean; import java.io.File; +import com.ecep.contract.vo.ContractCatalogVo; import org.springframework.util.StringUtils; import com.ecep.contract.MessageHolder; @@ -119,7 +120,7 @@ public class ContractRepairComm { parentDir = new File(parentPath); } else { // 主合同 - ContractCatalog catalog = getContractService().findContractCatalogByContract(contract.getCode()); + ContractCatalogVo catalog = getContractService().findContractCatalogByContract(contract.getCode()); if (catalog == null) { return null; } diff --git a/server/src/main/java/com/ecep/contract/ds/customer/repository/CompanyCustomerRepository.java b/server/src/main/java/com/ecep/contract/ds/customer/repository/CompanyCustomerRepository.java index a2295f2..336240f 100644 --- a/server/src/main/java/com/ecep/contract/ds/customer/repository/CompanyCustomerRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/customer/repository/CompanyCustomerRepository.java @@ -1,20 +1,21 @@ package com.ecep.contract.ds.customer.repository; -import java.util.Optional; - -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - import com.ecep.contract.ds.MyRepository; import com.ecep.contract.ds.company.model.Company; import com.ecep.contract.ds.customer.model.CompanyCustomer; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; @Repository public interface CompanyCustomerRepository extends MyRepository { Optional findByCompany(Company company); + Optional findByCompanyId(Integer companyId); + @Modifying @Transactional int deleteAllByCompany(Company company); diff --git a/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerService.java b/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerService.java index 21a0df3..085f1d4 100644 --- a/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerService.java +++ b/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerService.java @@ -11,6 +11,7 @@ import java.util.Optional; import java.util.function.Consumer; import java.util.stream.Collectors; +import com.ecep.contract.vo.CompanyVo; import org.hibernate.Hibernate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,6 +81,11 @@ public class CustomerService extends CompanyBasicService return repository.findByCompany(company).orElse(null); } + public CustomerVo findByCompany(CompanyVo company) { + return repository.findByCompanyId(company.getId()).map(CompanyCustomer::toVo).orElse(null); + } + + @Override public CompanyCustomer getById(Integer id) { return repository.findById(id).orElse(null); @@ -193,7 +199,7 @@ public class CustomerService extends CompanyBasicService @SuppressWarnings("unchecked") @Override protected > boolean fillFileAsDefaultType(F dbFile, File file, - Consumer status) { + Consumer status) { dbFile.setType((T) CustomerFileType.General); fillFile(dbFile, file, null, status); companyCustomerFileService.save((CompanyCustomerFile) dbFile); @@ -202,7 +208,7 @@ public class CustomerService extends CompanyBasicService @Override protected > boolean fillFileAsEvaluationFile(F customerFile, File file, - List fileList, Consumer status) { + List fileList, Consumer status) { boolean modified = super.fillFileAsEvaluationFile(customerFile, file, fileList, status); if (fileList != null) { @@ -236,7 +242,7 @@ public class CustomerService extends CompanyBasicService } private > void updateEvaluationFileByJsonFile(F customerFile, File jsonFile, - Consumer status) throws IOException { + Consumer status) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); JsonNode root = objectMapper.readTree(jsonFile); if (!root.isObject()) { @@ -262,7 +268,7 @@ public class CustomerService extends CompanyBasicService @SuppressWarnings("unchecked") @Override protected > F fillFileType(File file, List fileList, - Consumer status) { + Consumer status) { CompanyCustomerFile customerFile = new CompanyCustomerFile(); customerFile.setType(CustomerFileType.General); if (fillFile(customerFile, file, fileList, status)) { @@ -286,7 +292,7 @@ public class CustomerService extends CompanyBasicService return (fileName.contains(CompanyCustomerConstant.EVALUATION_FORM_NAME1) || fileName.contains(CompanyCustomerConstant.EVALUATION_FORM_NAME2)) && (FileUtils.withExtensions(fileName, FileUtils.JPG, FileUtils.JPEG, - FileUtils.PDF)); + FileUtils.PDF)); } public boolean makePathAbsent(CompanyCustomer companyCustomer) { diff --git a/server/src/main/java/com/ecep/contract/ds/other/service/InventoryCatalogService.java b/server/src/main/java/com/ecep/contract/ds/other/service/InventoryCatalogService.java index 99f2814..5eb1ced 100644 --- a/server/src/main/java/com/ecep/contract/ds/other/service/InventoryCatalogService.java +++ b/server/src/main/java/com/ecep/contract/ds/other/service/InventoryCatalogService.java @@ -42,13 +42,13 @@ public class InventoryCatalogService implements IEntityService } @Cacheable(key = "'code-'+#p0") - public InventoryCatalog findByCode(String code) { - return repository.findByCode(code).orElse(null); + public InventoryCatalogVo findByCode(String code) { + return repository.findByCode(code).map(InventoryCatalog::toVo).orElse(null); } @Cacheable(key = "'name-'+#p0") - public InventoryCatalog findByName(String name) { - return repository.findByName(name).orElse(null); + public InventoryCatalogVo findByName(String name) { + return repository.findByName(name).map(InventoryCatalog::toVo).orElse(null); } @Override diff --git a/server/src/main/java/com/ecep/contract/ds/project/ProjectCtx.java b/server/src/main/java/com/ecep/contract/ds/project/ProjectCtx.java index 08cd182..92fb49c 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/ProjectCtx.java +++ b/server/src/main/java/com/ecep/contract/ds/project/ProjectCtx.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.project; import java.util.Objects; +import com.ecep.contract.vo.ProjectVo; import org.hibernate.Hibernate; import com.ecep.contract.MessageHolder; @@ -13,15 +14,9 @@ import com.ecep.contract.ds.project.model.Project; import lombok.Setter; public class ProjectCtx extends AbstractCtx { - @Setter - private ProjectService projectService; - - ProjectService getProjectService() { - if (projectService == null) { - projectService = getBean(ProjectService.class); - } - return projectService; + public ProjectService getProjectService() { + return getCachedBean(ProjectService.class); } public boolean updateCustomer(Project project, Company customer, MessageHolder holder) { @@ -38,14 +33,27 @@ public class ProjectCtx extends AbstractCtx { return modified; } - public Project initialize(Project project) { - if (Hibernate.isInitialized(project)) { - return project; + public boolean updateCustomerId(ProjectVo project, Integer customerId, MessageHolder holder) { + boolean modified = false; + if (!Objects.equals(project.getCustomerId(), customerId)) { + project.setCustomerId(customerId); + var customer = getCompanyService().findById(customerId); + holder.info("同步合同所属项目客户为:" + customer.getName()); + modified = true; } - return getProjectService().getById(project.getId()); + + return modified; } + public Project save(Project project) { return getProjectService().save(project); } + + public ProjectVo save(ProjectVo project) { + ProjectService service = getProjectService(); + var v0 = service.getById(project.getId()); + service.updateByVo(v0, project); + return service.save(v0).toVo(); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostService.java index 1cb5351..b3b1416 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostService.java @@ -143,6 +143,15 @@ public class ProjectCostService implements IEntityService, QuerySer model.setDescription(vo.getDescription()); model.setImportLock(vo.isImportLock()); + model.setInTaxAmount(vo.getInTaxAmount()); + model.setInQuantities(vo.getInQuantities()); + model.setInExclusiveTaxAmount(vo.getInExclusiveTaxAmount()); + model.setOutTaxAmount(vo.getOutTaxAmount()); + model.setOutQuantities(vo.getOutQuantities()); + model.setOutExclusiveTaxAmount(vo.getOutExclusiveTaxAmount()); + model.setGrossProfitMargin(vo.getGrossProfitMargin()); + + if (vo.getProject() == null) { model.setProject(null); } else { @@ -156,10 +165,10 @@ public class ProjectCostService implements IEntityService, QuerySer model.setContract(SpringApp.getBean(ContractService.class).getById(vo.getContractId())); } - if (vo.getApplicantId() == null) { + if (vo.getAuthorizerId() == null) { model.setAuthorizer(null); } else { - model.setApplicant(SpringApp.getBean(EmployeeService.class).getById(vo.getApplicantId())); + model.setAuthorizer(SpringApp.getBean(EmployeeService.class).getById(vo.getAuthorizerId())); } if (vo.getApplicantId() == null) { diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorRepository.java b/server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorRepository.java index 3271817..da11e0f 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorRepository.java @@ -24,6 +24,8 @@ public interface VendorRepository extends MyRepository { Optional findByCompany(Company company); + Optional findByCompanyId(Integer companyId); + @Modifying @Transactional int deleteAllByCompany(Company company); diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorService.java index 5cfe04f..97d43a7 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorService.java @@ -11,6 +11,7 @@ import java.util.Optional; import java.util.function.Consumer; import java.util.stream.Collectors; +import com.ecep.contract.vo.CompanyVo; import com.ecep.contract.vo.VendorCatalogVo; import org.hibernate.Hibernate; import org.slf4j.Logger; @@ -121,6 +122,10 @@ public class VendorService extends CompanyBasicService return repository.findByCompany(company).orElse(null); } + public VendorVo findByCompany(CompanyVo company) { + return repository.findByCompanyId(company.getId()).map(Vendor::toVo).orElse(null); + } + @Caching(evict = { @CacheEvict(key = "#p0.id") }) @@ -221,7 +226,7 @@ public class VendorService extends CompanyBasicService @SuppressWarnings("unchecked") @Override protected > boolean fillFileAsDefaultType(F dbFile, File file, - Consumer status) { + Consumer status) { dbFile.setType((T) VendorFileType.General); fillFile(dbFile, file, null, status); vendorFileService.save((VendorFile) dbFile); @@ -231,7 +236,7 @@ public class VendorService extends CompanyBasicService @SuppressWarnings("unchecked") @Override protected > F fillFileType(File file, List fileList, - Consumer status) { + Consumer status) { VendorFile vendorFile = new VendorFile(); vendorFile.setType(VendorFileType.General); vendorFile.setFilePath(file.getAbsolutePath()); @@ -252,7 +257,7 @@ public class VendorService extends CompanyBasicService @Override protected > boolean fillFileAsEvaluationFile(F customerFile, File file, - List fileList, Consumer status) { + List fileList, Consumer status) { boolean modified = super.fillFileAsEvaluationFile(customerFile, file, fileList, status); // 当评价表有日期,并且未设审核时 boolean valid = FileUtils.isArchiveFile(customerFile.getFilePath()) && customerFile.getSignDate() != null; diff --git a/server/src/main/java/com/ecep/contract/service/tasker/ContractRepairTasker.java b/server/src/main/java/com/ecep/contract/service/tasker/ContractRepairTasker.java index 45719ff..adf8a4d 100644 --- a/server/src/main/java/com/ecep/contract/service/tasker/ContractRepairTasker.java +++ b/server/src/main/java/com/ecep/contract/service/tasker/ContractRepairTasker.java @@ -5,6 +5,7 @@ import java.util.concurrent.atomic.AtomicReference; import com.ecep.contract.ds.contract.service.ContractService; import com.ecep.contract.ds.contract.tasker.AbstContractRepairTasker; import com.ecep.contract.ds.contract.tasker.ContractRepairComm; +import com.ecep.contract.vo.ContractVo; import com.fasterxml.jackson.databind.JsonNode; import org.springframework.util.StringUtils; @@ -19,7 +20,7 @@ import lombok.Getter; */ public class ContractRepairTasker extends AbstContractRepairTasker implements WebSocketServerTasker { @Getter - private Contract contract; + private ContractVo contract; @Getter boolean repaired = false; @@ -31,13 +32,13 @@ public class ContractRepairTasker extends AbstContractRepairTasker implements We public void init(JsonNode argsNode) { int contractId = argsNode.get(0).asInt(); - contract = getCachedBean(ContractService.class).getById(contractId); + contract = getCachedBean(ContractService.class).findById(contractId); } @Override protected void repair(MessageHolder holder) { - updateTitle("修复合同 " + contract.toPrettyString()); - Contract parent = null; + updateTitle("修复合同 " + contract.getCode() + " - " + contract.getName()); + ContractVo parent = null; if (contract.getPayWay() == ContractPayWay.PAY) { if (StringUtils.hasText(contract.getParentCode())) { @@ -45,7 +46,7 @@ public class ContractRepairTasker extends AbstContractRepairTasker implements We } } - AtomicReference contractProperty = new AtomicReference<>(contract); + AtomicReference contractProperty = new AtomicReference<>(contract); if (repair(contractProperty, parent, holder, progress -> updateProgress(progress, 1))) { repaired = true; updateProperty("repaired", true); @@ -56,7 +57,7 @@ public class ContractRepairTasker extends AbstContractRepairTasker implements We updateProgress(1, 1); } - public void setContract(Contract contract) { + public void setContract(ContractVo contract) { this.contract = contract; updateProperty("contract", contract); }