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":
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");

View File

@ -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<String> mergedFields = new ArrayList();
mergedFields.add("qty");
mergedFields.add("amount");
if (entrys.length > 0 && entrys[0].getDataEntityType().getProperties().containsKey("ftransamount")) {
mergedFields.add("ftransamount");
// 1. 先按物料唯一标识分组并累加 qtyamount 等字段
Map<String, DynamicObject> 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);
// 如果已存在累加 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);
Set<Long> 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<Long> 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<String, DynamicObject> 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<String, DynamicObject> 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<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) {
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);
// 如果库存存在更新 qtytempqtyamount
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]));
}
}

View File

@ -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);
}
}
}