From 42a8f9ab3097d5a15aa26eefe76fd59229f94565 Mon Sep 17 00:00:00 2001 From: songqq Date: Fri, 26 Sep 2025 12:31:08 +0800 Subject: [PATCH] =?UTF-8?q?refactor(service):=20=E5=AE=9E=E7=8E=B0VoableSe?= =?UTF-8?q?rvice=E6=8E=A5=E5=8F=A3=E4=BB=A5=E7=BB=9F=E4=B8=80VO=E4=B8=8E?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E6=98=A0=E5=B0=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactor(model): 重构实体类与VO类的字段映射关系 style: 调整代码格式与注释 fix: 修复部分字段映射错误 --- .../tab/ContractTabSkinVendorBid.java | 1 + .../contract/vm/PurchaseOrderViewModel.java | 44 +- .../contract/vm/SalesOrderItemViewModel.java | 6 +- .../contract/model/ContractFileTypeLocal.java | 1 + .../contract/model/ProjectFileTypeLocal.java | 1 - .../ecep/contract/model/ProjectQuotation.java | 9 +- .../ecep/contract/model/ProjectSaleType.java | 2 +- .../ecep/contract/model/PurchaseOrder.java | 32 +- .../ecep/contract/model/SalesOrderItem.java | 5 +- .../ecep/contract/vo/CompanyContactVo.java | 8 +- .../com/ecep/contract/vo/ContractGroupVo.java | 4 +- .../ecep/contract/vo/ProjectSaleTypeVo.java | 1 + .../com/ecep/contract/vo/PurchaseOrderVo.java | 26 +- .../ecep/contract/vo/SalesOrderItemVo.java | 13 +- .../voable_service_implementation_analysis.md | 414 +++++++++++------- .../java/com/ecep/contract/EntityService.java | 18 +- .../contract/cloud/rk/CloudRkService.java | 69 ++- .../contract/cloud/tyc/CloudTycService.java | 37 +- .../contract/cloud/u8/YongYouU8Service.java | 56 ++- .../ecep/contract/config/JacksonConfig.java | 29 +- .../service/CompanyBankAccountService.java | 39 +- .../service/CompanyContactService.java | 40 +- .../company/service/CompanyFileService.java | 109 +++-- .../ds/company/service/InvoiceService.java | 16 +- .../service/ContractBidVendorService.java | 30 +- .../service/ContractCatalogService.java | 17 +- .../contract/service/ContractFileService.java | 21 +- .../service/ContractFileTypeService.java | 27 +- .../service/ContractGroupService.java | 15 +- .../contract/service/ContractItemService.java | 53 ++- .../contract/service/ContractKindService.java | 16 +- .../service/ContractPayPlanService.java | 28 +- .../ds/contract/service/ContractService.java | 80 +++- .../contract/service/ContractTypeService.java | 21 +- .../service/ExtendVendorInfoService.java | 52 ++- .../service/PurchaseBillVoucherService.java | 55 ++- .../service/PurchaseOrderItemService.java | 38 +- .../service/PurchaseOrdersService.java | 65 ++- .../contract/service/SaleOrdersService.java | 68 ++- .../service/SalesBillVoucherService.java | 103 +++-- .../service/SalesOrderItemService.java | 70 ++- ...panyCustomerEvaluationFormFileService.java | 36 +- .../service/CompanyCustomerFileService.java | 32 +- .../CompanyCustomerFileTypeService.java | 45 +- .../service/CustomerCatalogService.java | 20 +- .../service/CustomerFileTypeService.java | 22 +- .../service/EmployeeAuthBindService.java | 33 +- .../service/EmployeeLoginHistoryService.java | 30 +- .../service/DeliverySignMethodService.java | 36 +- .../ds/project/service/ProjectBidService.java | 65 ++- .../service/ProjectCostItemService.java | 72 ++- .../project/service/ProjectCostService.java | 104 ++++- .../project/service/ProjectFileService.java | 32 +- .../service/ProjectFileTypeService.java | 34 +- .../service/ProjectQuotationService.java | 66 ++- ...ProjectSaleTypeRequireFileTypeService.java | 37 +- .../service/ProjectSaleTypeService.java | 20 +- .../service/VendorApprovedFileService.java | 42 +- .../service/VendorApprovedItemService.java | 68 ++- .../vendor/service/VendorApprovedService.java | 60 ++- .../vendor/service/VendorCatalogService.java | 21 +- .../vendor/service/VendorEntityService.java | 69 ++- .../ds/vendor/service/VendorFileService.java | 52 ++- .../vendor/service/VendorFileTypeService.java | 34 +- .../VendorGroupRequireFileTypeService.java | 59 ++- .../ds/vendor/service/VendorGroupService.java | 39 +- .../ds/vendor/service/VendorTypeService.java | 20 +- 67 files changed, 2277 insertions(+), 610 deletions(-) diff --git a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinVendorBid.java b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinVendorBid.java index 641a9a4..a2a1cb5 100644 --- a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinVendorBid.java +++ b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinVendorBid.java @@ -95,6 +95,7 @@ public class ContractTabSkinVendorBid showInOwner(VendorBidWindowController.class, item); } + @SuppressWarnings("unchecked") public void onBidVendorTableCreateAction(ActionEvent event) { ContractVo contract = getParent(); diff --git a/client/src/main/java/com/ecep/contract/vm/PurchaseOrderViewModel.java b/client/src/main/java/com/ecep/contract/vm/PurchaseOrderViewModel.java index cf19543..2befa78 100644 --- a/client/src/main/java/com/ecep/contract/vm/PurchaseOrderViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/PurchaseOrderViewModel.java @@ -20,8 +20,6 @@ public class PurchaseOrderViewModel extends IdentityViewModel { SimpleIntegerProperty refId = new SimpleIntegerProperty(); SimpleObjectProperty contractId = new SimpleObjectProperty<>(); SimpleStringProperty code = new SimpleStringProperty(); - SimpleStringProperty name = new SimpleStringProperty(); - SimpleObjectProperty vendorId = new SimpleObjectProperty<>(); SimpleObjectProperty orderDate = new SimpleObjectProperty<>(); SimpleDoubleProperty totalAmount = new SimpleDoubleProperty(); SimpleDoubleProperty taxAmount = new SimpleDoubleProperty(); @@ -48,20 +46,10 @@ public class PurchaseOrderViewModel extends IdentityViewModel { getContractId().set(v.getContractId()); } getCode().set(v.getCode()); - getName().set(v.getName()); - if (v.getVendorId() != null) { - getVendorId().set(v.getVendorId()); - } - getOrderDate().set(v.getOrderDate()); getTotalAmount().set(v.getTotalAmount() != null ? v.getTotalAmount() : 0.0); getTaxAmount().set(v.getTaxAmount() != null ? v.getTaxAmount() : 0.0); getTaxRate().set(v.getTaxRate() != null ? v.getTaxRate() : 0.0); - if (v.getStatusId() != null) { - getStatusId().set(v.getStatusId()); - } - getRemark().set(v.getRemark()); - getActive().set(v.getActive() != null ? v.getActive() : false); - + // 保留原有的员工相关字段设置 if (getEmployee() != null && getEmployee().get() != null) { getEmployee().set(getEmployee().get()); @@ -107,18 +95,6 @@ public class PurchaseOrderViewModel extends IdentityViewModel { v.setCode(code.get()); modified = true; } - if (!Objects.equals(name.get(), v.getName())) { - v.setName(name.get()); - modified = true; - } - if (!Objects.equals(vendorId.get(), v.getVendorId())) { - v.setVendorId(vendorId.get()); - modified = true; - } - if (!Objects.equals(orderDate.get(), v.getOrderDate())) { - v.setOrderDate(orderDate.get()); - modified = true; - } if (!Objects.equals(totalAmount.get(), v.getTotalAmount())) { v.setTotalAmount(totalAmount.get()); modified = true; @@ -131,21 +107,13 @@ public class PurchaseOrderViewModel extends IdentityViewModel { v.setTaxRate(taxRate.get()); modified = true; } - if (!Objects.equals(statusId.get(), v.getStatusId())) { - v.setStatusId(statusId.get()); + if (!Objects.equals(taxRate.get(), v.getTaxRate())) { + v.setTaxRate(taxRate.get()); modified = true; } - if (!Objects.equals(remark.get(), v.getRemark())) { - v.setRemark(remark.get()); - modified = true; - } - if (!Objects.equals(active.get(), v.getActive())) { - v.setActive(active.get()); - modified = true; - } - // 保留原有的员工相关字段复制 - if (!Objects.equals(description.get(), v.getRemark())) { - v.setRemark(description.get()); + + if (!Objects.equals(description.get(), v.getDescription())) { + v.setDescription(description.get()); modified = true; } return modified; diff --git a/client/src/main/java/com/ecep/contract/vm/SalesOrderItemViewModel.java b/client/src/main/java/com/ecep/contract/vm/SalesOrderItemViewModel.java index 3e87695..7497a81 100644 --- a/client/src/main/java/com/ecep/contract/vm/SalesOrderItemViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/SalesOrderItemViewModel.java @@ -32,7 +32,7 @@ public class SalesOrderItemViewModel extends IdentityViewModel @Override protected void updateFrom(SalesOrderItemVo v) { super.updateFrom(v); - getOrder().set(v.getSalesOrderId()); + getOrder().set(v.getOrderId()); getCode().set(v.getCode()); getName().set(v.getName()); getQuantity().set(v.getQuantity()); @@ -47,8 +47,8 @@ public class SalesOrderItemViewModel extends IdentityViewModel @Override public boolean copyTo(SalesOrderItemVo v) { boolean modified = super.copyTo(v); - if (!Objects.equals(order.get(), v.getSalesOrderId())) { - v.setSalesOrderId(order.get()); + if (!Objects.equals(order.get(), v.getOrderId())) { + v.setOrderId(order.get()); modified = true; } if (!Objects.equals(code.get(), v.getCode())) { diff --git a/common/src/main/java/com/ecep/contract/model/ContractFileTypeLocal.java b/common/src/main/java/com/ecep/contract/model/ContractFileTypeLocal.java index ad8dd07..9ec262c 100644 --- a/common/src/main/java/com/ecep/contract/model/ContractFileTypeLocal.java +++ b/common/src/main/java/com/ecep/contract/model/ContractFileTypeLocal.java @@ -57,6 +57,7 @@ public class ContractFileTypeLocal extends BaseEnumEntity impl vo.setId(getId()); vo.setLang(getLang()); vo.setType(getType()); + vo.setValue(getValue()); vo.setDescription(getDescription()); vo.setSuggestFileName(suggestFileName); return vo; diff --git a/common/src/main/java/com/ecep/contract/model/ProjectFileTypeLocal.java b/common/src/main/java/com/ecep/contract/model/ProjectFileTypeLocal.java index de7d310..96c39d4 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectFileTypeLocal.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectFileTypeLocal.java @@ -1,6 +1,5 @@ package com.ecep.contract.model; -import java.io.Serializable; import java.util.Objects; import com.ecep.contract.ProjectFileType; diff --git a/common/src/main/java/com/ecep/contract/model/ProjectQuotation.java b/common/src/main/java/com/ecep/contract/model/ProjectQuotation.java index 2788ba7..cffb3ed 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectQuotation.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectQuotation.java @@ -7,7 +7,6 @@ import org.hibernate.annotations.ColumnDefault; import com.ecep.contract.util.HibernateProxyUtils; import com.ecep.contract.vo.ProjectQuotationVo; -import com.ecep.contract.model.Voable; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -32,7 +31,8 @@ import lombok.ToString; @Entity @Table(name = "PROJECT_QUOTATION") @ToString -public class ProjectQuotation implements IdentityEntity, ProjectBasedEntity, java.io.Serializable, Voable { +public class ProjectQuotation + implements IdentityEntity, ProjectBasedEntity, java.io.Serializable, Voable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -47,7 +47,6 @@ public class ProjectQuotation implements IdentityEntity, ProjectBasedEntity, jav @ToString.Exclude private Project project; - /** * 客户资信等级 */ @@ -116,7 +115,7 @@ public class ProjectQuotation implements IdentityEntity, ProjectBasedEntity, jav @Override public boolean equals(Object object) { - if (this == object) { + if (this == object) { return true; } if (object == null) { @@ -154,10 +153,10 @@ public class ProjectQuotation implements IdentityEntity, ProjectBasedEntity, jav } vo.setAuthorizationTime(authorizationTime); vo.setAuthorizationFile(authorizationFile); - vo.setDescription(description); if (evaluationFile != null) { vo.setEvaluationFileId(evaluationFile.getId()); } + vo.setDescription(description); // active字段默认为false,在ProjectQuotationVo类中已经设置 return vo; } diff --git a/common/src/main/java/com/ecep/contract/model/ProjectSaleType.java b/common/src/main/java/com/ecep/contract/model/ProjectSaleType.java index fa627ba..c2a9966 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectSaleType.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectSaleType.java @@ -53,7 +53,7 @@ public class ProjectSaleType implements IdentityEntity, NamedEntity, BasedEntity * 符合重大项目的合同金额条件 */ @Column(name = "CRITICAL_PROJECT_LIMIT") - private double criticalProjectLimit; + private Double criticalProjectLimit; @Column(name = "IS_ACTIVE") private boolean active; diff --git a/common/src/main/java/com/ecep/contract/model/PurchaseOrder.java b/common/src/main/java/com/ecep/contract/model/PurchaseOrder.java index 1873888..f4b86f7 100644 --- a/common/src/main/java/com/ecep/contract/model/PurchaseOrder.java +++ b/common/src/main/java/com/ecep/contract/model/PurchaseOrder.java @@ -28,7 +28,8 @@ import lombok.ToString; @Entity @Table(name = "PURCHASE_ORDER", schema = "supplier_ms") @ToString -public class PurchaseOrder implements IdentityEntity, BasedEntity, ContractBasedEntity, java.io.Serializable, Voable { +public class PurchaseOrder + implements IdentityEntity, BasedEntity, ContractBasedEntity, java.io.Serializable, Voable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -126,17 +127,26 @@ public class PurchaseOrder implements IdentityEntity, BasedEntity, ContractBased vo.setContractId(contract.getId()); } vo.setCode(code); - // PurchaseOrder中没有name字段,这里可以设置为code - vo.setName(code); - // PurchaseOrder中没有vendorId字段,只有vendorCode - // vo.setVendorId(); - // PurchaseOrder中没有orderDate字段,这里可以设置为makerDate - if (makerDate != null) { - vo.setOrderDate(makerDate.toLocalDate()); + vo.setRefId(refId); + vo.setVendorCode(vendorCode); + vo.setDescription(description); + vo.setMakerDate(makerDate); + vo.setModifyDate(modifyDate); + vo.setVerifierDate(verifierDate); + vo.setCloserDate(closerDate); + + if (employee != null) { + vo.setEmployeeId(employee.getId()); + } + if (maker != null) { + vo.setMakerId(maker.getId()); + } + if (verifier != null) { + vo.setVerifierId(verifier.getId()); + } + if (closer != null) { + vo.setCloserId(closer.getId()); } - // PurchaseOrder中没有totalAmount、taxAmount、taxRate和statusId字段,暂时不设置 - vo.setRemark(description); - // active字段默认为false,在PurchaseOrderVo类中已经设置 return vo; } } diff --git a/common/src/main/java/com/ecep/contract/model/SalesOrderItem.java b/common/src/main/java/com/ecep/contract/model/SalesOrderItem.java index 9eaaffb..1c1e55c 100644 --- a/common/src/main/java/com/ecep/contract/model/SalesOrderItem.java +++ b/common/src/main/java/com/ecep/contract/model/SalesOrderItem.java @@ -107,15 +107,16 @@ public class SalesOrderItem implements IdentityEntity, BasedEntity, Serializable vo.setCode(code); vo.setName(name); if (order != null) { - vo.setSalesOrderId(order.getId()); + vo.setOrderId(order.getId()); } - vo.setItemName(name); vo.setQuantity(quantity); vo.setPrice(price); vo.setTaxRate(taxRate); vo.setExclusiveTaxPrice(exclusiveTaxPrice); + vo.setStartDate(startDate); vo.setEndDate(endDate); + vo.setDescription(description); return vo; } diff --git a/common/src/main/java/com/ecep/contract/vo/CompanyContactVo.java b/common/src/main/java/com/ecep/contract/vo/CompanyContactVo.java index fd10c6c..0eb2730 100644 --- a/common/src/main/java/com/ecep/contract/vo/CompanyContactVo.java +++ b/common/src/main/java/com/ecep/contract/vo/CompanyContactVo.java @@ -17,8 +17,10 @@ public class CompanyContactVo implements IdentityEntity, NamedEntity, CompanyBas private String u8Code; private String memo; private LocalDate created; - private boolean primary = false; - private String description; - private boolean active = false; + private int version; + + // 备用扩展 + private boolean primary = false; + private boolean active = false; } \ No newline at end of file diff --git a/common/src/main/java/com/ecep/contract/vo/ContractGroupVo.java b/common/src/main/java/com/ecep/contract/vo/ContractGroupVo.java index ec05150..f7ebba4 100644 --- a/common/src/main/java/com/ecep/contract/vo/ContractGroupVo.java +++ b/common/src/main/java/com/ecep/contract/vo/ContractGroupVo.java @@ -10,8 +10,8 @@ public class ContractGroupVo implements IdentityEntity, NamedEntity { private String name; private String code; private String title; - private Integer parentId; - private Integer order; + + // 以下field在ContractGroup实体中不存在,待后期扩展用途 private String description; private boolean active = false; } \ No newline at end of file diff --git a/common/src/main/java/com/ecep/contract/vo/ProjectSaleTypeVo.java b/common/src/main/java/com/ecep/contract/vo/ProjectSaleTypeVo.java index 76bbb13..70be45c 100644 --- a/common/src/main/java/com/ecep/contract/vo/ProjectSaleTypeVo.java +++ b/common/src/main/java/com/ecep/contract/vo/ProjectSaleTypeVo.java @@ -16,6 +16,7 @@ public class ProjectSaleTypeVo implements IdentityEntity, NamedEntity { private Double criticalProjectLimit; private boolean active = false; private String description; + private LocalDate created; private int version; } \ No newline at end of file diff --git a/common/src/main/java/com/ecep/contract/vo/PurchaseOrderVo.java b/common/src/main/java/com/ecep/contract/vo/PurchaseOrderVo.java index 42720de..caca049 100644 --- a/common/src/main/java/com/ecep/contract/vo/PurchaseOrderVo.java +++ b/common/src/main/java/com/ecep/contract/vo/PurchaseOrderVo.java @@ -1,21 +1,33 @@ package com.ecep.contract.vo; +import java.time.LocalDateTime; + import com.ecep.contract.model.IdentityEntity; -import java.time.LocalDate; + import lombok.Data; @Data public class PurchaseOrderVo implements IdentityEntity, ContractBasedVo { private Integer id; private Integer contractId; + private Integer refId; private String code; - private String name; - private Integer vendorId; - private LocalDate orderDate; + private String vendorCode; + + private Integer employeeId; + private Integer makerId; + private LocalDateTime makerDate; + private LocalDateTime modifyDate; + + private Integer verifierId; + private LocalDateTime verifierDate; + + private Integer closerId; + private LocalDateTime closerDate; + private Double totalAmount; private Double taxAmount; private Double taxRate; - private Integer statusId; - private String remark; - private Boolean active = false; + + private String description; } \ No newline at end of file diff --git a/common/src/main/java/com/ecep/contract/vo/SalesOrderItemVo.java b/common/src/main/java/com/ecep/contract/vo/SalesOrderItemVo.java index a7fc8ec..7fba8aa 100644 --- a/common/src/main/java/com/ecep/contract/vo/SalesOrderItemVo.java +++ b/common/src/main/java/com/ecep/contract/vo/SalesOrderItemVo.java @@ -8,15 +8,11 @@ import java.time.LocalDate; @Data public class SalesOrderItemVo implements IdentityEntity { private Integer id; - private Integer salesOrderId; + private Integer orderId; private String code; private String name; - private Integer contractItemId; - private Integer inventoryId; - private String itemName; - private Integer unitId; - + // private double quantity; private double price; private double taxRate; @@ -26,4 +22,9 @@ public class SalesOrderItemVo implements IdentityEntity { private LocalDate endDate; private String description; + + // 备用扩展 + private Integer contractItemId; + private Integer inventoryId; + private Integer unitId; } \ No newline at end of file diff --git a/docs/task/voable_service_implementation_analysis.md b/docs/task/voable_service_implementation_analysis.md index b9634c1..0f25a38 100644 --- a/docs/task/voable_service_implementation_analysis.md +++ b/docs/task/voable_service_implementation_analysis.md @@ -2,13 +2,18 @@ ## 概述 -本报告分析了`d:\idea-workspace\Contract-Manager\server\src\main\java\com\ecep\contract\ds`目录下,所有实现了[`IEntityService`](/server/src/main/java/com/ecep/contract/IEntityService.java)接口的Service实现,检查它们是否符合[`create_vo.md`](/docs/task/create_vo.md)文档中关于Server模块Service需要继承[`VoableService`](/server/src/main/java/com/ecep/contract/service/VoableService.java)接口的要求。 +本报告分析了[Server](/server/src/main/java/com/ecep/contract/)模块下,所有实现了[`IEntityService`](/server/src/main/java/com/ecep/contract/IEntityService.java)接口的Service是否都继承实现了[`com.ecep.contract.service.VoableService`](/server/src/main/java/com/ecep/contract/service/VoableService.java),包括接口的继承和接口方法的实现,并确认其是否符合[`create_vo.md`](/docs/task/create_vo.md)的要求。 + +## 范围 +- Server 模块中实现了`IEntityService`接口的Service类 +- 实体类和Vo类定义在 Common 模块 +- 参考 [`create_vo.md`](/docs/task/create_vo.md) 文档规范 ## 需要实现VoableService接口的Service列表 -通过分析,以下是server模块下所有实现了[`IEntityService`](/server/src/main/java/com/ecep/contract/IEntityService.java)接口的73个Service类: +通过分析,server模块下共有73个实现了[`IEntityService`](/server/src/main/java/com/ecep/contract/IEntityService.java)接口的Service类,按模块分类如下: -### contract模块Service +### contract模块Service(18个) 1. [`ContractService`](/server/src/main/java/com/ecep/contract/ds/contract/service/ContractService.java) - 合同服务 2. [`ContractGroupService`](/server/src/main/java/com/ecep/contract/ds/contract/service/ContractGroupService.java) - 合同组服务 @@ -29,7 +34,7 @@ 17. [`ContractFileTypeService`](/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java) - 合同文件类型服务 18. [`PurchaseBillVoucherItemService`](/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherItemService.java) - 采购发票凭证项服务 -### company模块Service +### company模块Service(8个) 19. [`InvoiceService`](/server/src/main/java/com/ecep/contract/ds/company/service/InvoiceService.java) - 发票服务 20. [`CompanyFileTypeService`](/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileTypeService.java) - 公司文件类型服务 @@ -40,7 +45,7 @@ 25. [`CompanyFileService`](/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileService.java) - 公司文件服务 26. [`CompanyService`](/server/src/main/java/com/ecep/contract/ds/company/service/CompanyService.java) - 公司服务 -### customer模块Service +### customer模块Service(7个) 27. [`CompanyCustomerFileTypeService`](/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileTypeService.java) - 公司客户文件类型服务 28. [`CustomerFileTypeService`](/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java) - 客户文件类型服务 @@ -50,7 +55,7 @@ 32. [`CompanyCustomerService`](/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerService.java) - 公司客户服务 33. [`CompanyCustomerFileService`](/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileService.java) - 公司客户文件服务 -### project模块Service +### project模块Service(16个) 34. [`ProjectCostService`](/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostService.java) - 项目成本服务 35. [`ProjectService`](/server/src/main/java/com/ecep/contract/ds/project/service/ProjectService.java) - 项目服务 @@ -69,7 +74,7 @@ 48. [`ProjectSaleTypeRequireFileTypeService`](/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java) - 项目销售类型要求文件类型服务 49. [`ProjectFileService`](/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileService.java) - 项目文件服务 -### vendor模块Service +### vendor模块Service(11个) 50. [`VendorTypeService`](/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorTypeService.java) - 供应商类型服务 51. [`VendorService`](/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorService.java) - 供应商服务 @@ -83,7 +88,7 @@ 59. [`VendorCatalogService`](/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorCatalogService.java) - 供应商目录服务 60. [`VendorFileService`](/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileService.java) - 供应商文件服务 -### other模块Service +### other模块Service(10个) 61. [`EmployeeLoginHistoryService`](/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeLoginHistoryService.java) - 员工登录历史服务 62. [`EmployeeService`](/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeService.java) - 员工服务 @@ -96,7 +101,7 @@ 69. [`InventoryService`](/server/src/main/java/com/ecep/contract/ds/other/service/InventoryService.java) - 库存服务 70. [`PermissionService`](/server/src/main/java/com/ecep/contract/ds/other/service/PermissionService.java) - 权限服务 -### cloud模块Service +### cloud模块Service(3个) 71. [`YongYouU8Service`](/server/src/main/java/com/ecep/contract/cloud/u8/YongYouU8Service.java) - 用友U8服务 72. [`CloudTycService`](/server/src/main/java/com/ecep/contract/cloud/tyc/CloudTycService.java) - 云天眼查服务 @@ -234,6 +239,84 @@ - ✅ 方法实现了将InventoryHistoryPriceVo的inventoryId、price、changeDate等属性映射到InventoryHistoryPrice实体 - ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.InventoryHistoryPriceVo`包 +#### SalesBillVoucherService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(SalesBillVoucher model, SalesBillVoucherVo vo)`方法 +- ✅ 方法实现了将SalesBillVoucherVo的refId、code、makerDate、modifyDate、verifierDate、description等属性映射到SalesBillVoucher实体 +- ✅ 已正确处理company、order、employee、maker、verifier等关联实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.SalesBillVoucherVo`包 + +#### ExtendVendorInfoService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ExtendVendorInfo info, ExtendVendorInfoVo vo)`方法 +- ✅ 方法实现了将ExtendVendorInfoVo的codeSequenceNumber、assignedProvider、prePurchase等属性映射到ExtendVendorInfo实体 +- ✅ 已正确处理contract、group等关联实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ExtendVendorInfoVo`包 + +#### ContractItemService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ContractItem item, ContractItemVo vo)`方法 +- ✅ 方法实现了将ContractItemVo的基本属性映射到ContractItem实体 +- ✅ 已正确处理contract、inventory、creator、updater等关联实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ContractItemVo`包 + +#### ContractTypeService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ContractType type, ContractTypeVo vo)`方法 +- ✅ 方法实现了将ContractTypeVo的name、code、catalog、title、direction等属性映射到ContractType实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ContractTypeVo`包 + +#### ContractFileTypeService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ContractFileTypeLocal model, ContractFileTypeLocalVo vo)`方法 +- ✅ 方法实现了将ContractFileTypeLocalVo的id、lang、type、value、description、suggestFileName等属性映射到ContractFileTypeLocal实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ContractFileTypeLocalVo`包 + +#### SaleOrdersService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(SalesOrder model, SalesOrderVo vo)`方法 +- ✅ 方法实现了将SalesOrderVo的code、makerDate、verifierDate、description等属性映射到SalesOrder实体 +- ✅ 已正确处理contract、employee、maker、verifier等关联实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.SalesOrderVo`包 + +#### ContractKindService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ContractKind model, ContractKindVo vo)`方法 +- ✅ 方法实现了将ContractKindVo的name、code、title等属性映射到ContractKind实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ContractKindVo`包 + +#### ContractBidVendorService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ContractBidVendor model, ContractBidVendorVo vo)`方法 +- ✅ 已正确处理contract、company、quotationSheet等关联实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ContractBidVendorVo`包 + +#### ContractPayPlanService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ContractPayPlan model, ContractPayPlanVo vo)`方法 +- ✅ 方法实现了将ContractPayPlanVo的refId、payRatio、payCurrency、payDate、payTerm等属性映射到ContractPayPlan实体 +- ✅ 已正确处理contract关联实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ContractPayPlanVo`包 + +#### PurchaseBillVoucherService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(PurchaseBillVoucher voucher, PurchaseBillVoucherVo vo)`方法 +- ✅ 方法实现了将PurchaseBillVoucherVo的id、refId、code、companyId、invoiceId、employeeId、makerId、makerDate、modifyDate、verifierId、verifierDate、description等属性映射到PurchaseBillVoucher实体 +- ✅ 已正确处理company、invoice、employee、maker、verifier等关联实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.PurchaseBillVoucherVo`包 + +#### PurchaseOrderItemService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(PurchaseOrderItem item, PurchaseOrderItemVo vo)`方法 +- ✅ 方法实现了将PurchaseOrderItemVo的id、code、name、quantity、price等属性映射到PurchaseOrderItem实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.PurchaseOrderItemVo`包 + +#### SalesOrderItemService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(SalesOrderItem item, SalesOrderItemVo vo)`方法 +- ✅ 方法实现了将SalesOrderItemVo的id、code、name、quantity、price等属性映射到SalesOrderItem实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.SalesOrderItemVo`包 + #### CompanyBlackReasonService - ✅ 已实现`VoableService`接口 - ✅ 已实现`updateByVo(CompanyBlackReason reason, CompanyBlackReasonVo vo)`方法 @@ -243,7 +326,8 @@ #### CompanyCustomerEntityService - ✅ 已实现`VoableService`接口 - ✅ 已实现`updateByVo(CompanyCustomerEntity entity, CompanyCustomerEntityVo vo)`方法 -- ✅ 方法实现了将CompanyCustomerEntityVo的companyCustomerId、entityType、entityId等属性映射到CompanyCustomerEntity实体 +- ✅ 方法实现了将CompanyCustomerEntityVo的name、abbName、code等基本属性映射到CompanyCustomerEntity实体 +- ✅ 已正确处理customer、catalog、creator、modifier等关联实体 - ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.CompanyCustomerEntityVo`包 #### CompanyFileTypeService @@ -264,225 +348,260 @@ - ✅ 方法实现了将PurchaseBillVoucherItemVo的id、refId、quantity、price等属性映射到PurchaseBillVoucherItem实体 - ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.PurchaseBillVoucherItemVo`包 -### 尚未实现VoableService接口的Service列表 +#### ContractFileService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ContractFile file, ContractFileVo vo)`方法 +- ✅ 方法实现了将ContractFileVo的id、contractId、type、fileName、applyDate、description等属性映射到ContractFile实体 +- ✅ 已正确处理contract关联实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ContractFileVo`包 -经过重新检查,以下48个Service尚未实现`VoableService`接口: +#### ContractCatalogService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ContractCatalog catalog, ContractCatalogVo vo)`方法 +- ✅ 方法实现了将ContractCatalogVo的id、code、name、path、parent、useYear等属性映射到ContractCatalog实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ContractCatalogVo`包 -### contract模块(11个) -1. **ContractGroupService** - 合同组服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ContractGroup group, ContractGroupVo vo)`方法 +#### ContractGroupService +- ✅ 已实现`VoableService`接口 +- ✅ 已实现`updateByVo(ContractGroup group, ContractGroupVo vo)`方法 +- ✅ 方法实现了将ContractGroupVo的id、name、code、title等属性映射到ContractGroup实体 +- ✅ 已正确导入`com.ecep.contract.service.VoableService`和`com.ecep.contract.vo.ContractGroupVo`包 -2. **ContractFileService** - 合同文件服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ContractFile file, ContractFileVo vo)`方法 +### VoableService接口实现状态分析 -3. **SalesBillVoucherService** - 销售票据凭证服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(SalesBillVoucher voucher, SalesBillVoucherVo vo)`方法 +经过重新检查,contract、company、customer、project、vendor和other模块的所有Service已实现`VoableService`接口,仅cloud模块的3个Service尚未实现,具体参考后续各模块的实现状态分析 -4. **ContractCatalogService** - 合同目录服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ContractCatalog catalog, ContractCatalogVo vo)`方法 +### contract模块(0个未实现) +> 所有contract模块Service已实现VoableService接口 -5. **PurchaseOrderItemService** - 采购订单项服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(PurchaseOrderItem item, PurchaseOrderItemVo vo)`方法 +### contract模块已实现的Service +1. **PurchaseOrdersService** - 采购订单服务 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(PurchaseOrder order, PurchaseOrderVo vo)`方法 -6. **PurchaseBillVoucherService** - 采购票据凭证服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(PurchaseBillVoucher voucher, PurchaseBillVoucherVo vo)`方法 - -7. **ExtendVendorInfoService** - 扩展供应商信息服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ExtendVendorInfo info, ExtendVendorInfoVo vo)`方法 - -8. **SalesOrderItemService** - 销售订单项服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(SalesOrderItem item, SalesOrderItemVo vo)`方法 - -9. **ContractItemService** - 合同项目服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ContractItem item, ContractItemVo vo)`方法 - -10. **ContractTypeService** - 合同类型服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ContractType type, ContractTypeVo vo)`方法 - -11. **PurchaseOrdersService** - 采购订单服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(PurchaseOrders orders, PurchaseOrdersVo vo)`方法 - -12. **ContractFileTypeService** - 合同文件类型服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ContractFileType fileType, ContractFileTypeVo vo)`方法 - -13. **SaleOrdersService** - 销售订单服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(SaleOrders orders, SaleOrdersVo vo)`方法 - -14. **ContractKindService** - 合同种类服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ContractKind kind, ContractKindVo vo)`方法 - -15. **ContractBidVendorService** - 合同投标供应商服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ContractBidVendor vendor, ContractBidVendorVo vo)`方法 - -16. **ContractPayPlanService** - 合同付款计划服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ContractPayPlan plan, ContractPayPlanVo vo)`方法 - -### company模块(8个) +### company模块 (0个未实现) 1. **InvoiceService** - 发票服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(Invoice invoice, InvoiceVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(Invoice invoice, InvoiceVo vo)`方法 + - 实体类`Invoice`已实现`Voable`接口 + - VO类`InvoiceVo`已创建 2. **CompanyContactService** - 公司联系人服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(CompanyContact contact, CompanyContactVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(CompanyContact contact, CompanyContactVo vo)`方法 + - 实体类`CompanyContact`已实现`Voable`接口 + - VO类`CompanyContactVo`已创建 3. **CompanyBankAccountService** - 公司银行账户服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(CompanyBankAccount account, CompanyBankAccountVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(CompanyBankAccount account, CompanyBankAccountVo vo)`方法 + - 实体类`CompanyBankAccount`已实现`Voable`接口 + - VO类`CompanyBankAccountVo`已创建 4. **CompanyFileService** - 公司文件服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(CompanyFile file, CompanyFileVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(CompanyFile file, CompanyFileVo vo)`方法 + - 实体类`CompanyFile`已实现`Voable`接口 + - VO类`CompanyFileVo`已创建 -### customer模块(5个) +### customer模块(0个未实现) 1. **CompanyCustomerFileTypeService** - 公司客户文件类型服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(CompanyCustomerFileType fileType, CompanyCustomerFileTypeVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(CompanyCustomerFileTypeLocal fileType, CompanyCustomerFileTypeLocalVo vo)`方法 + - 客户端已实现`QueryService` + - 实现细节:映射了type、lang、value等基本属性 2. **CustomerFileTypeService** - 客户文件类型服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(CustomerFileType fileType, CustomerFileTypeVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(CustomerFileTypeLocal fileType, CustomerFileTypeLocalVo vo)`方法 + - 实现细节:映射了type、lang、value等基本属性 3. **CustomerCatalogService** - 客户目录服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(CustomerCatalog catalog, CustomerCatalogVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(CustomerCatalog catalog, CustomerCatalogVo vo)`方法 + - VO类`CustomerCatalogVo`已创建(标记为已更新) + - 实现细节:映射了code、name、description等基本属性 4. **CompanyCustomerEvaluationFormFileService** - 公司客户评估表单文件服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(CompanyCustomerEvaluationFormFile file, CompanyCustomerEvaluationFormFileVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(CompanyCustomerEvaluationFormFile file, CompanyCustomerEvaluationFormFileVo vo)`方法 + - 实现细节:映射了catalog、level、creditLevel、score1-5、scoreTemplateVersion等基本属性,以及通过SpringApp.getBean获取CompanyCustomerFileService处理customerFile关联实体 + - 实体类`CompanyCustomerEvaluationFormFile`已实现`Voable`接口 + - 客户端已实现`QueryService` 5. **CompanyCustomerFileService** - 公司客户文件服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(CompanyCustomerFile file, CompanyCustomerFileVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(CompanyCustomerFile file, CompanyCustomerFileVo vo)`方法 + - 方法实现了将CompanyCustomerFileVo的filePath、type、signDate、valid等属性映射到CompanyCustomerFile实体 + - 已正确处理customer关联实体 + - 实体类`CompanyCustomerFile`已实现`Voable`接口 + - 客户端已实现`QueryService` -### project模块(12个) +### project模块(0个未实现) 1. **ProjectCostService** - 项目成本服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ProjectCost cost, ProjectCostVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(ProjectCost cost, ProjectCostVo vo)`方法 + - 方法实现了将ProjectCostVo的description、version等属性映射到ProjectCost实体 + - 已正确处理project、contract、applicant、authorizer等关联实体 + - 实体类`ProjectCost`已实现`Voable`接口 + - VO类`ProjectCostVo`已创建 2. **DeliverySignMethodService** - 交付签收方法服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(DeliverySignMethod method, DeliverySignMethodVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(DeliverySignMethod method, DeliverySignMethodVo vo)`方法,映射name、code、description基本属性,处理saleType关联实体转换 + - 实体类`DeliverySignMethod`已实现`Voable`接口 + - VO类`DeliverySignMethodVo`已创建 3. **ProjectFileTypeService** - 项目文件类型服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ProjectFileType fileType, ProjectFileTypeVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(ProjectFileTypeLocal fileType, ProjectFileTypeLocalVo vo)`方法,映射type、lang、value基本属性 + - VO类`ProjectFileTypeLocalVo`已创建 4. **ProjectQuotationService** - 项目报价服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ProjectQuotation quotation, ProjectQuotationVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(ProjectQuotation quotation, ProjectQuotationVo vo)`方法,映射level、standardPayWay等基本属性,处理project、applicant、authorizer关联实体转换 + - 实体类`ProjectQuotation`已实现`Voable`接口 + - VO类`ProjectQuotationVo`已创建 5. **ProjectBidService** - 项目投标服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ProjectBid bid, ProjectBidVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(ProjectBid bid, ProjectBidVo vo)`方法 + - 实体类`ProjectBid`已实现`Voable`接口 + - VO类`ProjectBidVo`已创建 6. **ProjectSaleTypeRequireFileTypeService** - 项目销售类型要求文件类型服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ProjectSaleTypeRequireFileType fileType, ProjectSaleTypeRequireFileTypeVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(ProjectSaleTypeRequireFileType fileType, ProjectSaleTypeRequireFileTypeVo vo)`方法 7. **ProjectFileService** - 项目文件服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(ProjectFile file, ProjectFileVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(ProjectFile file, ProjectFileVo vo)`方法 -### vendor模块(10个) +### vendor模块(0个未实现) 1. **VendorTypeService** - 供应商类型服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorType type, VendorTypeVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorTypeLocal entity, VendorTypeLocalVo vo)`方法 + - ✅ 方法实现了将VendorTypeLocalVo的id、lang、type、value属性映射到VendorTypeLocal实体 2. **VendorApprovedFileService** - 供应商批准文件服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorApprovedFile file, VendorApprovedFileVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorApprovedFile entity, VendorApprovedFileVo vo)`方法 + - ✅ 方法实现了将VendorApprovedFileVo的id、fileName、signDate、description属性映射到VendorApprovedFile实体 + - ✅ 方法处理了listId到VendorApproved关联实体的转换 + - 实体类`VendorApprovedFile`已实现`Voable`接口 3. **VendorEntityService** - 供应商实体服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorEntity entity, VendorEntityVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorEntity entity, VendorEntityVo vo)`方法 + - VO类`CompanyVendorEntityVo`已创建 4. **VendorApprovedItemService** - 供应商批准项服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorApprovedItem item, VendorApprovedItemVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorApprovedItem entity, VendorApprovedItemVo vo)`方法 + - ✅ 方法实现了将VendorApprovedItemVo的id、vendorName、type、description属性映射到VendorApprovedItem实体 + - ✅ 方法处理了listId到VendorApproved、vendorId到Vendor的关联实体转换 + - 实体类`VendorApprovedItem`已实现`Voable`接口 + - VO类`VendorApprovedItemVo`已创建 5. **VendorGroupRequireFileTypeService** - 供应商组要求文件类型服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorGroupRequireFileType fileType, VendorGroupRequireFileTypeVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorGroupRequireFileType entity, VendorGroupRequireFileTypeVo vo)`方法 + - ✅ 方法实现了将VendorGroupRequireFileTypeVo的id、fileType、frequency属性映射到VendorGroupRequireFileType实体 + - ✅ 方法处理了groupId到VendorGroup的关联实体转换 + - 实体类`VendorGroupRequireFileType`已实现`Voable`接口 + - VO类`VendorGroupRequireFileTypeVo`已创建 6. **VendorFileTypeService** - 供应商文件类型服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorFileType fileType, VendorFileTypeVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorFileTypeLocal entity, VendorFileTypeLocalVo vo)`方法 + - ✅ 方法实现了将VendorFileTypeLocalVo的id、lang、value、type属性映射到VendorFileTypeLocal实体 + - 实体类`VendorFileTypeLocal`已实现`Voable`接口 + - VO类`VendorFileTypeLocalVo`已创建 7. **VendorGroupService** - 供应商组服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorGroup group, VendorGroupVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorGroupVo vo)`方法 + - 方法实现了实体和VO的空值检查,以及id、name、code、description、active、priceComparison、requireQuotationSheetForBid属性的映射 + - 实体类`VendorGroup`已实现`Voable`接口 + - VO类`VendorGroupVo`已创建 8. **VendorApprovedService** - 供应商批准服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorApproved approved, VendorApprovedVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorApprovedVo vo)`方法 + - 方法实现了实体和VO的空值检查,以及title、publishDate、path、description属性的映射(id属性不更新) + - 实体类`VendorApproved`已实现`Voable`接口 + - VO类`VendorApprovedVo`已创建 9. **VendorCatalogService** - 供应商目录服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorCatalog catalog, VendorCatalogVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorCatalogVo vo)`方法 + - 方法实现了实体和VO的空值检查,以及name、code、type属性的映射(id属性不更新) + - 实体类`VendorCatalog`已实现`Voable`接口 + - VO类`VendorCatalogVo`已创建 10. **VendorFileService** - 供应商文件服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(VendorFile file, VendorFileVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(VendorFileVo vo)`方法 + - 方法实现了实体和VO的空值检查,以及type、filePath、editFilePath、signDate、valid属性的映射(id属性不更新) + - 实体类`VendorFile`已实现`Voable`接口 + - VO类`VendorFileVo`已创建 -### other模块(2个) +### other模块(0个未实现) 1. **EmployeeLoginHistoryService** - 员工登录历史服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(EmployeeLoginHistory history, EmployeeLoginHistoryVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(EmployeeLoginHistoryVo vo)`方法 + - 方法实现了实体和VO的空值检查,以及employee、ip、mac、loginTime、activeTime属性的映射(id属性不更新) + - 实体类`EmployeeLoginHistory`已实现`Voable`接口 + - VO类`EmployeeLoginHistoryVo`已创建 2. **EmployeeAuthBindService** - 员工授权绑定服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(EmployeeAuthBind bind, EmployeeAuthBindVo vo)`方法 + - ✅ 已实现`VoableService`接口 + - ✅ 已实现`updateByVo(EmployeeAuthBind model, EmployeeAuthBindVo vo)`方法 + - 方法实现了将EmployeeAuthBindVo的ip、mac、createTime、updateTime、description属性映射到EmployeeAuthBind实体 + - employee和updater属性通过ID查找对应的实体 + - 实体类`EmployeeAuthBind`已实现`Voable`接口 + - VO类`EmployeeAuthBindVo`已创建 ### cloud模块(3个) 1. **YongYouU8Service** - 用友U8服务 - - ❌ 未实现`VoableService`接口 - - ❌ 未实现`updateByVo(YongYouU8 u8, YongYouU8Vo vo)`方法 + - ❌ 未实现`VoableService`接口(实际实体类为CloudYu) + - ❌ 未实现`updateByVo(CloudYu cloudYu, CloudYuVo vo)`方法 + - ✅ 实体类`CloudYu`已实现`Voable`接口 + - ✅ `CloudYuVo`类已创建 2. **CloudTycService** - 云天眼查服务 - ❌ 未实现`VoableService`接口 - ❌ 未实现`updateByVo(CloudTyc tyc, CloudTycVo vo)`方法 + - ✅ 实体类`CloudTyc`已实现`Voable`接口 + - ✅ `CloudTycVo`类已创建 3. **CloudRkService** - 云瑞科服务 - ❌ 未实现`VoableService`接口 - ❌ 未实现`updateByVo(CloudRk rk, CloudRkVo vo)`方法 + - ✅ 实体类`CloudRk`已实现`Voable`接口 + - ✅ `CloudRkVo`类已创建 ## 已完成的实现修改 通过对server模块下所有实现了[`IEntityService`](/server/src/main/java/com/ecep/contract/IEntityService.java)接口的73个Service的分析,我们发现: 1. **已实现VoableService接口的Service**: - - 25个Service已成功实现`VoableService`接口 - - 这些Service包括:ContractService、CompanyService、CompanyCustomerService、ProjectService、VendorService、BankService、DepartmentService、EmployeeService、FunctionService、ProjectCostItemService、EmployeeRoleService、PermissionService、ProductTypeService、ProjectFundPlanService、ProjectIndustryService、ProjectSaleTypeService、ProjectTypeService、ProductUsageService、CustomerSatisfactionSurveyService、InventoryService、InventoryHistoryPriceService、CompanyBlackReasonService、CompanyCustomerEntityService、CompanyFileTypeService、CompanyOldNameService和PurchaseBillVoucherItemService - - 所有Service已经正确实现了`updateByVo`方法,能够将VO对象的数据映射到实体对象中 - - 已完成的实现修改已经通过Maven编译验证,确保了代码的正确性和稳定性 + - 70个Service已成功实现`VoableService`接口(contract、company、customer、project、vendor和other模块的所有Service) + - 所有Service已经正确实现了`updateByVo`方法,能够将Vo对象的数据映射到实体对象中 + - 仅有cloud模块的3个Service尚未实现 2. **在实现过程中修复的问题**: - 移除不存在的ServiceException导入 - 调整SpringApp导入路径 - 修复ProjectFundPlan.java中调用不存在的setProjectName方法的问题 + - 为PurchaseBillVoucherService添加VoableService接口实现和updateByVo方法 + - 为ContractFileService添加VoableService接口实现和updateByVo方法,并完善空值检查 + - 为ContractCatalogService添加VoableService接口实现和updateByVo方法 + - 为ContractGroupService添加VoableService接口实现和updateByVo方法 ## 需要进行的实现修改 -以下48个Service需要实现`VoableService`接口: - -所有未实现的Service需要按照以下规范进行实现: +所有未实现的Service需要实现`com.ecep.contract.service.VoableService`接口,按照以下规范进行实现: 1. 添加`implements VoableService`接口声明 2. 实现`updateByVo(M model, Vo vo)`方法,将VO对象的属性映射到实体对象中 @@ -490,21 +609,22 @@ 4. 确保正确导入`com.ecep.contract.service.VoableService`和对应的VO类包 5. 如果实体类有@Version注解的字段,在updateByVo方法中检查版本号一致性 -> 注:根据[`create_vo.md`](/docs/task/create_vo.md)文档中的要求,所有Server模块的Service都需要继承`VoableService`接口。目前还有48个Service未实现该接口,需要尽快完成实现以满足系统架构要求。 - ## 关于 `updateByVo` 方法实现规范 在实现`updateByVo`方法时,请遵循以下规范: - Service 如果缺少`updateByVo`方法,请添加该方法 `void updateByVo(M model, Vo vo)`,并确保该方法将VO对象中的数据映射到实体对象中 - 如果实体类有 @Version 注解的字段,如 version 字段,在 updateByVo 方法中,判断版本号是否一致,不一致则打印警告日志 -- 如果Vo的属性转换时可以使用 `SpringApp.getBean( Service.class ).findById(id)` 方法来转换为对象 +- Vo的属性转换时可以使用 `SpringApp.getBean().findById(id)` 方法来转换为对象 +- id 属性不用更新 +- 方法的返回类型为 void - 确保正确处理关联实体的映射逻辑 - 确保所有必要的包都已正确导入 +- 参考 [`ContractService`](/server/src/main/java/com/ecep/contract/ds/contract/service/ContractService.java) 的 updateByVo 方法实现 ## 结论 -通过本次分析,我们确认了Contract-Manager项目中Server模块Service对VoableService接口的实现状况。目前已有25个Service成功实现了该接口,并正确实现了updateByVo方法,还有48个Service尚未实现。 +通过本次分析,我们确认了Contract-Manager项目中Server模块Service对VoableService接口的实现状况。目前已有70个Service成功实现了该接口,并正确实现了updateByVo方法,还有3个Service尚未实现(均在cloud模块中)。 这些修改将确保: 1. 所有Service都符合系统架构要求,支持Vo对象到实体对象的转换 @@ -512,4 +632,4 @@ 3. 为前端UI提供更好的数据绑定和更新支持 4. 使系统整体设计更加统一,便于后续扩展和维护 -建议尽快完成剩余48个Service的实现,以确保系统架构的完整性和一致性。 +建议尽快完成剩余3个Service的实现(cloud模块中的YongYouU8Service、CloudTycService和CloudRkService),以确保系统架构的完整性和一致性。 diff --git a/server/src/main/java/com/ecep/contract/EntityService.java b/server/src/main/java/com/ecep/contract/EntityService.java index c548136..678fc55 100644 --- a/server/src/main/java/com/ecep/contract/EntityService.java +++ b/server/src/main/java/com/ecep/contract/EntityService.java @@ -1,17 +1,17 @@ package com.ecep.contract; -import com.ecep.contract.ds.MyRepository; -import com.ecep.contract.model.Contract; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; -import org.springframework.cache.annotation.Cacheable; +import java.util.List; + import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.util.StringUtils; -import java.util.List; +import com.ecep.contract.constant.ServiceConstant; +import com.ecep.contract.ds.MyRepository; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; public abstract class EntityService { @@ -19,7 +19,6 @@ public abstract class EntityService { public abstract T createNewEntity(); - public long count() { return getRepository().count(); } @@ -36,14 +35,13 @@ public abstract class EntityService { public Page findAll(JsonNode paramsNode, Pageable pageable) { Specification spec = null; - if (paramsNode.has("searchText")) { - spec = getSpecification(paramsNode.get("searchText").asText()); + if (paramsNode.has(ServiceConstant.KEY_SEARCH_TEXT)) { + spec = getSpecification(paramsNode.get(ServiceConstant.KEY_SEARCH_TEXT).asText()); } spec = SpecificationUtils.and(spec, buildParameterSpecification(paramsNode)); return findAll(spec, pageable); } - public Page findAll(Specification spec, Pageable pageable) { return getRepository().findAll(spec, pageable); } diff --git a/server/src/main/java/com/ecep/contract/cloud/rk/CloudRkService.java b/server/src/main/java/com/ecep/contract/cloud/rk/CloudRkService.java index 50e9486..9735d79 100644 --- a/server/src/main/java/com/ecep/contract/cloud/rk/CloudRkService.java +++ b/server/src/main/java/com/ecep/contract/cloud/rk/CloudRkService.java @@ -28,6 +28,7 @@ import org.springframework.util.StringUtils; import com.ecep.contract.BlackReasonType; import com.ecep.contract.IEntityService; +import com.ecep.contract.SpringApp; import com.ecep.contract.cloud.CloudInfo; import com.ecep.contract.ds.company.repository.CompanyBlackReasonRepository; import com.ecep.contract.ds.company.repository.CompanyOldNameRepository; @@ -36,9 +37,11 @@ import com.ecep.contract.ds.other.service.SysConfService; import com.ecep.contract.model.CloudRk; import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyBlackReason; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.FileUtils; import com.ecep.contract.util.HttpJsonUtils; import com.ecep.contract.util.MyStringUtils; +import com.ecep.contract.vo.CloudRkVo; import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.JsonMappingException; @@ -52,7 +55,7 @@ import lombok.Data; @Lazy @Service @CacheConfig(cacheNames = "cloud-rk") -public class CloudRkService implements IEntityService { +public class CloudRkService implements IEntityService, VoableService { private static final Logger logger = LoggerFactory.getLogger(CloudRkService.class); public static final String KEY_PROXY = "cloud.rk.proxy"; @@ -375,4 +378,68 @@ public class CloudRkService implements IEntityService { } cloudRKRepository.saveAll(list); } + + @Override + public void updateByVo(CloudRk cloudRk, CloudRkVo vo) { + if (cloudRk == null || vo == null) { + throw new IllegalArgumentException("CloudRk and CloudRkVo cannot be null"); + } + + // 更新基本属性 + if (vo.getCloudId() != null) { + cloudRk.setCloudId(vo.getCloudId()); + } + + cloudRk.setAutoUpdate(vo.isAutoUpdate()); + cloudRk.setUpdateDays(vo.getUpdateDays()); + + if (vo.getCustomerGrade() != null) { + cloudRk.setCustomerGrade(vo.getCustomerGrade()); + } + if (vo.getCustomerScore() != null) { + cloudRk.setCustomerScore(vo.getCustomerScore()); + } + if (vo.getCustomerDescription() != null) { + cloudRk.setCustomerDescription(vo.getCustomerDescription()); + } + if (vo.getVendorGrade() != null) { + cloudRk.setVendorGrade(vo.getVendorGrade()); + } + if (vo.getVendorScore() != null) { + cloudRk.setVendorScore(vo.getVendorScore()); + } + if (vo.getVendorDescription() != null) { + cloudRk.setVendorDescription(vo.getVendorDescription()); + } + if (vo.getRank() != null) { + cloudRk.setRank(vo.getRank()); + } + if (vo.getRankDescription() != null) { + cloudRk.setRankDescription(vo.getRankDescription()); + } + if (vo.getCloudLatest() != null) { + cloudRk.setCloudLatest(vo.getCloudLatest()); + } + if (vo.getCloudBlackListUpdated() != null) { + cloudRk.setCloudBlackListUpdated(vo.getCloudBlackListUpdated()); + } + if (vo.getCloudEntUpdate() != null) { + cloudRk.setCloudEntUpdate(vo.getCloudEntUpdate()); + } + if (vo.getDescription() != null) { + cloudRk.setDescription(vo.getDescription()); + } + if (vo.getLatestUpdate() != null) { + cloudRk.setLatestUpdate(vo.getLatestUpdate()); + } + + // 更新关联的公司 + if (vo.getCompanyId() != null) { + CompanyService companyService = SpringApp.getBean(CompanyService.class); + Company company = companyService.findById(vo.getCompanyId()); + if (company != null) { + cloudRk.setCompany(company); + } + } + } } diff --git a/server/src/main/java/com/ecep/contract/cloud/tyc/CloudTycService.java b/server/src/main/java/com/ecep/contract/cloud/tyc/CloudTycService.java index fde76a6..409ddc4 100644 --- a/server/src/main/java/com/ecep/contract/cloud/tyc/CloudTycService.java +++ b/server/src/main/java/com/ecep/contract/cloud/tyc/CloudTycService.java @@ -17,15 +17,19 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.MessageHolder; +import com.ecep.contract.SpringApp; import com.ecep.contract.cloud.CloudInfo; import com.ecep.contract.constant.CloudServiceConstant; +import com.ecep.contract.ds.company.service.CompanyService; import com.ecep.contract.model.CloudTyc; import com.ecep.contract.model.Company; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.MyStringUtils; +import com.ecep.contract.vo.CloudTycVo; @Lazy @Service -public class CloudTycService implements IEntityService { +public class CloudTycService implements IEntityService, VoableService { private static final Logger logger = LoggerFactory.getLogger(CloudTycService.class); /** @@ -121,7 +125,6 @@ public class CloudTycService implements IEntityService { cloudTycRepository.delete(entity); } - public void deleteByCompany(Company company) { int deleted = cloudTycRepository.deleteAllByCompany(company); if (deleted > 0) { @@ -165,4 +168,34 @@ public class CloudTycService implements IEntityService { // TODO 从天眼查同步公司信息 holder.warn("TODO 未实现"); } + + @Override + public void updateByVo(CloudTyc cloudTyc, CloudTycVo vo) { + if (cloudTyc == null || vo == null) { + throw new IllegalArgumentException("CloudTyc and CloudTycVo cannot be null"); + } + + // 更新基本属性 + if (vo.getScore() != null) { + cloudTyc.setScore(vo.getScore()); + } + if (vo.getCloudLatest() != null) { + cloudTyc.setCloudLatest(vo.getCloudLatest()); + } + if (vo.getCloudId() != null) { + cloudTyc.setCloudId(vo.getCloudId()); + } + if (vo.getLatestUpdate() != null) { + cloudTyc.setLatestUpdate(vo.getLatestUpdate()); + } + + // 更新关联的公司 + if (vo.getCompanyId() != null) { + CompanyService companyService = SpringApp.getBean(CompanyService.class); + Company company = companyService.findById(vo.getCompanyId()); + if (company != null) { + cloudTyc.setCompany(company); + } + } + } } diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/YongYouU8Service.java b/server/src/main/java/com/ecep/contract/cloud/u8/YongYouU8Service.java index 8b197d0..ba24615 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/YongYouU8Service.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/YongYouU8Service.java @@ -17,21 +17,22 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.cloud.CloudInfo; import com.ecep.contract.cloud.CloudInfoRepository; import com.ecep.contract.cloud.u8.ctx.AbstractYongYouU8Ctx; import com.ecep.contract.ds.company.service.CompanyService; -import com.ecep.contract.ds.customer.service.CompanyCustomerService; -import com.ecep.contract.ds.other.service.EmployeeService; -import com.ecep.contract.ds.vendor.service.VendorService; import com.ecep.contract.model.CloudYu; import com.ecep.contract.model.Company; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.vo.CloudYuVo; import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service -// @ConditionalOnProperty(name = "cloud.u8.enabled", havingValue = "true") -public class YongYouU8Service implements IEntityService, QueryService { +// @ConditionalOnProperty(name = "cloud.u8.enabled", havingValue = "true") +public class YongYouU8Service + implements IEntityService, QueryService, VoableService { private static final Logger logger = LoggerFactory.getLogger(YongYouU8Service.class); public static final String KEY_HOST_IP = "u8.db.server.ip"; @@ -47,19 +48,7 @@ public class YongYouU8Service implements IEntityService, QueryService, QueryService findAllCloudYu() { return cloudInfoRepository.findAll(); } + + @Override + public void updateByVo(CloudYu cloudYu, CloudYuVo vo) { + if (cloudYu == null || vo == null) { + throw new IllegalArgumentException("CloudYu and CloudYuVo cannot be null"); + } + + // 更新基本属性 + if (vo.getLatestUpdate() != null) { + cloudYu.setLatestUpdate(vo.getLatestUpdate()); + } + if (vo.getExceptionMessage() != null) { + cloudYu.setExceptionMessage(vo.getExceptionMessage()); + } + if (vo.getVendorUpdateDate() != null) { + cloudYu.setVendorUpdateDate(vo.getVendorUpdateDate()); + } + if (vo.getCustomerUpdateDate() != null) { + cloudYu.setCustomerUpdateDate(vo.getCustomerUpdateDate()); + } + if (vo.getCloudLatest() != null) { + cloudYu.setCloudLatest(vo.getCloudLatest()); + } + + // 更新关联的公司 + if (vo.getCompanyId() != null) { + CompanyService companyService = SpringApp.getBean(CompanyService.class); + Company company = companyService.findById(vo.getCompanyId()); + if (company != null) { + cloudYu.setCompany(company); + } + } + } } diff --git a/server/src/main/java/com/ecep/contract/config/JacksonConfig.java b/server/src/main/java/com/ecep/contract/config/JacksonConfig.java index 7ff3d80..c53874c 100644 --- a/server/src/main/java/com/ecep/contract/config/JacksonConfig.java +++ b/server/src/main/java/com/ecep/contract/config/JacksonConfig.java @@ -133,34 +133,6 @@ public class JacksonConfig { } } - /** - * 用于处理集合类型的序列化器,避免懒加载集合在会话关闭时无法序列化的问题 - */ - private static class CollectionSerializer extends StdSerializer> { - - protected CollectionSerializer() { - super((Class>) (Class) Collection.class); - } - - @Override - public void serialize(Collection value, JsonGenerator gen, SerializerProvider serializers) - throws IOException { - // 检查集合是否为Hibernate的持久化集合 - if (value instanceof PersistentCollection) { - PersistentCollection persistentCollection = (PersistentCollection) value; - // 如果集合未初始化,返回空集合 - if (!persistentCollection.wasInitialized()) { - gen.writeStartArray(); - gen.writeEndArray(); - return; - } - } - - // 如果已初始化,使用默认序列化 - serializers.defaultSerializeValue(value, gen); - } - } - /** * 用于处理IdentityEntity类型的序列化器包装器 */ @@ -172,6 +144,7 @@ public class JacksonConfig { this.delegate = delegate; } + @SuppressWarnings("unchecked") @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { diff --git a/server/src/main/java/com/ecep/contract/ds/company/service/CompanyBankAccountService.java b/server/src/main/java/com/ecep/contract/ds/company/service/CompanyBankAccountService.java index c994f65..7982117 100644 --- a/server/src/main/java/com/ecep/contract/ds/company/service/CompanyBankAccountService.java +++ b/server/src/main/java/com/ecep/contract/ds/company/service/CompanyBankAccountService.java @@ -18,16 +18,22 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.MessageHolder; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.company.repository.CompanyBankAccountRepository; +import com.ecep.contract.ds.other.service.BankService; import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.CompanyBankAccountVo; import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "company-bank-account") -public class CompanyBankAccountService implements IEntityService, QueryService { +public class CompanyBankAccountService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(CompanyBankAccountService.class); @Lazy @Autowired @@ -126,4 +132,35 @@ public class CompanyBankAccountService implements IEntityService, QueryService { +public class CompanyContactService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(CompanyContactService.class); @Autowired @@ -118,4 +124,36 @@ public class CompanyContactService implements IEntityService, Qu spec = SpecificationUtils.andParam(spec, paramsNode, "company"); return findAll(spec, pageable); } + + @Override + public void updateByVo(CompanyContact model, CompanyContactVo vo) { + if (model == null) { + throw new ServiceException("CompanyContact cannot be null"); + } + if (vo == null) { + throw new ServiceException("CompanyContactVo cannot be null"); + } + + // 基本属性映射 + model.setName(vo.getName()); + model.setPhone(vo.getPhone()); + model.setEmail(vo.getEmail()); + model.setAddress(vo.getAddress()); + model.setPosition(vo.getPosition()); + model.setU8Code(vo.getU8Code()); + model.setMemo(vo.getMemo()); + model.setCreated(vo.getCreated()); + + // 处理关联关系 - 公司 + if (vo.getCompanyId() != null) { + model.setCompany(SpringApp.getBean(CompanyService.class).findById(vo.getCompanyId())); + } else { + model.setCompany(null); + } + + // 注意: + // 1. CompanyContact实体类中没有primary字段,所以不需要设置 + // 2. CompanyContact实体类中没有active字段,所以不需要设置 + } + } diff --git a/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileService.java b/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileService.java index a94f7e9..8e7b376 100644 --- a/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileService.java @@ -11,10 +11,6 @@ import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.ecep.contract.*; -import com.ecep.contract.constant.CompanyConstant; -import com.ecep.contract.ds.MyRepository; -import com.ecep.contract.util.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -25,22 +21,29 @@ import org.springframework.cache.annotation.Caching; import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import com.ecep.contract.CompanyFileType; +import com.ecep.contract.IEntityService; +import com.ecep.contract.MyDateTimeUtils; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.constant.CloudServiceConstant; +import com.ecep.contract.constant.CompanyConstant; +import com.ecep.contract.constant.ServiceConstant; import com.ecep.contract.ds.company.repository.CompanyFileRepository; -import com.ecep.contract.ds.company.repository.CompanyFileTypeLocalRepository; -import com.ecep.contract.ds.company.repository.CompanyOldNameRepository; import com.ecep.contract.ds.contract.service.ContractService; +import com.ecep.contract.ds.vendor.repository.VendorGroupRepository; import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyFile; -import com.ecep.contract.model.CompanyFileTypeLocal; import com.ecep.contract.model.CompanyOldName; import com.ecep.contract.model.Contract; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.FileUtils; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.CompanyFileVo; import com.fasterxml.jackson.databind.JsonNode; /** @@ -49,26 +52,17 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "company-file") -public class CompanyFileService extends EntityService implements IEntityService, QueryService { +public class CompanyFileService + implements IEntityService, QueryService, VoableService { + + private final VendorGroupRepository vendorGroupRepository; private static final Logger logger = LoggerFactory.getLogger(CompanyFileService.class); @Lazy @Autowired private CompanyFileRepository companyFileRepository; - @Lazy - @Autowired - private CompanyOldNameRepository companyOldNameRepository; - @Lazy - @Autowired - private CompanyFileTypeLocalRepository fileTypeLocalRepository; - @Override - protected CompanyFileRepository getRepository() { - return companyFileRepository; - } - - @Override - public CompanyFile createNewEntity() { - return new CompanyFile(); + CompanyFileService(VendorGroupRepository vendorGroupRepository) { + this.vendorGroupRepository = vendorGroupRepository; } @Cacheable(key = "#p0") @@ -76,20 +70,10 @@ public class CompanyFileService extends EntityService impl return companyFileRepository.findById(id).orElse(null); } - public List findFileByCompanyAndType(Company company, CompanyFileType type) { return companyFileRepository.findByCompanyAndType(company, type); } - - @Override - protected Specification buildSearchSpecification(String searchText) { - return (root, query, builder) -> { - return builder.or(builder.like(root.get("filePath"), "%" + searchText + "%")); - }; - } - - @Override protected Specification buildParameterSpecification(JsonNode paramsNode) { Specification spec = null; if (paramsNode.has("type")) { @@ -280,7 +264,7 @@ public class CompanyFileService extends EntityService impl } // 获取所有曾用名 - for (CompanyOldName companyOldName : companyOldNameRepository.findAllByCompanyId(company.getId())) { + for (CompanyOldName companyOldName : SpringApp.getBean(CompanyOldNameService.class).findAllByCompany(company)) { String path = companyOldName.getPath(); if (StringUtils.hasText(path)) { File dir = new File(path); @@ -439,5 +423,62 @@ public class CompanyFileService extends EntityService impl } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has(ServiceConstant.KEY_SEARCH_TEXT)) { + spec = getSpecification(paramsNode.get(ServiceConstant.KEY_SEARCH_TEXT).asText()); + } + spec = SpecificationUtils.and(spec, buildParameterSpecification(paramsNode)); + return findAll(spec, pageable); + } + + @Override + public Page findAll(Specification spec, Pageable pageable) { + return companyFileRepository.findAll(spec, pageable); + } + + @Override + public Specification getSpecification(String searchText) { + if (!StringUtils.hasText(searchText)) { + return null; + } + return SpecificationUtils.andWith(searchText, this::buildSearchSpecification); + } + + protected Specification buildSearchSpecification(String searchText) { + return (root, query, builder) -> { + return builder.or(builder.like(root.get("filePath"), "%" + searchText + "%")); + }; + } + + @Override + public void updateByVo(CompanyFile model, CompanyFileVo vo) { + // 空值校验 + if (model == null) { + throw new IllegalArgumentException("companyFile cannot be null"); + } + if (vo == null) { + throw new IllegalArgumentException("companyFileVo cannot be null"); + } + + // 映射基本属性 + model.setId(vo.getId()); + model.setType(vo.getType()); + model.setApplyDate(vo.getApplyDate()); + model.setExpiringDate(vo.getExpiringDate()); + model.setFilePath(vo.getFilePath()); + + // 处理公司关联 + if (vo.getCompanyId() == null) { + model.setCompany(null); + } else { + CompanyService companyService = SpringApp.getBean(CompanyService.class); + Company company = companyService.findById(vo.getCompanyId()); + model.setCompany(company); + } + + // 实体类中没有active字段,不需要映射 + } } diff --git a/server/src/main/java/com/ecep/contract/ds/company/service/InvoiceService.java b/server/src/main/java/com/ecep/contract/ds/company/service/InvoiceService.java index a6176e6..a6949aa 100644 --- a/server/src/main/java/com/ecep/contract/ds/company/service/InvoiceService.java +++ b/server/src/main/java/com/ecep/contract/ds/company/service/InvoiceService.java @@ -18,15 +18,21 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.company.repository.InvoiceRepository; +import com.ecep.contract.ds.company.service.CompanyService; import com.ecep.contract.model.Invoice; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.InvoiceVo; import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "invoice") -public class InvoiceService implements IEntityService, QueryService { +public class InvoiceService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(InvoiceService.class); @Autowired @@ -80,9 +86,15 @@ public class InvoiceService implements IEntityService, QueryService, QueryService { +public class ContractBidVendorService implements IEntityService, QueryService, VoableService { @Lazy @Autowired private ContractBidVendorRepository repository; @@ -99,9 +104,30 @@ public class ContractBidVendorService implements IEntityService, QueryService { +public class ContractCatalogService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private ContractCatalogRepository repository; @@ -99,4 +102,16 @@ public class ContractCatalogService implements IEntityService, } return findAll(spec, pageable); } + + @Override + public void updateByVo(ContractCatalog model, ContractCatalogVo vo) { + if (model == null || vo == null) { + return; + } + model.setCode(vo.getCode()); + model.setName(vo.getName()); + model.setPath(vo.getPath()); + model.setParent(vo.getParent()); + model.setUseYear(vo.isUseYear()); + } } \ No newline at end of file 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 7c9f946..0fd9f19 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 @@ -21,16 +21,20 @@ import org.springframework.util.StringUtils; import com.ecep.contract.ContractFileType; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.contract.repository.ContractFileRepository; import com.ecep.contract.model.Contract; import com.ecep.contract.model.ContractFile; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.ContractFileVo; import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-file") -public class ContractFileService implements IEntityService, QueryService { +public class ContractFileService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(ContractFileService.class); @Lazy @Autowired @@ -166,4 +170,19 @@ public class ContractFileService implements IEntityService, QueryS }; return contractFileRepository.findAll(spec); } + + @Override + public void updateByVo(ContractFile model, ContractFileVo vo) { + // 更新基本属性 + if (vo.getContractId() == null) { + model.setContract(null); + } else { + model.setContract(SpringApp.getBean(ContractService.class).findById(vo.getContractId())); + } + + model.setType(vo.getType()); + model.setFileName(vo.getFileName()); + model.setApplyDate(vo.getApplyDate()); + model.setDescription(vo.getDescription()); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java index 8b77223..9beb037 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java @@ -3,7 +3,6 @@ package com.ecep.contract.ds.contract.service; import java.util.Locale; import java.util.Map; -import com.ecep.contract.VendorType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -22,14 +21,18 @@ import com.ecep.contract.QueryService; import com.ecep.contract.constant.ServiceConstant; import com.ecep.contract.ds.contract.repository.ContractFileTypeLocalRepository; import com.ecep.contract.model.ContractFileTypeLocal; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.ContractFileTypeLocalVo; import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-file-type") public class ContractFileTypeService - implements IEntityService, QueryService { + implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private ContractFileTypeLocalRepository repository; @@ -42,7 +45,8 @@ public class ContractFileTypeService } if (paramsNode.has("type")) { - spec = SpecificationUtils.and(spec, (root, query, builder) -> builder.equal(root.get("type"), ContractFileType.valueOf(paramsNode.get("type").asText()))); + spec = SpecificationUtils.and(spec, (root, query, builder) -> builder.equal(root.get("type"), + ContractFileType.valueOf(paramsNode.get("type").asText()))); } // field @@ -96,4 +100,21 @@ public class ContractFileTypeService return repository.save(entity); } + @Override + public void updateByVo(ContractFileTypeLocal model, ContractFileTypeLocalVo vo) { + if (model == null) { + throw new ServiceException("实体对象不能为空"); + } + if (vo == null) { + throw new ServiceException("VO对象不能为空"); + } + + model.setId(vo.getId()); + model.setLang(vo.getLang()); + model.setType(vo.getType()); + model.setValue(vo.getValue()); + model.setDescription(vo.getDescription()); + model.setSuggestFileName(vo.getSuggestFileName()); + } + } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractGroupService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractGroupService.java index 563b2e2..39edd8c 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractGroupService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractGroupService.java @@ -19,6 +19,8 @@ import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; import com.ecep.contract.ds.contract.repository.ContractGroupRepository; import com.ecep.contract.model.ContractGroup; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.vo.ContractGroupVo; import com.fasterxml.jackson.databind.JsonNode; /** @@ -27,7 +29,8 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-group") -public class ContractGroupService implements IEntityService, QueryService { +public class ContractGroupService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(ContractGroupService.class); @Lazy @@ -113,4 +116,14 @@ public class ContractGroupService implements IEntityService, Quer return group; } + @Override + public void updateByVo(ContractGroup model, ContractGroupVo vo) { + if (model != null && vo != null) { + model.setId(vo.getId()); + model.setName(vo.getName()); + model.setCode(vo.getCode()); + model.setTitle(vo.getTitle()); + } + } + } \ No newline at end of file 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 ad31771..e23fb1b 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 @@ -19,11 +19,17 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.contract.repository.ContractItemRepository; +import com.ecep.contract.ds.other.service.EmployeeService; +import com.ecep.contract.ds.other.service.InventoryService; import com.ecep.contract.model.Contract; import com.ecep.contract.model.ContractItem; import com.ecep.contract.model.Inventory; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.ContractItemVo; import com.fasterxml.jackson.databind.JsonNode; import jakarta.persistence.criteria.Path; @@ -31,7 +37,7 @@ import jakarta.persistence.criteria.Path; @Lazy @Service @CacheConfig(cacheNames = "contract-item") -public class ContractItemService implements IEntityService, QueryService { +public class ContractItemService implements IEntityService, QueryService, VoableService { private static final Logger logger = LoggerFactory.getLogger(ContractItemService.class); @Lazy @@ -98,6 +104,51 @@ public class ContractItemService implements IEntityService, QueryS @Caching(evict = { @CacheEvict(key = "#p0.id") }) + + @Override + public void updateByVo(ContractItem model, ContractItemVo vo) { + // 更新基本属性 + model.setRefId(vo.getRefId()); + model.setItemCode(vo.getItemCode()); + model.setTitle(vo.getTitle()); + model.setSpecification(vo.getSpecification()); + model.setUnit(vo.getUnit()); + model.setExclusiveTaxPrice(vo.getExclusiveTaxPrice() != null ? vo.getExclusiveTaxPrice() : 0); + model.setTaxRate(vo.getTaxRate() != null ? vo.getTaxRate() : 0); + model.setTaxPrice(vo.getTaxPrice() != null ? vo.getTaxPrice() : 0); + model.setQuantity(vo.getQuantity() != null ? vo.getQuantity() : 0); + model.setStartDate(vo.getStartDate()); + model.setEndDate(vo.getEndDate()); + model.setRemark(vo.getRemark()); + + // 处理关联对象 + if (vo.getContractId() == null) { + model.setContract(null); + } else { + model.setContract(SpringApp.getBean(ContractService.class).findById(vo.getContractId())); + } + + if (vo.getInventoryId() == null) { + model.setInventory(null); + } else { + model.setInventory(SpringApp.getBean(InventoryService.class).findById(vo.getInventoryId())); + } + + if (vo.getCreatorId() == null) { + model.setCreator(null); + } else { + model.setCreator(SpringApp.getBean(EmployeeService.class).findById(vo.getCreatorId())); + } + + if (vo.getUpdaterId() == null) { + model.setUpdater(null); + } else { + model.setUpdater(SpringApp.getBean(EmployeeService.class).findById(vo.getUpdaterId())); + } + + // 创建日期和更新日期通常由系统自动维护,这里不设置 + } + public ContractItem save(ContractItem item) { return itemRepository.save(item); } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractKindService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractKindService.java index a49590e..fa60080 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractKindService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractKindService.java @@ -19,6 +19,8 @@ import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; import com.ecep.contract.ds.contract.repository.ContractKindRepository; import com.ecep.contract.model.ContractKind; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.vo.ContractKindVo; import com.fasterxml.jackson.databind.JsonNode; /** @@ -27,7 +29,8 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-kind") -public class ContractKindService implements IEntityService, QueryService { +public class ContractKindService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(ContractKindService.class); @Lazy @@ -99,4 +102,15 @@ public class ContractKindService implements IEntityService, QueryS public void delete(Integer id) { repository.deleteById(id); } + + @Override + public void updateByVo(ContractKind model, ContractKindVo vo) { + if (model == null || vo == null) { + return; + } + model.setName(vo.getName()); + model.setCode(vo.getCode()); + model.setTitle(vo.getTitle()); + // model.setActive(vo.isActive()); + } } \ No newline at end of file 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 548d748..3e3d3e9 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 @@ -16,10 +16,13 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.contract.repository.ContractPayPlanRepository; import com.ecep.contract.model.Contract; import com.ecep.contract.model.ContractPayPlan; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.ContractPayPlanVo; import com.fasterxml.jackson.databind.JsonNode; /** @@ -28,7 +31,8 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-pay-plan") -public class ContractPayPlanService implements IEntityService, QueryService { +public class ContractPayPlanService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private ContractPayPlanRepository repository; @@ -85,4 +89,26 @@ public class ContractPayPlanService implements IEntityService, return repository.save(entity); } + @Override + public void updateByVo(ContractPayPlan model, ContractPayPlanVo vo) { + if (model == null || vo == null) { + return; + } + model.setRefId(vo.getRefId()); + model.setPayRatio(vo.getPayRatio()); + model.setPayCurrency(vo.getPayCurrency() != null ? vo.getPayCurrency() : 0); + model.setPayDate(vo.getPayDate()); + model.setPayTerm(vo.getPayTerm()); + + // 处理关联对象 + if (vo.getContractId() == null) { + model.setContract(null); + } else { + model.setContract(SpringApp.getBean(ContractService.class).findById(vo.getContractId())); + } + + if (vo.getUpdateDate() != null) { + model.setUpdateDate(vo.getUpdateDate()); + } + } } 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 57f2fac..5f87070 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 @@ -373,24 +373,86 @@ public class ContractService extends EntityService @Override public void updateByVo(Contract contract, ContractVo vo) { + if (contract == null || vo == null) { + return; + } + contract.setCode(vo.getCode()); contract.setName(vo.getName()); - contract.setCompany(SpringApp.getBean(CompanyService.class).findById(vo.getCompanyId())); - contract.setGroup(SpringApp.getBean(ContractGroupService.class).findById(vo.getGroupId())); - contract.setType(SpringApp.getBean(ContractTypeService.class).findById(vo.getTypeId())); - contract.setKind(SpringApp.getBean(ContractKindService.class).findById(vo.getKindId())); - contract.setProject(SpringApp.getBean(ProjectService.class).findById(vo.getProject())); + contract.setGuid(vo.getGuid()); + contract.setState(vo.getState()); + contract.setPath(vo.getPath()); + contract.setDescription(vo.getDescription()); + contract.setAmount(vo.getAmount()); + contract.setStandardPayWay(vo.isStandardPayWay()); + contract.setStandardPContractText(vo.isStandardPContractText()); + contract.setTotalQuantity(vo.getTotalQuantity()); + contract.setTotalAmount(vo.getTotalAmount()); + contract.setTotalUnTaxAmount(vo.getTotalUnTaxAmount()); + contract.setExecQuantity(vo.getExecQuantity()); + contract.setExecAmount(vo.getExecAmount()); + contract.setExecUnTaxAmount(vo.getExecUnTaxAmount()); + contract.setPayWay(vo.getPayWay()); + + if (vo.getCompanyId() == null) { + contract.setCompany(null); + } else { + contract.setCompany(SpringApp.getBean(CompanyService.class).findById(vo.getCompanyId())); + } + if (vo.getGroupId() == null) { + contract.setGroup(null); + } else { + contract.setGroup(SpringApp.getBean(ContractGroupService.class).findById(vo.getGroupId())); + } + if (vo.getTypeId() == null) { + contract.setType(null); + } else { + contract.setType(SpringApp.getBean(ContractTypeService.class).findById(vo.getTypeId())); + } + if (vo.getKindId() == null) { + contract.setKind(null); + } else { + contract.setKind(SpringApp.getBean(ContractKindService.class).findById(vo.getKindId())); + } + if (vo.getProject() == null) { + contract.setProject(null); + } else { + contract.setProject(SpringApp.getBean(ProjectService.class).findById(vo.getProject())); + } contract.setParentCode(vo.getParentCode()); contract.setOrderDate(vo.getOrderDate()); contract.setStartDate(vo.getStartDate()); contract.setEndDate(vo.getEndDate()); + EmployeeService employeeService = SpringApp.getBean(EmployeeService.class); - contract.setEmployee(employeeService.findById(vo.getEmployeeId())); - contract.setHandler(employeeService.findById(vo.getHandlerId())); - contract.setSetupPerson(employeeService.findById(vo.getSetupPersonId())); + if (vo.getEmployeeId() == null) { + contract.setEmployee(null); + } else { + contract.setEmployee(employeeService.findById(vo.getEmployeeId())); + } + if (vo.getHandlerId() == null) { + contract.setHandler(null); + } else { + contract.setHandler(employeeService.findById(vo.getHandlerId())); + } + if (vo.getSetupPersonId() == null) { + contract.setSetupPerson(null); + } else { + contract.setSetupPerson(employeeService.findById(vo.getSetupPersonId())); + } contract.setSetupDate(vo.getSetupDate()); - contract.setInurePerson(employeeService.findById(vo.getInurePersonId())); + if (vo.getInurePersonId() == null) { + contract.setInurePerson(null); + } else { + contract.setInurePerson(employeeService.findById(vo.getInurePersonId())); + } contract.setInureDate(vo.getInureDate()); + if (vo.getVaryPersonId() == null) { + contract.setVaryPerson(null); + } else { + contract.setVaryPerson(employeeService.findById(vo.getVaryPersonId())); + } + contract.setVaryDate(vo.getVaryDate()); } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractTypeService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractTypeService.java index e8f523e..9dfe252 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractTypeService.java @@ -19,6 +19,8 @@ import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; import com.ecep.contract.ds.contract.repository.ContractTypeRepository; import com.ecep.contract.model.ContractType; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.vo.ContractTypeVo; import com.fasterxml.jackson.databind.JsonNode; /** @@ -27,7 +29,8 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-type") -public class ContractTypeService implements IEntityService, QueryService { +public class ContractTypeService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(ContractTypeService.class); @Lazy @@ -98,7 +101,21 @@ public class ContractTypeService implements IEntityService, QueryS return (root, query, builder) -> { return builder.or( builder.like(root.get("code"), "%" + searchText + "%"), - builder.like(root.get("name"), "%" + searchText + "%")); + builder.like(root.get("name"), "%" + searchText + "%"), + builder.like(root.get("title"), "%" + searchText + "%")); }; } + + @Override + public void updateByVo(ContractType model, ContractTypeVo vo) { + // 更新基本属性 + model.setName(vo.getName()); + model.setCode(vo.getCode()); + model.setCatalog(vo.getCatalog()); + model.setTitle(vo.getTitle()); + model.setDirection(vo.getDirection()); + + // 注意:ContractType实体类中没有active字段,所以不设置 + } + } \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ExtendVendorInfoService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ExtendVendorInfoService.java index de4095b..68fbdab 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ExtendVendorInfoService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ExtendVendorInfoService.java @@ -23,19 +23,25 @@ import com.ecep.contract.ds.contract.repository.ExtendVendorInfoRepository; import com.ecep.contract.ds.vendor.service.VendorGroupService; import com.ecep.contract.model.Contract; import com.ecep.contract.model.ExtendVendorInfo; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.ExtendVendorInfoVo; import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-ext-ven-info") -public class ExtendVendorInfoService implements IEntityService, QueryService { +public class ExtendVendorInfoService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private ExtendVendorInfoRepository repository; @Lazy @Autowired private VendorGroupService vendorGroupService; + @Lazy + @Autowired + private ContractService contractService; @Override @Cacheable(key = "#p0") @@ -56,22 +62,20 @@ public class ExtendVendorInfoService implements IEntityService return repository.save(bidVendor); } - @Caching( - evict = { - @CacheEvict(key = "#p0.id"), - @CacheEvict(key = "'bycontract-'+#p0.contract.id") - } - ) + @Caching(evict = { + @CacheEvict(key = "#p0.id"), + @CacheEvict(key = "'bycontract-'+#p0.contract.id") + }) @Override public void delete(ExtendVendorInfo bidVendor) { repository.delete(bidVendor); } - + @Override public Page findAll(Specification spec, Pageable pageable) { return repository.findAll(spec, pageable); } - + @Override public Specification getSpecification(String searchText) { if (!StringUtils.hasText(searchText)) { @@ -81,11 +85,10 @@ public class ExtendVendorInfoService implements IEntityService return builder.or( builder.like(root.get("contract").get("code"), "%" + searchText + "%"), builder.like(root.get("contract").get("name"), "%" + searchText + "%"), - builder.like(root.get("codeSequenceNumber").as(String.class), "%" + searchText + "%") - ); + builder.like(root.get("codeSequenceNumber").as(String.class), "%" + searchText + "%")); }; } - + @Override public Page findAll(JsonNode paramsNode, Pageable pageable) { Specification spec = null; @@ -122,4 +125,29 @@ public class ExtendVendorInfoService implements IEntityService info.setPrePurchase(false); return info; } + + @Override + public void updateByVo(ExtendVendorInfo entity, ExtendVendorInfoVo vo) { + if (entity == null || vo == null) { + return; + } + + // 更新基本属性 + entity.setCodeSequenceNumber(vo.getCodeSequenceNumber()); + entity.setAssignedProvider(vo.isAssignedProvider()); + entity.setPrePurchase(vo.isPrePurchase()); + + // 处理关联对象 + if (vo.getContractId() != null) { + entity.setContract(contractService.findById(vo.getContractId())); + } else { + entity.setContract(null); + } + + if (vo.getGroupId() != null) { + entity.setGroup(vendorGroupService.findById(vo.getGroupId())); + } else { + entity.setGroup(null); + } + } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherService.java index 48f3220..f543ae7 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherService.java @@ -19,9 +19,15 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; +import com.ecep.contract.ds.company.service.CompanyService; +import com.ecep.contract.ds.company.service.InvoiceService; import com.ecep.contract.ds.contract.repository.PurchaseBillVoucherRepository; +import com.ecep.contract.ds.other.service.EmployeeService; import com.ecep.contract.model.PurchaseBillVoucher; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.PurchaseBillVoucherVo; import com.fasterxml.jackson.databind.JsonNode; /** @@ -31,7 +37,8 @@ import com.fasterxml.jackson.databind.JsonNode; @Service @CacheConfig(cacheNames = "purchase-bill-voucher") public class PurchaseBillVoucherService - implements IEntityService, QueryService { + implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(PurchaseBillVoucherService.class); @Lazy @@ -124,4 +131,50 @@ public class PurchaseBillVoucherService public List search(String searchText) { return repository.findAll(getSpecification(searchText), Pageable.ofSize(10)).getContent(); } + + @Override + public void updateByVo(PurchaseBillVoucher model, PurchaseBillVoucherVo vo) { + if (model == null || vo == null) { + return; + } + + model.setRefId(vo.getRefId()); + model.setCode(vo.getCode()); + model.setMakerDate(vo.getMakerDate()); + model.setModifyDate(vo.getModifyDate()); + model.setVerifierDate(vo.getVerifierDate()); + model.setDescription(vo.getDescription()); + + // 处理关联对象 + if (vo.getInvoiceId() == null) { + model.setInvoice(null); + } else { + model.setInvoice(SpringApp.getBean(InvoiceService.class).findById(vo.getInvoiceId())); + } + + if (vo.getCompanyId() == null) { + model.setCompany(null); + } else { + model.setCompany(SpringApp.getBean(CompanyService.class).findById(vo.getCompanyId())); + } + + EmployeeService employeeService = SpringApp.getBean(EmployeeService.class); + if (vo.getEmployeeId() == null) { + model.setEmployee(null); + } else { + model.setEmployee(employeeService.findById(vo.getEmployeeId())); + } + + if (vo.getMakerId() == null) { + model.setMaker(null); + } else { + model.setMaker(employeeService.findById(vo.getMakerId())); + } + + if (vo.getVerifierId() == null) { + model.setVerifier(null); + } else { + model.setVerifier(employeeService.findById(vo.getVerifierId())); + } + } } 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 f217802..e5413b0 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 @@ -19,15 +19,21 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.contract.repository.PurchaseOrderItemRepository; +import com.ecep.contract.ds.other.service.InventoryService; import com.ecep.contract.model.PurchaseOrderItem; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.PurchaseOrderItemVo; import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-purchase-order-item") -public class PurchaseOrderItemService implements IEntityService, QueryService { +public class PurchaseOrderItemService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(PurchaseOrderItemService.class); @Lazy @Autowired @@ -101,4 +107,34 @@ public class PurchaseOrderItemService implements IEntityService findAll(Specification spec, Sort sort) { return repository.findAll(spec, sort); } + + @Override + public void updateByVo(PurchaseOrderItem model, PurchaseOrderItemVo vo) { + if (model == null) { + throw new ServiceException("实体对象不能为空"); + } + if (vo == null) { + throw new ServiceException("VO对象不能为空"); + } + + model.setRefId(vo.getRefId()); + model.setQuantity(vo.getQuantity()); + model.setPrice(vo.getPrice()); + model.setTaxRate(vo.getTaxRate()); + model.setExclusiveTaxPrice(vo.getExclusiveTaxPrice()); + model.setArriveDate(vo.getArriveDate()); + model.setDescription(vo.getDescription()); + + if (vo.getOrder() == null) { + model.setOrder(null); + } else { + model.setOrder(SpringApp.getBean(PurchaseOrdersService.class).findById(vo.getOrder())); + } + + if(vo.getInventoryId() == null) { + model.setInventory(null); + } else { + model.setInventory(SpringApp.getBean(InventoryService.class).findById(vo.getInventoryId())); + } + } } 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 cd77ed6..cf25a2d 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 @@ -18,10 +18,16 @@ import org.springframework.stereotype.Service; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.contract.repository.PurchaseOrderRepository; +import com.ecep.contract.ds.other.service.EmployeeService; import com.ecep.contract.model.Contract; +import com.ecep.contract.model.Employee; import com.ecep.contract.model.PurchaseOrder; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.PurchaseOrderVo; import com.fasterxml.jackson.databind.JsonNode; /** @@ -30,13 +36,18 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-purchase-order") -public class PurchaseOrdersService implements IEntityService, QueryService { +public class PurchaseOrdersService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(PurchaseOrdersService.class); @Lazy @Autowired private PurchaseOrderRepository purchaseOrderRepository; + @Lazy + @Autowired + private EmployeeService employeeService; + @Override @Cacheable(key = "#p0") public PurchaseOrder findById(Integer id) { @@ -126,4 +137,56 @@ public class PurchaseOrdersService implements IEntityService, Que }; return purchaseOrderRepository.findAll(spec, Pageable.ofSize(10)).getContent(); } + + @Override + public void updateByVo(PurchaseOrder model, PurchaseOrderVo vo) { + if (model == null || vo == null) { + throw new ServiceException("实体或VO对象不能为空"); + } + + // 设置基础属性 + model.setCode(vo.getCode()); + model.setRefId(vo.getRefId()); + model.setVendorCode(vo.getVendorCode()); + model.setDescription(vo.getDescription()); + + // 更新负责人信息 + if (vo.getContractId() == null) { + model.setContract(null); + } else { + model.setContract(SpringApp.getBean(ContractService.class).findById(vo.getContractId())); + } + EmployeeService employeeService = SpringApp.getBean(EmployeeService.class); + // 更新采购人信息 + if (vo.getEmployeeId() == null) { + model.setEmployee(null); + } else { + model.setEmployee(employeeService.findById(vo.getEmployeeId())); + } + // 更新制单人信息 + if (vo.getMakerId() == null) { + model.setMaker(null); + } else { + model.setMaker(employeeService.findById(vo.getMakerId())); + } + model.setMakerDate(vo.getMakerDate()); + model.setModifyDate(vo.getModifyDate()); + + // 更新审核人信息 + if (vo.getVerifierId() == null) { + model.setVerifier(null); + } else { + model.setVerifier(employeeService.findById(vo.getVerifierId())); + } + model.setVerifierDate(vo.getVerifierDate()); + + // 更新关闭人信息 + if (vo.getCloserId() == null) { + model.setCloser(null); + } else { + model.setCloser(employeeService.findById(vo.getCloserId())); + } + model.setCloserDate(vo.getCloserDate()); + } + } 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 2bfa8f4..2bb9dbc 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 @@ -1,15 +1,7 @@ package com.ecep.contract.ds.contract.service; -import com.ecep.contract.EntityService; -import com.ecep.contract.IEntityService; -import com.ecep.contract.QueryService; -import com.ecep.contract.ds.MyRepository; -import com.ecep.contract.ds.contract.repository.SalesOrderRepository; -import com.ecep.contract.model.Contract; -import com.ecep.contract.model.PurchaseOrder; -import com.ecep.contract.model.SalesOrder; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; +import java.util.List; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -18,14 +10,21 @@ 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.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; -import java.util.List; +import com.ecep.contract.EntityService; +import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; +import com.ecep.contract.ds.contract.repository.SalesOrderRepository; +import com.ecep.contract.ds.other.service.EmployeeService; +import com.ecep.contract.model.Contract; +import com.ecep.contract.model.SalesOrder; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.SalesOrderVo; +import com.fasterxml.jackson.databind.JsonNode; /** * 合同服务 @@ -33,7 +32,8 @@ import java.util.List; @Lazy @Service @CacheConfig(cacheNames = "contract-sale-order") -public class SaleOrdersService extends EntityService implements IEntityService, QueryService { +public class SaleOrdersService extends EntityService + implements IEntityService, QueryService, VoableService { private static final Logger logger = LoggerFactory.getLogger(SaleOrdersService.class); @Lazy @@ -55,7 +55,6 @@ public class SaleOrdersService extends EntityService implem return salesOrderRepository.findById(id).orElse(null); } - @Override protected Specification buildParameterSpecification(JsonNode paramsNode) { Specification spec = null; @@ -100,6 +99,41 @@ public class SaleOrdersService extends EntityService implem salesOrderRepository.delete(order); } + @Override + public void updateByVo(SalesOrder model, SalesOrderVo vo) { + // 更新基本属性 + model.setCode(vo.getCode()); + model.setMakerDate(vo.getMakerDate()); + model.setVerifierDate(vo.getVerifierDate()); + model.setDescription(vo.getDescription()); + + // 处理关联对象 + if (vo.getContractId() == null) { + model.setContract(null); + } else { + model.setContract(SpringApp.getBean(ContractService.class).findById(vo.getContractId())); + } + + if (vo.getEmployeeId() == null) { + model.setEmployee(null); + } else { + model.setEmployee(SpringApp.getBean(EmployeeService.class).findById(vo.getEmployeeId())); + } + + if (vo.getMakerId() == null) { + model.setMaker(null); + } else { + model.setMaker(SpringApp.getBean(EmployeeService.class).findById(vo.getMakerId())); + } + + if (vo.getVerifierId() == null) { + model.setVerifier(null); + } else { + model.setVerifier(SpringApp.getBean(EmployeeService.class).findById(vo.getVerifierId())); + } + + // active字段在SalesOrder实体类中不存在,不需要设置 + } public List findAllByContract(Contract contract) { return salesOrderRepository.findAllByContract(contract); diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/SalesBillVoucherService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/SalesBillVoucherService.java index 3a00ccd..fb6d9b3 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/SalesBillVoucherService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/SalesBillVoucherService.java @@ -2,12 +2,6 @@ package com.ecep.contract.ds.contract.service; import java.util.List; -import com.ecep.contract.EntityService; -import com.ecep.contract.QueryService; -import com.ecep.contract.ds.MyRepository; -import com.ecep.contract.model.SalesOrder; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -21,13 +15,21 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; +import com.ecep.contract.EntityService; import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; +import com.ecep.contract.ds.company.service.CompanyService; import com.ecep.contract.ds.contract.repository.SalesBillVoucherItemRepository; import com.ecep.contract.ds.contract.repository.SalesBillVoucherRepository; +import com.ecep.contract.ds.other.service.EmployeeService; import com.ecep.contract.model.SalesBillVoucher; import com.ecep.contract.model.SalesBillVoucherItem; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.SalesBillVoucherVo; +import com.fasterxml.jackson.databind.JsonNode; /** * 采购账单凭证服务 @@ -35,7 +37,9 @@ import com.ecep.contract.model.SalesBillVoucherItem; @Lazy @Service @CacheConfig(cacheNames = "sales-bill-voucher") -public class SalesBillVoucherService extends EntityService implements IEntityService, QueryService { +public class SalesBillVoucherService extends EntityService + implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(SalesBillVoucherService.class); @Lazy @@ -65,8 +69,7 @@ public class SalesBillVoucherService extends EntityService { return builder.or( builder.like(root.get("name"), "%" + searchText + "%"), - builder.like(root.get("code"), "%" + searchText + "%") - ); + builder.like(root.get("code"), "%" + searchText + "%")); }; } @@ -81,27 +84,22 @@ public class SalesBillVoucherService extends EntityService buildParameterSpecification(JsonNode paramsNode) { Specification spec = null; @@ -121,20 +119,16 @@ public class SalesBillVoucherService extends EntityService findAllItems(Specification spec, Sort sort) { return salesBillVoucherItemRepository.findAll(spec, sort); } + + @Override + public void updateByVo(SalesBillVoucher model, SalesBillVoucherVo vo) { + // 更新基本属性 + model.setRefId(vo.getRefId()); + model.setCode(vo.getCode()); + model.setMakerDate(vo.getMakerDate()); + model.setModifyDate(vo.getModifyDate()); + model.setVerifierDate(vo.getVerifierDate()); + model.setDescription(vo.getDescription()); + + // 处理关联对象 + if (vo.getCompanyId() == null) { + model.setCompany(null); + } else { + model.setCompany(SpringApp.getBean(CompanyService.class).findById(vo.getCompanyId())); + } + + if (vo.getOrderId() == null) { + model.setOrder(null); + } else { + model.setOrder(SpringApp.getBean(SaleOrdersService.class).findById(vo.getOrderId())); + } + + EmployeeService employeeService = SpringApp.getBean(EmployeeService.class); + if (vo.getEmployeeId() == null) { + model.setEmployee(null); + } else { + model.setEmployee(employeeService.findById(vo.getEmployeeId())); + } + + if (vo.getMakerId() == null) { + model.setMaker(null); + } else { + model.setMaker(employeeService.findById(vo.getMakerId())); + } + + if (vo.getVerifierId() == null) { + model.setVerifier(null); + } else { + model.setVerifier(employeeService.findById(vo.getVerifierId())); + } + } } 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 5cfcffa..0d66233 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,32 +1,32 @@ package com.ecep.contract.ds.contract.service; -import java.util.List; - -import com.ecep.contract.EntityService; -import com.ecep.contract.QueryService; -import com.ecep.contract.model.SalesOrder; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; 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.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; +import com.ecep.contract.EntityService; import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.contract.repository.SalesOrderItemRepository; import com.ecep.contract.model.SalesOrderItem; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.SalesOrderItemVo; +import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "contract-sale-order-item") -public class SalesOrderItemService extends EntityService implements IEntityService, QueryService { +public class SalesOrderItemService extends EntityService + implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private SalesOrderItemRepository repository; @@ -47,15 +47,13 @@ public class SalesOrderItemService extends EntityService buildSearchSpecification(String searchText) { return (root, query, builder) -> { return builder.or( builder.like(root.get("code"), "%" + searchText + "%"), builder.like(root.get("name"), "%" + searchText + "%"), - builder.like(root.get("description"), "%" + searchText + "%") - ); + builder.like(root.get("description"), "%" + searchText + "%")); }; } @@ -67,23 +65,47 @@ public class SalesOrderItemService extends EntityService, QueryService { + implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(CompanyCustomerEvaluationFormFileService.class); @Lazy @@ -127,4 +132,33 @@ public class CompanyCustomerEvaluationFormFileService return repository.findByCustomerFile(customerFile); } + @Override + public void updateByVo(CompanyCustomerEvaluationFormFile model, CompanyCustomerEvaluationFormFileVo vo) { + if (model == null) { + throw new ServiceException("实体对象不能为空"); + } + if (vo == null) { + throw new ServiceException("VO对象不能为空"); + } + + // 映射基本属性 + model.setCatalog(vo.getCatalog()); + model.setLevel(vo.getLevel()); + model.setCreditLevel(vo.getCreditLevel()); + + model.setScore1(vo.getScore1()); + model.setScore2(vo.getScore2()); + model.setScore3(vo.getScore3()); + model.setScore4(vo.getScore4()); + model.setScore5(vo.getScore5()); + + model.setScoreTemplateVersion(vo.getScoreTemplateVersion()); + + if (vo.getCustomerFile() != null) { + CompanyCustomerFileService service = SpringApp.getBean(CompanyCustomerFileService.class); + model.setCustomerFile(service.findById(vo.getCustomerFile())); + } else { + model.setCustomerFile(null); + } + } } \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileService.java b/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileService.java index a3f61a7..bed5714 100644 --- a/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileService.java @@ -36,7 +36,10 @@ import com.ecep.contract.model.CompanyCustomer; import com.ecep.contract.model.CompanyCustomerEvaluationFormFile; import com.ecep.contract.model.CompanyCustomerFile; import com.ecep.contract.model.Contract; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.CompanyCustomerFileVo; import com.fasterxml.jackson.databind.JsonNode; import jakarta.persistence.criteria.Path; @@ -45,7 +48,8 @@ import jakarta.persistence.criteria.Path; @Service @CacheConfig(cacheNames = "company-customer-file") public class CompanyCustomerFileService - implements IEntityService, QueryService { + implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(CompanyCustomerFileService.class); @Lazy @Autowired @@ -261,4 +265,30 @@ public class CompanyCustomerFileService return companyCustomerEvaluationFormFileRepository.findAll(spec, Pageable.ofSize(10)).getContent(); } + @Override + public void updateByVo(CompanyCustomerFile model, CompanyCustomerFileVo vo) { + if (model == null) { + throw new ServiceException("companyCustomerFile is null"); + } + if (vo == null) { + throw new ServiceException("companyCustomerFileVo is null"); + } + + model.setFilePath(vo.getFilePath()); + model.setType(vo.getType()); + model.setFilePath(vo.getFilePath()); + model.setEditFilePath(vo.getEditFilePath()); + + model.setSignDate(vo.getSignDate()); + model.setValid(vo.isValid()); + + if (vo.getCustomer() != null) { + CompanyCustomerService service = SpringApp.getBean(CompanyCustomerService.class); + model.setCustomer(service.findById(vo.getCustomer())); + } else { + model.setCustomer(null); + } + + } + } diff --git a/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileTypeService.java index b8c1863..0305340 100644 --- a/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/customer/service/CompanyCustomerFileTypeService.java @@ -1,14 +1,8 @@ package com.ecep.contract.ds.customer.service; -import com.ecep.contract.CustomerFileType; -import com.ecep.contract.IEntityService; -import com.ecep.contract.QueryService; -import com.ecep.contract.constant.ServiceConstant; -import com.ecep.contract.ds.customer.repository.CompanyCustomerFileTypeLocalRepository; -import com.ecep.contract.model.CompanyCustomerFileTypeLocal; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; -import jakarta.annotation.Resource; +import java.util.Locale; +import java.util.Map; + import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -20,13 +14,25 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import java.util.Locale; -import java.util.Map; +import com.ecep.contract.CustomerFileType; +import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.constant.ServiceConstant; +import com.ecep.contract.ds.customer.repository.CompanyCustomerFileTypeLocalRepository; +import com.ecep.contract.model.CompanyCustomerFileTypeLocal; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.CompanyCustomerFileTypeLocalVo; +import com.fasterxml.jackson.databind.JsonNode; + +import jakarta.annotation.Resource; @Lazy @Service @CacheConfig(cacheNames = "customer-file-type") -public class CompanyCustomerFileTypeService implements IEntityService, QueryService { +public class CompanyCustomerFileTypeService implements IEntityService, QueryService, + VoableService { @Resource private CompanyCustomerFileTypeLocalRepository repository; @@ -91,4 +97,19 @@ public class CompanyCustomerFileTypeService implements IEntityService, QueryService { +public class CustomerCatalogService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private CustomerCatalogRepository repository; @@ -148,4 +152,18 @@ public class CustomerCatalogService implements IEntityService, return repository.findAll(spec, pageable); } + @Override + public void updateByVo(CustomerCatalog model, CustomerCatalogVo vo) { + if (model == null) { + throw new ServiceException("实体对象不能为空"); + } + if (vo == null) { + throw new ServiceException("VO对象不能为空"); + } + + // 映射基本属性 + model.setCode(vo.getCode()); + model.setName(vo.getName()); + model.setDescription(vo.getDescription()); + } } \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java index d7350cd..e22dd34 100644 --- a/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java @@ -24,10 +24,15 @@ import com.ecep.contract.model.CustomerFileTypeLocal; import com.ecep.contract.util.SpecificationUtils; import com.fasterxml.jackson.databind.JsonNode; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.vo.CustomerFileTypeLocalVo; + @Lazy @Service @CacheConfig(cacheNames = "customer-file-type") -public class CustomerFileTypeService implements IEntityService, QueryService { +public class CustomerFileTypeService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private CustomerFileTypeLocalRepository repository; @@ -95,4 +100,19 @@ public class CustomerFileTypeService implements IEntityService, QueryService { +public class EmployeeAuthBindService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private EmployeeAuthBindRepository repository; @@ -75,4 +79,29 @@ public class EmployeeAuthBindService implements IEntityService public List findAllByEmployee(Employee employee, Sort sort) { return repository.findAllByEmployee(employee, sort); } + + @Override + public void updateByVo(EmployeeAuthBind model, EmployeeAuthBindVo vo) { + // 从VO映射属性到实体 + model.setIp(vo.getIp()); + model.setMac(vo.getMac()); + model.setCreateTime(vo.getCreateTime()); + model.setUpdateTime(vo.getUpdateTime()); + model.setDescription(vo.getDescription()); + + // employee和updater属性需要通过ID查找对应的实体 + EmployeeService employeeService = SpringApp.getBean(EmployeeService.class); + if (vo.getEmployeeId() != null) { + Employee employee = employeeService.findById(vo.getEmployeeId()); + model.setEmployee(employee); + } else { + model.setEmployee(null); + } + if (vo.getUpdaterId() != null) { + Employee updater = employeeService.findById(vo.getUpdaterId()); + model.setUpdater(updater); + } else { + model.setUpdater(null); + } + } } diff --git a/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeLoginHistoryService.java b/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeLoginHistoryService.java index 70e69c9..8d4e4c0 100644 --- a/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeLoginHistoryService.java +++ b/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeLoginHistoryService.java @@ -11,16 +11,21 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; -import com.fasterxml.jackson.databind.JsonNode; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.other.repository.EmployeeLoginHistoryRepository; import com.ecep.contract.model.EmployeeLoginHistory; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.EmployeeLoginHistoryVo; +import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "employee-login-history") public class EmployeeLoginHistoryService - implements IEntityService, QueryService { + implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private EmployeeLoginHistoryRepository repository; @@ -68,4 +73,25 @@ public class EmployeeLoginHistoryService public EmployeeLoginHistory save(EmployeeLoginHistory entity) { return repository.save(entity); } + + @Override + public void updateByVo(EmployeeLoginHistory model, EmployeeLoginHistoryVo vo) { + if (model == null) { + throw new ServiceException("EmployeeLoginHistory cannot be null"); + } + if (vo == null) { + throw new ServiceException("EmployeeLoginHistoryVo cannot be null"); + } + + // Map properties from VO to entity (id属性不更新) + if (vo.getEmployeeId() == null) { + model.setEmployee(null); + } else { + model.setEmployee(SpringApp.getBean(EmployeeService.class).findById(vo.getEmployeeId())); + } + model.setIp(vo.getIp()); + model.setMac(vo.getMac()); + model.setLoginTime(vo.getLoginTime()); + model.setActiveTime(vo.getActiveTime()); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/DeliverySignMethodService.java b/server/src/main/java/com/ecep/contract/ds/project/service/DeliverySignMethodService.java index 8cdb67b..253aee8 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/DeliverySignMethodService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/DeliverySignMethodService.java @@ -2,10 +2,6 @@ package com.ecep.contract.ds.project.service; import java.util.List; -import com.ecep.contract.QueryService; -import com.ecep.contract.model.CompanyBankAccount; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -19,14 +15,21 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.project.repository.ProductDeliverySignMethodRepository; import com.ecep.contract.model.DeliverySignMethod; import com.ecep.contract.model.ProjectSaleType; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.vo.DeliverySignMethodVo; +import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "project-sign-method") -public class DeliverySignMethodService implements IEntityService, QueryService { +public class DeliverySignMethodService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private ProductDeliverySignMethodRepository deliverySignMethodRepository; @@ -48,7 +51,7 @@ public class DeliverySignMethodService implements IEntityService, QueryService { +public class ProjectBidService implements IEntityService, QueryService, VoableService { private static final Logger logger = LoggerFactory.getLogger(ProjectBidService.class); @Lazy @@ -84,4 +88,55 @@ public class ProjectBidService implements IEntityService, QueryServi public List findAll(Specification spec, Sort sort) { return repository.findAll(spec, sort); } + + @Override + public void updateByVo(ProjectBid model, ProjectBidVo vo) { + if (model == null || vo == null) { + return; + } + + // 设置基本属性 + model.setLevel(vo.getLevel()); + model.setAmount(vo.getAmount()); + model.setStandardPayWay(vo.isStandardPayWay()); + model.setNoStandardPayWayText(vo.getNoStandardPayWayText()); + model.setStandardContractText(vo.isStandardContractText()); + model.setNoStandardContractText(vo.getNoStandardContractText()); + model.setAuthorizationFile(vo.getAuthorizationFile()); + model.setBidAcceptanceLetterFile(vo.getBidAcceptanceLetterFile()); + model.setApplyTime(vo.getApplyTime()); + model.setAuthorizationTime(vo.getAuthorizationTime()); + model.setDescription(vo.getDescription()); + + // 处理关联实体 + if (vo.getProject() == null) { + model.setProject(null); + } else { + model.setProject(SpringApp.getBean(ProjectService.class).findById(vo.getProject())); + } + + if (vo.getEvaluationFileId() == null) { + model.setEvaluationFile(null); + } else { + model.setEvaluationFile(SpringApp.getBean(CompanyCustomerEvaluationFormFileService.class).findById(vo.getEvaluationFileId())); + } + + if (vo.getCostId() == null) { + model.setCost(null); + } else { + model.setCost(SpringApp.getBean(ProjectCostService.class).findById(vo.getCostId())); + } + + if (vo.getApplicantId() == null) { + model.setApplicant(null); + } else { + model.setApplicant(SpringApp.getBean(EmployeeService.class).findById(vo.getApplicantId())); + } + + if (vo.getAuthorizerId() == null) { + model.setAuthorizer(null); + } else { + model.setAuthorizer(SpringApp.getBean(EmployeeService.class).findById(vo.getAuthorizerId())); + } + } } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostItemService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostItemService.java index 9f207a5..48358fe 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostItemService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostItemService.java @@ -7,14 +7,21 @@ import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; +import com.ecep.contract.ds.other.service.EmployeeService; +import com.ecep.contract.ds.other.service.InventoryService; import com.ecep.contract.ds.project.repository.ProjectCostItemRepository; +import com.ecep.contract.model.Employee; +import com.ecep.contract.model.Inventory; import com.ecep.contract.model.ProjectCost; import com.ecep.contract.model.ProjectCostItem; +import com.ecep.contract.service.ServiceException; import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; import com.ecep.contract.vo.ProjectCostItemVo; @@ -22,11 +29,18 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service -public class ProjectCostItemService implements IEntityService, QueryService, VoableService { +public class ProjectCostItemService implements IEntityService, QueryService, + VoableService { + + private final AuthenticationManager authenticationManager; @Lazy @Autowired private ProjectCostItemRepository repository; + ProjectCostItemService(AuthenticationManager authenticationManager) { + this.authenticationManager = authenticationManager; + } + @Override public ProjectCostItem findById(Integer id) { return repository.findById(id).orElse(null); @@ -76,8 +90,58 @@ public class ProjectCostItemService implements IEntityService, @Override public void updateByVo(ProjectCostItem item, ProjectCostItemVo vo) { - - throw new UnsupportedOperationException("Not supported yet."); - } + if (item == null) { + throw new ServiceException("ProjectCostItem is null"); + } + if (vo == null) { + throw new ServiceException("ProjectCostItemVo is null"); + } + item.setTitle(vo.getTitle()); + item.setSpecification(vo.getSpecification()); + item.setUnit(vo.getUnit()); + + item.setInTaxRate(vo.getInTaxRate()); + item.setInExclusiveTaxPrice(vo.getInExclusiveTaxPrice()); + item.setInQuantity(vo.getInQuantity()); + + item.setOutTaxRate(vo.getOutTaxRate()); + item.setOutExclusiveTaxPrice(vo.getOutExclusiveTaxPrice()); + item.setOutQuantity(vo.getOutQuantity()); + + item.setCreateDate(vo.getCreateDate()); + item.setUpdateDate(vo.getUpdateDate()); + + item.setRemark(vo.getRemark()); + + if (vo.getCostId() == null) { + item.setCost(null); + } else { + ProjectCostService costService = SpringApp.getBean(ProjectCostService.class); + ProjectCost cost = costService.findById(vo.getCostId()); + item.setCost(cost); + } + + if (vo.getInventoryId() == null) { + item.setInventory(null); + } else { + InventoryService inventoryService = SpringApp.getBean(InventoryService.class); + Inventory inventory = inventoryService.findById(vo.getInventoryId()); + item.setInventory(inventory); + } + + EmployeeService employeeService = SpringApp.getBean(EmployeeService.class); + if (vo.getCreatorId() == null) { + item.setCreator(null); + } else { + Employee creator = employeeService.findById(vo.getCreatorId()); + item.setCreator(creator); + } + if (vo.getUpdaterId() == null) { + item.setUpdater(null); + } else { + Employee updater = employeeService.findById(vo.getUpdaterId()); + item.setUpdater(updater); + } + } } 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 02eaa9f..d70b23d 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 @@ -3,10 +3,6 @@ package com.ecep.contract.ds.project.service; import java.util.Comparator; import java.util.List; -import com.ecep.contract.QueryService; -import com.ecep.contract.model.CompanyBankAccount; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -19,21 +15,31 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; +import com.ecep.contract.ds.contract.service.ContractService; +import com.ecep.contract.ds.other.service.EmployeeService; import com.ecep.contract.ds.project.repository.ProjectCostRepository; import com.ecep.contract.model.Contract; +import com.ecep.contract.model.Employee; import com.ecep.contract.model.Project; import com.ecep.contract.model.ProjectCost; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.ProjectCostVo; +import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service -public class ProjectCostService implements IEntityService, QueryService { +public class ProjectCostService + implements IEntityService, QueryService, VoableService { private static final Logger logger = LoggerFactory.getLogger(ProjectCostService.class); @Lazy @Autowired private ProjectCostRepository repository; - public ProjectCost findById(Integer id) { return repository.findById(id).orElse(null); } @@ -84,7 +90,6 @@ public class ProjectCostService implements IEntityService, QuerySer return repository.findAllByProject(project); } - public ProjectCost save(ProjectCost cost) { return repository.save(cost); } @@ -115,4 +120,89 @@ public class ProjectCostService implements IEntityService, QuerySer public List findAll(Specification spec, Sort sort) { return repository.findAll(spec, sort); } + + @Override + public void updateByVo(ProjectCost entity, ProjectCostVo vo) { + if (entity == null) { + throw new ServiceException("ProjectCost is null"); + } + if (vo == null) { + throw new ServiceException("ProjectCostVo is null"); + } + + // 基本字段映射 + // 准付款方式 和 合同文本 + entity.setStandardPayWay(vo.isStandardPayWay()); + entity.setNoStandardPayWayText(vo.getNoStandardPayWayText()); + entity.setStandardContractText(vo.isStandardContractText()); + entity.setNoStandardContractText(vo.getNoStandardContractText()); + + // 印花税率和税费 + entity.setStampTax(vo.getStampTax()); + entity.setStampTaxFee(vo.getStampTaxFee()); + + // 其他服务费用和运费 + entity.setOnSiteServiceFee(vo.getOnSiteServiceFee()); + entity.setAssemblyServiceFee(vo.getAssemblyServiceFee()); + entity.setTechnicalServiceFee(vo.getTechnicalServiceFee()); + entity.setBidServiceFee(vo.getBidServiceFee()); + entity.setFreightCost(vo.getFreightCost()); + entity.setGuaranteeLetterFee(vo.getGuaranteeLetterFee()); + // 营业税及附加费 + entity.setTaxAndSurcharges(vo.getTaxAndSurcharges()); + entity.setTaxAndSurchargesFee(vo.getTaxAndSurchargesFee()); + + // 数量和金额 + entity.setInQuantities(vo.getInQuantities()); + entity.setInTaxAmount(vo.getInTaxAmount()); + entity.setInExclusiveTaxAmount(vo.getInExclusiveTaxAmount()); + entity.setOutQuantities(vo.getOutQuantities()); + entity.setOutTaxAmount(vo.getOutTaxAmount()); + entity.setOutExclusiveTaxAmount(vo.getOutExclusiveTaxAmount()); + + // 毛利率 + entity.setGrossProfitMargin(vo.getGrossProfitMargin()); + + // + entity.setApplyTime(vo.getApplyTime()); + entity.setAuthorizationTime(vo.getAuthorizationTime()); + entity.setAuthorizationFile(vo.getAuthorizationFile()); + entity.setImportLock(vo.isImportLock()); + entity.setDescription(vo.getDescription()); + entity.setVersion(vo.getVersion()); + + // 处理关联实体 + if (vo.getProject() != null) { + Project project = SpringApp.getBean(ProjectService.class).findById(vo.getProject()); + entity.setProject(project); + } else { + entity.setProject(null); + } + + if (vo.getContractId() != null) { + Contract contract = SpringApp.getBean(ContractService.class).findById(vo.getContractId()); + if (contract != null) { + entity.setContract(contract); + } + } else { + entity.setContract(null); + } + + EmployeeService employeeService = SpringApp.getBean(EmployeeService.class); + if (vo.getApplicantId() != null) { + Employee applicant = employeeService.findById(vo.getApplicantId()); + if (applicant != null) { + entity.setApplicant(applicant); + } + } else { + entity.setApplicant(null); + } + + if (vo.getAuthorizerId() != null) { + Employee authorizer = employeeService.findById(vo.getAuthorizerId()); + if (authorizer != null) { + entity.setAuthorizer(authorizer); + } + } + } } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileService.java index 9bbaeca..0a272af 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileService.java @@ -5,10 +5,6 @@ import java.util.List; import java.util.Optional; import java.util.function.Consumer; -import com.ecep.contract.QueryService; -import com.ecep.contract.model.CompanyBankAccount; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -22,13 +18,20 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.ProjectFileType; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.project.repository.ProjectFileRepository; import com.ecep.contract.model.Project; import com.ecep.contract.model.ProjectFile; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.ProjectFileVo; +import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service -public class ProjectFileService implements IEntityService, QueryService { +public class ProjectFileService + implements IEntityService, QueryService, VoableService { private static final Logger logger = LoggerFactory.getLogger(ProjectFileService.class); @Autowired @@ -98,9 +101,26 @@ public class ProjectFileService implements IEntityService, QuerySer return projectFileRepository.saveAll(files); } + @Override + public void updateByVo(ProjectFile model, ProjectFileVo vo) { + if (model == null || vo == null) { + return; + } + + // 设置基本属性 + model.setType(vo.getType()); + model.setFilePath(vo.getFilePath()); + + // 处理关联实体 + if (vo.getProjectId() == null) { + model.setProject(null); + } else { + model.setProject(SpringApp.getBean(ProjectService.class).findById(vo.getProjectId())); + } + } + public List findAllByProjectAndType(Project project, ProjectFileType type) { return projectFileRepository.findByProjectAndType(project, type); } - } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileTypeService.java index ab6393e..ce06e02 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileTypeService.java @@ -20,13 +20,18 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.vo.ProjectFileTypeLocalVo; + import java.util.Locale; import java.util.Map; @Lazy @Service @CacheConfig(cacheNames = "project-file-type") -public class ProjectFileTypeService implements IEntityService, QueryService { +public class ProjectFileTypeService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired @@ -40,7 +45,8 @@ public class ProjectFileTypeService implements IEntityService builder.equal(root.get("type"), ProjectFileType.valueOf(paramsNode.get("type").asText()))); + spec = SpecificationUtils.and(spec, (root, query, builder) -> builder.equal(root.get("type"), + ProjectFileType.valueOf(paramsNode.get("type").asText()))); } // field @@ -70,10 +76,10 @@ public class ProjectFileTypeService implements IEntityService { return - // builder.or( - builder.like(root.get("type"), "%" + searchText + "%") - // ) - ; + // builder.or( + builder.like(root.get("type"), "%" + searchText + "%") + // ) + ; }; } @@ -94,4 +100,18 @@ public class ProjectFileTypeService implements IEntityService, QueryService { +public class ProjectQuotationService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(ProjectQuotationService.class); - @Lazy @Autowired private ProjectQuotationRepository repository; - public ProjectQuotation findById(Integer id) { return repository.findById(id).orElse(null); } @@ -49,7 +53,7 @@ public class ProjectQuotationService implements IEntityService spec = getSpecification(paramsNode.get("searchText").asText()); } // field - spec = SpecificationUtils.andParam(spec, paramsNode, "project", "applicant","authorizer"); + spec = SpecificationUtils.andParam(spec, paramsNode, "project", "applicant", "authorizer"); return findAll(spec, pageable); } @@ -70,7 +74,6 @@ public class ProjectQuotationService implements IEntityService repository.delete(approval); } - public ProjectQuotation newInstanceByProject(Project project) { ProjectQuotation approval = new ProjectQuotation(); approval.setProject(project); @@ -83,4 +86,49 @@ public class ProjectQuotationService implements IEntityService public List findAll(Specification spec, Sort sort) { return repository.findAll(spec, sort); } + + @Override + public void updateByVo(ProjectQuotation entity, ProjectQuotationVo vo) { + if (entity == null) { + throw new ServiceException("ProjectQuotation is null"); + } + if (vo == null) { + throw new ServiceException("ProjectQuotationVo is null"); + } + + entity.setLevel(vo.getLevel()); + entity.setStandardPayWay(vo.isStandardPayWay()); + entity.setNoStandardPayWayText(vo.getNoStandardPayWayText()); + entity.setAmount(vo.getAmount()); + entity.setApplyTime(vo.getApplyTime()); + entity.setAuthorizationTime(vo.getAuthorizationTime()); + entity.setDescription(vo.getDescription()); + + // 处理关联实体 + if (vo.getProject() != null) { + ProjectService projectService = SpringApp.getBean(ProjectService.class); + entity.setProject(projectService.findById(vo.getProject())); + } else { + entity.setProject(null); + } + + EmployeeService employeeService = SpringApp.getBean(EmployeeService.class); + if (vo.getApplicantId() != null) { + entity.setApplicant(employeeService.findById(vo.getApplicantId())); + } else { + entity.setApplicant(null); + } + + if (vo.getAuthorizerId() != null) { + entity.setAuthorizer(employeeService.findById(vo.getAuthorizerId())); + } else { + entity.setAuthorizer(null); + } + if(vo.getEvaluationFileId() != null){ + CompanyCustomerEvaluationFormFileService evaluationFileService = SpringApp.getBean(CompanyCustomerEvaluationFormFileService.class); + entity.setEvaluationFile(evaluationFileService.findById(vo.getEvaluationFileId())); + }else{ + entity.setEvaluationFile(null); + } + } } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java index dbcfc2d..605bc89 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java @@ -2,10 +2,6 @@ package com.ecep.contract.ds.project.service; import java.util.List; -import com.ecep.contract.QueryService; -import com.ecep.contract.model.CompanyBankAccount; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -17,14 +13,21 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; +import com.ecep.contract.ContractFileType; import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.project.repository.ProjectSaleTypeRequireFileTypeRepository; import com.ecep.contract.model.ProjectSaleTypeRequireFileType; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.ProjectSaleTypeRequireFileTypeVo; +import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "project-sale-type-require-file-type") -public class ProjectSaleTypeRequireFileTypeService implements IEntityService, QueryService { +public class ProjectSaleTypeRequireFileTypeService implements IEntityService, QueryService, VoableService { @Lazy @Autowired private ProjectSaleTypeRequireFileTypeRepository repository; @@ -92,5 +95,29 @@ public class ProjectSaleTypeRequireFileTypeService implements IEntityService, QueryService, VoableService { +public class ProjectSaleTypeService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private ProjectSaleTypeRepository saleTypeRepository; @@ -97,6 +98,10 @@ public class ProjectSaleTypeService implements IEntityService, @Override public void updateByVo(ProjectSaleType saleType, ProjectSaleTypeVo vo) { + if (saleType == null || vo == null) { + return; + } + // 映射基本属性 saleType.setName(vo.getName()); saleType.setCode(vo.getCode()); @@ -104,14 +109,13 @@ public class ProjectSaleTypeService implements IEntityService, saleType.setDescription(vo.getDescription()); saleType.setStoreByYear(vo.isStoreByYear()); saleType.setCriticalProjectDecision(vo.isCriticalProjectDecision()); - - // 处理Double类型的criticalProjectLimit - if (vo.getCriticalProjectLimit() != null) { - saleType.setCriticalProjectLimit(vo.getCriticalProjectLimit()); - } - + saleType.setCriticalProjectLimit(vo.getCriticalProjectLimit() != null ? vo.getCriticalProjectLimit() : 0); saleType.setActive(vo.isActive()); - + + saleType.setCriticalProjectLimit(vo.getCriticalProjectLimit()); + + saleType.setActive(vo.isActive()); + // ProjectSaleTypeVo中的created和version字段在ProjectSaleType实体中不存在,这里不做处理 // 如果需要处理,可以添加日志记录或者其他逻辑 } diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedFileService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedFileService.java index 93fd11e..a94b358 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedFileService.java @@ -10,13 +10,18 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import com.ecep.contract.IEntityService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.vendor.repository.VendorApprovedFileRepository; -import com.ecep.contract.model.VendorApprovedFile; import com.ecep.contract.model.VendorApproved; +import com.ecep.contract.model.VendorApprovedFile; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.vo.VendorApprovedFileVo; @Lazy @Service -public class VendorApprovedFileService implements IEntityService { +public class VendorApprovedFileService + implements IEntityService, VoableService { @Lazy @Autowired private VendorApprovedFileRepository repository; @@ -44,15 +49,14 @@ public class VendorApprovedFileService implements IEntityService { return builder.or( builder.like(root.get("fileName"), "%" + searchText + "%"), - builder.like(root.get("description"), "%" + searchText + "%") - ); + builder.like(root.get("description"), "%" + searchText + "%")); }; } /** * 根据查询规格和分页参数获取供应商已批准文件列表 * - * @param spec 查询规格 + * @param spec 查询规格 * @param pageable 分页参数 * @return 分页的文件列表 */ @@ -86,7 +90,7 @@ public class VendorApprovedFileService implements IEntityService findAllByList(VendorApproved list) { return repository.findAllByListId(list.getId()); } + + @Override + public void updateByVo(VendorApprovedFile entity, VendorApprovedFileVo vo) throws ServiceException { + if (entity == null) { + throw new ServiceException("VendorApprovedFile entity cannot be null"); + } + if (vo == null) { + throw new ServiceException("VendorApprovedFileVo cannot be null"); + } + + // 映射基本属性 + entity.setFileName(vo.getFileName()); + entity.setSignDate(vo.getSignDate()); + entity.setDescription(vo.getDescription()); + + // 处理关联实体 + if (vo.getListId() != null) { + VendorApprovedService vendorApprovedService = SpringApp.getBean(VendorApprovedService.class); + VendorApproved vendorApproved = vendorApprovedService.findById(vo.getListId()); + if (vendorApproved != null) { + entity.setList(vendorApproved); + } + } else { + entity.setList(null); + } + } } \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedItemService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedItemService.java index f387233..fa7c45d 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedItemService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedItemService.java @@ -3,9 +3,6 @@ package com.ecep.contract.ds.vendor.service; import java.util.List; import java.util.stream.Collectors; -import com.ecep.contract.QueryService; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; @@ -15,20 +12,30 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; import com.ecep.contract.ds.company.service.CompanyOldNameService; import com.ecep.contract.ds.vendor.repository.VendorApprovedItemRepository; import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyOldName; import com.ecep.contract.model.Vendor; -import com.ecep.contract.model.VendorApprovedItem; import com.ecep.contract.model.VendorApproved; +import com.ecep.contract.model.VendorApprovedItem; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.VendorApprovedItemVo; +import com.fasterxml.jackson.databind.JsonNode; import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Predicate; @Lazy @Service -public class VendorApprovedItemService implements IEntityService, QueryService { +public class VendorApprovedItemService implements IEntityService, QueryService, + VoableService { + + private final VendorApprovedFileService vendorApprovedFileService; @Lazy @Autowired private VendorApprovedItemRepository repository; @@ -36,6 +43,10 @@ public class VendorApprovedItemService implements IEntityService company = vendor.get("company"); List oldNames = companyOldNameService.search(searchText); - Predicate companyPredicate = oldNames.isEmpty() ? builder.like(company.get("name"), "%" + searchText + "%") : builder.or( - builder.like(company.get("name"), "%" + searchText + "%"), - company.get("id").in(oldNames.stream().map(CompanyOldName::getCompanyId).collect(Collectors.toList())) - ); + Predicate companyPredicate = oldNames.isEmpty() ? builder.like(company.get("name"), "%" + searchText + "%") + : builder.or( + builder.like(company.get("name"), "%" + searchText + "%"), + company.get("id").in( + oldNames.stream().map(CompanyOldName::getCompanyId).collect(Collectors.toList()))); return builder.or( builder.and( vendor.isNotNull(), builder.and( company.isNotNull(), - companyPredicate - )), + companyPredicate)), builder.like(root.get("vendorName"), "%" + searchText + "%"), - builder.like(root.get("description"), "%" + searchText + "%") - ); + builder.like(root.get("description"), "%" + searchText + "%")); }; } @@ -98,4 +108,36 @@ public class VendorApprovedItemService implements IEntityService findAllByListAndVendor(VendorApproved approvedList, Vendor vendor) { return repository.findAllByListAndVendor(approvedList, vendor); } + + @Override + public void updateByVo(VendorApprovedItem entity, VendorApprovedItemVo vo) throws ServiceException { + if (entity == null) { + throw new ServiceException("VendorApprovedItem entity cannot be null"); + } + if (vo == null) { + throw new ServiceException("VendorApprovedItemVo cannot be null"); + } + + // 映射基本属性 + entity.setVendorName(vo.getVendorName()); + entity.setType(vo.getType()); + entity.setDescription(vo.getDescription()); + + // 处理关联实体 + if (vo.getListId() != null) { + VendorApprovedService vendorApprovedService = SpringApp.getBean(VendorApprovedService.class); + VendorApproved vendorApproved = vendorApprovedService.findById(vo.getListId()); + if (vendorApproved != null) { + entity.setList(vendorApproved); + } + } + + if (vo.getVendorId() != null) { + VendorService vendorService = SpringApp.getBean(VendorService.class); + Vendor vendor = vendorService.findById(vo.getVendorId()); + if (vendor != null) { + entity.setVendor(vendor); + } + } + } } diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedService.java index f6b3bf6..c4373db 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedService.java @@ -1,17 +1,12 @@ package com.ecep.contract.ds.vendor.service; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; -import com.ecep.contract.IEntityService; -import com.ecep.contract.MyDateTimeUtils; -import com.ecep.contract.QueryService; -import com.ecep.contract.constant.CompanyVendorConstant; -import com.ecep.contract.ds.other.service.SysConfService; -import com.ecep.contract.ds.vendor.repository.VendorApprovedRepository; -import com.ecep.contract.model.VendorApprovedFile; -import com.ecep.contract.model.VendorApproved; -import com.ecep.contract.util.FileUtils; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -23,17 +18,25 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - +import com.ecep.contract.IEntityService; +import com.ecep.contract.MyDateTimeUtils; +import com.ecep.contract.QueryService; +import com.ecep.contract.constant.CompanyVendorConstant; +import com.ecep.contract.ds.other.service.SysConfService; +import com.ecep.contract.ds.vendor.repository.VendorApprovedRepository; +import com.ecep.contract.model.VendorApproved; +import com.ecep.contract.model.VendorApprovedFile; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.FileUtils; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.VendorApprovedVo; +import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service -public class VendorApprovedService implements IEntityService, QueryService { +public class VendorApprovedService implements IEntityService, QueryService, + VoableService { private static final Logger logger = LoggerFactory.getLogger(VendorApprovedService.class); @Lazy @Autowired @@ -49,7 +52,6 @@ public class VendorApprovedService implements IEntityService, Qu @Autowired private SysConfService confService; - public File getBasePath() { return new File(confService.getString(CompanyVendorConstant.KEY_APPROVED_LIST_BASE_PATH)); } @@ -195,7 +197,7 @@ public class VendorApprovedService implements IEntityService, Qu return modfied; } - //update db + // update db retrieveFiles.forEach(v -> { v.setList(list); fileService.save(v); @@ -212,4 +214,20 @@ public class VendorApprovedService implements IEntityService, Qu return vendorFile; } + @Override + public void updateByVo(VendorApproved model, VendorApprovedVo vo) { + if (model == null) { + throw new ServiceException("VendorApproved cannot be null"); + } + if (vo == null) { + throw new ServiceException("VendorApprovedVo cannot be null"); + } + + // Map properties from VO to entity + model.setTitle(vo.getTitle()); + model.setPublishDate(vo.getPublishDate()); + model.setPath(vo.getPath()); + model.setDescription(vo.getDescription()); + } + } diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorCatalogService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorCatalogService.java index 466d3ee..be59b6c 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorCatalogService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorCatalogService.java @@ -17,7 +17,10 @@ import com.ecep.contract.QueryService; import com.ecep.contract.constant.ServiceConstant; import com.ecep.contract.ds.vendor.repository.VendorClassRepository; import com.ecep.contract.model.VendorCatalog; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.VendorCatalogVo; import com.fasterxml.jackson.databind.JsonNode; /** @@ -27,7 +30,8 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "vendor-catalog") -public class VendorCatalogService implements IEntityService, QueryService { +public class VendorCatalogService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private VendorClassRepository repository; @@ -82,4 +86,19 @@ public class VendorCatalogService implements IEntityService, Quer public VendorCatalog save(VendorCatalog entity) { return repository.save(entity); } + + @Override + public void updateByVo(VendorCatalog model, VendorCatalogVo vo) { + if (model == null) { + throw new ServiceException("VendorCatalog cannot be null"); + } + if (vo == null) { + throw new ServiceException("VendorCatalogVo cannot be null"); + } + + // Map properties from VO to entity (id属性不更新) + model.setName(vo.getName()); + model.setCode(vo.getCode()); + model.setType(vo.getType()); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorEntityService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorEntityService.java index 5843214..ab72802 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorEntityService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorEntityService.java @@ -2,7 +2,6 @@ package com.ecep.contract.ds.vendor.service; import java.util.List; -import com.ecep.contract.QueryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -16,16 +15,22 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; +import com.ecep.contract.ds.other.service.EmployeeService; import com.ecep.contract.ds.vendor.repository.VendorEntityRepository; import com.ecep.contract.model.Vendor; import com.ecep.contract.model.VendorEntity; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.VendorEntityVo; import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "company-vendor-entity") -public class VendorEntityService implements IEntityService, QueryService { +public class VendorEntityService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private VendorEntityRepository repository; @@ -60,8 +65,7 @@ public class VendorEntityService implements IEntityService, QueryS return builder.or( builder.like(root.get("name"), "%" + searchText + "%"), builder.like(root.get("abbName"), "%" + searchText + "%"), - builder.like(root.get("code"), "%" + searchText + "%") - ); + builder.like(root.get("code"), "%" + searchText + "%")); }; } @@ -87,23 +91,19 @@ public class VendorEntityService implements IEntityService, QueryS return findAll(spec, pageable); } - @Caching( - evict = { - @CacheEvict(key = "#p0.id"), - @CacheEvict(key = "'code-'+#p0.code") - } - ) + @Caching(evict = { + @CacheEvict(key = "#p0.id"), + @CacheEvict(key = "'code-'+#p0.code") + }) @Override public void delete(VendorEntity entity) { repository.delete(entity); } - @Caching( - evict = { - @CacheEvict(key = "#p0.id"), - @CacheEvict(key = "'code-'+#p0.code") - } - ) + @Caching(evict = { + @CacheEvict(key = "#p0.id"), + @CacheEvict(key = "'code-'+#p0.code") + }) @Override public VendorEntity save(VendorEntity entity) { return repository.save(entity); @@ -112,4 +112,41 @@ public class VendorEntityService implements IEntityService, QueryS public List findAllByVendor(Vendor vendor) { return repository.findByVendor(vendor); } + + @Override + public void updateByVo(VendorEntity model, VendorEntityVo vo) { + // 处理关联对象 + if (vo.getVendorId() == null) { + model.setVendor(null); + } else { + model.setVendor(SpringApp.getBean(VendorService.class).findById(vo.getVendorId())); + } + + // 更新基本属性 + model.setName(vo.getName()); + model.setAbbName(vo.getAbbName()); + model.setCode(vo.getCode()); + model.setModifyDate(vo.getModifyDate()); + model.setDevelopDate(vo.getDevelopDate()); + model.setUpdatedDate(vo.getUpdatedDate()); + model.setFetchedTime(vo.getFetchedTime()); + + if (vo.getCatalogId() == null) { + model.setCatalog(null); + } else { + model.setCatalog(SpringApp.getBean(VendorCatalogService.class).findById(vo.getCatalogId())); + } + + EmployeeService employeeService = SpringApp.getBean(EmployeeService.class); + if (vo.getCreatorId() == null) { + model.setCreator(null); + } else { + model.setCreator(employeeService.findById(vo.getCreatorId())); + } + if (vo.getModifierId() == null) { + model.setModifier(null); + } else { + model.setModifier(employeeService.findById(vo.getModifierId())); + } + } } \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileService.java index d0c7c11..005bc1d 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileService.java @@ -6,9 +6,6 @@ import java.util.Comparator; import java.util.List; import java.util.function.Consumer; -import com.ecep.contract.*; -import com.ecep.contract.util.SpecificationUtils; -import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -19,19 +16,29 @@ import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; +import com.ecep.contract.IEntityService; +import com.ecep.contract.MessageHolder; +import com.ecep.contract.MyDateTimeUtils; +import com.ecep.contract.QueryService; +import com.ecep.contract.SpringApp; +import com.ecep.contract.VendorFileType; import com.ecep.contract.ds.company.service.CompanyBasicService; import com.ecep.contract.ds.contract.service.ContractFileService; import com.ecep.contract.ds.contract.service.ContractService; import com.ecep.contract.ds.vendor.repository.VendorFileRepository; +import com.ecep.contract.model.Contract; import com.ecep.contract.model.Vendor; import com.ecep.contract.model.VendorFile; -import com.ecep.contract.model.Contract; - +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; +import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.VendorFileVo; +import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service -public class VendorFileService implements IEntityService, QueryService { - +public class VendorFileService + implements IEntityService, QueryService, VoableService { private static final Logger logger = LoggerFactory.getLogger(VendorFileService.class); @@ -103,9 +110,9 @@ public class VendorFileService implements IEntityService, QueryServi /** * 验证供应商文件 * - * @param vendor 供应商 - * @param verifyDate 验证日期 - * @param holder 状态输出 + * @param vendor 供应商 + * @param verifyDate 验证日期 + * @param holder 状态输出 */ public void verify(Vendor vendor, LocalDate verifyDate, MessageHolder holder) { // 验证最早日期,之前属于历史问题,不做处理 @@ -207,5 +214,30 @@ public class VendorFileService implements IEntityService, QueryServi return CompanyBasicService.adjustToWorkDay(setupDate.plusDays(-7)); } + @Override + public void updateByVo(VendorFile model, VendorFileVo vo) { + if (model == null) { + throw new ServiceException("VendorFile cannot be null"); + } + if (vo == null) { + throw new ServiceException("VendorFileVo cannot be null"); + } + // Map properties from VO to entity + model.setType(vo.getType()); + model.setFilePath(vo.getFilePath()); + model.setEditFilePath(vo.getEditFilePath()); + model.setSignDate(vo.getSignDate()); + model.setValid(vo.isValid()); + + if (vo.getVendorId() == null) { + model.setVendor(null); + } else { + VendorService vendorService = SpringApp.getBean(VendorService.class); + model.setVendor(vendorService.findById(vo.getVendorId())); + } + + + + } } diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileTypeService.java index b27c68b..5792da2 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileTypeService.java @@ -3,7 +3,6 @@ package com.ecep.contract.ds.vendor.service; import java.util.Locale; import java.util.Map; -import com.ecep.contract.VendorType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -19,10 +18,14 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; import com.ecep.contract.VendorFileType; +import com.ecep.contract.VendorType; import com.ecep.contract.constant.ServiceConstant; import com.ecep.contract.ds.vendor.repository.VendorFileTypeLocalRepository; import com.ecep.contract.model.VendorFileTypeLocal; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.VendorFileTypeLocalVo; import com.fasterxml.jackson.databind.JsonNode; /** @@ -32,7 +35,8 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "vendor-file-type") -public class VendorFileTypeService implements IEntityService, QueryService { +public class VendorFileTypeService implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private VendorFileTypeLocalRepository repository; @@ -45,7 +49,8 @@ public class VendorFileTypeService implements IEntityService builder.equal(root.get("type"), VendorType.valueOf(paramsNode.get("type").asText()))); + spec = SpecificationUtils.and(spec, (root, query, builder) -> builder.equal(root.get("type"), + VendorType.valueOf(paramsNode.get("type").asText()))); } // field @@ -76,10 +81,10 @@ public class VendorFileTypeService implements IEntityService { return - // builder.or( - builder.like(root.get("type"), "%" + searchText + "%") - // ) - ; + // builder.or( + builder.like(root.get("type"), "%" + searchText + "%") + // ) + ; }; } @@ -100,4 +105,19 @@ public class VendorFileTypeService implements IEntityService, QueryService { +public class VendorGroupRequireFileTypeService + implements IEntityService, QueryService, + VoableService { @Lazy @Autowired private VendorGroupRequireFileTypeRepository repository; @@ -64,13 +71,11 @@ public class VendorGroupRequireFileTypeService implements IEntityService, QueryService { +public class VendorGroupService + implements IEntityService, QueryService, VoableService { @Lazy @Autowired private VendorGroupRepository vendorGroupRepository; @@ -96,4 +101,22 @@ public class VendorGroupService implements IEntityService, QuerySer return group; } + @Override + public void updateByVo(VendorGroup model, VendorGroupVo vo) { + if (model == null) { + throw new ServiceException("VendorGroup cannot be null"); + } + if (vo == null) { + throw new ServiceException("VendorGroupVo cannot be null"); + } + // Map properties from VO to entity + model.setName(vo.getName()); + model.setCode(vo.getCode()); + model.setDescription(vo.getDescription()); + model.setActive(vo.isActive()); + model.setPriceComparison(vo.isPriceComparison()); + model.setRequireQuotationSheetForBid(vo.isRequireQuotationSheetForBid()); + model.setCanPrePurchase(vo.isCanPrePurchase()); + } + } diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorTypeService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorTypeService.java index bfc1bf8..0dece40 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorTypeService.java @@ -21,13 +21,16 @@ import com.ecep.contract.VendorType; import com.ecep.contract.constant.ServiceConstant; import com.ecep.contract.ds.vendor.repository.VendorTypeLocalRepository; import com.ecep.contract.model.VendorTypeLocal; +import com.ecep.contract.service.ServiceException; +import com.ecep.contract.service.VoableService; import com.ecep.contract.util.SpecificationUtils; +import com.ecep.contract.vo.VendorTypeLocalVo; import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "vendor-type") -public class VendorTypeService implements IEntityService, QueryService { +public class VendorTypeService implements IEntityService, QueryService, VoableService { @Lazy @Autowired private VendorTypeLocalRepository repository; @@ -95,4 +98,19 @@ public class VendorTypeService implements IEntityService, Query public VendorTypeLocal save(VendorTypeLocal entity) { return repository.save(entity); } + + @Override + public void updateByVo(VendorTypeLocal entity, VendorTypeLocalVo vo) throws ServiceException { + if (entity == null) { + throw new ServiceException("VendorTypeLocal entity cannot be null"); + } + if (vo == null) { + throw new ServiceException("VendorTypeLocalVo cannot be null"); + } + + // 映射基本属性 + entity.setLang(vo.getLang()); + entity.setType(vo.getType()); + entity.setValue(vo.getValue()); + } }