Browse Source

差旅报销单回写应收挂帐单开发

wanwei 6 months ago
parent
commit
8ceb95ff39
1 changed files with 220 additions and 0 deletions
  1. 220 0
      src/main/java/fi/er/opplugin/TripreimburseOpPlugin.java

+ 220 - 0
src/main/java/fi/er/opplugin/TripreimburseOpPlugin.java

@@ -0,0 +1,220 @@
+package fi.er.opplugin;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.math.BigDecimal;
+
+public class TripreimburseOpPlugin extends AbstractOperationServicePlugIn {
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        //获取报销单据信息
+        DynamicObject[] dynamicObjects = e.getDataEntities();
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            if (StringUtils.equals(e.getOperationKey(),"save")) {
+                DynamicObject info = dynamicObjects[i];
+                //反写预付借款单
+                DynamicObjectCollection nckd_clearloanentrys = info.getDynamicObjectCollection("nckd_clearloanentry");
+                Boolean exist = QueryServiceHelper.exists(info.getDynamicObjectType().getName(),  info.getPkValue());
+                if (!exist) {
+                    // 如果没有保存的信息,直接反写
+                    writeBackFinarbill(nckd_clearloanentrys);
+                }else {
+                    DynamicObject saveInfo = BusinessDataServiceHelper.loadSingle(info.getPkValue(), info.getDynamicObjectType().getName());
+                    DynamicObjectCollection saveClearloanentrys = saveInfo.getDynamicObjectCollection("nckd_clearloanentry");
+                    // 处理在 saveWriteoffmoneys 中但不在 writeoffmoneys 中的元素
+                    DynamicObjectCollection toDelete = getDifference(saveClearloanentrys, nckd_clearloanentrys);
+                    if (toDelete.size() != 0) {
+                        deleteBackFinarbill(toDelete);
+                    }
+                    // 处理在 writeoffmoneys 中但不在 saveWriteoffmoneys 中的元素
+                    DynamicObjectCollection toWriteBack = getDifference(nckd_clearloanentrys, saveClearloanentrys);
+                    if (toWriteBack.size() != 0) {
+                        writeBackFinarbill(toWriteBack);
+                    }
+                    // 获取在 writeoffmoneys 和 saveWriteoffmoneys 中都有的元素并执行反写
+                    DynamicObjectCollection commonItems = getCommonItems(nckd_clearloanentrys, saveClearloanentrys);
+                    if (commonItems.size() != 0) {
+                        commonBackFinarbill(commonItems);
+                    }
+                }
+            } else if (StringUtils.equals(e.getOperationKey(),"delete")) {
+                //当前单头数据包
+                DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+                DynamicObjectCollection writeoffmoneys = info.getDynamicObjectCollection("nckd_clearloanentry");
+                deleteBackFinarbill(writeoffmoneys);
+            }
+        }
+    }
+
+    public void writeBackFinarbill(DynamicObjectCollection writeoffmoneys) {
+        //报销单冲预付借款分录
+        for (DynamicObject writeoffmoney : writeoffmoneys) {
+            //预付借款单id
+            Long nckd_bigintfield1 = writeoffmoney.getLong("nckd_bigintfield1");
+            String sourcebillid = String.valueOf(nckd_bigintfield1);
+            //预付借款单预付借款信息分录id
+            Long srcofsrcentryid = writeoffmoney.getLong("nckd_bigintfield2");
+            //冲销金额
+            BigDecimal accloanamount = writeoffmoney.getBigDecimal("nckd_unexporiusedamount");
+            //查询应收挂账单
+            QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
+            DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
+            for (DynamicObject finarbill : finarbills) {
+                DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
+                //应收挂账单明细分录
+                DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
+                for (DynamicObject entry : entrys) {
+                    //预付借款单预付借款信息分录id
+                    Long e_srcentryid = entry.getLong("e_srcentryid");
+                    //销账金额
+                    BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
+                    //已结算金额
+                    BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
+                    //未结算金额
+                    BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
+                    //已结算金额(本位币)
+                    BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
+                    //未结算金额(本位币)
+                    BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
+                    if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
+                        entry.set("nckd_e_settledamt", nckd_e_settledamt.add(accloanamount));
+                        entry.set("e_settledamt", e_settledamt.add(accloanamount));
+                        entry.set("e_unsettleamt", e_unsettleamt.subtract(accloanamount));
+                    }
+                }
+                SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
+            }
+        }
+    }
+
+    public void deleteBackFinarbill(DynamicObjectCollection writeoffmoneys) {
+        //报销单冲预付借款分录
+        for (DynamicObject writeoffmoney : writeoffmoneys) {
+            //预付借款单id
+            Long nckd_bigintfield1 = writeoffmoney.getLong("nckd_bigintfield1");
+            String sourcebillid = String.valueOf(nckd_bigintfield1);
+            //预付借款单预付借款信息分录id
+            Long srcofsrcentryid = writeoffmoney.getLong("nckd_bigintfield2");
+            //冲销金额
+            BigDecimal accloanamount = writeoffmoney.getBigDecimal("nckd_unexporiusedamount");
+            //查询应收挂账单
+            QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
+            DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
+            for (DynamicObject finarbill : finarbills) {
+                DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
+                //应收挂账单明细分录
+                DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
+                for (DynamicObject entry : entrys) {
+                    //预付借款单预付借款信息分录id
+                    Long e_srcentryid = entry.getLong("e_srcentryid");
+                    //销账金额
+                    BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
+                    //已结算金额
+                    BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
+                    //未结算金额
+                    BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
+                    //已结算金额(本位币)
+                    BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
+                    //未结算金额(本位币)
+                    BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
+                    if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
+                        entry.set("nckd_e_settledamt", nckd_e_settledamt.subtract(accloanamount));
+                        entry.set("e_settledamt", e_settledamt.subtract(accloanamount));
+                        entry.set("e_unsettleamt", e_unsettleamt.add(accloanamount));
+                    }
+                }
+                SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
+            }
+        }
+    }
+
+    public void commonBackFinarbill(DynamicObjectCollection writeoffmoneys) {
+        //报销单冲预付借款分录
+        for (DynamicObject writeoffmoney : writeoffmoneys) {
+            //预付借款单id
+            Long nckd_bigintfield1 = writeoffmoney.getLong("nckd_bigintfield1");
+            String sourcebillid = String.valueOf(nckd_bigintfield1);
+            //预付借款单预付借款信息分录id
+            Long srcofsrcentryid = writeoffmoney.getLong("nckd_bigintfield2");
+            //冲销金额
+            BigDecimal nckd_amountfield13 = writeoffmoney.getBigDecimal("nckd_amountfield13");
+            //查询应收挂账单
+            QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
+            DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
+            for (DynamicObject finarbill : finarbills) {
+                DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
+                //应收挂账单明细分录
+                DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
+                for (DynamicObject entry : entrys) {
+                    //预付借款单预付借款信息分录id
+                    Long e_srcentryid = entry.getLong("e_srcentryid");
+                    //销账金额
+                    BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
+                    //已结算金额
+                    BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
+                    //未结算金额
+                    BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
+                    //已结算金额(本位币)
+                    BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
+                    //未结算金额(本位币)
+                    BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
+                    if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
+                        entry.set("nckd_e_settledamt", nckd_e_settledamt.add(nckd_amountfield13));
+                        entry.set("e_settledamt", e_settledamt.add(nckd_amountfield13));
+                        entry.set("e_unsettleamt", e_unsettleamt.subtract(nckd_amountfield13));
+                    }
+                }
+                SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
+            }
+        }
+    }
+
+    // 获取在 source 中但不在 target 中的元素集合
+    private DynamicObjectCollection getDifference(DynamicObjectCollection source, DynamicObjectCollection target) {
+        DynamicObjectCollection difference = new DynamicObjectCollection();
+        for (DynamicObject sourceItem : source) {
+            boolean existsInTarget = false;
+            for (DynamicObject targetItem : target) {
+                // 根据某个唯一标识符判断是否存在
+                if (sourceItem.getPkValue().equals(targetItem.getPkValue())) {
+                    existsInTarget = true;
+                    break;
+                }
+            }
+            if (!existsInTarget) {
+                difference.add(sourceItem);
+            }
+        }
+        return difference;
+    }
+
+    // 获取在 source 和 target 中都有的元素集合
+    private DynamicObjectCollection getCommonItems(DynamicObjectCollection source, DynamicObjectCollection target) {
+        DynamicObjectCollection commonItems = new DynamicObjectCollection();
+        for (DynamicObject sourceItem : source) {
+            for (DynamicObject targetItem : target) {
+                // 根据某个唯一标识符判断是否存在
+                if (sourceItem.getPkValue().equals(targetItem.getPkValue())) {
+                    BigDecimal sourceAmount = sourceItem.getBigDecimal("nckd_unexporiusedamount");
+                    BigDecimal targetAmount = targetItem.getBigDecimal("nckd_unexporiusedamount");
+                    BigDecimal nckd_amountfield13 = sourceAmount.subtract(targetAmount);
+                    if (nckd_amountfield13.compareTo(BigDecimal.ZERO) != 0) {
+                        sourceItem.set("nckd_amountfield13", nckd_amountfield13);
+                        commonItems.add(sourceItem);
+                        break; // 找到共同项后跳出内层循环
+                    }
+                }
+            }
+        }
+        return commonItems;
+    }
+}