From 810b8523b03e5ee739b834f3a67d2a050d84f93d Mon Sep 17 00:00:00 2001 From: myf Date: Fri, 11 Sep 2026 15:31:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application-tenant/tenant-admin/pom.xml | 2 +- common/common-association/pom.xml | 2 +- .../java/apelet/association/model/Quotation.java | 6 ++ .../plugin/quotation/ReviewPastPlugin.java | 72 +++++++++++++++++++++- 4 files changed, 77 insertions(+), 5 deletions(-) diff --git a/application-tenant/tenant-admin/pom.xml b/application-tenant/tenant-admin/pom.xml index 867b72e..02afce9 100644 --- a/application-tenant/tenant-admin/pom.xml +++ b/application-tenant/tenant-admin/pom.xml @@ -100,7 +100,7 @@ apelet common-online - 1.0.3 + 1.0.5 apelet diff --git a/common/common-association/pom.xml b/common/common-association/pom.xml index 9e7b096..1e7b5b2 100644 --- a/common/common-association/pom.xml +++ b/common/common-association/pom.xml @@ -47,7 +47,7 @@ apelet common-online - 1.0.3 + 1.0.5 common-orm diff --git a/common/common-association/src/main/java/apelet/association/model/Quotation.java b/common/common-association/src/main/java/apelet/association/model/Quotation.java index 0a33823..3944c00 100644 --- a/common/common-association/src/main/java/apelet/association/model/Quotation.java +++ b/common/common-association/src/main/java/apelet/association/model/Quotation.java @@ -140,6 +140,12 @@ public class Quotation implements Serializable { private String status; /** + * 是否转为合同(0: 非合同 1: 合同) + */ + @TableField("is_contract") + private Integer isContract; + + /** * 取消原因 */ @TableField("canaelreason") diff --git a/common/common-association/src/main/java/apelet/association/plugin/quotation/ReviewPastPlugin.java b/common/common-association/src/main/java/apelet/association/plugin/quotation/ReviewPastPlugin.java index ffe870d..990f684 100644 --- a/common/common-association/src/main/java/apelet/association/plugin/quotation/ReviewPastPlugin.java +++ b/common/common-association/src/main/java/apelet/association/plugin/quotation/ReviewPastPlugin.java @@ -8,14 +8,30 @@ import apelet.common.generator.utils.OrmGenDataSourceUtil; import apelet.common.online.plugin.BeginOperationTransactionArgs; import apelet.common.online.plugin.OperationServicePlugIn; import apelet.common.online.plugin.OperationServicePlugInArgs; +import apelet.common.orm.impl.Filter; +import apelet.common.orm.impl.FilterItem; import apelet.common.orm.impl.Selector; import apelet.common.orm.impl.SelectorItem; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + /* 审核通过插件 +审核通过后:报价单状态置 3(已审核)、is_contract 置 1(转为合同), +并将报价单主表数据写入 contract 表、报价单附表数据同步写入 contract_e 表。 */ public class ReviewPastPlugin extends OperationServicePlugIn { + /** + * 写入合同表时需跳过的字段: + * id 由 addNew 自动生成;status/canaelreason/is_contract 为报价单特有字段,合同表无对应列 + */ + private static final Set SKIP_CONTRACT_FIELDS = new HashSet<>(Arrays.asList( + "id", "status", "canaelreason", "is_contract")); + private final OrmGenDataSourceUtil ormGenDataSourceUtil; public ReviewPastPlugin() { @@ -38,12 +54,62 @@ public class ReviewPastPlugin extends OperationServicePlugIn { try { // 获取单据对象 ObjectValue bill = modelCollcetion.getObject(i); - bill.put("status", "3"); - bill.put("billstatus", "C"); + String quotationId = bill.getString("id"); + + // 1. 查询报价单完整数据(用于更新状态及复制写入合同表) + ObjectValue quotation = ormGenDataSourceUtil.queryOne("quotation", Long.valueOf(quotationId)); + if (quotation == null) { + throw new MyRuntimeException("报价单不存在,id=" + quotationId); + } + + // 2. 审核通过:状态置 3、billstatus 置 C、is_contract 置 1(转为合同) + quotation.put("status", "3"); + quotation.put("billstatus", "C"); + quotation.put("is_contract", "1"); Selector selector = new Selector(); selector.getList().add(new SelectorItem("status")); selector.getList().add(new SelectorItem("billstatus")); - ormGenDataSourceUtil.update(bill.getTableName(), bill, selector); + selector.getList().add(new SelectorItem("is_contract")); + ormGenDataSourceUtil.update(quotation.getTableName(), quotation, selector); + + // 3. 将报价单数据写入合同表(跳过 id 及报价单特有字段) + ObjectValue contract = new ObjectValue("contract"); + for (Object fieldObj : quotation.getValues().entrySet()) { + Map.Entry field = (Map.Entry) fieldObj; + String fieldName = String.valueOf(field.getKey()); + if (SKIP_CONTRACT_FIELDS.contains(fieldName)) { + continue; + } + contract.put(fieldName, field.getValue()); + } + ObjectValue newContract = ormGenDataSourceUtil.addNew("contract", contract); + Object newContractId = newContract.get("id"); + if (newContractId == null) { + throw new MyRuntimeException("写入合同表失败,未生成合同ID"); + } + String contractId = String.valueOf(newContractId); + + // 4. 报价单附表数据同步写入合同附表,parent_id 指向新写入的合同主表 id + Filter entryFilter = new Filter(); + entryFilter.add(new FilterItem("parent_id", FilterItem.equals, quotationId)); + ObjectCollection quotationEntries = ormGenDataSourceUtil.query("quotation_e", entryFilter, new Selector()); + if (quotationEntries != null && !quotationEntries.isEmpty()) { + for (int j = 0; j < quotationEntries.size(); j++) { + ObjectValue quotationEntry = quotationEntries.getObject(j); + ObjectValue contractEntry = new ObjectValue("contract_e"); + for (Object fieldObj : quotationEntry.getValues().entrySet()) { + Map.Entry field = (Map.Entry) fieldObj; + String fieldName = String.valueOf(field.getKey()); + if ("id".equals(fieldName)) { + continue; + } + contractEntry.put(fieldName, field.getValue()); + } + contractEntry.put("parent_id", contractId); + ormGenDataSourceUtil.addNew("contract_e", contractEntry); + } + } + } catch (Exception ex) { throw new MyRuntimeException(ex.getMessage()); }