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) {