|
@@ -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_bigintfield2 = writeoffmoney.getLong("nckd_bigintfield2");
|
|
|
|
+ String sourcebillid = String.valueOf(nckd_bigintfield2);
|
|
|
|
+ //预付借款单预付借款信息分录id
|
|
|
|
+ Long srcofsrcentryid = writeoffmoney.getLong("nckd_bigintfield1");
|
|
|
|
+ //冲销金额
|
|
|
|
+ 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_bigintfield2 = writeoffmoney.getLong("nckd_bigintfield2");
|
|
|
|
+ String sourcebillid = String.valueOf(nckd_bigintfield2);
|
|
|
|
+ //预付借款单预付借款信息分录id
|
|
|
|
+ Long srcofsrcentryid = writeoffmoney.getLong("nckd_bigintfield1");
|
|
|
|
+ //冲销金额
|
|
|
|
+ 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_bigintfield2 = writeoffmoney.getLong("nckd_bigintfield2");
|
|
|
|
+ String sourcebillid = String.valueOf(nckd_bigintfield2);
|
|
|
|
+ //预付借款单预付借款信息分录id
|
|
|
|
+ Long srcofsrcentryid = writeoffmoney.getLong("nckd_bigintfield1");
|
|
|
|
+ //冲销金额
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
+}
|