This commit is contained in:
parent
1ce97325ce
commit
e04af0f287
File diff suppressed because it is too large
Load Diff
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue