PaymentProcessOpPlugin.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package fi.cas.opplugin;
  2. import dm.jdbc.util.StringUtil;
  3. import fi.cas.common.SettlementStatusEnum;
  4. import kd.bos.dataentity.entity.DynamicObject;
  5. import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
  6. import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
  7. import kd.bos.orm.query.QCP;
  8. import kd.bos.orm.query.QFilter;
  9. import kd.bos.servicehelper.BusinessDataServiceHelper;
  10. import kd.bos.servicehelper.operation.SaveServiceHelper;
  11. import java.math.BigDecimal;
  12. import java.util.HashMap;
  13. //付款处理单
  14. public class PaymentProcessOpPlugin extends AbstractOperationServicePlugIn {
  15. private static String nckd_cas_arbill_gz_l = "nckd_cas_arbill"; //应收挂帐单标识
  16. private static String nckd_er_prepaybill_ext = "er_prepaybill"; //预付借款单标识
  17. private static String nckd_er_publicreimbur_ext = "er_publicreimbursebill"; //报销单标识
  18. private static String er_contractbill = "er_contractbill"; //合同台账单标识
  19. @Override
  20. public void beginOperationTransaction(BeginOperationTransactionArgs e) {
  21. //获取付款处理单据信息
  22. DynamicObject[] dynamicObjects = e.getDataEntities();
  23. for (int i = 0; i < dynamicObjects.length; i++) {
  24. //当前单头数据包
  25. DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
  26. //获取应收挂帐单id
  27. Long sourcebillid = info.getLong("sourcebillid");
  28. //存储应收挂账单分录id和付款处理分录实付金额
  29. HashMap<String,BigDecimal> amountMap = new HashMap<>();
  30. //循环付款明细分录
  31. for (DynamicObject entryentity : info.getDynamicObjectCollection("entry")) {
  32. //取当前循环付款明细分录的实付金额
  33. BigDecimal expenseamount = entryentity.getBigDecimal("e_actamt");
  34. //取当前循环付款明细分录的源单分录id
  35. String sourcebillentryid = entryentity.getString("e_sourcebillentryid");
  36. amountMap.put(sourcebillentryid,expenseamount);
  37. }
  38. //查询应收挂账单
  39. QFilter gzFilter = new QFilter("id", QCP.equals,sourcebillid);
  40. DynamicObject[] gzDynamicObjects = BusinessDataServiceHelper.load(nckd_cas_arbill_gz_l,"id",new QFilter[] {gzFilter});
  41. //查询报销单
  42. QFilter bxFilter = new QFilter("id", QCP.equals,sourcebillid);
  43. DynamicObject[] bxDynamicObjects = BusinessDataServiceHelper.load(nckd_er_publicreimbur_ext,"id",new QFilter[] {bxFilter});
  44. //应收方向的回写
  45. if (gzDynamicObjects.length > 0) {
  46. //循环数组获取结算状态,已结算金额,未结算金额
  47. for (int c=0;c<gzDynamicObjects.length;c++) {
  48. //应收挂帐单头数据包
  49. DynamicObject gzInfo = BusinessDataServiceHelper.loadSingle(gzDynamicObjects[i].getPkValue(), gzDynamicObjects[i].getDynamicObjectType().getName());
  50. //获取预付借款单id
  51. Long yfjkId = gzInfo.getLong("sourcebillid");
  52. //存储预付借款单分录id和付款处理分录实付金额
  53. HashMap<String,BigDecimal> yfjkMap = new HashMap<>();
  54. //应收挂帐单头已结算金额
  55. BigDecimal totalSettledamt = BigDecimal.ZERO;
  56. //应收挂帐单头未结算金额
  57. BigDecimal totalUnsettledamt = BigDecimal.ZERO;
  58. //循环应收挂帐单付款明细分录
  59. for (DynamicObject entryentity : gzInfo.getDynamicObjectCollection("entry")) {
  60. //获取分录实付金额
  61. BigDecimal settledamt = amountMap.get(entryentity.getString("id"));
  62. //获取未结算金额
  63. BigDecimal unsettledamt = entryentity.getBigDecimal("e_unsettledamt");
  64. unsettledamt = unsettledamt.subtract(settledamt);
  65. //反写分录已结算金额,未结算金额
  66. entryentity.set("e_settledamt",settledamt);
  67. entryentity.set("e_unsettledamt",unsettledamt);
  68. totalSettledamt = totalSettledamt.add(settledamt);
  69. totalUnsettledamt = totalUnsettledamt.add(unsettledamt);
  70. String yfjkSourceBillEntryId = entryentity.getString("e_sourcebillentryid");
  71. yfjkMap.put(yfjkSourceBillEntryId,settledamt);
  72. }
  73. if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
  74. gzInfo.set("settlestatus", SettlementStatusEnum.已结算.getValue());
  75. gzInfo.set("settleamount", totalSettledamt);
  76. gzInfo.set("unsettleamount", totalUnsettledamt);
  77. } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
  78. gzInfo.set("settlestatus", SettlementStatusEnum.未结算.getValue());
  79. gzInfo.set("settleamount", totalSettledamt);
  80. gzInfo.set("unsettleamount", totalUnsettledamt);
  81. } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
  82. gzInfo.set("settlestatus", SettlementStatusEnum.部分结算.getValue());
  83. gzInfo.set("settleamount", totalSettledamt);
  84. gzInfo.set("unsettleamount", totalUnsettledamt);
  85. }
  86. SaveServiceHelper.save(new DynamicObject[]{gzInfo});
  87. //查询预付借款单
  88. QFilter nckd_yfjkFilter = new QFilter("id", QCP.equals,yfjkId);
  89. DynamicObject[] yfjkDynamicObjects = BusinessDataServiceHelper.load(nckd_er_prepaybill_ext,"id",new QFilter[] {nckd_yfjkFilter});
  90. //循环数组获取结算状态,已结算金额,未结算金额
  91. for (int d=0;d<yfjkDynamicObjects.length;d++) {
  92. //预付借款单头数据包
  93. DynamicObject yfjkInfo = BusinessDataServiceHelper.loadSingle(yfjkDynamicObjects[i].getPkValue(), yfjkDynamicObjects[i].getDynamicObjectType().getName());
  94. //循环预付借款单预付借款信息分录
  95. for (DynamicObject entryentity : yfjkInfo.getDynamicObjectCollection("expenseentryentity")) {
  96. //获取分录实付金额
  97. BigDecimal settledamt = yfjkMap.get(entryentity.getString("id"));
  98. //获取未结算金额
  99. BigDecimal unsettledamt = entryentity.getBigDecimal("nckd_unsettleamount_et");
  100. unsettledamt = unsettledamt.subtract(settledamt);
  101. //反写分录已结算金额,未结算金额
  102. entryentity.set("nckd_settleamount_et",settledamt);
  103. entryentity.set("nckd_unsettleamount_et",unsettledamt);
  104. }
  105. if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
  106. yfjkInfo.set("nckd_settlestatus", SettlementStatusEnum.已结算.getValue());
  107. yfjkInfo.set("nckd_settleamount", totalSettledamt);
  108. yfjkInfo.set("nckd_unsettleamount", totalUnsettledamt);
  109. } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
  110. yfjkInfo.set("nckd_settlestatus", SettlementStatusEnum.未结算.getValue());
  111. yfjkInfo.set("nckd_settleamount", totalSettledamt);
  112. yfjkInfo.set("nckd_unsettleamount", totalUnsettledamt);
  113. } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
  114. yfjkInfo.set("nckd_settlestatus", SettlementStatusEnum.部分结算.getValue());
  115. yfjkInfo.set("nckd_settleamount", totalSettledamt);
  116. yfjkInfo.set("nckd_unsettleamount", totalUnsettledamt);
  117. }
  118. SaveServiceHelper.save(new DynamicObject[]{yfjkInfo});
  119. }
  120. }
  121. }//应付方向的回写
  122. else if (bxDynamicObjects.length > 0) {
  123. //循环数组获取结算状态,已结算金额,未结算金额
  124. for (int c=0;c<bxDynamicObjects.length;c++) {
  125. //应收挂帐单头数据包
  126. DynamicObject bxInfo = BusinessDataServiceHelper.loadSingle(bxDynamicObjects[i].getPkValue(), bxDynamicObjects[i].getDynamicObjectType().getName());
  127. String reimbursetype = bxInfo.getString("reimbursetype");
  128. //获取合同台账单id
  129. Long contractbillId = bxInfo.getLong("sourcebillid");
  130. //已结算金额
  131. BigDecimal totalSettledamt = BigDecimal.ZERO;
  132. //未结算金额
  133. BigDecimal totalUnsettledamt = BigDecimal.ZERO;
  134. //循环报销单收款信息分录
  135. for (DynamicObject entryentity : bxInfo.getDynamicObjectCollection("accountentry")) {
  136. //获取分录收款金额
  137. BigDecimal settledamt = amountMap.get(entryentity.getString("id"));
  138. //获取未结算金额
  139. BigDecimal unsettledamt = entryentity.getBigDecimal("nckd_unsettleamount_et");
  140. unsettledamt = unsettledamt.subtract(settledamt);
  141. //反写分录已结算金额,未结算金额
  142. entryentity.set("nckd_settleamount_et",settledamt);
  143. entryentity.set("nckd_unsettleamount_et",unsettledamt);
  144. totalSettledamt = totalSettledamt.add(settledamt);
  145. totalUnsettledamt = totalUnsettledamt.add(unsettledamt);
  146. }
  147. if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
  148. bxInfo.set("nckd_settlestatus", SettlementStatusEnum.已结算.getValue());
  149. bxInfo.set("nckd_settleamount", totalSettledamt);
  150. bxInfo.set("nckd_unsettleamount", totalUnsettledamt);
  151. } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
  152. bxInfo.set("nckd_settlestatus", SettlementStatusEnum.未结算.getValue());
  153. bxInfo.set("nckd_settleamount", totalSettledamt);
  154. bxInfo.set("nckd_unsettleamount", totalUnsettledamt);
  155. } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
  156. bxInfo.set("nckd_settlestatus", SettlementStatusEnum.部分结算.getValue());
  157. bxInfo.set("nckd_settleamount", totalSettledamt);
  158. bxInfo.set("nckd_unsettleamount", totalUnsettledamt);
  159. }
  160. SaveServiceHelper.save(new DynamicObject[]{bxInfo});
  161. //报账类型等于工程报账回写合同台账单
  162. if (StringUtil.equals("engineering",reimbursetype)) {
  163. //查询合同台账单
  164. QFilter htFilter = new QFilter("id", QCP.equals,contractbillId);
  165. DynamicObject[] htDynamicObjects = BusinessDataServiceHelper.load(er_contractbill,"id",new QFilter[] {htFilter});
  166. for (int j=0;j<htDynamicObjects.length;j++) {
  167. //合同台账单头数据包
  168. DynamicObject htInfo = BusinessDataServiceHelper.loadSingle(htDynamicObjects[i].getPkValue(), htDynamicObjects[i].getDynamicObjectType().getName());
  169. htInfo.set("oripayedamount",totalSettledamt);
  170. htInfo.set("orinotpayamount",totalUnsettledamt);
  171. if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
  172. htInfo.set("nckd_settlestatus", SettlementStatusEnum.已结算.getValue());
  173. htInfo.set("nckd_settleamount", totalSettledamt);
  174. htInfo.set("nckd_unsettleamount", totalUnsettledamt);
  175. } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
  176. htInfo.set("nckd_settlestatus", SettlementStatusEnum.未结算.getValue());
  177. htInfo.set("nckd_settleamount", totalSettledamt);
  178. htInfo.set("nckd_unsettleamount", totalUnsettledamt);
  179. } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
  180. htInfo.set("nckd_settlestatus", SettlementStatusEnum.部分结算.getValue());
  181. htInfo.set("nckd_settleamount", totalSettledamt);
  182. htInfo.set("nckd_unsettleamount", totalUnsettledamt);
  183. }
  184. SaveServiceHelper.save(new DynamicObject[]{htInfo});
  185. }
  186. }
  187. }
  188. }
  189. }
  190. }
  191. }