This commit is contained in:
xuhaihui 2025-08-29 13:56:09 +08:00
parent 1ce97325ce
commit e04af0f287
2 changed files with 1446 additions and 8 deletions

View File

@ -0,0 +1,272 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package zcgj.zcdev.zcdev.pr.plugin.form;
import com.google.common.collect.Maps;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import kd.bos.dataentity.Tuple;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.resource.ResManager;
import kd.bos.dataentity.utils.ArrayUtils;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.datamodel.IDataModel;
import kd.bos.form.IFormView;
import kd.bos.form.events.BeforeDoOperationEventArgs;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.ec.basedata.common.utils.CurrencyHelper;
import kd.ec.material.common.enums.PoundTransTypeEnum;
import kd.ec.material.formplugin.MaterialOutBillEditPlugin;
import org.apache.commons.collections4.CollectionUtils;
public class PoundAutoFetchBizExt2 {
private final MaterialOutBillEditPluginExt plugin;
private final IFormView formView;
public PoundAutoFetchBizExt2(MaterialOutBillEditPluginExt plugin) {
this.plugin = plugin;
this.formView = plugin.getView();
}
public void doFetchPound(BeforeDoOperationEventArgs args) {
IDataModel model = this.formView.getModel();
DynamicObject warehouse = (DynamicObject)model.getValue("warehouse");
if (warehouse == null) {
this.formView.showMessage(ResManager.loadKDString("请先选择发货仓库。", "PoundAutoFetchBiz_2", "ec-ecma-formplugin", new Object[0]));
args.setCancel(true);
} else {
DynamicObject transType = (DynamicObject)this.formView.getModel().getValue("transtype");
if (transType == null) {
this.formView.getModel().setValue("transtype", PoundTransTypeEnum.POUND_OUT.getDefaultId());
}
int rowCount = this.formView.getModel().getEntryRowCount("entryentity");
if (rowCount > 0) {
this.formView.getModel().deleteEntryData("entryentity");
this.formView.updateView("entryentity");
}
DynamicObject[] matInventoryEntities = this.queryMatInventory();
if (!ArrayUtils.isEmpty(matInventoryEntities)) {
Map<Long, List<DynamicObject>> matInventoryGroup = (Map)Arrays.stream(matInventoryEntities).filter((dynamicObject) -> {
return Optional.ofNullable(dynamicObject.getDynamicObject("material")).isPresent();
}).collect(Collectors.groupingBy((dynamicObject) -> {
return (Long)dynamicObject.getDynamicObject("material").getPkValue();
}));
Set<Long> resourceIds = matInventoryGroup.keySet();
DynamicObject[] poundEntities = this.queryPoundBills(resourceIds);
this.fillEntry(poundEntities, matInventoryGroup);
}
}
}
protected DynamicObject[] queryMatInventory() {
DynamicObject org = (DynamicObject)this.formView.getModel().getValue("org");
DynamicObject warehouse = (DynamicObject)this.formView.getModel().getValue("warehouse");
DynamicObject project = (DynamicObject)this.formView.getModel().getValue("project");
QFilter orgFilter = new QFilter("org", "=", org.getPkValue());
QFilter warehouseFilter = new QFilter("warehouse", "=", warehouse.getPkValue());
if (project != null) {
warehouseFilter = warehouseFilter.and(new QFilter("project", "=", project.getPkValue()));
}
QFilter qtyFilter = new QFilter("qty", ">", 0);
String matInventorySelectProps = "material,modelnum,measureunit,lot,qty,price,amount,currency";
return BusinessDataServiceHelper.load("ecma_matinventory", matInventorySelectProps, new QFilter[]{orgFilter, warehouseFilter, qtyFilter});
}
protected DynamicObject[] queryPoundBills(Set<Long> resourceIds) {
DynamicObject project = (DynamicObject)this.formView.getModel().getValue("project");
DynamicObject warehouse = (DynamicObject)this.formView.getModel().getValue("warehouse");
DynamicObject org = (DynamicObject)this.formView.getModel().getValue("org");
QFilter orgFilter = new QFilter("org", "=", org.getPkValue());
if (project != null) {
orgFilter = orgFilter.and(new QFilter("project", "=", project.getPkValue()));
}
if (warehouse != null) {
orgFilter = orgFilter.and((new QFilter("out_depot", "=", warehouse.getPkValue())).or(new QFilter("out_depot", "=", 0)));
}
QFilter depotStatusFilter = new QFilter("depotstatus", "=", Boolean.FALSE);
QFilter transTypeFilter = new QFilter("transtype", "=", PoundTransTypeEnum.POUND_OUT.getDefaultId());
QFilter optTypeFilter = new QFilter("opt_type", "!=", "2");
QFilter poundResourceFilter = new QFilter("material", "in", resourceIds);
return BusinessDataServiceHelper.load("ecma_poundbill", "id ,billno ,material ,actualweight", new QFilter[]{orgFilter, transTypeFilter, depotStatusFilter, optTypeFilter, poundResourceFilter});
}
protected void fillEntry(DynamicObject[] poundEntities, Map<Long, List<DynamicObject>> matInventoryGroup) {
if (!ArrayUtils.isEmpty(poundEntities)) {
DynamicObject[] var3 = poundEntities;
int var4 = poundEntities.length;
for(int var5 = 0; var5 < var4; ++var5) {
DynamicObject poundEntity = var3[var5];
DynamicObject resource = poundEntity.getDynamicObject("material");
List<DynamicObject> resourceListEntities = (List)matInventoryGroup.get((Long)resource.getPkValue());
if (!CollectionUtils.isEmpty(resourceListEntities)) {
Map<String, Object> poundDataMap = Maps.newHashMap();
poundDataMap.put("poundid", poundEntity.getPkValue());
poundDataMap.put("poundno", poundEntity.getString("billno"));
poundDataMap.put("qty", poundEntity.getString("actualweight"));
List<Tuple<DynamicObject, BigDecimal>> tupleList = this.filterResourceListByLot(resource, resourceListEntities, new BigDecimal(poundEntity.getString("actualweight")));
this.fillEntryByMatInventory(tupleList, poundDataMap);
}
}
this.formView.updateView("entryentity");
this.plugin.sumOutAmount();
}
}
protected List<Tuple<DynamicObject, BigDecimal>> filterResourceListByLot(DynamicObject resource, List<DynamicObject> resourceListEntities, BigDecimal targetQty) {
List<Tuple<DynamicObject, BigDecimal>> result = new ArrayList();
if (CollectionUtils.isEmpty(resourceListEntities)) {
return result;
} else {
Map<Boolean, List<DynamicObject>> lotMap = (Map)resourceListEntities.stream().collect(Collectors.groupingBy((dynamicObject) -> {
String lot = dynamicObject.getString("lot");
return StringUtils.isNotEmpty(lot);
}));
List<DynamicObject> lotResourceList = (List)lotMap.get(true);
if (CollectionUtils.isNotEmpty(lotResourceList)) {
Map<String, DynamicObject> lotResourceMap = (Map)resourceListEntities.stream().collect(Collectors.toMap((materialInventory) -> {
return materialInventory.getString("lot");
}, Function.identity(), (k1, k2) -> {
return k1;
}));
Set<String> lotSet = lotResourceMap.keySet();
QFilter filter = new QFilter("number", "in", lotSet);
filter.and(new QFilter("material", "=", resource.getPkValue()));
DynamicObject[] lotEntities = BusinessDataServiceHelper.load("ecma_material_lot", "number", new QFilter[]{filter}, "id");
DynamicObject[] var11 = lotEntities;
int var12 = lotEntities.length;
for(int var13 = 0; var13 < var12; ++var13) {
DynamicObject lotEntity = var11[var13];
if (targetQty.compareTo(BigDecimal.ZERO) <= 0) {
break;
}
String logNumber = lotEntity.getString("number");
DynamicObject lotResource = (DynamicObject)lotResourceMap.get(logNumber);
BigDecimal qty = lotResource.getBigDecimal("qty");
BigDecimal diff = targetQty.subtract(qty);
if (diff.compareTo(BigDecimal.ZERO) >= 0) {
result.add(Tuple.create(lotResource, qty));
targetQty = diff;
} else {
result.add(Tuple.create(lotResource, targetQty));
targetQty = BigDecimal.ZERO;
}
}
}
List<DynamicObject> notLotResourceList = (List)lotMap.get(false);
if (CollectionUtils.isEmpty(notLotResourceList)) {
return result;
} else {
Iterator var20 = notLotResourceList.iterator();
while(var20.hasNext()) {
DynamicObject notLotResource = (DynamicObject)var20.next();
if (targetQty.compareTo(BigDecimal.ZERO) <= 0) {
break;
}
BigDecimal qty = notLotResource.getBigDecimal("qty");
BigDecimal diff = targetQty.subtract(qty);
if (diff.compareTo(BigDecimal.ZERO) >= 0) {
result.add(Tuple.create(notLotResource, qty));
targetQty = diff;
} else {
result.add(Tuple.create(notLotResource, targetQty));
targetQty = BigDecimal.ZERO;
}
}
return result;
}
}
}
protected void fillEntryByMatInventory(List<Tuple<DynamicObject, BigDecimal>> resourceListEntities, Map<String, Object> poundDataMap) {
DynamicObject dataEntity = this.formView.getModel().getDataEntity();
DynamicObject currency = dataEntity.getDynamicObject("currency");
DynamicObject rateTable = dataEntity.getDynamicObject("exratetable");
DynamicObjectCollection entryEntity = this.formView.getModel().getEntryEntity("entryentity");
Date rateDate = dataEntity.getDate("exchangedate");
Iterator var8 = resourceListEntities.iterator();
while(var8.hasNext()) {
Tuple<DynamicObject, BigDecimal> materialInventoryTuple = (Tuple)var8.next();
DynamicObject row = entryEntity.addNew();
DynamicObject materialInventory = (DynamicObject)materialInventoryTuple.item1;
String modelNum = materialInventory.getString("modelnum");
DynamicObject material = materialInventory.getDynamicObject("material");
String lot = materialInventory.getString("lot");
DynamicObject measureUnit = materialInventory.getDynamicObject("measureunit");
String price = materialInventory.getString("price");
BigDecimal priceNum = new BigDecimal(price);
QFilter filter = new QFilter("number", "=", lot);
filter.and(new QFilter("material", "=", material.getPkValue()));
filter.and(new QFilter("modelnum", "=", modelNum.trim()));
DynamicObject[] lots = BusinessDataServiceHelper.load("ecma_material_lot", "number", new QFilter[]{filter});
if (ArrayUtils.isNotEmpty(lots)) {
row.set("lotid", lots[0]);
}
row.set("material", material);
row.set("modelnum", modelNum);
row.set("lot", lot);
if (measureUnit != null) {
row.set("measureunit", measureUnit);
} else {
row.set("measureunit", (Object)null);
}
boolean isMultiCurrency = dataEntity.getBoolean("ismulticurrency");
DynamicObject srcCurrency = materialInventory.getDynamicObject("currency");
BigDecimal rate = BigDecimal.ONE;
BigDecimal directRate;
if (isMultiCurrency && !StringUtils.equals(srcCurrency.getString("id"), currency.getString("id"))) {
DynamicObject stdCurrency = dataEntity.getDynamicObject("stdcurrency");
if (!srcCurrency.getPkValue().equals(stdCurrency.getPkValue())) {
if (rateTable != null && rateDate != null) {
rate = CurrencyHelper.getExChangeRate(srcCurrency.getLong("id"), currency.getLong("id"), rateTable.getLong("id"), rateDate);
rate = rate == null ? BigDecimal.ONE : rate;
}
} else {
directRate = dataEntity.getBigDecimal("exchangerate");
directRate = directRate != null && directRate.compareTo(BigDecimal.ZERO) != 0 ? directRate : BigDecimal.ZERO;
rate = BigDecimal.ONE.divide(directRate, 10, 4);
}
}
BigDecimal entryPrice = priceNum.multiply(rate);
row.set("price", entryPrice);
row.set("poundid", poundDataMap.get("poundid"));
row.set("poundno", poundDataMap.get("poundno"));
directRate = (BigDecimal)materialInventoryTuple.item2;
row.set("qty", directRate);
row.set("amount", entryPrice.multiply(directRate));
row.set("matinventory", materialInventory.getPkValue());
}
this.formView.getModel().updateEntryCache(entryEntity);
}
}