From ddd9dad9458fdb67de4c77be6c09c788eb9bb190 Mon Sep 17 00:00:00 2001 From: songqq Date: Sun, 12 Oct 2025 00:52:01 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E8=AE=A2=E5=8D=95=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=8F=8A=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构采购订单模块,包括以下改进: 1. 移除PurchaseOrderItemVo中冗余字段 2. 在ContractCtx中添加调试日志 3. 修改InventoryTabSkinContracts和PurchaseOrderTabSkinBillVoucher中的equals比较逻辑 4. 调整PurchaseOrderVo的税率字段类型并添加锁定标志 5. 修正FXML文件中的控制器路径 6. 优化InventoryStringConverter的toString方法格式 7. 在PurchaseBillVoucherItemService中添加凭证查询条件 8. 改进ContractRepairTasker的进度更新逻辑 9. 修复AbstContractRepairTasker中的子合同同步问题 10. 优化PurchaseOrderTabSkinItems的表格列显示 11. 添加InventoryCatalogStringConverter及相关缓存支持 12. 完善PurchaseBillVoucherService的查询逻辑 13. 增强ContractService的库存查询功能 14. 改进PurchaseOrderItemService的合同项查询逻辑 15. 为InventoryService添加缓存支持 16. 优化ContractTabSkinPurchaseOrders的员工列显示 17. 改进ContractTabSkinItemsV2的数量显示逻辑 18. 重构PurchaseOrderViewModel的数据绑定逻辑 --- .../inventory/InventoryTabSkinContracts.java | 2 +- .../tab/ContractTabSkinItemsV2.java | 36 ++++++- .../tab/ContractTabSkinPurchaseOrders.java | 8 +- .../table/cell/AsyncUpdateTableCell.java | 18 +--- .../table/cell/InventoryTableCell.java | 10 +- .../order/PurchaseOrderTabSkinBase.java | 4 +- .../PurchaseOrderTabSkinBillVoucher.java | 2 +- .../order/PurchaseOrderTabSkinItems.java | 2 +- .../InventoryCatalogStringConverter.java | 46 ++++++++ .../converter/InventoryStringConverter.java | 4 +- .../service/InventoryCatalogService.java | 34 ++++++ .../contract/service/InventoryService.java | 28 +++++ .../contract/vm/PurchaseOrderViewModel.java | 102 +++++++++++------- .../purchase-bill-voucher-tab-item.fxml | 2 +- .../ui/contract/purchase-bill-voucher.fxml | 2 +- .../purchase-orders-tab-bill-voucher.fxml | 2 +- .../ui/contract/purchase-orders-tab-item.fxml | 5 +- .../ui/contract/purchase-orders.fxml | 3 +- .../ecep/contract/vo/PurchaseOrderItemVo.java | 3 - .../com/ecep/contract/vo/PurchaseOrderVo.java | 4 +- .../contract/cloud/u8/ctx/ContractCtx.java | 1 + .../cloud/u8/ctx/PurchaseOrderCtx.java | 12 +++ .../ds/contract/service/ContractService.java | 14 ++- .../PurchaseBillVoucherItemService.java | 3 + .../service/PurchaseBillVoucherService.java | 14 +++ .../service/PurchaseOrderItemService.java | 24 +++++ .../service/PurchaseOrdersService.java | 3 + .../tasker/AbstContractRepairTasker.java | 4 +- .../ds/vendor/model/PurchaseOrder.java | 11 +- .../service/tasker/ContractRepairTasker.java | 3 +- 30 files changed, 316 insertions(+), 90 deletions(-) create mode 100644 client/src/main/java/com/ecep/contract/converter/InventoryCatalogStringConverter.java diff --git a/client/src/main/java/com/ecep/contract/controller/inventory/InventoryTabSkinContracts.java b/client/src/main/java/com/ecep/contract/controller/inventory/InventoryTabSkinContracts.java index e77bb67..f65d539 100644 --- a/client/src/main/java/com/ecep/contract/controller/inventory/InventoryTabSkinContracts.java +++ b/client/src/main/java/com/ecep/contract/controller/inventory/InventoryTabSkinContracts.java @@ -92,7 +92,7 @@ public class InventoryTabSkinContracts @Override public ParamUtils.Builder getSpecification(InventoryVo parent) { ParamUtils.Builder params = getSpecification(); - params.equals("inventory", parent); + params.equals("inventory", parent.getId()); return params; } diff --git a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinItemsV2.java b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinItemsV2.java index b8fa835..8331e3c 100644 --- a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinItemsV2.java +++ b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinItemsV2.java @@ -5,32 +5,36 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.HashMap; +import com.ecep.contract.SpringApp; import com.ecep.contract.controller.contract.AbstContractTableTabSkin; import com.ecep.contract.controller.contract.ContractWindowController; import com.ecep.contract.controller.inventory.InventoryWindowController; import com.ecep.contract.controller.table.EditableEntityTableTabSkin; +import com.ecep.contract.controller.table.cell.AsyncUpdateTableCell; import com.ecep.contract.controller.table.cell.EmployeeTableCell; import com.ecep.contract.controller.table.cell.InventoryTableCell; import com.ecep.contract.controller.table.cell.LocalDateTimeTableCell; import com.ecep.contract.service.ContractItemService; import com.ecep.contract.service.InventoryService; +import com.ecep.contract.service.PurchaseOrderItemService; import com.ecep.contract.util.FxmlPath; +import com.ecep.contract.util.ParamUtils; import com.ecep.contract.vm.ContractItemComposeViewModel; import com.ecep.contract.vm.ContractItemViewModel; import com.ecep.contract.vm.InventoryViewModel; import com.ecep.contract.vo.ContractItemVo; import com.ecep.contract.vo.InventoryVo; +import com.ecep.contract.vo.PurchaseOrderItemVo; import javafx.application.Platform; -import javafx.scene.control.ContextMenu; -import javafx.scene.control.MenuItem; -import javafx.scene.control.Tab; -import javafx.scene.control.TableColumn; +import javafx.scene.control.*; import javafx.scene.control.cell.TextFieldTableCell; +import javafx.util.Callback; import javafx.util.StringConverter; import javafx.util.converter.CurrencyStringConverter; import javafx.util.converter.NumberStringConverter; import lombok.Setter; +import org.springframework.data.domain.Pageable; @FxmlPath("/ui/contract/contract-tab-item-v2.fxml") public class ContractTabSkinItemsV2 @@ -128,7 +132,7 @@ public class ContractTabSkinItemsV2 taxPriceColumn.setCellFactory(TextFieldTableCell.forTableColumn(currencyStringConverter)); quantityColumn.setCellValueFactory(param -> param.getValue().getQuantity()); - quantityColumn.setCellFactory(TextFieldTableCell.forTableColumn(new NumberStringConverter(getLocale()))); + quantityColumn.setCellFactory(QuantityTableCell.forTableColumn(new NumberStringConverter(getLocale()))); taxAmountColumn.setCellValueFactory(param -> param.getValue().getTaxAmount()); taxAmountColumn.setCellFactory(TextFieldTableCell.forTableColumn(currencyStringConverter)); @@ -185,4 +189,26 @@ public class ContractTabSkinItemsV2 showInOwner(InventoryWindowController.class, InventoryViewModel.from(inventory)); }); } + + public static class QuantityTableCell extends AsyncUpdateTableCell { + public static Callback, TableCell> forTableColumn(NumberStringConverter stringConverter) { + ; + return param -> new QuantityTableCell(stringConverter); + } + + public QuantityTableCell(NumberStringConverter stringConverter) { + setService(SpringApp.getBean(PurchaseOrderItemService.class)); + } + + @Override + protected void setLoadingText() { + setText("-/" + getItem()); + } + + @Override + protected void asyncLoadAndUpdate() { + double sum = getService().findAll(ParamUtils.equal("contractItem", this.getTableRow().getItem().getId().get()), Pageable.unpaged()).stream().mapToDouble(PurchaseOrderItemVo::getQuantity).sum(); + Platform.runLater(() -> setText(sum + "/" + getItem())); + } + } } diff --git a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinPurchaseOrders.java b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinPurchaseOrders.java index e21baa7..20c0313 100644 --- a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinPurchaseOrders.java +++ b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinPurchaseOrders.java @@ -3,6 +3,7 @@ package com.ecep.contract.controller.tab; import java.time.LocalDateTime; import com.ecep.contract.ContractPayWay; +import com.ecep.contract.controller.table.cell.EmployeeTableCell; import com.ecep.contract.util.FxmlPath; import com.ecep.contract.controller.contract.AbstContractTableTabSkin; import com.ecep.contract.controller.contract.ContractWindowController; @@ -70,17 +71,16 @@ public class ContractTabSkinPurchaseOrders idColumn.setCellValueFactory(param -> param.getValue().getId()); codeColumn.setCellValueFactory(param -> param.getValue().getCode()); - EmployeeStringConverter converter = getEmployeeStringConverter(); table_makerColumn.setCellValueFactory(param -> param.getValue().getMaker()); - table_makerColumn.setCellFactory(CompanyTableCell.forTableColumn(getCompanyService())); + table_makerColumn.setCellFactory(EmployeeTableCell.forTableColumn(getEmployeeService())); table_makerDateColumn.setCellValueFactory(param -> param.getValue().getMakerDate()); table_makerDateColumn.setCellFactory(param -> new LocalDateTimeTableCell<>()); table_verifierColumn.setCellValueFactory(param -> param.getValue().getMaker()); - table_verifierColumn.setCellFactory(CompanyTableCell.forTableColumn(getCompanyService())); + table_verifierColumn.setCellFactory(EmployeeTableCell.forTableColumn(getEmployeeService())); table_verifierDateColumn.setCellValueFactory(param -> param.getValue().getVerifierDate()); table_verifierDateColumn.setCellFactory(param -> new LocalDateTimeTableCell<>()); table_closerColumn.setCellValueFactory(param -> param.getValue().getMaker()); - table_closerColumn.setCellFactory(CompanyTableCell.forTableColumn(getCompanyService())); + table_closerColumn.setCellFactory(EmployeeTableCell.forTableColumn(getEmployeeService())); table_closerDateColumn.setCellValueFactory(param -> param.getValue().getCloserDate()); table_closerDateColumn.setCellFactory(param -> new LocalDateTimeTableCell<>()); diff --git a/client/src/main/java/com/ecep/contract/controller/table/cell/AsyncUpdateTableCell.java b/client/src/main/java/com/ecep/contract/controller/table/cell/AsyncUpdateTableCell.java index 713d8e9..260c6a9 100644 --- a/client/src/main/java/com/ecep/contract/controller/table/cell/AsyncUpdateTableCell.java +++ b/client/src/main/java/com/ecep/contract/controller/table/cell/AsyncUpdateTableCell.java @@ -77,15 +77,14 @@ public class AsyncUpdateTableCell extends javafx setText(null); return; } - // if (isInitialized(itemId)) { - // setText(format(itemId)); - // return; - // } - - setText("# " + itemId); + setLoadingText(); syncFuture = submit(this::asyncLoadAndUpdate); } + protected void setLoadingText() { + setText("# " + getItem()); + } + /** * 检查实体是否已初始化 * @@ -126,15 +125,8 @@ public class AsyncUpdateTableCell extends javafx if (getItem() == null) { return; } - - // if (getService() instanceof QueryService queryService) { - // queryService.findById(getItem().getId()); - // queryService.asyncFindById(getItem().getId()).thenAccept(this::_updateEntity); - // return; - // } T entity = initialize(); _updateEntity(entity); - } private void _updateEntity(T entity) { diff --git a/client/src/main/java/com/ecep/contract/controller/table/cell/InventoryTableCell.java b/client/src/main/java/com/ecep/contract/controller/table/cell/InventoryTableCell.java index fc42ced..b2bac10 100644 --- a/client/src/main/java/com/ecep/contract/controller/table/cell/InventoryTableCell.java +++ b/client/src/main/java/com/ecep/contract/controller/table/cell/InventoryTableCell.java @@ -14,7 +14,7 @@ import lombok.NoArgsConstructor; public class InventoryTableCell extends AsyncUpdateTableCell { /** * 创建单元格工厂 - * + * * @param inventoryService 库存服务 * @return 单元格工厂 */ @@ -22,12 +22,12 @@ public class InventoryTableCell extends AsyncUpdateTableCell new InventoryTableCell<>(inventoryService); } - + /** * 创建单元格工厂,支持自定义StringConverter - * + * * @param inventoryService 库存服务 - * @param converter 字符串转换器 + * @param converter 字符串转换器 * @return 单元格工厂 */ public static Callback, javafx.scene.control.TableCell> forTableColumn( @@ -57,7 +57,7 @@ public class InventoryTableCell extends AsyncUpdateTableCell property) { - EmployeeStringConverter converter = getEmployeeStringConverter(); UITools.autoCompletion(textField, property, controller.getEmployeeService()); } diff --git a/client/src/main/java/com/ecep/contract/controller/vendor/purchase/order/PurchaseOrderTabSkinBillVoucher.java b/client/src/main/java/com/ecep/contract/controller/vendor/purchase/order/PurchaseOrderTabSkinBillVoucher.java index b019ea8..98d4455 100644 --- a/client/src/main/java/com/ecep/contract/controller/vendor/purchase/order/PurchaseOrderTabSkinBillVoucher.java +++ b/client/src/main/java/com/ecep/contract/controller/vendor/purchase/order/PurchaseOrderTabSkinBillVoucher.java @@ -125,7 +125,7 @@ public class PurchaseOrderTabSkinBillVoucher public Builder getSpecification(PurchaseOrderVo parent) { Builder params = getSpecification(); - params.equals("purchaseOrder", parent); + params.equals("purchaseOrder", parent.getId()); return params; } diff --git a/client/src/main/java/com/ecep/contract/controller/vendor/purchase/order/PurchaseOrderTabSkinItems.java b/client/src/main/java/com/ecep/contract/controller/vendor/purchase/order/PurchaseOrderTabSkinItems.java index 5630d37..187f56a 100644 --- a/client/src/main/java/com/ecep/contract/controller/vendor/purchase/order/PurchaseOrderTabSkinItems.java +++ b/client/src/main/java/com/ecep/contract/controller/vendor/purchase/order/PurchaseOrderTabSkinItems.java @@ -149,7 +149,7 @@ public class PurchaseOrderTabSkinItems idColumn.setCellValueFactory(param -> param.getValue().getId()); refIdColumn.setCellValueFactory(param -> param.getValue().getRefId()); nameColumn.setCellValueFactory(param -> param.getValue().getInventory()); - nameColumn.setCellFactory(col -> new InventoryTableCell<>()); + nameColumn.setCellFactory(InventoryTableCell.forTableColumn(getInventoryService())); // unitColumn.setCellValueFactory(param -> param.getValue().getInventory()); // unitColumn.setCellFactory(col -> new UnitTableCell()); NumberCellFactory v1 = new NumberCellFactory("%,.1f", null); diff --git a/client/src/main/java/com/ecep/contract/converter/InventoryCatalogStringConverter.java b/client/src/main/java/com/ecep/contract/converter/InventoryCatalogStringConverter.java new file mode 100644 index 0000000..7a95cc9 --- /dev/null +++ b/client/src/main/java/com/ecep/contract/converter/InventoryCatalogStringConverter.java @@ -0,0 +1,46 @@ +package com.ecep.contract.converter; + +import com.ecep.contract.service.InventoryCatalogService; +import com.ecep.contract.vo.InventoryCatalogVo; +import javafx.util.StringConverter; + +/** + * 存货分类字符串转换器 + * 用于在UI组件中显示存货分类信息并支持从字符串还原存货分类对象 + */ +public class InventoryCatalogStringConverter extends StringConverter { + + /** 存货分类服务,用于从字符串查找对应的存货分类对象 */ + private final InventoryCatalogService service; + + /** + * 构造函数 + * + * @param service 存货分类服务实例 + */ + public InventoryCatalogStringConverter(InventoryCatalogService service) { + this.service = service; + } + + /** + * 将存货分类对象转换为字符串表示 + * + * @param object 存货分类对象 + * @return 存货分类的名称,如果对象为null则返回空字符串 + */ + @Override + public String toString(InventoryCatalogVo object) { + return object == null ? "" : object.getName(); + } + + /** + * 从字符串还原存货分类对象 + * + * @param string 存货分类名称 + * @return 对应的存货分类对象,如果未找到则返回null + */ + @Override + public InventoryCatalogVo fromString(String string) { + return service.findByName(string); + } +} \ No newline at end of file diff --git a/client/src/main/java/com/ecep/contract/converter/InventoryStringConverter.java b/client/src/main/java/com/ecep/contract/converter/InventoryStringConverter.java index a4d0a02..ef7a865 100644 --- a/client/src/main/java/com/ecep/contract/converter/InventoryStringConverter.java +++ b/client/src/main/java/com/ecep/contract/converter/InventoryStringConverter.java @@ -9,7 +9,7 @@ import javafx.util.StringConverter; * 用于在UI组件中显示存货信息并支持从字符串还原存货对象 */ public class InventoryStringConverter extends StringConverter { - + /** 存货服务,用于从字符串查找对应的存货对象 */ private final InventoryService service; @@ -30,7 +30,7 @@ public class InventoryStringConverter extends StringConverter { */ @Override public String toString(InventoryVo object) { - return object == null ? "" : (object.getName()+"-"+ object.getSpecification()); + return object == null ? "" : (object.getName() + "-" + object.getSpecification()); } /** diff --git a/client/src/main/java/com/ecep/contract/service/InventoryCatalogService.java b/client/src/main/java/com/ecep/contract/service/InventoryCatalogService.java index b7d2e9b..fbfd476 100644 --- a/client/src/main/java/com/ecep/contract/service/InventoryCatalogService.java +++ b/client/src/main/java/com/ecep/contract/service/InventoryCatalogService.java @@ -1,5 +1,11 @@ package com.ecep.contract.service; +import com.ecep.contract.converter.InventoryCatalogStringConverter; +import javafx.util.StringConverter; +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.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -9,7 +15,15 @@ import com.ecep.contract.vm.InventoryCatalogViewModel; import com.ecep.contract.vo.InventoryCatalogVo; @Service +@CacheConfig(cacheNames = "inventory-catalog") public class InventoryCatalogService extends QueryService { + private StringConverter stringConverter = new InventoryCatalogStringConverter<>(this); + + @Cacheable(key = "#p0") + @Override + public InventoryCatalogVo findById(Integer id) { + return super.findById(id); + } public InventoryCatalogVo findByName(String name) { Page page = findAll(ParamUtils.builder().equals("name", name).build(), Pageable.ofSize(1)); @@ -19,4 +33,24 @@ public class InventoryCatalogService extends QueryService getStringConverter() { + return stringConverter; + } } diff --git a/client/src/main/java/com/ecep/contract/service/InventoryService.java b/client/src/main/java/com/ecep/contract/service/InventoryService.java index 5fcdc2f..c6d119b 100644 --- a/client/src/main/java/com/ecep/contract/service/InventoryService.java +++ b/client/src/main/java/com/ecep/contract/service/InventoryService.java @@ -6,6 +6,10 @@ import com.ecep.contract.converter.CustomerFileTypeStringConverter; import com.ecep.contract.converter.InventoryStringConverter; import com.ecep.contract.vo.CustomerFileTypeLocalVo; import javafx.util.StringConverter; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -15,9 +19,11 @@ import com.ecep.contract.util.ParamUtils; import com.ecep.contract.vm.InventoryViewModel; import com.ecep.contract.vo.InventoryVo; +@CacheConfig(cacheNames = "inventory") @Service public class InventoryService extends QueryService { private final StringConverter stringConverter = new InventoryStringConverter(this); + @Override public InventoryVo createNewEntity() { InventoryVo inventory = new InventoryVo(); @@ -32,6 +38,12 @@ public class InventoryService extends QueryService page = findAll(ParamUtils.builder().equals("code", code).build(), Pageable.ofSize(1)); if (page.isEmpty()) { @@ -48,6 +60,22 @@ public class InventoryService extends QueryService getStringConverter() { return stringConverter; 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 2befa78..e9781b5 100644 --- a/client/src/main/java/com/ecep/contract/vm/PurchaseOrderViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/PurchaseOrderViewModel.java @@ -6,11 +6,7 @@ import java.util.Objects; import com.ecep.contract.vo.PurchaseOrderVo; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleDoubleProperty; -import javafx.beans.property.SimpleIntegerProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.*; import lombok.Data; import lombok.EqualsAndHashCode; @@ -20,13 +16,11 @@ public class PurchaseOrderViewModel extends IdentityViewModel { SimpleIntegerProperty refId = new SimpleIntegerProperty(); SimpleObjectProperty contractId = new SimpleObjectProperty<>(); SimpleStringProperty code = new SimpleStringProperty(); - SimpleObjectProperty orderDate = new SimpleObjectProperty<>(); + SimpleStringProperty vendorCode = new SimpleStringProperty(); SimpleDoubleProperty totalAmount = new SimpleDoubleProperty(); SimpleDoubleProperty taxAmount = new SimpleDoubleProperty(); - SimpleDoubleProperty taxRate = new SimpleDoubleProperty(); - SimpleIntegerProperty statusId = new SimpleIntegerProperty(); - SimpleStringProperty remark = new SimpleStringProperty(); - SimpleBooleanProperty active = new SimpleBooleanProperty(); + SimpleFloatProperty taxRate = new SimpleFloatProperty(); + SimpleBooleanProperty taxRateLocked = new SimpleBooleanProperty(); // 保留原有的员工相关字段 SimpleObjectProperty employee = new SimpleObjectProperty<>(); SimpleObjectProperty maker = new SimpleObjectProperty<>(); @@ -46,38 +40,23 @@ public class PurchaseOrderViewModel extends IdentityViewModel { getContractId().set(v.getContractId()); } getCode().set(v.getCode()); + getVendorCode().set(v.getVendorCode()); + // 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); + getTaxRate().set(v.getTaxRate()); + taxRateLocked.set(v.isTaxRateLocked()); // 保留原有的员工相关字段设置 - if (getEmployee() != null && getEmployee().get() != null) { - getEmployee().set(getEmployee().get()); - } - if (getMaker() != null && getMaker().get() != null) { - getMaker().set(getMaker().get()); - } - if (getVerifier() != null && getVerifier().get() != null) { - getVerifier().set(getVerifier().get()); - } - if (getCloser() != null && getCloser().get() != null) { - getCloser().set(getCloser().get()); - } - if (getMakerDate() != null && getMakerDate().get() != null) { - getMakerDate().set(getMakerDate().get()); - } - if (getModifyDate() != null && getModifyDate().get() != null) { - getModifyDate().set(getModifyDate().get()); - } - if (getVerifierDate() != null && getVerifierDate().get() != null) { - getVerifierDate().set(getVerifierDate().get()); - } - if (getCloserDate() != null && getCloserDate().get() != null) { - getCloserDate().set(getCloserDate().get()); - } - if (getDescription() != null && getDescription().get() != null) { - getDescription().set(getDescription().get()); - } + employee.set(v.getEmployeeId()); + maker.set(v.getEmployeeId()); + verifier.set(v.getVerifierId()); + closer.set(v.getCloserId()); + makerDate.set(v.getMakerDate()); + modifyDate.set(v.getModifyDate()); + verifierDate.set(v.getVerifierDate()); + closerDate.set(v.getCloserDate()); + description.set(v.getDescription()); } @Override @@ -95,6 +74,10 @@ public class PurchaseOrderViewModel extends IdentityViewModel { v.setCode(code.get()); modified = true; } + if (!Objects.equals(vendorCode.get(), v.getVendorCode())) { + v.setVendorCode(vendorCode.get()); + modified = true; + } if (!Objects.equals(totalAmount.get(), v.getTotalAmount())) { v.setTotalAmount(totalAmount.get()); modified = true; @@ -107,11 +90,48 @@ public class PurchaseOrderViewModel extends IdentityViewModel { v.setTaxRate(taxRate.get()); modified = true; } - if (!Objects.equals(taxRate.get(), v.getTaxRate())) { - v.setTaxRate(taxRate.get()); + if (!Objects.equals(taxRateLocked.get(), v.isTaxRateLocked())) { + v.setTaxRateLocked(taxRateLocked.get()); modified = true; } - + + if (!Objects.equals(getEmployee().get(), v.getEmployeeId())) { + v.setEmployeeId(getEmployee().get()); + modified = true; + } + + if (!Objects.equals(getMaker().get(), v.getMakerId())) { + v.setMakerId(getMaker().get()); + modified = true; + } + + if (!Objects.equals(getVerifier().get(), v.getVerifierId())) { + v.setVerifierId(getVerifier().get()); + modified = true; + } + + if (!Objects.equals(getCloser().get(), v.getCloserId())) { + v.setCloserId(getCloser().get()); + modified = true; + } + + + if (!Objects.equals(getMakerDate().get(), v.getMakerDate())) { + v.setMakerDate(getMakerDate().get()); + modified = true; + } + + + if (!Objects.equals(getModifyDate().get(), v.getModifyDate())) { + v.setModifyDate(getModifyDate().get()); + modified = true; + } + + if (!Objects.equals(getCloserDate().get(), v.getCloserDate())) { + v.setCloserDate(getCloserDate().get()); + modified = true; + } + if (!Objects.equals(description.get(), v.getDescription())) { v.setDescription(description.get()); modified = true; diff --git a/client/src/main/resources/ui/contract/purchase-bill-voucher-tab-item.fxml b/client/src/main/resources/ui/contract/purchase-bill-voucher-tab-item.fxml index f7ddd1f..9814d77 100644 --- a/client/src/main/resources/ui/contract/purchase-bill-voucher-tab-item.fxml +++ b/client/src/main/resources/ui/contract/purchase-bill-voucher-tab-item.fxml @@ -5,7 +5,7 @@ + fx:controller="com.ecep.contract.controller.vendor.purchase.purchase_bill.PurchaseBillVoucherTabSkinItems"> diff --git a/client/src/main/resources/ui/contract/purchase-bill-voucher.fxml b/client/src/main/resources/ui/contract/purchase-bill-voucher.fxml index fa292e7..8e0e264 100644 --- a/client/src/main/resources/ui/contract/purchase-bill-voucher.fxml +++ b/client/src/main/resources/ui/contract/purchase-bill-voucher.fxml @@ -6,7 +6,7 @@ + fx:controller="com.ecep.contract.controller.vendor.purchase.purchase_bill.PurchaseBillVoucherWindowController"> diff --git a/client/src/main/resources/ui/contract/purchase-orders-tab-bill-voucher.fxml b/client/src/main/resources/ui/contract/purchase-orders-tab-bill-voucher.fxml index e7a957e..0844cbd 100644 --- a/client/src/main/resources/ui/contract/purchase-orders-tab-bill-voucher.fxml +++ b/client/src/main/resources/ui/contract/purchase-orders-tab-bill-voucher.fxml @@ -5,7 +5,7 @@ + fx:controller="com.ecep.contract.controller.vendor.purchase.order.PurchaseOrderTabSkinBillVoucher"> diff --git a/client/src/main/resources/ui/contract/purchase-orders-tab-item.fxml b/client/src/main/resources/ui/contract/purchase-orders-tab-item.fxml index e2f8c15..4c8d23a 100644 --- a/client/src/main/resources/ui/contract/purchase-orders-tab-item.fxml +++ b/client/src/main/resources/ui/contract/purchase-orders-tab-item.fxml @@ -5,7 +5,7 @@ + fx:controller="com.ecep.contract.controller.vendor.purchase.order.PurchaseOrderTabSkinItems"> @@ -23,8 +23,7 @@ prefWidth="75.0" text="ID"/> - + prefWidth="130.0" text="存货"/> - +
diff --git a/common/src/main/java/com/ecep/contract/vo/PurchaseOrderItemVo.java b/common/src/main/java/com/ecep/contract/vo/PurchaseOrderItemVo.java index 5bd47d2..c91334e 100644 --- a/common/src/main/java/com/ecep/contract/vo/PurchaseOrderItemVo.java +++ b/common/src/main/java/com/ecep/contract/vo/PurchaseOrderItemVo.java @@ -14,9 +14,6 @@ public class PurchaseOrderItemVo implements IdentityEntity, java.io.Serializable private Integer order; private Integer inventoryId; - private Integer purchaseOrderId; - private Integer contractItemId; - private String itemName; private Integer refId; private Double quantity; private Double price; 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 312ef0f..d4cbcd2 100644 --- a/common/src/main/java/com/ecep/contract/vo/PurchaseOrderVo.java +++ b/common/src/main/java/com/ecep/contract/vo/PurchaseOrderVo.java @@ -4,6 +4,7 @@ import java.time.LocalDateTime; import com.ecep.contract.model.IdentityEntity; +import jakarta.persistence.Column; import lombok.Data; @Data @@ -28,7 +29,8 @@ public class PurchaseOrderVo implements IdentityEntity, ContractBasedVo, java.io private Double totalAmount; private Double taxAmount; - private Double taxRate; + private float taxRate = 0; + private boolean taxRateLocked = false; private String description; } \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java index f2525dc..4ee104b 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java @@ -178,6 +178,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { Map data; try { data = repository.queryContractDetail(guid); + holder.debug("查询合同详情成功, guid=" + guid); } catch (Exception e) { throw new RuntimeException("查询合同详情失败, guid=" + guid, e); } diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseOrderCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseOrderCtx.java index 33abeac..c308029 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseOrderCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/PurchaseOrderCtx.java @@ -186,6 +186,14 @@ public class PurchaseOrderCtx extends AbstractYongYouU8Ctx { return new ArrayList<>(updateMap.keySet()); } + /** + * 同步采购订单条目 + * + * @param order + * @param map + * @param holder + * @return + */ private boolean applyPurchaseOrderDetail(PurchaseOrder order, Map map, MessageHolder holder) { String code = (String) map.get("cPOID"); @@ -203,6 +211,10 @@ public class PurchaseOrderCtx extends AbstractYongYouU8Ctx { modified = true; } + if (updateNumber(order::getTaxRate, order::setTaxRate, (float) map.get("iTaxRate"), holder, "税率")) { + modified = true; + } + if (updateEmployeeByCode(order::getEmployee, order::setEmployee, (String) map.get("cPersonCode"), holder, "业务员")) { modified = true; 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 711b275..11ac383 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractService.java @@ -9,7 +9,9 @@ import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.ecep.contract.ds.contract.model.ContractItem; import com.ecep.contract.vo.ContractCatalogVo; +import jakarta.persistence.criteria.Root; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -122,7 +124,7 @@ public class ContractService extends EntityService findAllByCompany(CompanyVo company, ContractPayWay payWay, LocalDate beginDate, - LocalDate endDate) { + LocalDate endDate) { return contractRepository.findAll((root, query, cb) -> { Predicate p = cb.and( cb.equal(root.get("company").get("id"), company.getId()), @@ -280,6 +282,16 @@ public class ContractService extends EntityService { + Root itemRoot = query.from(ContractItem.class); + return cb.and( + cb.equal(itemRoot.get("inventory").get("id"), paramsNode.get("inventory").asInt()), + cb.equal(root, itemRoot.get("contract")) + ); + }); + } return spec; } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherItemService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherItemService.java index d1563fc..159e5cb 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherItemService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/PurchaseBillVoucherItemService.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.util.SpecificationUtils; import com.ecep.contract.vo.ContractVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; @@ -63,6 +64,8 @@ public class PurchaseBillVoucherItemService if (paramsNode.has("searchText")) { spec = getSpecification(paramsNode.get("searchText").asText()); } + + spec = SpecificationUtils.andParam(spec, paramsNode, "voucher"); return findAll(spec, pageable); } 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 8c56678..ef59015 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 @@ -2,6 +2,9 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.ds.vendor.model.PurchaseBillVoucherItem; +import com.ecep.contract.ds.vendor.model.PurchaseOrderItem; +import jakarta.persistence.criteria.Root; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -130,6 +133,17 @@ public class PurchaseBillVoucherService } // field spec = SpecificationUtils.andParam(spec, paramsNode, "company", "inventory"); + if (paramsNode.has("purchaseOrder")) { + spec = SpecificationUtils.and(spec, (root, query, cb) -> { + Root voucherItemRoot = query.from(PurchaseBillVoucherItem.class); + Root orderItemRoot = query.from(PurchaseOrderItem.class); + return cb.and( + cb.equal(voucherItemRoot.get("orderItem"), orderItemRoot), + cb.equal(orderItemRoot.get("order").get("id"), paramsNode.get("purchaseOrder").asInt()), + cb.equal(root, voucherItemRoot.get("voucher")) + ); + }); + } return findAll(spec, pageable).map(PurchaseBillVoucher::toVo); } 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 10c8a2a..fbc1642 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 @@ -3,6 +3,7 @@ package com.ecep.contract.ds.contract.service; import java.util.List; import com.ecep.contract.ds.vendor.model.PurchaseOrder; +import com.ecep.contract.vo.ContractItemVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -90,6 +91,29 @@ public class PurchaseOrderItemService implements IEntityService { + return builder.and( + builder.equal(root.get("order").get("contract").get("id"), contractItem.getContractId()), + builder.equal(root.get("inventory").get("id"), null) + ); + }); + } else { + spec = SpecificationUtils.and(spec, (root, query, builder) -> { + return builder.and( + builder.equal(root.get("order").get("contract").get("id"), contractItem.getContractId()), + builder.equal(root.get("inventory").get("id"), contractItem.getInventoryId()) + ); + }); + } + + } + return findAll(spec, pageable).map(PurchaseOrderItem::toVo); } 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 824fd11..b1b4708 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 @@ -77,6 +77,7 @@ public class PurchaseOrdersService implements IEntityService, Que public PurchaseOrderVo findByRefId(Integer refId) { return repository.findByRefId(refId).map(PurchaseOrder::toVo).orElse(null); } + public PurchaseOrder getByRefId(Integer refId) { return repository.findByRefId(refId).orElse(null); } @@ -161,6 +162,8 @@ public class PurchaseOrdersService implements IEntityService, Que model.setCode(vo.getCode()); model.setRefId(vo.getRefId()); model.setVendorCode(vo.getVendorCode()); + model.setTaxRate(vo.getTaxRate()); + model.setTaxRateLocked(vo.isTaxRateLocked()); model.setDescription(vo.getDescription()); // 处理关联实体 - 合同 diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/AbstContractRepairTasker.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/AbstContractRepairTasker.java index 0206015..f04ac07 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/AbstContractRepairTasker.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/AbstContractRepairTasker.java @@ -265,12 +265,12 @@ public abstract class AbstContractRepairTasker extends Tasker { }); v1 = contractProperty.get(); - var projectVo = projectService.findById(projectId); + var projectVo = projectId == null ? null : projectService.findById(projectId); if (contractCtx.updateContractProject(v1, projectVo, subHolder)) { modified = true; } } catch (Exception e) { - throw new RuntimeException("同步子合同失败, 合同b编号:" + v1.getCode(), e); + throw new RuntimeException("同步子合同失败, 合同编号:" + v1.getCode(), e); } if (modified) { try { diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/model/PurchaseOrder.java b/server/src/main/java/com/ecep/contract/ds/vendor/model/PurchaseOrder.java index 32daa66..dda3bdd 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/model/PurchaseOrder.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/model/PurchaseOrder.java @@ -61,6 +61,12 @@ public class PurchaseOrder @Column(name = "VEN_CODE") private String vendorCode; + + @Column(name = "TAX_RATE") + private float taxRate; + + @Column(name = "TAX_RATE_LOCKED") + private boolean taxRateLocked; /** * 制单人 */ @@ -95,6 +101,7 @@ public class PurchaseOrder @JoinColumn(name = "CLOSER_ID") @ToString.Exclude private Employee closer; + @Column(name = "CLOSER_DATE") private LocalDateTime closerDate; @@ -134,7 +141,7 @@ public class PurchaseOrder vo.setCode(code); vo.setRefId(refId); vo.setVendorCode(vendorCode); - vo.setDescription(description); + vo.setMakerDate(makerDate); vo.setModifyDate(modifyDate); vo.setVerifierDate(verifierDate); @@ -152,6 +159,8 @@ public class PurchaseOrder if (closer != null) { vo.setCloserId(closer.getId()); } + + vo.setDescription(description); return vo; } } diff --git a/server/src/main/java/com/ecep/contract/service/tasker/ContractRepairTasker.java b/server/src/main/java/com/ecep/contract/service/tasker/ContractRepairTasker.java index adf8a4d..4147bb4 100644 --- a/server/src/main/java/com/ecep/contract/service/tasker/ContractRepairTasker.java +++ b/server/src/main/java/com/ecep/contract/service/tasker/ContractRepairTasker.java @@ -43,6 +43,7 @@ public class ContractRepairTasker extends AbstContractRepairTasker implements We if (contract.getPayWay() == ContractPayWay.PAY) { if (StringUtils.hasText(contract.getParentCode())) { parent = contractCtx.findContractByCode(contract.getParentCode()); + holder.info("找到上级合同 " + parent.getCode() + " - " + parent.getName()); } } @@ -54,7 +55,7 @@ public class ContractRepairTasker extends AbstContractRepairTasker implements We setContract(contractProperty.get()); - updateProgress(1, 1); + updateProgress(100, 100); } public void setContract(ContractVo contract) {