NonDirectConMsgWarnTask.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package kd.cosmic.jkjt.tmc.bei.task;
  2. import kd.bos.algo.DataSet;
  3. import kd.bos.context.RequestContext;
  4. import kd.bos.dataentity.entity.DynamicObject;
  5. import kd.bos.dataentity.entity.DynamicObjectCollection;
  6. import kd.bos.exception.KDException;
  7. import kd.bos.logging.BizLog;
  8. import kd.bos.orm.ORM;
  9. import kd.bos.orm.query.QCP;
  10. import kd.bos.orm.query.QFilter;
  11. import kd.bos.schedule.api.StopTask;
  12. import kd.bos.schedule.executor.AbstractTask;
  13. import kd.bos.servicehelper.BusinessDataServiceHelper;
  14. import kd.bos.servicehelper.QueryServiceHelper;
  15. import kd.bos.workflow.engine.msg.info.MessageInfo;
  16. import kd.cosmic.jkjt.tmc.bei.common.CommonUtils;
  17. import kd.cosmic.jkjt.tmc.bei.common.DateUtils;
  18. import kd.cosmic.jkjt.tmc.bei.common.FeishuSendMessageUtils;
  19. import kd.cosmic.jkjt.tmc.bei.common.constant.BeiBeTransDetailConstant;
  20. import kd.cosmic.jkjt.tmc.bei.common.constant.MsgWarnConfigConstant;
  21. import kd.cosmic.jkjt.tmc.bei.common.constant.MsgWarnTemplateConstant;
  22. import kd.cosmic.jkjt.tmc.bei.common.entity.MsgWarnMessageInfo;
  23. import kd.cosmic.jkjt.tmc.bei.common.enums.MsgWarnTypeEnum;
  24. import java.math.BigDecimal;
  25. import java.time.LocalDate;
  26. import java.util.*;
  27. import java.util.stream.Collectors;
  28. /**
  29. * 非直连账户每日提醒提醒
  30. */
  31. public class NonDirectConMsgWarnTask extends AbstractTask implements StopTask {
  32. private MsgWarnTypeEnum WARTYPE = MsgWarnTypeEnum.NONDIRECTCON;
  33. @Override
  34. public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
  35. // 查询生效的账户大额交易通知配置
  36. Set<Long> largeTransIdConfig = getMsgWarnConfig();
  37. largeTransIdConfig.forEach(configId -> transConfigSendMessage(configId));
  38. }
  39. protected Set<Long> getMsgWarnConfig() {
  40. DynamicObjectCollection configCol = QueryServiceHelper.query(MsgWarnConfigConstant.ENTITYID, "id,nckd_company.id", new QFilter[]{
  41. new QFilter(MsgWarnConfigConstant.KEY_NCKD_TYPE, QFilter.equals, WARTYPE.getValue()),
  42. new QFilter(MsgWarnConfigConstant.KEY_STATUS, QFilter.equals, "C"),
  43. new QFilter(MsgWarnConfigConstant.KEY_ENABLE, QFilter.equals, "1")
  44. });
  45. Map<Long, Long> companyIdMap = configCol.stream()
  46. .collect(Collectors.toMap(r -> r.getLong("nckd_company.id"), r -> r.getLong("id"), (a, b) -> a));
  47. return companyIdMap.values().stream().collect(Collectors.toSet());
  48. }
  49. protected void transConfigSendMessage(Long configId) {
  50. DynamicObject msgWarnConfig = BusinessDataServiceHelper.loadSingle(configId, MsgWarnConfigConstant.ENTITYID);
  51. DynamicObject company = msgWarnConfig.getDynamicObject(MsgWarnConfigConstant.KEY_NCKD_COMPANY);
  52. DynamicObject financeDirectors = msgWarnConfig.getDynamicObject(MsgWarnConfigConstant.KEY_NCKD_FINANCE_DIRECTOR);
  53. DynamicObject financeLeader = msgWarnConfig.getDynamicObject(MsgWarnConfigConstant.KEY_NCKD_FINANCE_LEADER);
  54. DynamicObject unitLeader = msgWarnConfig.getDynamicObject(MsgWarnConfigConstant.KEY_NCKD_UNIT_LEADER);
  55. // 没有设置接收人时跳过
  56. if(financeDirectors == null || financeLeader == null || unitLeader == null){
  57. BizLog.log("消息接收人为空,不进行消息发送。");
  58. return;
  59. }
  60. List<Long> receiverIdList = new ArrayList<>();
  61. receiverIdList.add(financeDirectors.getLong("id"));
  62. receiverIdList.add(financeLeader.getLong("id"));
  63. LocalDate today = LocalDate.now();
  64. // 上个月第一天
  65. LocalDate firstDayOfLastMonth = today.minusMonths(1).withDayOfMonth(1);
  66. // 本月第一天
  67. LocalDate firstDayOfThisMonth = today.withDayOfMonth(1);
  68. Date beginDate = Date.from(firstDayOfLastMonth.atStartOfDay().atZone(java.time.ZoneId.systemDefault()).toInstant());
  69. Date endDate = Date.from(firstDayOfThisMonth.atStartOfDay().atZone(java.time.ZoneId.systemDefault()).toInstant());
  70. // 自测------暂时设置成当前时间
  71. DynamicObjectCollection transDetailData = getTransDetailData(company, beginDate,endDate);
  72. if(transDetailData == null || transDetailData.isEmpty()){
  73. BizLog.log("没有符合条件的数据,不进行消息发送。");
  74. return;
  75. }
  76. String messageTime = String.format("%s年%s月",today.getYear(),today.getMonthValue()-1);
  77. String timeFlag = DateUtils.formatDateMonth(beginDate);
  78. for(DynamicObject transDetail : transDetailData){
  79. String dc = transDetail.getString("dc");
  80. String uniqueKey = String.join("-", WARTYPE.getValue(),timeFlag,dc,transDetail.getString("nckd_payaccbanknumber"));
  81. if(ORM.create().exists("nckd_msgwarnlog",new QFilter("nckd_unique_key", QCP.equals,uniqueKey).toArray())){
  82. // 消息如果已发送,就不在执行
  83. continue;
  84. }
  85. String messageContent = getMcCenterMessage(messageTime,transDetail);
  86. MessageInfo messageInfo = new MessageInfo();
  87. messageInfo.setTitle(String.join("-",WARTYPE.getName()));
  88. messageInfo.setUserIds(receiverIdList);
  89. messageInfo.setContent(messageContent);
  90. messageInfo.setTag(WARTYPE.getName());
  91. messageInfo.setSenderId(RequestContext.get().getCurrUserId());
  92. messageInfo.setEntityNumber("nckd_msgwarnconfig");
  93. messageInfo.setBizDataId(configId);
  94. String feishuMessage = MsgWarnTemplateConstant.getFeishuTemplate(WARTYPE.getName(),messageContent);
  95. MsgWarnMessageInfo warnMessageInfo = new MsgWarnMessageInfo(WARTYPE.getValue(),
  96. company.getString("name"),
  97. uniqueKey,
  98. feishuMessage,
  99. messageInfo);
  100. FeishuSendMessageUtils.sendFeishuMessage(warnMessageInfo);
  101. }
  102. }
  103. protected String getMcCenterMessage(String time,DynamicObject transDetail) {
  104. String dc = transDetail.getString("dc");
  105. if("1".equals(dc)){
  106. return MsgWarnTemplateConstant.formatNonDirectMessageDebit(
  107. time,
  108. transDetail.getString("nckd_payaccount"),
  109. transDetail.getString("nckd_payaccbanknumber"),
  110. transDetail.getString("nckd_payaccbank"),
  111. transDetail.getString("nckd_count"),
  112. transDetail.getBigDecimal("nckd_amount").setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
  113. }else{
  114. return MsgWarnTemplateConstant.formatNonDirectMessageCredit(
  115. time,
  116. transDetail.getString("nckd_payaccount"),
  117. transDetail.getString("nckd_payaccbanknumber"),
  118. transDetail.getString("nckd_payaccbank"),
  119. transDetail.getString("nckd_count"),
  120. transDetail.getBigDecimal("nckd_amount").setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
  121. }
  122. }
  123. protected DynamicObjectCollection getTransDetailData(DynamicObject company , Date beginDate , Date endDate){
  124. DataSet debitDetailDataSet = getTransDetailDataSet(company, beginDate,endDate,true);
  125. // DataSet crediDetailDataSet = getTransDetailDataSet(company, beginDate,endDate,false);
  126. // DataSet transDetailDataSet = debitDetailDataSet.union(crediDetailDataSet);
  127. // // 看报表与消息的兼容程度,再看怎么处理,暂时转成动态对象集合
  128. return ORM.create().toPlainDynamicObjectCollection(debitDetailDataSet.copy());
  129. }
  130. protected DataSet getPaymentDataSet(DynamicObject company , Date beginDate , Date endDate) {
  131. List<QFilter> filterList = new ArrayList<>();
  132. filterList.add(new QFilter("org", QFilter.equals, company.getPkValue()));
  133. if(beginDate != null){
  134. filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.large_equals, beginDate));
  135. }
  136. if(endDate != null){
  137. filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.less_than, endDate));
  138. }
  139. filterList.add(new QFilter("settletype.number", QCP.equals,"JSFS13"));
  140. filterList.add(new QFilter("billstatus", QCP.equals,"D"));
  141. // DataSet dataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "cas_paybill",
  142. // "id,company.id,accountbank.id,"+amountField+",biztime",
  143. // filterList.toArray(new QFilter[0]), "");
  144. return null;
  145. }
  146. /**
  147. * 获取账户交易明细
  148. * 1.非日常报销账户
  149. * 2.
  150. * @param company
  151. * @param beginDate
  152. * @return
  153. */
  154. protected DataSet getTransDetailDataSet(DynamicObject company , Date beginDate , Date endDate,boolean isDebitamount){
  155. String amountField = isDebitamount?BeiBeTransDetailConstant.KEY_DEBITAMOUNT:BeiBeTransDetailConstant.KEY_CREDITAMOUNT;
  156. List<QFilter> filterList = new ArrayList<>();
  157. filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_COMPANY, QFilter.equals, company.getPkValue()));
  158. if(beginDate != null){
  159. filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.large_equals, beginDate));
  160. }
  161. if(endDate != null){
  162. filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.less_than, endDate));
  163. }
  164. filterList.add(new QFilter("nckd_generatemethod", QCP.equals,"Manual import"));
  165. filterList.add(new QFilter(amountField, QCP.large_than,BigDecimal.ZERO));
  166. DataSet dataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), BeiBeTransDetailConstant.ENTITYID,
  167. "id,company.id,accountbank.id,"+amountField+",biztime",
  168. filterList.toArray(new QFilter[0]), "");
  169. // 通过公司、我方账号,对方账号分组,求和
  170. DataSet amountDataSet = dataSet
  171. .groupBy(new String[]{"company.id", "accountbank.id"}).sum(amountField).count("totaltimes").finish()
  172. .select("company.id,accountbank.id,"+amountField+" totalamount,totaltimes");
  173. Set companyIdSet = CommonUtils.getFieldValue(amountDataSet, "company.id");
  174. DataSet companyDataSet = QueryServiceHelper
  175. .queryDataSet(this.getClass().getName(), "bos_org", "id,name", new QFilter("id", QCP.in, companyIdSet).toArray(), "");
  176. // 查询银行账户
  177. Set accountBankIdSet = CommonUtils.getFieldValue(amountDataSet, "accountbank.id");
  178. DataSet accountBankDataSet = QueryServiceHelper
  179. .queryDataSet(this.getClass().getName(), "bd_accountbanks", "id,bankaccountnumber,bank.name", new QFilter("id", QCP.in, accountBankIdSet).toArray(), "");
  180. return amountDataSet
  181. .leftJoin(companyDataSet).on("company.id", "id")
  182. .select( new String[] {"company.id nckd_company", "accountbank.id accountbankid","totaltimes nckd_count","totalamount nckd_amount"}, new String[] {"name nckd_payaccount"}).finish()
  183. .leftJoin(accountBankDataSet).on("accountbankid", "id")
  184. .select(new String[] {"nckd_company", "nckd_payaccount","nckd_count","nckd_amount", String.format("'%s' dc",isDebitamount?"1":"-1")}, new String[]{"bankaccountnumber nckd_payaccbanknumber", "bank.name nckd_payaccbank"})
  185. .finish();
  186. }
  187. }