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