MatchBadDebtsTask.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package fi.cas.task;
  2. import com.alibaba.druid.util.StringUtils;
  3. import kd.bos.context.RequestContext;
  4. import kd.bos.dataentity.entity.DynamicObject;
  5. import kd.bos.exception.KDException;
  6. import kd.bos.orm.query.QCP;
  7. import kd.bos.orm.query.QFilter;
  8. import kd.bos.schedule.executor.AbstractTask;
  9. import kd.bos.servicehelper.BusinessDataServiceHelper;
  10. import kd.bos.servicehelper.operation.SaveServiceHelper;
  11. import java.math.BigDecimal;
  12. import java.util.*;
  13. import java.util.stream.Collectors;
  14. //计算财务应付单到坏账计提单的减值数据
  15. public class MatchBadDebtsTask extends AbstractTask {
  16. @Override
  17. public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
  18. List<DynamicObject> jz = new ArrayList<>();//减值数据
  19. List<DynamicObject> ar_baddebtlossbill = new ArrayList<>();//坏账单列表
  20. List<String> dubilList = new ArrayList<>();//坏账单列表
  21. List<String> custList = new ArrayList<>();//坏账单列表
  22. List<DynamicObject> infoList = new ArrayList<>();//计算成功的坏帐单列表
  23. List<DynamicObject> ar_baddebtlossbill_customer = new ArrayList<>();//根据客户坏账单列表
  24. List<DynamicObject> ar_baddebtlossbill_five_level = new ArrayList<>();//根据五级分类坏账单列表
  25. //获取当前日期和时间
  26. Date currentDate = new Date();
  27. // 使用Calendar来获取前七天的日期
  28. Calendar calendar = Calendar.getInstance();
  29. calendar.setTime(currentDate);
  30. calendar.add(Calendar.DAY_OF_MONTH, -7);
  31. Date sevenDaysAgo = calendar.getTime();
  32. //查询“是否诉讼类费用”且业务日期再当前日期到啊七天前之间的坏账单
  33. QFilter filter = new QFilter("nckd_checkboxfield", QCP.equals, "1");
  34. filter.and("bizdate", QCP.large_than, sevenDaysAgo);
  35. filter.and("bizdate", QCP.less_than, currentDate);
  36. filter.and("baddebtamt", QCP.large_than, 0);
  37. filter.and("nckd_match_amt", QCP.equals, "0");
  38. DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("ar_baddebtlossbill","id", new QFilter[] {filter});
  39. for (int i = 0; i < dynamicObjects.length; i++) {
  40. DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
  41. ar_baddebtlossbill.add(info);
  42. dubilList.add(info.getString("nckd_textfield"));
  43. custList.add(info.getDynamicObject("asstact").getString("name"));
  44. }
  45. //查询减值准备数据(最新一批)
  46. QFilter jzfilter = new QFilter("nckd_dubil_id", QCP.in, dubilList);
  47. jzfilter.or("nckd_cust_name", QCP.in, custList);
  48. DynamicObject[] jzdynamicObjects = BusinessDataServiceHelper.load("nckd_impairment","nckd_dubil_id,nckd_cust_id,nckd_ecl_ratio", new QFilter[]{jzfilter});
  49. jz = new ArrayList<>(Arrays.asList(jzdynamicObjects));
  50. //下推坏账-根据借据号匹配
  51. MatchByDubilId(ar_baddebtlossbill, jz, infoList, ar_baddebtlossbill_customer);
  52. //下推坏账-根据客户匹配
  53. MatchByCustom(ar_baddebtlossbill_customer, jz, infoList, ar_baddebtlossbill_five_level);
  54. //下推坏账-根据五级分类匹配
  55. MatchByFiveLevel(ar_baddebtlossbill_five_level, infoList);
  56. //保存
  57. DynamicObject[] array = infoList.toArray(new DynamicObject[0]);
  58. SaveServiceHelper.save(array);
  59. }
  60. public void MatchByDubilId(List<DynamicObject> ar_baddebtlossbill, List<DynamicObject> jz, List<DynamicObject> infoList, List<DynamicObject> ar_baddebtlossbill_customer) {
  61. for (DynamicObject dynamicObject : ar_baddebtlossbill) {
  62. String dubil_id = dynamicObject.getString("nckd_textfield");//借据号
  63. BigDecimal unsettleamount = dynamicObject.getBigDecimal("baddebtamt");//未结算金额
  64. BigDecimal nckd_amountfield1 = dynamicObject.getBigDecimal("nckd_amountfield1");//上月计提金额
  65. //查询借据号匹配的减值数据
  66. List<DynamicObject> jzInfo = jz.stream().filter(item -> StringUtils.equals(item.getString("nckd_dubil_id"), dubil_id)).collect(Collectors.toList());
  67. if (jzInfo.size() > 0) {
  68. //更新坏账单
  69. BigDecimal ecl_ratio = jzInfo.get(0).getBigDecimal("nckd_ecl_ratio");
  70. BigDecimal ecl_amount = unsettleamount.multiply(ecl_ratio);
  71. dynamicObject.set("nckd_textfield1", String.valueOf(ecl_ratio));//计提比例
  72. dynamicObject.set("nckd_amountfield", ecl_amount);//计提金额
  73. dynamicObject.set("nckd_match_amt", true);//是否计算计提金额
  74. dynamicObject.set("nckd_amountfield2", ecl_amount.subtract(nckd_amountfield1 != null ? nckd_amountfield1 : BigDecimal.ZERO));//扎差金额
  75. infoList.add(dynamicObject);
  76. }else {
  77. //根据客户匹配
  78. ar_baddebtlossbill_customer.add(dynamicObject);
  79. }
  80. }
  81. }
  82. public void MatchByCustom(List<DynamicObject> ar_baddebtlossbill_customer, List<DynamicObject> jz, List<DynamicObject> infoList, List<DynamicObject> ar_baddebtlossbill_five_level) {
  83. for (DynamicObject dynamicObject : ar_baddebtlossbill_customer) {
  84. BigDecimal unsettleamount = dynamicObject.getBigDecimal("baddebtamt");//未结算金额
  85. String customer = dynamicObject.getDynamicObject("asstact").getString("number");//供应商编码
  86. BigDecimal nckd_amountfield1 = dynamicObject.getBigDecimal("nckd_amountfield1");//上月计提金额
  87. //查询客户匹配的减值数据
  88. List<DynamicObject> jzInfo = jz.stream().filter(item -> StringUtils.equals(item.getString("nckd_cust_id"), customer)).collect(Collectors.toList());
  89. if (jzInfo.size() > 0) {
  90. //更新坏账单
  91. BigDecimal ecl_ratio = jzInfo.stream()
  92. .map(s -> {
  93. BigDecimal value = s.getBigDecimal("nckd_ecl_ratio");
  94. return value != null ? value : BigDecimal.ZERO; // 处理 null
  95. })
  96. .reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(jzInfo.size()));
  97. BigDecimal ecl_amount = unsettleamount.multiply(ecl_ratio);
  98. dynamicObject.set("nckd_textfield1", String.valueOf(ecl_ratio));//计提比例
  99. dynamicObject.set("nckd_amountfield", ecl_amount);//计提金额
  100. dynamicObject.set("nckd_match_amt", true);//是否计算计提金额
  101. dynamicObject.set("nckd_amountfield2", ecl_amount.subtract(nckd_amountfield1 != null ? nckd_amountfield1 : BigDecimal.ZERO));//扎差金额
  102. infoList.add(dynamicObject);
  103. }else {
  104. //根据五级分类匹配
  105. ar_baddebtlossbill_five_level.add(dynamicObject);
  106. }
  107. }
  108. }
  109. public void MatchByFiveLevel(List<DynamicObject> ar_baddebtlossbill_five_level, List<DynamicObject> infoList) {
  110. for (DynamicObject dynamicObject : ar_baddebtlossbill_five_level) {
  111. BigDecimal unsettleamount = dynamicObject.getBigDecimal("baddebtamt");//未结算金额
  112. DynamicObject fiveLevel = dynamicObject.getDynamicObject("nckd_basedatafield");//五级分类
  113. BigDecimal nckd_amountfield1 = dynamicObject.getBigDecimal("nckd_amountfield1");//上月计提金额
  114. if (fiveLevel != null) {
  115. //更新坏账单
  116. BigDecimal ecl_ratio = fiveLevel.getBigDecimal("nckd_ecl_ratio");
  117. BigDecimal ecl_amount = unsettleamount.multiply(ecl_ratio);
  118. dynamicObject.set("nckd_textfield1", String.valueOf(ecl_ratio));//计提比例
  119. dynamicObject.set("nckd_amountfield", ecl_amount);//计提金额
  120. dynamicObject.set("nckd_match_amt", true);//是否计算计提金额
  121. dynamicObject.set("nckd_amountfield2", ecl_amount.subtract(nckd_amountfield1 != null ? nckd_amountfield1 : BigDecimal.ZERO));//扎差金额
  122. infoList.add(dynamicObject);
  123. }
  124. }
  125. }
  126. }