From 0c7ef831e5d43a65afc1233d11f2f62fc1db1b8b Mon Sep 17 00:00:00 2001 From: zhangzhiguo Date: Wed, 2 Apr 2025 17:23:38 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E6=94=AF=E5=87=BA=E5=90=88?= =?UTF-8?q?=E5=90=8C=E5=A4=9A=E7=A8=8E=E7=8E=87=E5=8F=98=E6=9B=B4=E4=B8=BA?= =?UTF-8?q?=E5=8D=95=E7=A8=8E=E7=8E=87=E9=80=BB=E8=BE=91=202.=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=94=AF=E5=87=BA=E5=90=88=E5=90=8C=E5=8D=95=E7=A8=8E?= =?UTF-8?q?=E7=8E=87=E5=8F=98=E6=9B=B4=E4=B8=BA=E5=A4=9A=E7=A8=8E=E7=8E=87?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operate/OutContractRevisionBillOpExt.java | 346 ++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/OutContractRevisionBillOpExt.java diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/OutContractRevisionBillOpExt.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/OutContractRevisionBillOpExt.java new file mode 100644 index 0000000..37c15eb --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/OutContractRevisionBillOpExt.java @@ -0,0 +1,346 @@ +package zcgj.zcdev.zcdev.pr.plugin.operate; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.EntityMetadataCache; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.ec.basedata.common.enums.PayDirectionEnum; +import kd.ec.basedata.common.enums.ecma.OrderSourceEnum; +import kd.ec.contract.common.utils.EcNumberHelper; +import kd.ec.contract.common.utils.TypeUtils; +import kd.ec.contract.opplugin.OutContractRevisionBillOp; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class OutContractRevisionBillOpExt extends OutContractRevisionBillOp { + + private static String selector = (String) Stream.of("totalrevisionamount", "totalrevisionoftaxamount", "totalamount", "totaloftaxamount", "ismultirate", "taxrate", "originalamount", "avgtaxrate", "originaloftaxamount", "taxamount").collect(Collectors.joining(",")); + + @Override + public void reverseWritingToContract(String operationKey, DynamicObject source) { + boolean isFromDB = source.getDataEntityState().getFromDatabase(); + if (isFromDB) { + source = BusinessDataServiceHelper.loadSingle(source.getPkValue(), EntityMetadataCache.getDataEntityType("ec_outrevision")); + DynamicObject contract = BusinessDataServiceHelper.loadSingle(source.getDynamicObject("contract").getPkValue(), "ec_out_contract", selector); + BigDecimal totalRevisionAmount = contract.getBigDecimal("totalrevisionamount"); + BigDecimal totalRevisionOfTaxAmount = contract.getBigDecimal("totalrevisionoftaxamount"); + BigDecimal totalAmount = contract.getBigDecimal("totalamount"); + BigDecimal totalOfTaxAmount = contract.getBigDecimal("totaloftaxamount"); + BigDecimal revisionAmount = source.getBigDecimal("revisionamount"); + BigDecimal revisionOfTaxAmount = source.getBigDecimal("revisionoftaxamount"); + DynamicObject currency = source.getDynamicObject("currency"); + int pricePrecision = currency == null ? 10 : currency.getInt("priceprecision"); + if (operationKey.equals("audit")) { + this.doHandlerTaxRateChange(contract, source); + contract.set("totalrevisionamount", totalRevisionAmount.add(revisionAmount)); + contract.set("totalrevisionoftaxamount", totalRevisionOfTaxAmount.add(revisionOfTaxAmount)); + contract.set("totalamount", totalAmount.add(revisionAmount)); + contract.set("totaloftaxamount", totalOfTaxAmount.add(revisionOfTaxAmount)); + DynamicObjectCollection kapianEntry = (DynamicObjectCollection)source.get("kapianentry"); + List listUpdateList = new ArrayList(); + List listaddList = new ArrayList(); + Map entryId_biangengsl = new HashMap(); + boolean isSingleRateChangeMultyRate = false;//单税率改为多税率 + boolean isMultyRateChangeSingleRate = false;//多税率改为单税率 + for(int i = 0; i < kapianEntry.size(); ++i) { + DynamicObjectCollection subentrys = (DynamicObjectCollection)((DynamicObject)kapianEntry.get(i)).get("entryentity"); + HashMap newListingMap = new HashMap(); + ArrayList updateLevelList = new ArrayList(); + + for(int k = 0; k < subentrys.size(); ++k) { + DynamicObject subEntry = (DynamicObject)subentrys.get(k); + int changeType = TypeUtils.nullToInt(subEntry.get("subchangetype")); + if (changeType == 3) { + DynamicObject listing = new DynamicObject(EntityMetadataCache.getDataEntityType("ec_outtreelisting")); + listing.set("id", subEntry.get("newlistingid")); + listing.set("isaddnew", true); + listing.set("listparentid", subEntry.get("superlistingid")); + listing.set("parent", subEntry.get("superlistingid")); + if (subEntry.getDynamicObject("parentgroup") != null) { + listing.set("level", subEntry.getDynamicObject("parentgroup").getInt("level") + 1); + } else { + updateLevelList.add(listing); + } + + listing.set("paydirection", PayDirectionEnum.OUT.getValue()); + listing.set("number", subEntry.get("listnumber")); + listing.set("name", subEntry.get("listname")); + listing.set("sysnumber", subEntry.get("sysnum")); + listing.set("desc", subEntry.get("remark")); + if (subEntry.get("boqnumber") != null) { + listing.set("boqnumber", subEntry.getDynamicObject("boqnumber").getPkValue()); + } + + DynamicObject parentnode = (DynamicObject)subEntry.getParent(); + listing.set("listingmodel", parentnode.get("listmodelid")); + listing.set("contractid", contract.getPkValue().toString()); + listing.set("enable", 1); + listing.set("status", "C"); + listing.set("isleaf", false); + listing.set("currency", source.getDynamicObject("currency").getPkValue()); + listaddList.add(listing); + newListingMap.put(subEntry.get("newlistingid").toString(), listing); + } + } + + for(DynamicObject listing : updateLevelList) { + if (listing.get("listparentid") != null && listing.getLong("listparentid") != 0L) { + DynamicObject parent = (DynamicObject)newListingMap.get(String.valueOf(listing.getLong("listparentid"))); + listing.set("level", parent.getInt("level") + 1); + } else { + listing.set("level", 1); + } + } + + for(int k = 0; k < subentrys.size(); ++k) { + DynamicObject subEntry = (DynamicObject)subentrys.get(k); + int changeType = TypeUtils.nullToInt(subEntry.get("subchangetype")); + if (changeType == 0) { + DynamicObject listing = (DynamicObject)subEntry.get("listid"); + if (listing == null) { + continue; + } + + listing = BusinessDataServiceHelper.loadSingle(listing.getPkValue(), EntityMetadataCache.getDataEntityType("ec_outtreelisting")); + listing.set("ischanged", true); + listing.set("enable", 1); + BigDecimal changeQty = listing.getBigDecimal("changeqty"); + BigDecimal addQty = subEntry.getBigDecimal("biangengsl"); + entryId_biangengsl.put((Long)listing.getPkValue(), addQty); + changeQty = changeQty.add(addQty); + listing.set("changeqty", changeQty); + BigDecimal changedTaxAmount = (BigDecimal)subEntry.get("hsbgje"); + BigDecimal lastChangedTaxAmount = (BigDecimal)listing.get("chgoftaxamount"); + listing.set("chgoftaxamount", lastChangedTaxAmount.add(changedTaxAmount)); + BigDecimal totalQty = listing.getBigDecimal("totalqty").add(addQty); + listing.set("totalqty", totalQty); + BigDecimal lastTotalChangedTaxAmount = listing.getBigDecimal("lstoftaxamount"); + BigDecimal totalChangedTaxAmount = lastTotalChangedTaxAmount.add(changedTaxAmount); + listing.set("lstoftaxamount", totalChangedTaxAmount); + listing.set("lasttotalamt", subEntry.getBigDecimal("bghzje")); + if (totalQty.compareTo(BigDecimal.ZERO) != 0) { + BigDecimal avgTaxPrice = EcNumberHelper.divide(totalChangedTaxAmount, totalQty, pricePrecision); + listing.set("avgtaxprice", avgTaxPrice); + BigDecimal avgPrice = EcNumberHelper.divide(subEntry.getBigDecimal("bghzje"), totalQty, pricePrecision); + listing.set("avgprice", avgPrice); + } + + listUpdateList.add(listing); + } + + if (changeType == 1 || changeType == 4 || changeType == 5) { + DynamicObject listing = (DynamicObject)subEntry.get("listid"); + if (listing == null) { + continue; + } + + listing = BusinessDataServiceHelper.loadSingle(listing.getPkValue(), EntityMetadataCache.getDataEntityType("ec_outtreelisting")); + if (this.isSingleRateChange(contract, source)) { + //如果是单税率变更为多税率的情况下,需要判断综合税率是不是为空,如果当前税率为空,则有可能是单改多 + Object curtaxrate = source.get("curtaxrate"); + if (curtaxrate != null) { + listing.set("rateobj", source.get("curtaxrate")); + listing.set("taxrate", source.getDynamicObject("curtaxrate").get("taxrate")); + }else{ + Object rateobj = subEntry.get("rateobj"); + listing.set("rateobj", rateobj); + listing.set("taxrate", subEntry.getDynamicObject("rateobj").get("taxrate")); + listing.set("taxprice", subEntry.get("biangenghouhsdj")); //含税单价 + listing.set("oftax", subEntry.get("bghhszje")); //价税合计 + listing.set("tax", subEntry.get("bghse")); //税额 + listing.set("desc", subEntry.get("remark")); //备注 + isSingleRateChangeMultyRate = true; + } + } + + if (this.isMultyRateChange(contract, source)) { + boolean ismultirate = source.getBoolean("ismultirate"); + Object rateobj = subEntry.get("rateobj"); + if(rateobj!=null){ + listing.set("rateobj", rateobj); + listing.set("taxrate", subEntry.getDynamicObject("rateobj").get("taxrate")); + } + if(!ismultirate){ + Object curtaxrate = source.get("curtaxrate"); + listing.set("rateobj", curtaxrate); + listing.set("taxrate", source.getDynamicObject("curtaxrate").get("taxrate")); + listing.set("taxprice", subEntry.get("biangenghouhsdj")); //含税单价 + listing.set("oftax", subEntry.get("bghhszje")); //价税合计 + listing.set("tax", subEntry.get("bghse")); //税额 + listing.set("desc", subEntry.get("remark")); //备注 + isMultyRateChangeSingleRate = true; + } + } + + listing.set("ischanged", true); + listing.set("enable", 1); + BigDecimal effectQty = subEntry.getBigDecimal("shouyingxsl"); + BigDecimal lastChangedEffectQty = listing.getBigDecimal("chgeffectqty"); + listing.set("chgeffectqty", effectQty.add(lastChangedEffectQty)); + listing.set("curtaxprice", subEntry.getBigDecimal("biangenghouhsdj")); + BigDecimal changedTaxAmount = subEntry.getBigDecimal("hsbgje"); + BigDecimal lastChangedTaxAmount = (BigDecimal)listing.get("chgoftaxamount"); + listing.set("chgoftaxamount", lastChangedTaxAmount.add(changedTaxAmount)); + BigDecimal lastTotalChangedTaxAmount = listing.getBigDecimal("lstoftaxamount"); + BigDecimal totalChangedTaxAmount = lastTotalChangedTaxAmount.add(changedTaxAmount); + listing.set("lstoftaxamount", totalChangedTaxAmount); + listing.set("currentprice", subEntry.getBigDecimal("biangenghoudj")); + listing.set("lasttotalamt", subEntry.getBigDecimal("bghzje")); + BigDecimal addQty = subEntry.getBigDecimal("biangengsl"); + entryId_biangengsl.put((Long)listing.getPkValue(), addQty); + BigDecimal totalQty = listing.getBigDecimal("totalqty").add(addQty); + listing.set("totalqty", totalQty); + if (totalQty.compareTo(BigDecimal.ZERO) != 0) { + BigDecimal avgTaxPrice = EcNumberHelper.divide(totalChangedTaxAmount, totalQty, pricePrecision); + listing.set("avgtaxprice", avgTaxPrice); + BigDecimal avgPrice = EcNumberHelper.divide(subEntry.getBigDecimal("bghzje"), totalQty, pricePrecision); + listing.set("avgprice", avgPrice); + } + + listUpdateList.add(listing); + } + if (changeType == 2) { + DynamicObject listing = new DynamicObject(EntityMetadataCache.getDataEntityType("ec_outtreelisting")); + listing.set("id", subEntry.get("newlistingid")); + listing.set("isaddnew", true); + listing.set("paydirection", PayDirectionEnum.OUT.getValue()); + listing.set("listparentid", subEntry.getString("superlistingid")); + listing.set("number", subEntry.get("listnumber")); + listing.set("name", subEntry.get("listname")); + listing.set("sysnumber", subEntry.get("sysnum")); + if (subEntry.get("measureunit") != null) { + listing.set("measureunit", subEntry.getDynamicObject("measureunit").getPkValue()); + } + + listing.set("qty", subEntry.get("qty")); + listing.set("totalqty", subEntry.get("qty")); + listing.set("price", subEntry.get("price")); + listing.set("avgprice", subEntry.get("price")); + listing.set("currentprice", subEntry.get("price")); + listing.set("cbsnumber", subEntry.get("cbsnumber")); + listing.set("amount", subEntry.get("amount")); + listing.set("lasttotalamt", subEntry.get("amount")); + listing.set("taxrate", subEntry.get("taxrate1")); + listing.set("tax", subEntry.get("tax")); + listing.set("taxprice", subEntry.get("hanshuidanj")); + listing.set("avgtaxprice", subEntry.get("hanshuidanj")); + listing.set("curtaxprice", subEntry.get("hanshuidanj")); + listing.set("oftax", subEntry.get("oftax")); + listing.set("lstoftaxamount", subEntry.get("oftax")); + listing.set("desc", subEntry.get("remark")); + DynamicObject parentnode = (DynamicObject)subEntry.getParent(); + listing.set("listingmodel", parentnode.get("listmodelid")); + listing.set("contractid", contract.getPkValue().toString()); + if (subEntry.get("resourceitem") != null) { + listing.set("resourceitem", subEntry.getDynamicObject("resourceitem").getPkValue()); + } + + if (subEntry.get("materiel") != null) { + listing.set("material", subEntry.getDynamicObject("materiel").getPkValue()); + } + + if (subEntry.get("boqnumber") != null) { + listing.set("boqnumber", subEntry.getDynamicObject("boqnumber").getPkValue()); + } + + if (subEntry.get("contlistnumber") != null) { + listing.set("contlistnumber", subEntry.getDynamicObject("contlistnumber").getPkValue()); + } + + if (subEntry.get("listunitproject") != null) { + listing.set("listunitproject", subEntry.getDynamicObject("listunitproject").getPkValue()); + } + + if (subEntry.get("rateobj") != null) { + listing.set("rateobj", subEntry.getDynamicObject("rateobj").getPkValue()); + } + + listing.set("directfee", subEntry.get("directfee")); + listing.set("equfee", subEntry.get("equfee")); + listing.set("manequfee", subEntry.get("manequfee")); + listing.set("manfee", subEntry.get("manfee")); + listing.set("tmpfee", subEntry.get("tmpfee")); + listing.set("enable", 1); + listing.set("status", "C"); + listing.set("currency", source.getDynamicObject("currency").getPkValue()); + listing.set("isleaf", true); + if (subEntry.getDynamicObject("parentgroup") != null) { + listing.set("level", subEntry.getDynamicObject("parentgroup").getInt("level") + 1); + listing.set("parent", subEntry.getDynamicObject("parentgroup").getPkValue()); + } else if (subEntry.get("superlistingid") != null && subEntry.getLong("superlistingid") != 0L) { + DynamicObject superListing = (DynamicObject)newListingMap.get(String.valueOf(subEntry.getLong("superlistingid"))); + listing.set("level", superListing.getInt("level") + 1); + listing.set("parent", subEntry.getLong("superlistingid")); + } else { + listing.set("level", 1); + listing.set("parent", (Object)null); + } + + listing.set("leaseunit", subEntry.get("leaseunit")); + listing.set("leaseqty", subEntry.get("leaseqty")); + listing.set("leasebegintime", subEntry.get("leasebegintime")); + listing.set("leaseendtime", subEntry.get("leaseendtime")); + listing.set("leasedayqty", subEntry.get("leasedayqty")); + listing.set("arrivaldate", subEntry.get("arrivaldate")); + listaddList.add(listing); + } + } + } + + this.writeBackPurchaseOrder(entryId_biangengsl, contract); + if (!listUpdateList.isEmpty()) { + SaveServiceHelper.save(((DynamicObject)listUpdateList.get(0)).getDataEntityType(), listUpdateList.toArray()); + } + + if (!listaddList.isEmpty()) { + SaveServiceHelper.save(((DynamicObject)listaddList.get(0)).getDataEntityType(), listaddList.toArray()); + } + boolean ismultirate = source.getBoolean("ismultirate"); + if(isSingleRateChangeMultyRate && ismultirate){ + contract.set("ismultirate", true);//多税率 + } + if(isMultyRateChangeSingleRate && !ismultirate){ + contract.set("ismultirate", false);//单税率 + } + + } else if (operationKey.equals("unaudit")) { + contract.set("totalrevisionamount", totalRevisionAmount.subtract(revisionAmount)); + contract.set("totalrevisionoftaxamount", totalRevisionOfTaxAmount.subtract(revisionOfTaxAmount)); + contract.set("totalamount", totalAmount.subtract(revisionAmount)); + contract.set("totaloftaxamount", totalOfTaxAmount.subtract(revisionOfTaxAmount)); + } + + SaveServiceHelper.save(new DynamicObject[]{contract}); + } + } + + + private void writeBackPurchaseOrder(Map entryId_biangengsl, DynamicObject contract) { + QFilter contractFilter = new QFilter("contract", "=", contract.getPkValue()); + QFilter sourceFilter = new QFilter("source", "=", OrderSourceEnum.PUR_CONT.getValue()); + DynamicObject[] orderBillArr = BusinessDataServiceHelper.load("ecma_purchaseorderbill", "billno,billname,orderentry,orderentry.sourceqty,orderentry.restqty,orderentry.listingid", new QFilter[]{contractFilter, sourceFilter}); + + for(DynamicObject item : orderBillArr) { + for(DynamicObject entry : item.getDynamicObjectCollection("orderentry")) { + Long listingId = entry.getLong("listingid"); + BigDecimal biangengsl = (BigDecimal)entryId_biangengsl.get(listingId); + BigDecimal sourceQty = entry.getBigDecimal("sourceqty"); + BigDecimal restQty = entry.getBigDecimal("restqty"); + if (biangengsl != null) { + entry.set("sourceqty", sourceQty.add(biangengsl)); + entry.set("restqty", restQty.add(biangengsl)); + } + } + } + + SaveServiceHelper.save(orderBillArr); + } +}