AccChangeMsgWarnTask.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package kd.cosmic.jkjt.tmc.bei.task;
  2. import kd.bos.context.RequestContext;
  3. import kd.bos.dataentity.entity.DynamicObject;
  4. import kd.bos.dataentity.entity.DynamicObjectCollection;
  5. import kd.bos.exception.KDException;
  6. import kd.bos.logging.BizLog;
  7. import kd.bos.orm.ORM;
  8. import kd.bos.orm.query.QCP;
  9. import kd.bos.orm.query.QFilter;
  10. import kd.bos.schedule.api.StopTask;
  11. import kd.bos.schedule.executor.AbstractTask;
  12. import kd.bos.servicehelper.BusinessDataServiceHelper;
  13. import kd.bos.servicehelper.QueryServiceHelper;
  14. import kd.bos.util.StringUtils;
  15. import kd.bos.workflow.engine.msg.info.MessageInfo;
  16. import kd.cosmic.jkjt.tmc.bei.common.DateUtils;
  17. import kd.cosmic.jkjt.tmc.bei.common.FeishuSendMessageUtils;
  18. import kd.cosmic.jkjt.tmc.bei.common.constant.BeiBeTransDetailConstant;
  19. import kd.cosmic.jkjt.tmc.bei.common.constant.LargeTransConfigConstant;
  20. import kd.cosmic.jkjt.tmc.bei.common.constant.MsgWarnTemplateConstant;
  21. import kd.cosmic.jkjt.tmc.bei.common.entity.MsgWarnMessageInfo;
  22. import kd.cosmic.jkjt.tmc.bei.common.enums.MsgWarnTypeEnum;
  23. import java.math.BigDecimal;
  24. import java.util.*;
  25. import java.util.stream.Collectors;
  26. /**
  27. * 动账提醒任务
  28. */
  29. public class AccChangeMsgWarnTask extends AbstractTask implements StopTask {
  30. // 预警执行时间间隔,默认查询1个小时内的数据
  31. private int changeMinute = 1*60 ;
  32. private static final MsgWarnTypeEnum WARTYPE = MsgWarnTypeEnum.ACCCHANGE;
  33. @Override
  34. public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
  35. Set<Long> largeTransIdConfig = getAccChangeRange();
  36. if(map.containsKey("minute") && StringUtils.isNotEmpty((String) map.get("minute"))){
  37. changeMinute = Integer.parseInt((String) map.get("minute"));
  38. }
  39. largeTransIdConfig.forEach(rangeId -> accChangeSendMessage(rangeId));
  40. }
  41. private void accChangeSendMessage(Long rangeId) {
  42. DynamicObject accChangeRangeInfo = BusinessDataServiceHelper.loadSingle(rangeId, "nckd_accchangerange");
  43. DynamicObject company = accChangeRangeInfo.getDynamicObject("nckd_company");
  44. DynamicObjectCollection receiverCol = accChangeRangeInfo.getDynamicObjectCollection("nckd_receiver");
  45. if(receiverCol == null || receiverCol.isEmpty()){
  46. BizLog.log("消息接收人为空,不进行消息发送。");
  47. return;
  48. }
  49. List<Long> receiverIdList = receiverCol.stream().map(receiver -> (Long) receiver.getDynamicObject("fbasedataid").getPkValue()).collect(Collectors.toList());
  50. DynamicObjectCollection transDetailData = getTransDetailData(company);
  51. if(transDetailData == null || transDetailData.isEmpty()){
  52. BizLog.log("没有符合条件的数据,不进行消息发送。");
  53. return;
  54. }
  55. BizLog.log("transDetailData size " + transDetailData.size());
  56. for(DynamicObject transDetail : transDetailData){
  57. String uniqueKey = String.join("-", MsgWarnTypeEnum.ACCCHANGE.getValue(),transDetail.getString("billno"));
  58. if(ORM.create().exists("nckd_msgwarnlog",new QFilter("nckd_unique_key", QCP.equals,uniqueKey).toArray())){
  59. // 消息如果已发送,就不在执行
  60. continue;
  61. }
  62. String messageContent = getMcCenterMessage(transDetail);
  63. MessageInfo messageInfo = new MessageInfo();
  64. messageInfo.setTitle(String.join("-",MsgWarnTypeEnum.ACCCHANGE.getName()));
  65. messageInfo.setUserIds(receiverIdList);
  66. messageInfo.setContent(messageContent);
  67. messageInfo.setTag(WARTYPE.getName());
  68. messageInfo.setSenderId(RequestContext.get().getCurrUserId());
  69. messageInfo.setEntityNumber(BeiBeTransDetailConstant.ENTITYID);
  70. messageInfo.setBizDataId(transDetail.getLong("id"));
  71. String feishuMessage = MsgWarnTemplateConstant.getFeishuTemplate(WARTYPE.getName(),messageContent);
  72. MsgWarnMessageInfo warnMessageInfo = new MsgWarnMessageInfo(WARTYPE.getValue(),
  73. company.getString("name"),
  74. uniqueKey,
  75. feishuMessage,
  76. messageInfo);
  77. FeishuSendMessageUtils.sendFeishuMessage(warnMessageInfo);
  78. }
  79. }
  80. protected String getMcCenterMessage(DynamicObject transDetail) {
  81. BigDecimal debitAmount = transDetail.getBigDecimal(BeiBeTransDetailConstant.KEY_DEBITAMOUNT);
  82. BigDecimal creditAmount = transDetail.getBigDecimal(BeiBeTransDetailConstant.KEY_CREDITAMOUNT);
  83. // 付款
  84. if(debitAmount != null && debitAmount.compareTo(BigDecimal.ZERO) > 0){
  85. return MsgWarnTemplateConstant.formatAccChangeDebitMessage(
  86. debitAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString(),
  87. transDetail.getString("company.name"),
  88. transDetail.getString("accountbank.bankaccountnumber"),
  89. transDetail.getString("bank.name"),
  90. transDetail.getString(BeiBeTransDetailConstant.KEY_OPPUNIT),
  91. transDetail.getString(BeiBeTransDetailConstant.KEY_DESCRIPTION),
  92. DateUtils.formatDate(transDetail.getDate(BeiBeTransDetailConstant.KEY_BIZTIME)));
  93. }else{
  94. return MsgWarnTemplateConstant.formatAccChangeCreditMessage(
  95. creditAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString(),
  96. transDetail.getString("oppunit"),
  97. transDetail.getString("accountbank.bankaccountnumber"),
  98. transDetail.getString("bank.name"),
  99. transDetail.getString(BeiBeTransDetailConstant.KEY_DESCRIPTION),
  100. DateUtils.formatDate(transDetail.getDate(BeiBeTransDetailConstant.KEY_BIZTIME)));
  101. }
  102. }
  103. protected DynamicObjectCollection getTransDetailData(DynamicObject company) {
  104. List<QFilter> filterList = new ArrayList<>();
  105. filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_COMPANY, QFilter.equals, company.getPkValue()));
  106. Date beginDate = DateUtils.getMinutesBefore(changeMinute);
  107. filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.large_equals, beginDate));
  108. filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.less_than, new Date()));
  109. // 从银企同步的流水
  110. filterList.add(new QFilter("accountbank.issetbankinterface", QFilter.equals, true));
  111. return QueryServiceHelper.query(this.getClass().getName() ,BeiBeTransDetailConstant.ENTITYID,
  112. "id,billno,company.name,accountbank.name,accountbank.bankaccountnumber,bank.name,debitamount,creditamount,oppunit,oppbanknumber,oppbank,description,bizdate,biztime",
  113. filterList.toArray(new QFilter[0]),"bizdate desc");
  114. }
  115. //TODO
  116. protected Set<Long> getAccChangeRange() {
  117. DynamicObjectCollection configCol = QueryServiceHelper.query("nckd_accchangerange", "id,nckd_company.id", new QFilter[]{
  118. new QFilter(LargeTransConfigConstant.KEY_STATUS, QFilter.equals, "C"),
  119. new QFilter(LargeTransConfigConstant.KEY_ENABLE, QFilter.equals, "1")
  120. });
  121. Map<Long, Long> companyIdMap = configCol.stream()
  122. .collect(Collectors.toMap(r -> r.getLong("nckd_company.id"), r -> r.getLong("id"), (a, b) -> a));
  123. return companyIdMap.values().stream().collect(Collectors.toSet());
  124. }
  125. }