Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
zhangzhiguo 2025-09-22 11:08:57 +08:00
commit fb58b6ea97
3 changed files with 79 additions and 68 deletions

View File

@ -323,7 +323,7 @@ public class MaterialInBillEditPluginExt extends AbstractEcmaBillPlugin implemen
case "mataxamount": case "mataxamount":
this.mataxamountChanged((BigDecimal) propValue); this.mataxamountChanged((BigDecimal) propValue);
break; break;
case "matoftaxamount": case "matoftaxamount"://材料含税总金额
this.matoftaxamountChanged((BigDecimal) propValue); this.matoftaxamountChanged((BigDecimal) propValue);
break; break;
case "matamount": case "matamount":
@ -1749,8 +1749,12 @@ public class MaterialInBillEditPluginExt extends AbstractEcmaBillPlugin implemen
this.sumMaoftaxAmount(); this.sumMaoftaxAmount();
this.sumMaTaxAmount(); this.sumMaTaxAmount();
EntryGrid grid = (EntryGrid) this.getControl("entryentity"); EntryGrid grid = (EntryGrid) this.getControl("entryentity");
BigDecimal sum = grid.getSum("ftransamount"); BigDecimal sum = grid.getSum("ftransamount");//入库单-运费金额合计
this.getModel().setValue("transamount", sum); 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("matamount");
this.getView().updateView("matoftaxamount"); this.getView().updateView("matoftaxamount");
this.getView().updateView("mataxamount"); this.getView().updateView("mataxamount");
@ -1762,6 +1766,8 @@ public class MaterialInBillEditPluginExt extends AbstractEcmaBillPlugin implemen
this.getView().updateView("totaloftaxamount"); this.getView().updateView("totaloftaxamount");
this.getView().updateView("totaltaxamount"); this.getView().updateView("totaltaxamount");
this.getView().updateView("transamount"); this.getView().updateView("transamount");
this.getView().updateView("transtaxamount");
this.getView().updateView("transoftaxamount");
break; break;
case "unaudit": case "unaudit":
this.getView().invokeOperation("refresh"); this.getView().invokeOperation("refresh");

View File

@ -5,6 +5,7 @@
package zcgj.zcdev.zcdev.pr.plugin.form; package zcgj.zcdev.zcdev.pr.plugin.form;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -88,21 +89,41 @@ public class MaterialInventoryUtilsExt {
coef = BigDecimal.valueOf(-1L); coef = BigDecimal.valueOf(-1L);
} }
List<String> mergedFields = new ArrayList(); // 1. 先按物料唯一标识分组并累加 qtyamount 等字段
mergedFields.add("qty"); Map<String, DynamicObject> mergedEntryMap = new HashMap<>();
mergedFields.add("amount"); for (DynamicObject entryInfo : entrys) {
if (entrys.length > 0 && entrys[0].getDataEntityType().getProperties().containsKey("ftransamount")) { DynamicObject material = entryInfo.getDynamicObject("material");
mergedFields.add("ftransamount"); 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);
// 如果已存在累加 qtyamount 等字段
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); // 2. 获取所有物料的库存信息
Set<Long> materialIdSet = new HashSet(); Set<Long> materialIdSet = new HashSet<>();
DynamicObject[] var10 = mergedEntrys; for (DynamicObject entryInfo : mergedEntryMap.values()) {
int var11 = mergedEntrys.length; Long materialId = entryInfo.getDynamicObject("material").getLong("id");
for(int var12 = 0; var12 < var11; ++var12) {
DynamicObject mergedEntry = var10[var12];
Long materialId = mergedEntry.getLong("material_id");
if (materialId != null && materialId != 0L) { if (materialId != null && materialId != 0L) {
materialIdSet.add(materialId); 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("project", "=", StringUtils.isBlank(projectId) ? 0L : Long.parseLong(projectId)));
filter.and(new QFilter("warehouse", "=", StringUtils.isBlank(warehouseId) ? 0L : Long.parseLong(warehouseId))); filter.and(new QFilter("warehouse", "=", StringUtils.isBlank(warehouseId) ? 0L : Long.parseLong(warehouseId)));
QFilter materialIdFilter = new QFilter("material", "in", materialIdSet); 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<String, DynamicObject> matInventoryMap = new HashMap();
DynamicObject[] var33 = ecmaMatinventories;
int i = ecmaMatinventories.length;
String matId; DynamicObject[] ecmaMatinventories = BusinessDataServiceHelper.load(
String modelnum; "ecma_matinventory",
String lot; "id,measureunit,lot,currency,price,qty,amount,lockedqty,tempqty,modelnum,saleprice,measureuint,project,org,material,warehouse",
String unitId; new QFilter[]{filter, materialIdFilter}
String key; );
for(int var16 = 0; var16 < i; ++var16) {
DynamicObject ecmaMatinventory = var33[var16]; // 3. 构建库存 Map
matId = ecmaMatinventory.getDynamicObject("material").getString("id"); Map<String, DynamicObject> matInventoryMap = new HashMap<>();
modelnum = "".equals(ecmaMatinventory.getString("modelnum")) ? " " : ecmaMatinventory.getString("modelnum"); for (DynamicObject ecmaMatinventory : ecmaMatinventories) {
lot = "".equals(ecmaMatinventory.getString("lot")) ? " " : ecmaMatinventory.getString("lot"); String matId = ecmaMatinventory.getDynamicObject("material").getString("id");
unitId = ecmaMatinventory.getDynamicObject("measureunit") == null ? "" : ecmaMatinventory.getDynamicObject("measureunit").getString("id"); String modelnum = "".equals(ecmaMatinventory.getString("modelnum")) ? " " : ecmaMatinventory.getString("modelnum");
key = String.format("%1$s_%2$s_%3$s_%4$s", matId, modelnum, lot, unitId); 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); matInventoryMap.put(key, ecmaMatinventory);
} }
List<DynamicObject> matInvList = new ArrayList(); // 4. 更新库存
List<DynamicObject> matInvList = new ArrayList<>();
for (Map.Entry<String, DynamicObject> entry : mergedEntryMap.entrySet()) {
String key = entry.getKey();
DynamicObject entryInfo = entry.getValue();
DynamicObject matInvInfo = matInventoryMap.get(key);
for(i = 0; i < mergedEntrys.length; ++i) { BigDecimal qty = entryInfo.getBigDecimal("qty").multiply(coef);
DynamicObject entryInfo = mergedEntrys[i]; BigDecimal amount = entryInfo.getBigDecimal("amount").multiply(exchangerate).multiply(coef);
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;
}
}
if (matInvInfo == null) { if (matInvInfo == null) {
// 如果库存不存在创建新库存记录
matInvInfo = setMatInvInfo(orgId, projectId, warehouseId, entryInfo, coef, exchangerate); matInvInfo = setMatInvInfo(orgId, projectId, warehouseId, entryInfo, coef, exchangerate);
} else { } else {
qty = entryInfo.getBigDecimal("qty").multiply(coef); // 如果库存存在更新 qtytempqtyamount
BigDecimal amount = entryInfo.getBigDecimal("amount").multiply(exchangerate);
amount = amount.multiply(coef);
BigDecimal totalQty = matInvInfo.getBigDecimal("qty"); BigDecimal totalQty = matInvInfo.getBigDecimal("qty");
BigDecimal totalTmpQty = matInvInfo.getBigDecimal("tempqty"); BigDecimal totalTmpQty = matInvInfo.getBigDecimal("tempqty");
if (BigDecimal.ZERO.compareTo(totalTmpQty) == 0) { BigDecimal totalAmount = matInvInfo.getBigDecimal("amount");
matInvInfo.set("price", entryInfo.getBigDecimal("price").multiply(exchangerate));
}
totalQty = EcNumberHelper.add(totalQty, qty); totalQty = EcNumberHelper.add(totalQty, qty);
BigDecimal totalAmount = matInvInfo.getBigDecimal("amount");
totalAmount = EcNumberHelper.add(totalAmount, amount);
totalTmpQty = EcNumberHelper.add(totalTmpQty, qty); totalTmpQty = EcNumberHelper.add(totalTmpQty, qty);
totalAmount = EcNumberHelper.add(totalAmount, amount);
matInvInfo.set("qty", totalQty); matInvInfo.set("qty", totalQty);
matInvInfo.set("tempqty", totalTmpQty); matInvInfo.set("tempqty", totalTmpQty);
matInvInfo.set("amount", totalAmount); 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()) { if (!matInvList.isEmpty()) {
SaveServiceHelper.save((DynamicObject[])matInvList.toArray(new DynamicObject[0])); SaveServiceHelper.save(matInvList.toArray(new DynamicObject[0]));
} }
} }

View File

@ -156,9 +156,9 @@ public class MaterialOutBillOpExt extends AbstractOperationServicePlugIn {
} }
if ("INCREASE".equals(type)) { 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)) { } 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)) { 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)) { } 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);
} }
} }
} }