This commit is contained in:
xuhaihui 2025-10-24 17:04:56 +08:00
parent b4f0ce50d9
commit 2deeee51cb
2 changed files with 67 additions and 51 deletions

View File

@ -15,6 +15,7 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.resource.ResManager;
@ -43,6 +44,10 @@ import kd.ec.material.opplugin.validator.InvAdjustBillExistValidator;
import kd.ec.material.opplugin.validator.MaterialInBillValidator;
import org.apache.commons.collections4.CollectionUtils;
/**
* 入库单保存提交撤销审核反审核操作插件系统代码二开
* 说明1审核生成即时库存第一单中的单价与后续更新即时库存的单价不一致修改了第一单单价的逻辑
*/
public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
private static final String ecco_mainmatcost = "ecco_mainmatcost";
private static final String ecco_sporadicmatcost = "ecco_sporadicmatcost";
@ -105,7 +110,7 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
DynamicObject[] var6 = dataEntities;
int var7 = dataEntities.length;
for(int var8 = 0; var8 < var7; ++var8) {
for (int var8 = 0; var8 < var7; ++var8) {
DynamicObject bill = var6[var8];
String billId = bill.getString(MaterialInBillConstant.ID_ENTITY_PK);
QFilter payDirectionFilter = new QFilter("paydirection", "=", PayDirectionEnum.OUT.getValue());
@ -115,7 +120,7 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
if (objects.length > 0) {
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < objects.length; ++i) {
for (int i = 0; i < objects.length; ++i) {
stringBuilder.append(objects[i].getString("billno"));
if (i != objects.length - 1) {
stringBuilder.append("");
@ -151,7 +156,7 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
DynamicObject orderF7;
switch (operationKey) {
case "save":
for(int i = 0; i < dataEntities.length; ++i) {
for (int i = 0; i < dataEntities.length; ++i) {
DynamicObject obj = dataEntities[i];
this.doSaveLot(obj);
}
@ -161,7 +166,7 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
succObjs = new ArrayList();
ArrayList<DynamicObject> orders = new ArrayList();
for(int i = 0; i < dataEntities.length; ++i) {
for (int i = 0; i < dataEntities.length; ++i) {
DynamicObject obj = dataEntities[i];
obj = obj.getDynamicObject("purchaseorder");
DynamicObjectCollection inEntry = obj.getDynamicObjectCollection("entryentity");
@ -171,8 +176,8 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
Map<String, BigDecimal> inEntriesMap = new HashMap();
Iterator var43 = inEntry.iterator();
while(var43.hasNext()) {
DynamicObject in = (DynamicObject)var43.next();
while (var43.hasNext()) {
DynamicObject in = (DynamicObject) var43.next();
if (StringUtils.isNotBlank(in.getString("orderentryid"))) {
inEntriesMap.put(in.getString("orderentryid"), in.getBigDecimal("qty"));
}
@ -181,9 +186,9 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
Boolean allIn = true;
Iterator var48 = orderEntry.iterator();
while(var48.hasNext()) {
orderF7 = (DynamicObject)var48.next();
BigDecimal inQty = (BigDecimal)inEntriesMap.getOrDefault(orderF7.getString("id"), BigDecimal.ZERO);
while (var48.hasNext()) {
orderF7 = (DynamicObject) var48.next();
BigDecimal inQty = (BigDecimal) inEntriesMap.getOrDefault(orderF7.getString("id"), BigDecimal.ZERO);
BigDecimal surplusQty = orderF7.getBigDecimal("surplusqty").subtract(inQty);
orderF7.set("surplusqty", surplusQty);
if (surplusQty.compareTo(BigDecimal.ZERO) > 0) {
@ -206,10 +211,10 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
}
if (orders.size() > 0) {
SaveServiceHelper.save(((DynamicObject)orders.get(0)).getDynamicObjectType(), orders.toArray(new DynamicObject[orders.size()]));
SaveServiceHelper.save(((DynamicObject) orders.get(0)).getDynamicObjectType(), orders.toArray(new DynamicObject[orders.size()]));
}
e.setDataEntities((DynamicObject[])succObjs.toArray(new DynamicObject[succObjs.size()]));
e.setDataEntities((DynamicObject[]) succObjs.toArray(new DynamicObject[succObjs.size()]));
break;
case "unaudit":
succObjs = new ArrayList();
@ -218,7 +223,7 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
var34 = dataEntities;
var35 = dataEntities.length;
for(var37 = 0; var37 < var35; ++var37) {
for (var37 = 0; var37 < var35; ++var37) {
o = var34[var37];
Object[] objects = o.getDynamicObjectCollection("entryentity").stream().map((entry) -> {
return entry.getPkValue();
@ -248,8 +253,8 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
Map<String, BigDecimal> inEntriesMap = new HashMap();
Iterator var26 = inEntry.iterator();
while(var26.hasNext()) {
DynamicObject in = (DynamicObject)var26.next();
while (var26.hasNext()) {
DynamicObject in = (DynamicObject) var26.next();
if (StringUtils.isNotBlank(in.getString("orderentryid"))) {
inEntriesMap.put(in.getString("orderentryid"), in.getBigDecimal("qty"));
}
@ -258,9 +263,9 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
Boolean allIn = true;
Iterator var53 = orderEntry.iterator();
while(var53.hasNext()) {
DynamicObject ordE = (DynamicObject)var53.next();
BigDecimal inQty = (BigDecimal)inEntriesMap.getOrDefault(ordE.getString("id"), BigDecimal.ZERO);
while (var53.hasNext()) {
DynamicObject ordE = (DynamicObject) var53.next();
BigDecimal inQty = (BigDecimal) inEntriesMap.getOrDefault(ordE.getString("id"), BigDecimal.ZERO);
BigDecimal surplusQty = inQty.add(ordE.getBigDecimal("surplusqty"));
ordE.set("surplusqty", surplusQty);
if (surplusQty.compareTo(BigDecimal.ZERO) > 0) {
@ -286,7 +291,7 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
}
SaveServiceHelper.save(EntityMetadataCache.getDataEntityType("ecma_purchaseorderbill"), orders1.toArray(new DynamicObject[orders1.size()]));
e.setDataEntities((DynamicObject[])succObjs.toArray(new DynamicObject[succObjs.size()]));
e.setDataEntities((DynamicObject[]) succObjs.toArray(new DynamicObject[succObjs.size()]));
break;
case "submit":
succObjs = new ArrayList();
@ -294,7 +299,7 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
var34 = dataEntities;
var35 = dataEntities.length;
for(var37 = 0; var37 < var35; ++var37) {
for (var37 = 0; var37 < var35; ++var37) {
o = var34[var37];
this.doSaveLot(o);
String billNumber = o.getString("billno");
@ -316,13 +321,13 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
succObjs.add(o);
}
e.setDataEntities((DynamicObject[])succObjs.toArray(new DynamicObject[succObjs.size()]));
e.setDataEntities((DynamicObject[]) succObjs.toArray(new DynamicObject[succObjs.size()]));
break;
case "unsubmit":
succObjs = new ArrayList();
this.rewritePoundBills(dataEntities, true);
for(int i = 0; i < dataEntities.length; ++i) {
for (int i = 0; i < dataEntities.length; ++i) {
obj1 = dataEntities[i];
String result = this.updateMatLocked(obj1, false, false);
if (!"success".equals(result)) {
@ -333,7 +338,7 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
succObjs.add(obj1);
}
e.setDataEntities((DynamicObject[])succObjs.toArray(new DynamicObject[succObjs.size()]));
e.setDataEntities((DynamicObject[]) succObjs.toArray(new DynamicObject[succObjs.size()]));
}
}
@ -346,7 +351,7 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
}).forEach((dataEntity) -> {
DynamicObjectCollection entryEntity = dataEntity.getDynamicObjectCollection("entryentity");
if (!CollectionUtils.isEmpty(entryEntity)) {
Set<Long> entryPoundIds = (Set)entryEntity.stream().map((dynamicObject) -> {
Set<Long> entryPoundIds = (Set) entryEntity.stream().map((dynamicObject) -> {
return dynamicObject.getLong("poundid");
}).collect(Collectors.toSet());
poundIds.addAll(entryPoundIds);
@ -379,8 +384,8 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
ORM orm = ORM.create();
Map<Integer, DynamicObject> rowLotMap = new HashMap();
for(int i = 0; i < count; ++i) {
obj = (DynamicObject)inEntry.get(i);
for (int i = 0; i < count; ++i) {
obj = (DynamicObject) inEntry.get(i);
lotNum = obj.getString("lot");
lotObj = obj.getDynamicObject("lotid");
material = obj.getDynamicObject("material");
@ -498,16 +503,16 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
Iterator var27 = rowLotMap.entrySet().iterator();
while(var27.hasNext()) {
Map.Entry<Integer, DynamicObject> entry = (Map.Entry)var27.next();
Integer row = (Integer)entry.getKey();
DynamicObject lot = (DynamicObject)entry.getValue();
while (var27.hasNext()) {
Map.Entry<Integer, DynamicObject> entry = (Map.Entry) var27.next();
Integer row = (Integer) entry.getKey();
DynamicObject lot = (DynamicObject) entry.getValue();
long genLotId = orm.genLongId("ecma_material_lot");
lot.set("id", genLotId);
((DynamicObject)inEntry.get(row)).set("lotid", lot);
((DynamicObject) inEntry.get(row)).set("lotid", lot);
}
SaveServiceHelper.save((DynamicObject[])addLotList.toArray(new DynamicObject[addLotList.size()]));
SaveServiceHelper.save((DynamicObject[]) addLotList.toArray(new DynamicObject[addLotList.size()]));
}
private String updateMatLocked(DynamicObject obj, boolean isLock, boolean isSubmit) {
@ -522,13 +527,15 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
String result = "success";
if ("REDUCE".equals(type)) {
if (isSubmit) {
String msg1 = MaterialInventoryUtils.checkMatAsOut(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]));
// String msg1 = MaterialInventoryUtils.checkMatAsOut(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]));//系统源码
String msg1 = MaterialInventoryUtilsExt2.checkMatAsOut(orgId, projectId, warehouseId, (DynamicObject[]) entryCol.toArray(new DynamicObject[entryCol.size()]));//二开替代
if (!"success".equals(msg1)) {
return msg1;
}
}
result = MaterialInventoryUtils.matBalanceLocked(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), isLock);
// result = MaterialInventoryUtils.matBalanceLocked(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), isLock);//系统源码
result = MaterialInventoryUtilsExt2.matBalanceLocked(orgId, projectId, warehouseId, (DynamicObject[]) entryCol.toArray(new DynamicObject[entryCol.size()]), isLock);//二开替代
}
return result;
@ -566,17 +573,20 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
String type = transType.getString("type");
if ("INCREASE".equals(type)) {
if (!isAudit) {
String msg1 = MaterialInventoryUtils.checkMatAsOut(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]));
// String msg1 = MaterialInventoryUtils.checkMatAsOut(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]));//系统源码
String msg1 = MaterialInventoryUtilsExt2.checkMatAsOut(orgId, projectId, warehouseId, (DynamicObject[]) entryCol.toArray(new DynamicObject[entryCol.size()]));//二开替代
if (!"success".equals(msg1)) {
result = String.format(ResManager.loadKDString("反审核失败。%s", "MaterialInBillOp_7", "ec-ecma-opplugin", new Object[0]), msg1);
return result;
}
}
MaterialInventoryUtils.matBalanceUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), isAudit, exchangerate);
// MaterialInventoryUtils.matBalanceUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), isAudit, exchangerate);//系统源码
MaterialInventoryUtilsExt2.matBalanceUpdate(orgId, projectId, warehouseId, (DynamicObject[]) entryCol.toArray(new DynamicObject[entryCol.size()]), isAudit, exchangerate);//二开替代
} else if ("REDUCE".equals(type)) {
if (isAudit) {
String msg1 = MaterialInventoryUtils.checkInventoryQty(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]));
// String msg1 = MaterialInventoryUtils.checkInventoryQty(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]));//系统源码
String msg1 = MaterialInventoryUtilsExt2.checkInventoryQty(orgId, projectId, warehouseId, (DynamicObject[]) entryCol.toArray(new DynamicObject[entryCol.size()]));//二开替代
if (!"success".equals(msg1)) {
result = String.format(ResManager.loadKDString("审核失败。%s", "MaterialInBillOp_8", "ec-ecma-opplugin", new Object[0]), msg1);
return result;
@ -584,7 +594,8 @@ public class MaterialInBillOpExt extends AbstractOperationServicePlugIn {
}
boolean isAdd = !isAudit;
MaterialInventoryUtils.matBalanceLockAndUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), isAdd, exchangerate, false);
// MaterialInventoryUtils.matBalanceLockAndUpdate(orgId, projectId, warehouseId, (DynamicObject[])entryCol.toArray(new DynamicObject[entryCol.size()]), isAdd, exchangerate, false);//系统源码
MaterialInventoryUtilsExt2.matBalanceLockAndUpdate(orgId, projectId, warehouseId, (DynamicObject[]) entryCol.toArray(new DynamicObject[entryCol.size()]), isAdd, exchangerate, false);//二开替代
}
return result;

View File

@ -13,6 +13,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
import kd.bos.dataentity.resource.ResManager;
@ -30,6 +31,10 @@ import kd.ec.basedata.common.utils.CurrencyHelper;
import kd.ec.basedata.common.utils.EcNumberHelper;
import kd.ec.material.common.utils.MaterialInventoryUtils;
/**
* 入库单MaterialInBillOpExt二开插件的方法类
* 说明1审核生成即时库存第一单中的单价与后续更新即时库存的单价不一致修改了第一单单价的逻辑
*/
public class MaterialInventoryUtilsExt2 {
private static final Log log = LogFactory.getLog(MaterialInventoryUtils.class);
public static final DynamicObjectType matInvDT = EntityMetadataCache.getDataEntityType("ecma_matinventory");
@ -101,7 +106,7 @@ public class MaterialInventoryUtilsExt2 {
DynamicObject[] var10 = mergedEntrys;
int var11 = mergedEntrys.length;
for(int var12 = 0; var12 < var11; ++var12) {
for (int var12 = 0; var12 < var11; ++var12) {
DynamicObject mergedEntry = var10[var12];
Long materialId = mergedEntry.getLong("material_id");
if (materialId != null && materialId != 0L) {
@ -123,7 +128,7 @@ public class MaterialInventoryUtilsExt2 {
String lot;
String unitId;
String key;
for(int var16 = 0; var16 < i; ++var16) {
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");
@ -135,7 +140,7 @@ public class MaterialInventoryUtilsExt2 {
List<DynamicObject> matInvList = new ArrayList();
for(i = 0; i < mergedEntrys.length; ++i) {
for (i = 0; i < mergedEntrys.length; ++i) {
DynamicObject entryInfo = mergedEntrys[i];
boolean isFirst = false;
matId = entryInfo.getDynamicObject("material").getString("id");
@ -143,7 +148,7 @@ public class MaterialInventoryUtilsExt2 {
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);
DynamicObject matInvInfo = (DynamicObject) matInventoryMap.get(key);
BigDecimal qty;
if (matInvInfo == null || BigDecimal.ZERO.compareTo(matInvInfo.getBigDecimal("tempqty")) == 0) {
if (entryInfo.getDataEntityType().getProperties().containsKey("ftransamount")) {
@ -184,7 +189,7 @@ public class MaterialInventoryUtilsExt2 {
}
if (!matInvList.isEmpty()) {
SaveServiceHelper.save((DynamicObject[])matInvList.toArray(new DynamicObject[0]));
SaveServiceHelper.save((DynamicObject[]) matInvList.toArray(new DynamicObject[0]));
}
}
@ -197,7 +202,7 @@ public class MaterialInventoryUtilsExt2 {
List<DynamicObject> matInvList = new ArrayList();
for(int i = 0; i < entrys.length; ++i) {
for (int i = 0; i < entrys.length; ++i) {
DynamicObject entryInfo = entrys[i];
DynamicObject material = entryInfo.getDynamicObject("material");
String matId = material.getString("id");
@ -222,7 +227,7 @@ public class MaterialInventoryUtilsExt2 {
}
if (!matInvList.isEmpty()) {
SaveServiceHelper.save(((DynamicObject)matInvList.get(0)).getDataEntityType(), matInvList.toArray(new DynamicObject[0]));
SaveServiceHelper.save(((DynamicObject) matInvList.get(0)).getDataEntityType(), matInvList.toArray(new DynamicObject[0]));
}
return "success";
@ -242,7 +247,7 @@ public class MaterialInventoryUtilsExt2 {
dimensionList.add("price");
List<DynamicObject> copiedList = new ArrayList();
for(int i = 0; i < entrys.length; ++i) {
for (int i = 0; i < entrys.length; ++i) {
DynamicObject entryInfo = entrys[i];
DynamicObject copiedObj = new DynamicObject(entrys[0].getDynamicObjectType());
if (copiedList.isEmpty()) {
@ -258,7 +263,7 @@ public class MaterialInventoryUtilsExt2 {
String modelnum = "".equals(entryInfo.getString("modelnum")) ? " " : entryInfo.getString("modelnum");
String lot = entryInfo.getString("lot");
String unitId = entryInfo.getDynamicObject("measureunit") == null ? "" : entryInfo.getDynamicObject("measureunit").getString("id");
List<DynamicObject> sameList = (List)copiedList.stream().filter((obj) -> {
List<DynamicObject> sameList = (List) copiedList.stream().filter((obj) -> {
return matId.equals(obj.getDynamicObject("material").getString("id")) && modelnum.equals(obj.getString("modelnum") != null && !"".equals(obj.getString("modelnum")) ? obj.getString("modelnum") : " ") && unitId.equals(obj.getDynamicObject("measureunit") == null ? "" : obj.getDynamicObject("measureunit").getString("id")) && lot.equals(obj.getString("lot"));
}).collect(Collectors.toList());
if (sameList.isEmpty()) {
@ -270,7 +275,7 @@ public class MaterialInventoryUtilsExt2 {
});
copiedList.add(copiedObj);
} else {
DynamicObject mergedMatInfo = (DynamicObject)sameList.get(0);
DynamicObject mergedMatInfo = (DynamicObject) sameList.get(0);
mergeFields.forEach((field) -> {
mergedMatInfo.set(field, EcNumberHelper.add(mergedMatInfo.getBigDecimal(field), entryInfo.getBigDecimal(field)));
});
@ -281,7 +286,7 @@ public class MaterialInventoryUtilsExt2 {
}
}
return (DynamicObject[])copiedList.toArray(new DynamicObject[0]);
return (DynamicObject[]) copiedList.toArray(new DynamicObject[0]);
} else {
return new DynamicObject[0];
}
@ -292,7 +297,7 @@ public class MaterialInventoryUtilsExt2 {
mergedFields.add("qty");
DynamicObject[] mergedEntrys = mergeSameMaterial(entrys, mergedFields);
for(int i = 0; i < mergedEntrys.length; ++i) {
for (int i = 0; i < mergedEntrys.length; ++i) {
DynamicObject entryInfo = mergedEntrys[i];
DynamicObject material = entryInfo.getDynamicObject("material");
String matId = material.getString("id");
@ -321,7 +326,7 @@ public class MaterialInventoryUtilsExt2 {
mergedFields.add("qty");
DynamicObject[] mergedEntrys = mergeSameMaterial(entrys, mergedFields);
for(int i = 0; i < mergedEntrys.length; ++i) {
for (int i = 0; i < mergedEntrys.length; ++i) {
DynamicObject entryInfo = mergedEntrys[i];
DynamicObject material = entryInfo.getDynamicObject("material");
String matId = material.getString("id");
@ -387,7 +392,7 @@ public class MaterialInventoryUtilsExt2 {
}
public static String checkLotPrice(String orgId, String projectId, String warehouseId, DynamicObject[] entrys) {
for(int i = 0; i < entrys.length; ++i) {
for (int i = 0; i < entrys.length; ++i) {
DynamicObject entryInfo = entrys[i];
String lot = entryInfo.getString("lot");
if (lot != null && lot != "") {