feat: 添加按ID查询的仓库方法并优化合同同步逻辑

添加了多个仓库的按ID查询方法,如findByCompanyId和findAllByContractId
优化了合同同步任务,使用ContractVo替代Contract减少数据库访问
重构了部分服务方法,支持通过ID直接操作,提升性能
修复了ProjectCostService中字段映射错误的问题
This commit is contained in:
2025-10-11 17:56:02 +08:00
parent 553feac0a4
commit 333feb0d5a
38 changed files with 562 additions and 317 deletions

View File

@@ -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<String> getter, Consumer<String> 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<String> getter, Consumer<String> 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<LocalDate> getter, Consumer<LocalDate> 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<LocalDate> getter, Consumer<LocalDate> setter, LocalDate date,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
return updateLocalDate(getter, setter, date, holder, topic, false);
}
public boolean updateLocalDate(Supplier<LocalDate> getter, Consumer<LocalDate> 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<LocalDate> getter, Consumer<LocalDate> 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<LocalDate> getter, Consumer<LocalDate> 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<LocalDateTime> getter, Consumer<LocalDateTime> 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<LocalDateTime> getter, Consumer<LocalDateTime> 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<Instant> getter, Consumer<Instant> 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<Double> getter, Consumer<Double> 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<Double> getter, Consumer<Double> 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<Float> getter, Consumer<Float> 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<Integer> getter, Consumer<Integer> 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);

View File

@@ -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<Integer> getter, Consumer<Integer> 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<Integer> getter, Consumer<Integer> 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<Employee> getter, Consumer<Employee> setter, EmployeeVo employee,
MessageHolder holder, String topic) {
if (employee == null) {
@@ -106,6 +134,17 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
return false;
}
boolean updateEmployeeIdByName(Supplier<Integer> getter, Consumer<Integer> 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<Company> getter, Consumer<Company> setter, String customerCode,
MessageHolder holder, String topic) {
Company company = null;

View File

@@ -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<Contract> 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<String, Object> rs, MessageHolder holder) {
public boolean applyContractDetail(ContractVo contract, Map<String, Object> 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<String, Object> 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<Contract> 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<ContractItem> items, MessageHolder holder) {
private boolean sumItems(ContractVo contract, Collection<ContractItem> 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();
}
}

View File

@@ -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<InventoryCatalog> getter, Consumer<InventoryCatalog> 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<Inventory> getter, Consumer<Inventory> setter,
String inventoryCode, MessageHolder holder, String topic) {
String inventoryCode, MessageHolder holder, String topic) {
if (!StringUtils.hasText(inventoryCode)) {
return false;
}

View File

@@ -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<PurchaseBillVoucherItem> items = voucherItemService.findAll((root, q, cb) -> {
return cb.equal(root.get("contract"), contract);
}, Sort.unsorted());
List<PurchaseBillVoucherItem> items = voucherItemService.findAllByContract(contract);
Map<Integer, PurchaseBillVoucherItem> 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<Contract> getter, Consumer<Contract> 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;
}

View File

@@ -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<PurchaseOrder> syncByContract(Contract contract, MessageHolder holder) {
public List<PurchaseOrder> syncByContract(ContractVo contract, MessageHolder holder) {
PurchaseOrdersService ordersService = getPurchaseOrdersService();
PurchaseOrderItemService itemService = getPurchaseOrderItemService();
List<PurchaseOrder> orders = ordersService.findAll((root, q, cb) -> {
return cb.equal(root.get("contract"), contract);
}, Sort.unsorted());
List<PurchaseOrder> orders = ordersService.findAllByContract(contract);
holder.debug("查找到 " + orders.size() + " 条采购订单记录在数据库中");
Map<Integer, PurchaseOrder> ordersMap = orders.stream()
.collect(Collectors.toMap(PurchaseOrder::getRefId, item -> item));
List<PurchaseOrderItem> items = itemService.findAll((root, q, cb) -> {
return cb.equal(root.get("order").get("contract"), contract);
}, Sort.unsorted());
// 按 order 分组
Map<PurchaseOrder, Map<Integer, PurchaseOrderItem>> itemMap = items.stream()
.collect(Collectors.groupingBy(PurchaseOrderItem::getOrder,
Collectors.toMap(PurchaseOrderItem::getRefId, item -> item)));
Map<PurchaseOrder, Map<Integer, PurchaseOrderItem>> itemMap = orders.stream()
.collect(Collectors.toMap(Function.identity(), order -> itemService.findAllByOrder(order).stream().collect(
Collectors.toMap(PurchaseOrderItem::getRefId, item -> item)
))
);
// 查询 U8 数据库
List<Map<String, Object>> 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<String, Object> 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<Inventory> getter, Consumer<Inventory> setter, String inventoryCode,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
return getInventoryCtx().syncInventoryDetailByCode(getter, setter, inventoryCode, holder, topic);
}
}

View File

@@ -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<SalesOrder> syncByContract(Contract contract, MessageHolder holder) {
public List<SalesOrder> syncByContract(ContractVo contract, MessageHolder holder) {
SaleOrdersService saleOrdersService = getSaleOrdersService();
SalesOrderItemService orderItemService = getOrderItemService();
List<SalesOrder> orders = saleOrdersService.findAll((root, q, cb) -> {
return cb.equal(root.get("contract"), contract);
}, Sort.unsorted());
List<SalesOrder> orders = saleOrdersService.findAllByContract(contract);
holder.debug("查找到 " + orders.size() + " 条销售订单记录在数据库中");
Map<String, SalesOrder> ordersMap = orders.stream().collect(Collectors.toMap(SalesOrder::getCode, item -> item));
List<SalesOrderItem> items = orderItemService.findAll((root, q, cb) -> {
return cb.equal(root.get("order").get("contract"), contract);
}, Sort.unsorted());
// 按 order 分组
Map<SalesOrder, Map<String, SalesOrderItem>> itemMap = items.stream().collect(Collectors.groupingBy(SalesOrderItem::getOrder,
Collectors.toMap(SalesOrderItem::getCode, item -> item)));
Map<SalesOrder, Map<String, SalesOrderItem>> itemMap = orders.stream()
.collect(
Collectors.toMap(Function.identity(), order -> orderItemService.findAllBySaleOrder(order).stream().collect(
Collectors.toMap(SalesOrderItem::getCode, item -> item)
))
);
// 查询 U8 数据库
List<Map<String, Object>> 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);

View File

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