PublicreimburOpPlugin.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package fi.er.opplugin;
  2. import com.alibaba.druid.util.StringUtils;
  3. import fi.cas.common.SettlementStatusEnum;
  4. import kd.bos.dataentity.entity.DynamicObject;
  5. import kd.bos.dataentity.entity.DynamicObjectCollection;
  6. import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
  7. import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
  8. import kd.bos.orm.query.QCP;
  9. import kd.bos.orm.query.QFilter;
  10. import kd.bos.servicehelper.BusinessDataServiceHelper;
  11. import kd.bos.servicehelper.QueryServiceHelper;
  12. import kd.bos.servicehelper.operation.SaveServiceHelper;
  13. import java.math.BigDecimal;
  14. import java.util.Arrays;
  15. import java.util.List;
  16. //报销单
  17. public class PublicreimburOpPlugin extends AbstractOperationServicePlugIn {
  18. private static String ap_finapbill = "ap_finapbill"; //应付挂账单字段
  19. @Override
  20. public void beginOperationTransaction(BeginOperationTransactionArgs e) {
  21. //获取报销单据信息
  22. DynamicObject[] dynamicObjects = e.getDataEntities();
  23. for (int i = 0; i < dynamicObjects.length; i++) {
  24. if (StringUtils.equals(e.getOperationKey(),"audit")) {
  25. //当前单头数据包
  26. DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
  27. BigDecimal totalUnsettleamount = BigDecimal.ZERO;
  28. //循环收款信息分录
  29. for (DynamicObject entryentity : info.getDynamicObjectCollection("accountentry")) {
  30. //取当前分录的收款金额
  31. BigDecimal orireceiveamount = entryentity.getBigDecimal("orireceiveamount");
  32. //未结算金额=收款金额
  33. entryentity.set("nckd_unsettleamount_et",orireceiveamount);
  34. entryentity.set("nckd_settleamount_et",BigDecimal.ZERO);
  35. totalUnsettleamount = totalUnsettleamount.add(orireceiveamount);
  36. }
  37. info.set("nckd_unsettleamount",totalUnsettleamount);
  38. info.set("nckd_settleamount",BigDecimal.ZERO);
  39. info.set("nckd_settlestatus", SettlementStatusEnum.未结算.getValue());
  40. SaveServiceHelper.save(new DynamicObject[]{info});
  41. } else if (StringUtils.equals(e.getOperationKey(),"unaudit")) {
  42. //当前单头数据包
  43. DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
  44. //循环收款信息分录
  45. for (DynamicObject entryentity : info.getDynamicObjectCollection("accountentry")) {
  46. entryentity.set("nckd_unsettleamount_et",BigDecimal.ZERO);
  47. }
  48. info.set("nckd_unsettleamount",BigDecimal.ZERO);
  49. info.set("nckd_settlestatus", null);
  50. SaveServiceHelper.save(new DynamicObject[]{info});
  51. } else if (StringUtils.equals(e.getOperationKey(),"save")) {
  52. DynamicObject info = dynamicObjects[i];
  53. List<String> list = Arrays.asList("3", "4", "5", "7", "8", "9", "10", "11", "12", "13", "14", "15","16", "17", "18", "19", "20", "21", "24", "30");
  54. //获取发票信息分录
  55. DynamicObjectCollection invoiceentry = info.getDynamicObjectCollection("invoiceentry");
  56. for (DynamicObject entry : invoiceentry) {
  57. //发票类型
  58. String invoicetype = entry.getString("invoicetype");
  59. if (list.contains(invoicetype)) {
  60. info.set("nckd_checkboxfield4", true);
  61. break;
  62. }
  63. }
  64. //给资产信息协商最新的资产卡片id
  65. String assettype = info.getString("assettype");
  66. if (StringUtils.equals(assettype,"existasset")) {
  67. DynamicObjectCollection assetentrys = info.getDynamicObjectCollection("assetentry");
  68. for (DynamicObject assetentry : assetentrys) {
  69. DynamicObject assetbillno = assetentry.getDynamicObject("asset_billno");
  70. if (assetbillno != null) {
  71. Long cardId = assetbillno.getLong("id");
  72. QFilter filter = new QFilter("realcard.id", QCP.equals, cardId);
  73. DynamicObject[] finCards = BusinessDataServiceHelper.load("fa_card_fin","id",new QFilter[] {filter}, "endperiod.id DESC");
  74. if (finCards.length > 0) {
  75. DynamicObject finCard = BusinessDataServiceHelper.loadSingle(finCards[0].getPkValue(), finCards[0].getDynamicObjectType().getName());
  76. assetentry.set("nckd_bigintfield", finCard.getLong("id"));
  77. }
  78. }
  79. }
  80. }
  81. //反写预付借款单
  82. DynamicObjectCollection writeoffmoneys = info.getDynamicObjectCollection("writeoffmoney");
  83. Boolean exist = QueryServiceHelper.exists(info.getDynamicObjectType().getName(), info.getPkValue());
  84. if (!exist) {
  85. // 如果没有保存的信息,直接反写
  86. writeBackFinarbill(writeoffmoneys);
  87. }else {
  88. DynamicObject saveInfo = BusinessDataServiceHelper.loadSingle(info.getPkValue(), info.getDynamicObjectType().getName());
  89. DynamicObjectCollection saveWriteoffmoneys = saveInfo.getDynamicObjectCollection("writeoffmoney");
  90. // 处理在 saveWriteoffmoneys 中但不在 writeoffmoneys 中的元素
  91. DynamicObjectCollection toDelete = getDifference(saveWriteoffmoneys, writeoffmoneys);
  92. if (toDelete.size() != 0) {
  93. deleteBackFinarbill(toDelete);
  94. }
  95. // 处理在 writeoffmoneys 中但不在 saveWriteoffmoneys 中的元素
  96. DynamicObjectCollection toWriteBack = getDifference(writeoffmoneys, saveWriteoffmoneys);
  97. if (toWriteBack.size() != 0) {
  98. writeBackFinarbill(toWriteBack);
  99. }
  100. // 获取在 writeoffmoneys 和 saveWriteoffmoneys 中都有的元素并执行反写
  101. DynamicObjectCollection commonItems = getCommonItems(writeoffmoneys, saveWriteoffmoneys);
  102. if (commonItems.size() != 0) {
  103. commonBackFinarbill(commonItems);
  104. }
  105. }
  106. } else if (StringUtils.equals(e.getOperationKey(),"delete")) {
  107. //当前单头数据包
  108. DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
  109. DynamicObjectCollection writeoffmoneys = info.getDynamicObjectCollection("writeoffmoney");
  110. deleteBackFinarbill(writeoffmoneys);
  111. }
  112. }
  113. }
  114. public void writeBackFinarbill(DynamicObjectCollection writeoffmoneys) {
  115. //报销单冲预付借款分录
  116. for (DynamicObject writeoffmoney : writeoffmoneys) {
  117. //预付借款单id
  118. String sourcebillid = writeoffmoney.getString("sourcebillid");
  119. //预付借款单预付借款信息分录id
  120. Long srcofsrcentryid = writeoffmoney.getLong("srcofsrcentryid");
  121. //冲销金额
  122. BigDecimal accloanamount = writeoffmoney.getBigDecimal("accloanamount");
  123. //查询应收挂账单
  124. QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
  125. DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
  126. for (DynamicObject finarbill : finarbills) {
  127. DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
  128. //应收挂账单明细分录
  129. DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
  130. for (DynamicObject entry : entrys) {
  131. //预付借款单预付借款信息分录id
  132. Long e_srcentryid = entry.getLong("e_srcentryid");
  133. //销账金额
  134. BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
  135. //已结算金额
  136. BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
  137. //未结算金额
  138. BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
  139. //已结算金额(本位币)
  140. BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
  141. //未结算金额(本位币)
  142. BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
  143. if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
  144. entry.set("nckd_e_settledamt", nckd_e_settledamt.add(accloanamount));
  145. entry.set("e_settledamt", e_settledamt.add(accloanamount));
  146. entry.set("e_unsettleamt", e_unsettleamt.subtract(accloanamount));
  147. }
  148. }
  149. SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
  150. }
  151. }
  152. }
  153. public void deleteBackFinarbill(DynamicObjectCollection writeoffmoneys) {
  154. //报销单冲预付借款分录
  155. for (DynamicObject writeoffmoney : writeoffmoneys) {
  156. //预付借款单id
  157. String sourcebillid = writeoffmoney.getString("sourcebillid");
  158. //预付借款单预付借款信息分录id
  159. Long srcofsrcentryid = writeoffmoney.getLong("srcofsrcentryid");
  160. //冲销金额
  161. BigDecimal accloanamount = writeoffmoney.getBigDecimal("accloanamount");
  162. //查询应收挂账单
  163. QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
  164. DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
  165. for (DynamicObject finarbill : finarbills) {
  166. DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
  167. //应收挂账单明细分录
  168. DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
  169. for (DynamicObject entry : entrys) {
  170. //预付借款单预付借款信息分录id
  171. Long e_srcentryid = entry.getLong("e_srcentryid");
  172. //销账金额
  173. BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
  174. //已结算金额
  175. BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
  176. //未结算金额
  177. BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
  178. //已结算金额(本位币)
  179. BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
  180. //未结算金额(本位币)
  181. BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
  182. if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
  183. entry.set("nckd_e_settledamt", nckd_e_settledamt.subtract(accloanamount));
  184. entry.set("e_settledamt", e_settledamt.subtract(accloanamount));
  185. entry.set("e_unsettleamt", e_unsettleamt.add(accloanamount));
  186. }
  187. }
  188. SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
  189. }
  190. }
  191. }
  192. public void commonBackFinarbill(DynamicObjectCollection writeoffmoneys) {
  193. //报销单冲预付借款分录
  194. for (DynamicObject writeoffmoney : writeoffmoneys) {
  195. //预付借款单id
  196. String sourcebillid = writeoffmoney.getString("sourcebillid");
  197. //预付借款单预付借款信息分录id
  198. Long srcofsrcentryid = writeoffmoney.getLong("srcofsrcentryid");
  199. //冲销金额
  200. BigDecimal nckd_amountfield13 = writeoffmoney.getBigDecimal("nckd_amountfield13");
  201. //查询应收挂账单
  202. QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
  203. DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
  204. for (DynamicObject finarbill : finarbills) {
  205. DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
  206. //应收挂账单明细分录
  207. DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
  208. for (DynamicObject entry : entrys) {
  209. //预付借款单预付借款信息分录id
  210. Long e_srcentryid = entry.getLong("e_srcentryid");
  211. //销账金额
  212. BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
  213. //已结算金额
  214. BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
  215. //未结算金额
  216. BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
  217. //已结算金额(本位币)
  218. BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
  219. //未结算金额(本位币)
  220. BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
  221. if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
  222. entry.set("nckd_e_settledamt", nckd_e_settledamt.add(nckd_amountfield13));
  223. entry.set("e_settledamt", e_settledamt.add(nckd_amountfield13));
  224. entry.set("e_unsettleamt", e_unsettleamt.subtract(nckd_amountfield13));
  225. }
  226. }
  227. SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
  228. }
  229. }
  230. }
  231. // 获取在 source 中但不在 target 中的元素集合
  232. private DynamicObjectCollection getDifference(DynamicObjectCollection source, DynamicObjectCollection target) {
  233. DynamicObjectCollection difference = new DynamicObjectCollection();
  234. for (DynamicObject sourceItem : source) {
  235. boolean existsInTarget = false;
  236. for (DynamicObject targetItem : target) {
  237. // 根据某个唯一标识符判断是否存在
  238. if (sourceItem.getPkValue().equals(targetItem.getPkValue())) {
  239. existsInTarget = true;
  240. break;
  241. }
  242. }
  243. if (!existsInTarget) {
  244. difference.add(sourceItem);
  245. }
  246. }
  247. return difference;
  248. }
  249. // 获取在 source 和 target 中都有的元素集合
  250. private DynamicObjectCollection getCommonItems(DynamicObjectCollection source, DynamicObjectCollection target) {
  251. DynamicObjectCollection commonItems = new DynamicObjectCollection();
  252. for (DynamicObject sourceItem : source) {
  253. for (DynamicObject targetItem : target) {
  254. // 根据某个唯一标识符判断是否存在
  255. if (sourceItem.getPkValue().equals(targetItem.getPkValue())) {
  256. BigDecimal sourceAmount = sourceItem.getBigDecimal("accloanamount");
  257. BigDecimal targetAmount = targetItem.getBigDecimal("accloanamount");
  258. BigDecimal nckd_amountfield13 = sourceAmount.subtract(targetAmount);
  259. if (nckd_amountfield13.compareTo(BigDecimal.ZERO) != 0) {
  260. sourceItem.set("nckd_amountfield13", nckd_amountfield13);
  261. commonItems.add(sourceItem);
  262. break; // 找到共同项后跳出内层循环
  263. }
  264. }
  265. }
  266. }
  267. return commonItems;
  268. }
  269. }