From 18f21e1c78118848964464a160c90cb3635066f7 Mon Sep 17 00:00:00 2001 From: xuhaihui <2098865055@qq.com> Date: Mon, 22 Sep 2025 10:55:11 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=87=BA=E5=BA=93=E5=8D=95=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E6=8A=A5=E9=94=99bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/MaterialInventoryUtilsExt.java | 127 +++++++++--------- .../plugin/operate/MaterialOutBillOpExt.java | 8 +- 2 files changed, 70 insertions(+), 65 deletions(-) diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInventoryUtilsExt.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInventoryUtilsExt.java index dc20c6c..5fc53b6 100644 --- a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInventoryUtilsExt.java +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInventoryUtilsExt.java @@ -5,6 +5,7 @@ package zcgj.zcdev.zcdev.pr.plugin.form; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -88,21 +89,41 @@ public class MaterialInventoryUtilsExt { coef = BigDecimal.valueOf(-1L); } - List mergedFields = new ArrayList(); - mergedFields.add("qty"); - mergedFields.add("amount"); - if (entrys.length > 0 && entrys[0].getDataEntityType().getProperties().containsKey("ftransamount")) { - mergedFields.add("ftransamount"); + // 1. 先按物料唯一标识分组,并累加 qty、amount 等字段 + Map mergedEntryMap = new HashMap<>(); + for (DynamicObject entryInfo : entrys) { + DynamicObject material = entryInfo.getDynamicObject("material"); + String matId = material.getString("id"); + String modelnum = "".equals(entryInfo.getString("modelnum")) ? " " : entryInfo.getString("modelnum"); + String lot = "".equals(entryInfo.getString("lot")) ? " " : entryInfo.getString("lot"); + String unitId = entryInfo.getDynamicObject("measureunit") == null ? "" : entryInfo.getDynamicObject("measureunit").getString("id"); + + // 创建唯一键(物料ID+型号+批次+单位) + String key = String.format("%1$s_%2$s_%3$s_%4$s", matId, modelnum, lot, unitId); + + // 如果已存在,累加 qty、amount 等字段 + if (mergedEntryMap.containsKey(key)) { + DynamicObject mergedEntry = mergedEntryMap.get(key); + BigDecimal currentQty = mergedEntry.getBigDecimal("qty").add(entryInfo.getBigDecimal("qty")); + BigDecimal currentAmount = mergedEntry.getBigDecimal("amount").add(entryInfo.getBigDecimal("amount")); + mergedEntry.set("qty", currentQty); + mergedEntry.set("amount", currentAmount); + + // 如果有 ftransamount,也累加 + if (entryInfo.getDataEntityType().getProperties().containsKey("ftransamount")) { + BigDecimal currentFtransAmount = mergedEntry.getBigDecimal("ftransamount").add(entryInfo.getBigDecimal("ftransamount")); + mergedEntry.set("ftransamount", currentFtransAmount); + } + } else { + // 不存在则直接放入 Map + mergedEntryMap.put(key, entryInfo); + } } - DynamicObject[] mergedEntrys = mergeSameMaterial(entrys, mergedFields); - Set materialIdSet = new HashSet(); - DynamicObject[] var10 = mergedEntrys; - int var11 = mergedEntrys.length; - - for(int var12 = 0; var12 < var11; ++var12) { - DynamicObject mergedEntry = var10[var12]; - Long materialId = mergedEntry.getLong("material_id"); + // 2. 获取所有物料的库存信息 + Set materialIdSet = new HashSet<>(); + for (DynamicObject entryInfo : mergedEntryMap.values()) { + Long materialId = entryInfo.getDynamicObject("material").getLong("id"); if (materialId != null && materialId != 0L) { materialIdSet.add(materialId); } @@ -112,70 +133,54 @@ public class MaterialInventoryUtilsExt { filter.and(new QFilter("project", "=", StringUtils.isBlank(projectId) ? 0L : Long.parseLong(projectId))); filter.and(new QFilter("warehouse", "=", StringUtils.isBlank(warehouseId) ? 0L : Long.parseLong(warehouseId))); QFilter materialIdFilter = new QFilter("material", "in", materialIdSet); - DynamicObject[] ecmaMatinventories = BusinessDataServiceHelper.load("ecma_matinventory", "id,measureunit,lot,currency,price,qty,amount,lockedqty,tempqty,modelnum,saleprice,measureuint,project,org,material,warehouse", new QFilter[]{filter, materialIdFilter}); - Map matInventoryMap = new HashMap(); - DynamicObject[] var33 = ecmaMatinventories; - int i = ecmaMatinventories.length; - String matId; - String modelnum; - String lot; - String unitId; - String key; - for(int var16 = 0; var16 < i; ++var16) { - DynamicObject ecmaMatinventory = var33[var16]; - matId = ecmaMatinventory.getDynamicObject("material").getString("id"); - modelnum = "".equals(ecmaMatinventory.getString("modelnum")) ? " " : ecmaMatinventory.getString("modelnum"); - lot = "".equals(ecmaMatinventory.getString("lot")) ? " " : ecmaMatinventory.getString("lot"); - unitId = ecmaMatinventory.getDynamicObject("measureunit") == null ? "" : ecmaMatinventory.getDynamicObject("measureunit").getString("id"); - key = String.format("%1$s_%2$s_%3$s_%4$s", matId, modelnum, lot, unitId); + DynamicObject[] ecmaMatinventories = BusinessDataServiceHelper.load( + "ecma_matinventory", + "id,measureunit,lot,currency,price,qty,amount,lockedqty,tempqty,modelnum,saleprice,measureuint,project,org,material,warehouse", + new QFilter[]{filter, materialIdFilter} + ); + + // 3. 构建库存 Map + Map matInventoryMap = new HashMap<>(); + for (DynamicObject ecmaMatinventory : ecmaMatinventories) { + String matId = ecmaMatinventory.getDynamicObject("material").getString("id"); + String modelnum = "".equals(ecmaMatinventory.getString("modelnum")) ? " " : ecmaMatinventory.getString("modelnum"); + String lot = "".equals(ecmaMatinventory.getString("lot")) ? " " : ecmaMatinventory.getString("lot"); + String unitId = ecmaMatinventory.getDynamicObject("measureunit") == null ? "" : ecmaMatinventory.getDynamicObject("measureunit").getString("id"); + String key = String.format("%1$s_%2$s_%3$s_%4$s", matId, modelnum, lot, unitId); matInventoryMap.put(key, ecmaMatinventory); } - List matInvList = new ArrayList(); + // 4. 更新库存 + List matInvList = new ArrayList<>(); + for (Map.Entry entry : mergedEntryMap.entrySet()) { + String key = entry.getKey(); + DynamicObject entryInfo = entry.getValue(); + DynamicObject matInvInfo = matInventoryMap.get(key); - for(i = 0; i < mergedEntrys.length; ++i) { - DynamicObject entryInfo = mergedEntrys[i]; - boolean isFirst = false; - matId = entryInfo.getDynamicObject("material").getString("id"); - modelnum = "".equals(entryInfo.getString("modelnum")) ? " " : entryInfo.getString("modelnum"); - lot = "".equals(entryInfo.getString("lot")) ? " " : entryInfo.getString("lot"); - unitId = entryInfo.getDynamicObject("measureunit") == null ? "" : entryInfo.getDynamicObject("measureunit").getString("id"); - key = String.format("%1$s_%2$s_%3$s_%4$s", matId, modelnum, lot, unitId); - DynamicObject matInvInfo = (DynamicObject)matInventoryMap.get(key); - BigDecimal qty; - if (matInvInfo == null || BigDecimal.ZERO.compareTo(matInvInfo.getBigDecimal("tempqty")) == 0) { - if (entryInfo.getDataEntityType().getProperties().containsKey("ftransamount")) { - qty = entryInfo.getBigDecimal("ftransamount"); - if (BigDecimal.ZERO.compareTo(qty) == 0) { - isFirst = true; - } - } else { - isFirst = true; - } - } + BigDecimal qty = entryInfo.getBigDecimal("qty").multiply(coef); + BigDecimal amount = entryInfo.getBigDecimal("amount").multiply(exchangerate).multiply(coef); if (matInvInfo == null) { + // 如果库存不存在,创建新库存记录 matInvInfo = setMatInvInfo(orgId, projectId, warehouseId, entryInfo, coef, exchangerate); } else { - qty = entryInfo.getBigDecimal("qty").multiply(coef); - BigDecimal amount = entryInfo.getBigDecimal("amount").multiply(exchangerate); - amount = amount.multiply(coef); + // 如果库存存在,更新 qty、tempqty、amount BigDecimal totalQty = matInvInfo.getBigDecimal("qty"); BigDecimal totalTmpQty = matInvInfo.getBigDecimal("tempqty"); - if (BigDecimal.ZERO.compareTo(totalTmpQty) == 0) { - matInvInfo.set("price", entryInfo.getBigDecimal("price").multiply(exchangerate)); - } + BigDecimal totalAmount = matInvInfo.getBigDecimal("amount"); totalQty = EcNumberHelper.add(totalQty, qty); - BigDecimal totalAmount = matInvInfo.getBigDecimal("amount"); - totalAmount = EcNumberHelper.add(totalAmount, amount); totalTmpQty = EcNumberHelper.add(totalTmpQty, qty); + totalAmount = EcNumberHelper.add(totalAmount, amount); + matInvInfo.set("qty", totalQty); matInvInfo.set("tempqty", totalTmpQty); matInvInfo.set("amount", totalAmount); - if (!isFirst && totalQty.compareTo(BigDecimal.ZERO) != 0) { - matInvInfo.set("price", totalAmount.divide(totalTmpQty, 10, 4)); + + // 如果 qty 不为 0,重新计算 price + if (totalQty.compareTo(BigDecimal.ZERO) != 0) { + matInvInfo.set("price", totalAmount.divide(totalTmpQty, 10, RoundingMode.HALF_UP)); } } @@ -183,7 +188,7 @@ public class MaterialInventoryUtilsExt { } if (!matInvList.isEmpty()) { - SaveServiceHelper.save((DynamicObject[])matInvList.toArray(new DynamicObject[0])); + SaveServiceHelper.save(matInvList.toArray(new DynamicObject[0])); } } diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/MaterialOutBillOpExt.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/MaterialOutBillOpExt.java index ed42415..d53d4c7 100644 --- a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/MaterialOutBillOpExt.java +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/MaterialOutBillOpExt.java @@ -156,9 +156,9 @@ public class MaterialOutBillOpExt extends AbstractOperationServicePlugIn { } if ("INCREASE".equals(type)) { - MaterialInventoryUtils.matBalanceUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), true, exchangerate); + MaterialInventoryUtilsExt.matBalanceUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), true, exchangerate); } else if ("REDUCE".equals(type)) { - MaterialInventoryUtils.matBalanceLockAndUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), false, exchangerate, false); + MaterialInventoryUtilsExt.matBalanceLockAndUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), false, exchangerate, false); } } @@ -195,9 +195,9 @@ public class MaterialOutBillOpExt extends AbstractOperationServicePlugIn { } if ("INCREASE".equals(type)) { - MaterialInventoryUtils.matBalanceUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), false, exchangerate); + MaterialInventoryUtilsExt.matBalanceUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), false, exchangerate); } else if ("REDUCE".equals(type)) { - MaterialInventoryUtils.matBalanceUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), true, exchangerate); + MaterialInventoryUtilsExt.matBalanceUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), true, exchangerate); } } } From 0d2428c35eb63b8a178a1def4554255df5d255ea Mon Sep 17 00:00:00 2001 From: xuhaihui <2098865055@qq.com> Date: Mon, 22 Sep 2025 11:05:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=8D=95=E5=A1=AB?= =?UTF-8?q?=E5=86=99=E5=88=A0=E8=A1=8C=E5=90=8E=E5=A4=9A=E4=B8=AA=E5=80=BC?= =?UTF-8?q?=E6=9C=AA=E8=83=BD=E5=8F=91=E7=94=9F=E4=BF=AE=E6=94=B9bug?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pr/plugin/form/MaterialInBillEditPluginExt.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInBillEditPluginExt.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInBillEditPluginExt.java index 380de9a..9c57086 100644 --- a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInBillEditPluginExt.java +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInBillEditPluginExt.java @@ -323,7 +323,7 @@ public class MaterialInBillEditPluginExt extends AbstractEcmaBillPlugin implemen case "mataxamount": this.mataxamountChanged((BigDecimal) propValue); break; - case "matoftaxamount": + case "matoftaxamount"://材料含税总金额 this.matoftaxamountChanged((BigDecimal) propValue); break; case "matamount": @@ -1749,8 +1749,12 @@ public class MaterialInBillEditPluginExt extends AbstractEcmaBillPlugin implemen this.sumMaoftaxAmount(); this.sumMaTaxAmount(); EntryGrid grid = (EntryGrid) this.getControl("entryentity"); - BigDecimal sum = grid.getSum("ftransamount"); - this.getModel().setValue("transamount", sum); + BigDecimal sum = grid.getSum("ftransamount");//入库单-运费金额合计 + this.getModel().setValue("transamount", sum);//总运费 + BigDecimal zcgj_transtaxamount = grid.getSum("zcgj_transtaxamount");//入库单-运费税额合计 + this.getModel().setValue("transtaxamount", zcgj_transtaxamount);//运费总税额 + BigDecimal taxtransamount = grid.getSum("taxtransamount");//入库单-含税运费 + this.getModel().setValue("transoftaxamount", taxtransamount);//含税总运费 this.getView().updateView("matamount"); this.getView().updateView("matoftaxamount"); this.getView().updateView("mataxamount"); @@ -1762,6 +1766,8 @@ public class MaterialInBillEditPluginExt extends AbstractEcmaBillPlugin implemen this.getView().updateView("totaloftaxamount"); this.getView().updateView("totaltaxamount"); this.getView().updateView("transamount"); + this.getView().updateView("transtaxamount"); + this.getView().updateView("transoftaxamount"); break; case "unaudit": this.getView().invokeOperation("refresh");