diff --git a/src/main/java/cn/palmte/work/controller/backend/ProcessController.java b/src/main/java/cn/palmte/work/controller/backend/ProcessController.java index 1352815..1ce19c7 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProcessController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProcessController.java @@ -528,12 +528,16 @@ public class ProcessController { Integer contractId = contract.getId(); + // 本次表单的数据为全量数据 需要删除 + List supplierMaterialsToRemove = processService.getSupplierMaterials(processId); if (!CollectionUtils.isEmpty(form.supplierMaterials)) { for (SupplierMaterial material : form.supplierMaterials) { material.setProcessId(processId); material.setContractId(contractId); // 更新或者新增 if (material.getId() != null) { + // 更新了某个ID的数据就不删除了 + supplierMaterialsToRemove.remove(material); entityManager.merge(material); } else { @@ -542,16 +546,21 @@ public class ProcessController { } } + for (SupplierMaterial material : supplierMaterialsToRemove) { + entityManager.remove(material); + } + + List purchaseAmountToRemove = processService.getProcessPurchaseAmount(processId); + List purchaseDetailToRemove = processService.getProcessPurchaseDetail(processId); + if (!CollectionUtils.isEmpty(form.purchaseAmount)) { for (BudgetPurchaseAmountModel amountForm : form.purchaseAmount) { // 草稿模式也不允许为空 (基础数据), 更新ID不能为空 Assert.notNull(amountForm.amount, "合同明细填写不完整"); - Assert.notNull(amountForm.amountId, "合同明细填写不完整"); Assert.notNull(amountForm.budgetCostId, "合同明细填写不完整"); // 新建 BudgetPurchaseAmount purchaseAmount = new BudgetPurchaseAmount(); - purchaseAmount.setId(amountForm.amountId); purchaseAmount.setProcessId(processId); purchaseAmount.setContractId(contractId); purchaseAmount.setAmount(amountForm.amount); @@ -565,7 +574,15 @@ public class ProcessController { purchaseAmount.setSubmit(true); } - entityManager.merge(purchaseAmount); + if (amountForm.amountId != null) { + // 更新了某个ID的数据就不删除了 + purchaseAmount.setId(amountForm.amountId); + purchaseAmountToRemove.remove(purchaseAmount); + entityManager.merge(purchaseAmount); + } + else { + entityManager.persist(purchaseAmount); + } Integer amountId = purchaseAmount.getId(); // ID 自动生成或者使用之前已经有的 // 保存成本对应的 明细 @@ -573,19 +590,35 @@ public class ProcessController { for (BudgetPurchaseDetailModel detail : amountForm.details) { BudgetPurchaseDetail purchaseDetail = new BudgetPurchaseDetail(); // 关联主键 - purchaseDetail.setId(detail.id); purchaseDetail.setAmountId(amountId); purchaseDetail.setProcessId(processId); purchaseDetail.setContractId(contractId); purchaseDetail.setBudgetCostId(amountForm.budgetCostId); BeanUtils.copyProperties(detail, purchaseDetail, "details"); - entityManager.merge(purchaseDetail); + + if (detail.id != null) { + // 更新了某个ID的数据就不删除了 + purchaseDetail.setId(detail.id); + purchaseDetailToRemove.remove(purchaseDetail); + entityManager.merge(purchaseDetail); + } + else { + entityManager.persist(purchaseDetail); + } } } } } + // 删除 + for (BudgetPurchaseAmount amount : purchaseAmountToRemove) { + entityManager.remove(amount); + } + + for (BudgetPurchaseDetail detail : purchaseDetailToRemove) { + entityManager.remove(detail); + } } if (form.getStatus() == ProcessStatus.to_be_audit) { @@ -697,8 +730,7 @@ public class ProcessController { } private boolean isStartAuditProgress(ProjectTaskRecord record) { - return Objects.equals("提交申请", record.getTaskName()) - && Objects.equals("提交销售合同流程", record.getTaskComment()); + return Objects.equals("提交申请", record.getTaskName()); } private ProjectProcess obtainProjectProcess(int id) { diff --git a/src/main/java/cn/palmte/work/model/process/BudgetPurchaseAmount.java b/src/main/java/cn/palmte/work/model/process/BudgetPurchaseAmount.java index 377e084..6a94f67 100644 --- a/src/main/java/cn/palmte/work/model/process/BudgetPurchaseAmount.java +++ b/src/main/java/cn/palmte/work/model/process/BudgetPurchaseAmount.java @@ -1,9 +1,11 @@ package cn.palmte.work.model.process; +import org.hibernate.Hibernate; import org.hibernate.annotations.GenericGenerator; import java.io.Serializable; import java.math.BigDecimal; +import java.util.Objects; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -12,7 +14,10 @@ import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; -import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; /** * 采购合同流程预算采购明细的数量记录 @@ -25,7 +30,10 @@ import lombok.Data; * @author Harry Yang * @since 2.0 2022/12/28 14:15 */ -@Data +@Getter +@Setter +@ToString +@RequiredArgsConstructor @Entity @Table(name = "procurement_contract_budget_purchase_amount") public class BudgetPurchaseAmount implements Serializable { @@ -60,4 +68,19 @@ public class BudgetPurchaseAmount implements Serializable { return submit != null && submit; } + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) + return false; + BudgetPurchaseAmount that = (BudgetPurchaseAmount) o; + return id != null && Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + } diff --git a/src/main/java/cn/palmte/work/model/process/BudgetPurchaseDetail.java b/src/main/java/cn/palmte/work/model/process/BudgetPurchaseDetail.java index 7859635..aa42ae2 100644 --- a/src/main/java/cn/palmte/work/model/process/BudgetPurchaseDetail.java +++ b/src/main/java/cn/palmte/work/model/process/BudgetPurchaseDetail.java @@ -1,9 +1,11 @@ package cn.palmte.work.model.process; +import org.hibernate.Hibernate; import org.hibernate.annotations.GenericGenerator; import java.io.Serializable; import java.math.BigDecimal; +import java.util.Objects; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -12,6 +14,10 @@ import javax.persistence.Id; import javax.persistence.Table; import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; /** * 采购合同流程预算采购明细的详情 @@ -21,7 +27,10 @@ import lombok.Data; * @author Harry Yang * @since 2.0 2022/12/28 11:41 */ -@Data +@Getter +@Setter +@ToString +@RequiredArgsConstructor @Entity @Table(name = "procurement_contract_budget_purchase_detail") public class BudgetPurchaseDetail implements Serializable { @@ -62,4 +71,19 @@ public class BudgetPurchaseDetail implements Serializable { // 项目的成本明细ID private Integer budgetCostId; + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) + return false; + BudgetPurchaseDetail that = (BudgetPurchaseDetail) o; + return id != null && Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + } diff --git a/src/main/java/cn/palmte/work/service/ProjectProcessService.java b/src/main/java/cn/palmte/work/service/ProjectProcessService.java index bd6c58d..622a0a5 100644 --- a/src/main/java/cn/palmte/work/service/ProjectProcessService.java +++ b/src/main/java/cn/palmte/work/service/ProjectProcessService.java @@ -378,7 +378,7 @@ public class ProjectProcessService { return amountQuery.getResultList(); } catch (NoResultException e) { - return null; + return new ArrayList<>(); } } @@ -402,6 +402,18 @@ public class ProjectProcessService { return amountQuery.getResultList(); } + public List getProcessPurchaseDetail(Integer processId) { + TypedQuery amountQuery = entityManager.createQuery( + "from BudgetPurchaseDetail where processId=:processId", BudgetPurchaseDetail.class); + amountQuery.setParameter("processId", processId); + try { + return amountQuery.getResultList(); + } + catch (NoResultException e) { + return new ArrayList<>(); + } + } + /** * 计算当前已经提交的采购数量 */