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; } }