TripreimburseOpPlugin.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package fi.er.opplugin;
  2. import com.alibaba.druid.util.StringUtils;
  3. import kd.bos.dataentity.entity.DynamicObject;
  4. import kd.bos.dataentity.entity.DynamicObjectCollection;
  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.QueryServiceHelper;
  11. import kd.bos.servicehelper.operation.SaveServiceHelper;
  12. import java.math.BigDecimal;
  13. public class TripreimburseOpPlugin extends AbstractOperationServicePlugIn {
  14. @Override
  15. public void beginOperationTransaction(BeginOperationTransactionArgs e) {
  16. //获取报销单据信息
  17. DynamicObject[] dynamicObjects = e.getDataEntities();
  18. for (int i = 0; i < dynamicObjects.length; i++) {
  19. if (StringUtils.equals(e.getOperationKey(),"save")) {
  20. DynamicObject info = dynamicObjects[i];
  21. //反写预付借款单
  22. DynamicObjectCollection nckd_clearloanentrys = info.getDynamicObjectCollection("nckd_clearloanentry");
  23. Boolean exist = QueryServiceHelper.exists(info.getDynamicObjectType().getName(), info.getPkValue());
  24. if (!exist) {
  25. // 如果没有保存的信息,直接反写
  26. writeBackFinarbill(nckd_clearloanentrys);
  27. }else {
  28. DynamicObject saveInfo = BusinessDataServiceHelper.loadSingle(info.getPkValue(), info.getDynamicObjectType().getName());
  29. DynamicObjectCollection saveClearloanentrys = saveInfo.getDynamicObjectCollection("nckd_clearloanentry");
  30. // 处理在 saveWriteoffmoneys 中但不在 writeoffmoneys 中的元素
  31. DynamicObjectCollection toDelete = getDifference(saveClearloanentrys, nckd_clearloanentrys);
  32. if (toDelete.size() != 0) {
  33. deleteBackFinarbill(toDelete);
  34. }
  35. // 处理在 writeoffmoneys 中但不在 saveWriteoffmoneys 中的元素
  36. DynamicObjectCollection toWriteBack = getDifference(nckd_clearloanentrys, saveClearloanentrys);
  37. if (toWriteBack.size() != 0) {
  38. writeBackFinarbill(toWriteBack);
  39. }
  40. // 获取在 writeoffmoneys 和 saveWriteoffmoneys 中都有的元素并执行反写
  41. DynamicObjectCollection commonItems = getCommonItems(nckd_clearloanentrys, saveClearloanentrys);
  42. if (commonItems.size() != 0) {
  43. commonBackFinarbill(commonItems);
  44. }
  45. }
  46. } else if (StringUtils.equals(e.getOperationKey(),"delete")) {
  47. //当前单头数据包
  48. DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
  49. DynamicObjectCollection writeoffmoneys = info.getDynamicObjectCollection("nckd_clearloanentry");
  50. deleteBackFinarbill(writeoffmoneys);
  51. }
  52. }
  53. }
  54. public void writeBackFinarbill(DynamicObjectCollection writeoffmoneys) {
  55. //报销单冲预付借款分录
  56. for (DynamicObject writeoffmoney : writeoffmoneys) {
  57. //预付借款单id
  58. Long nckd_bigintfield1 = writeoffmoney.getLong("nckd_bigintfield1");
  59. String sourcebillid = String.valueOf(nckd_bigintfield1);
  60. //预付借款单预付借款信息分录id
  61. Long srcofsrcentryid = writeoffmoney.getLong("nckd_bigintfield2");
  62. //冲销金额
  63. BigDecimal accloanamount = writeoffmoney.getBigDecimal("nckd_unexporiusedamount");
  64. //查询应收挂账单
  65. QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
  66. DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
  67. for (DynamicObject finarbill : finarbills) {
  68. DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
  69. //应收挂账单明细分录
  70. DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
  71. for (DynamicObject entry : entrys) {
  72. //预付借款单预付借款信息分录id
  73. Long e_srcentryid = entry.getLong("e_srcentryid");
  74. //销账金额
  75. BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
  76. //已结算金额
  77. BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
  78. //未结算金额
  79. BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
  80. //已结算金额(本位币)
  81. BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
  82. //未结算金额(本位币)
  83. BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
  84. if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
  85. entry.set("nckd_e_settledamt", nckd_e_settledamt.add(accloanamount));
  86. entry.set("e_settledamt", e_settledamt.add(accloanamount));
  87. entry.set("e_unsettleamt", e_unsettleamt.subtract(accloanamount));
  88. }
  89. }
  90. SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
  91. }
  92. }
  93. }
  94. public void deleteBackFinarbill(DynamicObjectCollection writeoffmoneys) {
  95. //报销单冲预付借款分录
  96. for (DynamicObject writeoffmoney : writeoffmoneys) {
  97. //预付借款单id
  98. Long nckd_bigintfield1 = writeoffmoney.getLong("nckd_bigintfield1");
  99. String sourcebillid = String.valueOf(nckd_bigintfield1);
  100. //预付借款单预付借款信息分录id
  101. Long srcofsrcentryid = writeoffmoney.getLong("nckd_bigintfield2");
  102. //冲销金额
  103. BigDecimal accloanamount = writeoffmoney.getBigDecimal("nckd_unexporiusedamount");
  104. //查询应收挂账单
  105. QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
  106. DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
  107. for (DynamicObject finarbill : finarbills) {
  108. DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
  109. //应收挂账单明细分录
  110. DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
  111. for (DynamicObject entry : entrys) {
  112. //预付借款单预付借款信息分录id
  113. Long e_srcentryid = entry.getLong("e_srcentryid");
  114. //销账金额
  115. BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
  116. //已结算金额
  117. BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
  118. //未结算金额
  119. BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
  120. //已结算金额(本位币)
  121. BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
  122. //未结算金额(本位币)
  123. BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
  124. if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
  125. entry.set("nckd_e_settledamt", nckd_e_settledamt.subtract(accloanamount));
  126. entry.set("e_settledamt", e_settledamt.subtract(accloanamount));
  127. entry.set("e_unsettleamt", e_unsettleamt.add(accloanamount));
  128. }
  129. }
  130. SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
  131. }
  132. }
  133. }
  134. public void commonBackFinarbill(DynamicObjectCollection writeoffmoneys) {
  135. //报销单冲预付借款分录
  136. for (DynamicObject writeoffmoney : writeoffmoneys) {
  137. //预付借款单id
  138. Long nckd_bigintfield1 = writeoffmoney.getLong("nckd_bigintfield1");
  139. String sourcebillid = String.valueOf(nckd_bigintfield1);
  140. //预付借款单预付借款信息分录id
  141. Long srcofsrcentryid = writeoffmoney.getLong("nckd_bigintfield2");
  142. //冲销金额
  143. BigDecimal nckd_amountfield13 = writeoffmoney.getBigDecimal("nckd_amountfield13");
  144. //查询应收挂账单
  145. QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
  146. DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
  147. for (DynamicObject finarbill : finarbills) {
  148. DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
  149. //应收挂账单明细分录
  150. DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
  151. for (DynamicObject entry : entrys) {
  152. //预付借款单预付借款信息分录id
  153. Long e_srcentryid = entry.getLong("e_srcentryid");
  154. //销账金额
  155. BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
  156. //已结算金额
  157. BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
  158. //未结算金额
  159. BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
  160. //已结算金额(本位币)
  161. BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
  162. //未结算金额(本位币)
  163. BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
  164. if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
  165. entry.set("nckd_e_settledamt", nckd_e_settledamt.add(nckd_amountfield13));
  166. entry.set("e_settledamt", e_settledamt.add(nckd_amountfield13));
  167. entry.set("e_unsettleamt", e_unsettleamt.subtract(nckd_amountfield13));
  168. }
  169. }
  170. SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
  171. }
  172. }
  173. }
  174. // 获取在 source 中但不在 target 中的元素集合
  175. private DynamicObjectCollection getDifference(DynamicObjectCollection source, DynamicObjectCollection target) {
  176. DynamicObjectCollection difference = new DynamicObjectCollection();
  177. for (DynamicObject sourceItem : source) {
  178. boolean existsInTarget = false;
  179. for (DynamicObject targetItem : target) {
  180. // 根据某个唯一标识符判断是否存在
  181. if (sourceItem.getPkValue().equals(targetItem.getPkValue())) {
  182. existsInTarget = true;
  183. break;
  184. }
  185. }
  186. if (!existsInTarget) {
  187. difference.add(sourceItem);
  188. }
  189. }
  190. return difference;
  191. }
  192. // 获取在 source 和 target 中都有的元素集合
  193. private DynamicObjectCollection getCommonItems(DynamicObjectCollection source, DynamicObjectCollection target) {
  194. DynamicObjectCollection commonItems = new DynamicObjectCollection();
  195. for (DynamicObject sourceItem : source) {
  196. for (DynamicObject targetItem : target) {
  197. // 根据某个唯一标识符判断是否存在
  198. if (sourceItem.getPkValue().equals(targetItem.getPkValue())) {
  199. BigDecimal sourceAmount = sourceItem.getBigDecimal("nckd_unexporiusedamount");
  200. BigDecimal targetAmount = targetItem.getBigDecimal("nckd_unexporiusedamount");
  201. BigDecimal nckd_amountfield13 = sourceAmount.subtract(targetAmount);
  202. if (nckd_amountfield13.compareTo(BigDecimal.ZERO) != 0) {
  203. sourceItem.set("nckd_amountfield13", nckd_amountfield13);
  204. commonItems.add(sourceItem);
  205. break; // 找到共同项后跳出内层循环
  206. }
  207. }
  208. }
  209. }
  210. return commonItems;
  211. }
  212. }