|
@@ -0,0 +1,197 @@
|
|
|
|
+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 = "cas_paybill"; //应收挂帐单标识
|
|
|
|
+ private static String nckd_er_prepaybill_ext = "er_publicreimbursebill"; //预付借款单标识
|
|
|
|
+ private static String nckd_er_publicreimbur_ext = "er_publicreimbursebill"; //报销单标识
|
|
|
|
+ private static String er_contractbill = "er_contractbill"; //合同台账单标识
|
|
|
|
+ @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
|
|
|
|
+ String yfjkId = gzInfo.getString("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"));
|
|
|
|
+ //获取未结算金额
|
|
|
|
+ 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);
|
|
|
|
+ }
|
|
|
|
+ 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});
|
|
|
|
+ //查询预付借款单
|
|
|
|
+ QFilter nckd_yfjkFilter = new QFilter("nckd_er_prepaybill_ext.id", QCP.equals,yfjkId);
|
|
|
|
+ DynamicObject[] yfjkDynamicObjects = BusinessDataServiceHelper.load(nckd_er_prepaybill_ext,"id,nckd_settlestatus,nckd_settleamount,nckd_unsettleamount",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"));
|
|
|
|
+ //获取未结算金额
|
|
|
|
+ BigDecimal unsettledamt = entryentity.getBigDecimal("nckd_unsettleamount_et");
|
|
|
|
+ unsettledamt = unsettledamt.subtract(settledamt);
|
|
|
|
+ //反写分录已结算金额,未结算金额
|
|
|
|
+ entryentity.set("nckd_settleamount_et",settledamt);
|
|
|
|
+ entryentity.set("nckd_unsettleamount_et",unsettledamt);
|
|
|
|
+ }
|
|
|
|
+ if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
|
+ yfjkInfo.set("nckd_settlestatus", SettlementStatusEnum.已结算.getValue());
|
|
|
|
+ yfjkInfo.set("nckd_settleamount_et", totalSettledamt);
|
|
|
|
+ yfjkInfo.set("nckd_unsettleamount_et", totalUnsettledamt);
|
|
|
|
+ } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
|
+ yfjkInfo.set("nckd_settlestatus", SettlementStatusEnum.未结算.getValue());
|
|
|
|
+ yfjkInfo.set("nckd_settleamount_et", totalSettledamt);
|
|
|
|
+ yfjkInfo.set("nckd_unsettleamount_et", totalUnsettledamt);
|
|
|
|
+ } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
+ yfjkInfo.set("nckd_settlestatus", SettlementStatusEnum.部分结算.getValue());
|
|
|
|
+ yfjkInfo.set("nckd_settleamount_et", totalSettledamt);
|
|
|
|
+ yfjkInfo.set("nckd_unsettleamount_et", 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());
|
|
|
|
+ String reimbursetype = bxInfo.getString("reimbursetype");
|
|
|
|
+ //获取合同台账单id
|
|
|
|
+ Long contractbillId = bxInfo.getLong("sourcebillid");
|
|
|
|
+ //已结算金额
|
|
|
|
+ BigDecimal totalSettledamt = BigDecimal.ZERO;
|
|
|
|
+ //未结算金额
|
|
|
|
+ BigDecimal totalUnsettledamt = BigDecimal.ZERO;
|
|
|
|
+ //循环报销单收款信息分录
|
|
|
|
+ for (DynamicObject entryentity : bxInfo.getDynamicObjectCollection("accountentry")) {
|
|
|
|
+ //获取分录收款金额
|
|
|
|
+ BigDecimal settledamt = 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});
|
|
|
|
+ //报账类型等于工程报账回写合同台账单
|
|
|
|
+ if (StringUtil.equals("engineering",reimbursetype)) {
|
|
|
|
+ //查询合同台账单
|
|
|
|
+ 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});
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|