|  | @@ -0,0 +1,219 @@
 | 
	
		
			
				|  |  | +package fi.cas.opplugin;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import dm.jdbc.util.StringUtil;
 | 
	
		
			
				|  |  | +import fi.cas.common.SettlementStatusEnum;
 | 
	
		
			
				|  |  | +import kd.bos.dataentity.entity.DynamicObject;
 | 
	
		
			
				|  |  | +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.operation.SaveServiceHelper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.math.BigDecimal;
 | 
	
		
			
				|  |  | +import java.util.HashMap;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//付款处理单付款反写
 | 
	
		
			
				|  |  | +public class PaymentProcessOpPlugin extends AbstractOperationServicePlugIn {
 | 
	
		
			
				|  |  | +    private static String nckd_cas_arbill_gz_l = "nckd_cas_arbill"; //应收挂帐单标识
 | 
	
		
			
				|  |  | +    private static String nckd_er_prepaybill_ext = "er_prepaybill"; //预付借款单标识
 | 
	
		
			
				|  |  | +    private static String nckd_er_publicreimbur_ext = "er_publicreimbursebill"; //报销单标识
 | 
	
		
			
				|  |  | +    private static String er_contractbill = "er_contractbill"; //合同台账单标识
 | 
	
		
			
				|  |  | +    private static String nckd_ap_finapbill_gz = "ap_finapbill"; //应付挂账单标识
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
 | 
	
		
			
				|  |  | +        //获取付款处理单据信息
 | 
	
		
			
				|  |  | +        DynamicObject[] dynamicObjects = e.getDataEntities();
 | 
	
		
			
				|  |  | +        for (int i = 0; i < dynamicObjects.length; i++) {
 | 
	
		
			
				|  |  | +            //当前单头数据包
 | 
	
		
			
				|  |  | +            DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
 | 
	
		
			
				|  |  | +            //获取源单id
 | 
	
		
			
				|  |  | +            Long sourcebillid = info.getLong("sourcebillid");
 | 
	
		
			
				|  |  | +            //存储源单分录id和付款处理分录实付金额
 | 
	
		
			
				|  |  | +            HashMap<String,BigDecimal> amountMap = new HashMap<>();
 | 
	
		
			
				|  |  | +            //循环付款明细分录
 | 
	
		
			
				|  |  | +            for (DynamicObject entryentity : info.getDynamicObjectCollection("entry")) {
 | 
	
		
			
				|  |  | +                //取当前循环付款明细分录的实付金额
 | 
	
		
			
				|  |  | +                BigDecimal expenseamount = entryentity.getBigDecimal("e_actamt");
 | 
	
		
			
				|  |  | +                //取当前循环付款明细分录的源单分录id
 | 
	
		
			
				|  |  | +                String sourcebillentryid = entryentity.getString("e_sourcebillentryid");
 | 
	
		
			
				|  |  | +                amountMap.put(sourcebillentryid,expenseamount);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            //查询应收挂账单
 | 
	
		
			
				|  |  | +            QFilter gzFilter = new QFilter("id", QCP.equals,sourcebillid);
 | 
	
		
			
				|  |  | +            DynamicObject[] gzDynamicObjects = BusinessDataServiceHelper.load(nckd_cas_arbill_gz_l,"id",new QFilter[] {gzFilter});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //查询报销单
 | 
	
		
			
				|  |  | +            QFilter bxFilter = new QFilter("id", QCP.equals,sourcebillid);
 | 
	
		
			
				|  |  | +            DynamicObject[] bxDynamicObjects = BusinessDataServiceHelper.load(nckd_er_publicreimbur_ext,"id",new QFilter[] {bxFilter});
 | 
	
		
			
				|  |  | +            //应收方向的回写
 | 
	
		
			
				|  |  | +            if (gzDynamicObjects.length > 0) {
 | 
	
		
			
				|  |  | +                //循环数组获取结算状态,已结算金额,未结算金额
 | 
	
		
			
				|  |  | +                for (int c=0;c<gzDynamicObjects.length;c++) {
 | 
	
		
			
				|  |  | +                    //应收挂帐单头数据包
 | 
	
		
			
				|  |  | +                    DynamicObject gzInfo = BusinessDataServiceHelper.loadSingle(gzDynamicObjects[i].getPkValue(), gzDynamicObjects[i].getDynamicObjectType().getName());
 | 
	
		
			
				|  |  | +                    //获取预付借款单id
 | 
	
		
			
				|  |  | +                    Long yfjkId = gzInfo.getLong("sourcebillid");
 | 
	
		
			
				|  |  | +                    //存储预付借款单分录id和付款处理分录实付金额
 | 
	
		
			
				|  |  | +                    HashMap<String,BigDecimal> yfjkMap = new HashMap<>();
 | 
	
		
			
				|  |  | +                    //应收挂帐单头已结算金额
 | 
	
		
			
				|  |  | +                    BigDecimal totalSettledamt = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +                    //应收挂帐单头未结算金额
 | 
	
		
			
				|  |  | +                    BigDecimal totalUnsettledamt = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +                    //循环应收挂帐单付款明细分录
 | 
	
		
			
				|  |  | +                    for (DynamicObject entryentity : gzInfo.getDynamicObjectCollection("entry")) {
 | 
	
		
			
				|  |  | +                        //获取分录实付金额
 | 
	
		
			
				|  |  | +                        BigDecimal settledamt = amountMap.get(entryentity.getString("id")) == null ? BigDecimal.ZERO:amountMap.get(entryentity.getString("id"));
 | 
	
		
			
				|  |  | +                        //获取未结算金额
 | 
	
		
			
				|  |  | +                        BigDecimal unsettledamt = entryentity.getBigDecimal("e_unsettledamt");
 | 
	
		
			
				|  |  | +                        unsettledamt = unsettledamt.subtract(settledamt);
 | 
	
		
			
				|  |  | +                        //反写分录已结算金额,未结算金额
 | 
	
		
			
				|  |  | +                        entryentity.set("e_settledamt",settledamt);
 | 
	
		
			
				|  |  | +                        entryentity.set("e_unsettledamt",unsettledamt);
 | 
	
		
			
				|  |  | +                        totalSettledamt = totalSettledamt.add(settledamt);
 | 
	
		
			
				|  |  | +                        totalUnsettledamt = totalUnsettledamt.add(unsettledamt);
 | 
	
		
			
				|  |  | +                        String yfjkSourceBillEntryId = entryentity.getString("e_sourcebillentryid");
 | 
	
		
			
				|  |  | +                        yfjkMap.put(yfjkSourceBillEntryId,settledamt);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    //结算字段赋值
 | 
	
		
			
				|  |  | +                    settleMethod(gzInfo,"settlestatus","settleamount","unsettleamount",totalSettledamt,totalUnsettledamt);
 | 
	
		
			
				|  |  | +                    SaveServiceHelper.save(new DynamicObject[]{gzInfo});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    //查询预付借款单
 | 
	
		
			
				|  |  | +                    QFilter nckd_yfjkFilter = new QFilter("id", QCP.equals,yfjkId);
 | 
	
		
			
				|  |  | +                    DynamicObject[] yfjkDynamicObjects = BusinessDataServiceHelper.load(nckd_er_prepaybill_ext,"id",new QFilter[] {nckd_yfjkFilter});
 | 
	
		
			
				|  |  | +                    //循环数组获取结算状态,已结算金额,未结算金额
 | 
	
		
			
				|  |  | +                    for (int d=0;d<yfjkDynamicObjects.length;d++) {
 | 
	
		
			
				|  |  | +                        //预付借款单头数据包
 | 
	
		
			
				|  |  | +                        DynamicObject yfjkInfo = BusinessDataServiceHelper.loadSingle(yfjkDynamicObjects[i].getPkValue(), yfjkDynamicObjects[i].getDynamicObjectType().getName());
 | 
	
		
			
				|  |  | +                        //循环预付借款单预付借款信息分录
 | 
	
		
			
				|  |  | +                        for (DynamicObject entryentity : yfjkInfo.getDynamicObjectCollection("expenseentryentity")) {
 | 
	
		
			
				|  |  | +                            //获取分录实付金额
 | 
	
		
			
				|  |  | +                            BigDecimal settledamt = yfjkMap.get(entryentity.getString("id")) == null ? BigDecimal.ZERO:yfjkMap.get(entryentity.getString("id"));
 | 
	
		
			
				|  |  | +                            //获取未结算金额
 | 
	
		
			
				|  |  | +                            BigDecimal unsettledamt = entryentity.getBigDecimal("nckd_unsettleamount_et");
 | 
	
		
			
				|  |  | +                            unsettledamt = unsettledamt.subtract(settledamt);
 | 
	
		
			
				|  |  | +                            //反写分录已结算金额,未结算金额
 | 
	
		
			
				|  |  | +                            entryentity.set("nckd_settleamount_et",settledamt);
 | 
	
		
			
				|  |  | +                            entryentity.set("nckd_unsettleamount_et",unsettledamt);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        //结算字段赋值
 | 
	
		
			
				|  |  | +                        settleMethod(yfjkInfo,"nckd_settlestatus","nckd_settleamount","nckd_unsettleamount",totalSettledamt,totalUnsettledamt);
 | 
	
		
			
				|  |  | +                        SaveServiceHelper.save(new DynamicObject[]{yfjkInfo});
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }//应付方向的回写
 | 
	
		
			
				|  |  | +            else if (bxDynamicObjects.length > 0) {
 | 
	
		
			
				|  |  | +                //循环数组获取结算状态,已结算金额,未结算金额
 | 
	
		
			
				|  |  | +                for (int c=0;c<bxDynamicObjects.length;c++) {
 | 
	
		
			
				|  |  | +                    //报销单头数据包
 | 
	
		
			
				|  |  | +                    DynamicObject bxInfo = BusinessDataServiceHelper.loadSingle(bxDynamicObjects[i].getPkValue(), bxDynamicObjects[i].getDynamicObjectType().getName());
 | 
	
		
			
				|  |  | +                    Long bxId = bxInfo.getLong("id");
 | 
	
		
			
				|  |  | +                    //报账类型
 | 
	
		
			
				|  |  | +                    String reimbursetype = bxInfo.getString("reimbursetype");
 | 
	
		
			
				|  |  | +                    //已结算金额
 | 
	
		
			
				|  |  | +                    BigDecimal totalSettledamt = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +                    //未结算金额
 | 
	
		
			
				|  |  | +                    BigDecimal totalUnsettledamt = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +                    //循环报销单收款信息分录
 | 
	
		
			
				|  |  | +                    for (DynamicObject entryentity : bxInfo.getDynamicObjectCollection("accountentry")) {
 | 
	
		
			
				|  |  | +                        //获取分录收款金额
 | 
	
		
			
				|  |  | +                        BigDecimal settledamt = amountMap.get(entryentity.getString("id")) == null ? BigDecimal.ZERO:amountMap.get(entryentity.getString("id"));
 | 
	
		
			
				|  |  | +                        //获取未结算金额
 | 
	
		
			
				|  |  | +                        BigDecimal unsettledamt = entryentity.getBigDecimal("nckd_unsettleamount_et");
 | 
	
		
			
				|  |  | +                        unsettledamt = unsettledamt.subtract(settledamt);
 | 
	
		
			
				|  |  | +                        //反写分录已结算金额,未结算金额
 | 
	
		
			
				|  |  | +                        entryentity.set("nckd_settleamount_et",settledamt);
 | 
	
		
			
				|  |  | +                        entryentity.set("nckd_unsettleamount_et",unsettledamt);
 | 
	
		
			
				|  |  | +                        totalSettledamt = totalSettledamt.add(settledamt);
 | 
	
		
			
				|  |  | +                        totalUnsettledamt = totalUnsettledamt.add(unsettledamt);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
 | 
	
		
			
				|  |  | +                        bxInfo.set("nckd_settlestatus", SettlementStatusEnum.已结算.getValue());
 | 
	
		
			
				|  |  | +                        bxInfo.set("nckd_settleamount", totalSettledamt);
 | 
	
		
			
				|  |  | +                        bxInfo.set("nckd_unsettleamount", totalUnsettledamt);
 | 
	
		
			
				|  |  | +                    } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
 | 
	
		
			
				|  |  | +                        bxInfo.set("nckd_settlestatus", SettlementStatusEnum.未结算.getValue());
 | 
	
		
			
				|  |  | +                        bxInfo.set("nckd_settleamount", totalSettledamt);
 | 
	
		
			
				|  |  | +                        bxInfo.set("nckd_unsettleamount", totalUnsettledamt);
 | 
	
		
			
				|  |  | +                    } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | +                        bxInfo.set("nckd_settlestatus", SettlementStatusEnum.部分结算.getValue());
 | 
	
		
			
				|  |  | +                        bxInfo.set("nckd_settleamount", totalSettledamt);
 | 
	
		
			
				|  |  | +                        bxInfo.set("nckd_unsettleamount", totalUnsettledamt);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    SaveServiceHelper.save(new DynamicObject[]{bxInfo});
 | 
	
		
			
				|  |  | +                    //查询应付挂账
 | 
	
		
			
				|  |  | +                    QFilter nckd_yfgzFilter = new QFilter("sourcebillid", QCP.equals,bxId);
 | 
	
		
			
				|  |  | +                    DynamicObject[] yfgzDynamicObjects = BusinessDataServiceHelper.load(nckd_ap_finapbill_gz,"id",new QFilter[] {nckd_yfgzFilter});
 | 
	
		
			
				|  |  | +                    if (yfgzDynamicObjects.length > 0) {
 | 
	
		
			
				|  |  | +                        for (int f=0;f<yfgzDynamicObjects.length;f++) {
 | 
	
		
			
				|  |  | +                            //应付挂账单
 | 
	
		
			
				|  |  | +                            DynamicObject gzInfo = BusinessDataServiceHelper.loadSingle(yfgzDynamicObjects[i].getPkValue(), yfgzDynamicObjects[i].getDynamicObjectType().getName());
 | 
	
		
			
				|  |  | +                            if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
 | 
	
		
			
				|  |  | +                                gzInfo.set("settlestatus", SettlementStatusEnum.已结算.getValue());
 | 
	
		
			
				|  |  | +                                gzInfo.set("settleamount", totalSettledamt);
 | 
	
		
			
				|  |  | +                                gzInfo.set("unsettleamount", totalUnsettledamt);
 | 
	
		
			
				|  |  | +                            } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
 | 
	
		
			
				|  |  | +                                gzInfo.set("settlestatus", SettlementStatusEnum.未结算.getValue());
 | 
	
		
			
				|  |  | +                                gzInfo.set("settleamount", totalSettledamt);
 | 
	
		
			
				|  |  | +                                gzInfo.set("unsettleamount", totalUnsettledamt);
 | 
	
		
			
				|  |  | +                            } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | +                                gzInfo.set("settlestatus", SettlementStatusEnum.部分结算.getValue());
 | 
	
		
			
				|  |  | +                                gzInfo.set("settleamount", totalSettledamt);
 | 
	
		
			
				|  |  | +                                gzInfo.set("unsettleamount", totalUnsettledamt);
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                            SaveServiceHelper.save(new DynamicObject[]{gzInfo});
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    //报账类型等于工程报账回写合同台账单
 | 
	
		
			
				|  |  | +                    if (StringUtil.equals("engineering",reimbursetype)) {
 | 
	
		
			
				|  |  | +                        //获取合同台账单id
 | 
	
		
			
				|  |  | +                        Long contractbillId = bxInfo.getLong("sourcebillid");
 | 
	
		
			
				|  |  | +                        //查询合同台账单
 | 
	
		
			
				|  |  | +                        QFilter htFilter = new QFilter("id", QCP.equals,contractbillId);
 | 
	
		
			
				|  |  | +                        DynamicObject[] htDynamicObjects = BusinessDataServiceHelper.load(er_contractbill,"id",new QFilter[] {htFilter});
 | 
	
		
			
				|  |  | +                        for (int j=0;j<htDynamicObjects.length;j++) {
 | 
	
		
			
				|  |  | +                            //合同台账单头数据包
 | 
	
		
			
				|  |  | +                            DynamicObject htInfo = BusinessDataServiceHelper.loadSingle(htDynamicObjects[i].getPkValue(), htDynamicObjects[i].getDynamicObjectType().getName());
 | 
	
		
			
				|  |  | +                            htInfo.set("oripayedamount",totalSettledamt);
 | 
	
		
			
				|  |  | +                            htInfo.set("orinotpayamount",totalUnsettledamt);
 | 
	
		
			
				|  |  | +                            if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
 | 
	
		
			
				|  |  | +                                htInfo.set("nckd_settlestatus", SettlementStatusEnum.已结算.getValue());
 | 
	
		
			
				|  |  | +                                htInfo.set("nckd_settleamount", totalSettledamt);
 | 
	
		
			
				|  |  | +                                htInfo.set("nckd_unsettleamount", totalUnsettledamt);
 | 
	
		
			
				|  |  | +                            } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
 | 
	
		
			
				|  |  | +                                htInfo.set("nckd_settlestatus", SettlementStatusEnum.未结算.getValue());
 | 
	
		
			
				|  |  | +                                htInfo.set("nckd_settleamount", totalSettledamt);
 | 
	
		
			
				|  |  | +                                htInfo.set("nckd_unsettleamount", totalUnsettledamt);
 | 
	
		
			
				|  |  | +                            } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | +                                htInfo.set("nckd_settlestatus", SettlementStatusEnum.部分结算.getValue());
 | 
	
		
			
				|  |  | +                                htInfo.set("nckd_settleamount", totalSettledamt);
 | 
	
		
			
				|  |  | +                                htInfo.set("nckd_unsettleamount", totalUnsettledamt);
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                            SaveServiceHelper.save(new DynamicObject[]{htInfo});
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /*
 | 
	
		
			
				|  |  | +     * 给结算状态,结算金额,未结算金额赋值
 | 
	
		
			
				|  |  | +     * */
 | 
	
		
			
				|  |  | +    private void settleMethod(DynamicObject object ,String settlestatus ,String settleamount ,String unsettleamount ,BigDecimal totalSettledamt ,BigDecimal totalUnsettledamt) {
 | 
	
		
			
				|  |  | +        if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
 | 
	
		
			
				|  |  | +            object.set(settlestatus, SettlementStatusEnum.已结算.getValue());
 | 
	
		
			
				|  |  | +            object.set(settleamount, totalSettledamt);
 | 
	
		
			
				|  |  | +            object.set(unsettleamount, totalUnsettledamt);
 | 
	
		
			
				|  |  | +        } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
 | 
	
		
			
				|  |  | +            object.set(settlestatus, SettlementStatusEnum.未结算.getValue());
 | 
	
		
			
				|  |  | +            object.set(settleamount, totalSettledamt);
 | 
	
		
			
				|  |  | +            object.set(unsettleamount, totalUnsettledamt);
 | 
	
		
			
				|  |  | +        } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | +            object.set(settlestatus, SettlementStatusEnum.部分结算.getValue());
 | 
	
		
			
				|  |  | +            object.set(settleamount, totalSettledamt);
 | 
	
		
			
				|  |  | +            object.set(unsettleamount, totalUnsettledamt);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |