Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
fb58b6ea97
|
@ -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");
|
||||
|
|
|
@ -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. 先按物料唯一标识分组,并累加 qty、amount 等字段
|
||||
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);
|
||||
|
||||
// 如果已存在,累加 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<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);
|
||||
// 如果库存存在,更新 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]));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue