FeishuPushHelper.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package com.kingdee.eas.custom.perfweb.utils;
  2. import com.kingdee.bos.Context;
  3. import com.kingdee.shr.perfweb.app.base.evalplan.PerfPeriodInfo;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import java.util.*;
  7. /**
  8. * 飞书消息批量推送辅助类
  9. * <p>
  10. * 统一处理:按 wfLevel 分组查询下一节点处理人 → 合并结果 → 推送飞书消息
  11. */
  12. public class FeishuPushHelper {
  13. private static final Logger logger = LoggerFactory.getLogger(FeishuPushHelper.class);
  14. /**
  15. * 按 wfLevel 分组查询下一节点处理人,合并后推送飞书消息(下一节点处理人去重)
  16. */
  17. public static void sendOnceByWfLevel(Context ctx, Map<Integer, FeishuBatchContext> feishuBatchByWfLevel) {
  18. if (feishuBatchByWfLevel == null || feishuBatchByWfLevel.isEmpty()) {
  19. return;
  20. }
  21. Set<String> allEvaObjSet = new LinkedHashSet<>();
  22. Map<String, Integer> evaObjSubmitWfLevelMap = new HashMap<>();
  23. Map<String, Set<String>> mergedNextHandlerMap = new HashMap<>();
  24. Map<String, String> mergedWorkFlowNameMap = new HashMap<>();
  25. PerfPeriodInfo period = null;
  26. List<Integer> wfLevels = new ArrayList<>(feishuBatchByWfLevel.keySet());
  27. Collections.sort(wfLevels);
  28. for (Integer submitWfLevel : wfLevels) {
  29. FeishuBatchContext batch = feishuBatchByWfLevel.get(submitWfLevel);
  30. if (batch == null || batch.getEvaObjSet().isEmpty()) {
  31. continue;
  32. }
  33. allEvaObjSet.addAll(batch.getEvaObjSet());
  34. for (String evaObjId : batch.getEvaObjSet()) {
  35. evaObjSubmitWfLevelMap.put(evaObjId, submitWfLevel);
  36. }
  37. if (period == null && batch.getPeriod() != null) {
  38. period = batch.getPeriod();
  39. }
  40. Map<String, String> currentHandlerMap = new HashMap<>();
  41. Map<String, Set<String>> evaObjHandlerMap = new HashMap<>();
  42. Map<String, Set<String>> workNodeNameMap = new HashMap<>();
  43. Map<String, String> workFlowNameMap = new HashMap<>();
  44. PerfEvaObjectUtil.getBatchCurrentNodeHandersForEvaObj(ctx, batch.getEvaObjSet(), currentHandlerMap,
  45. evaObjHandlerMap, workNodeNameMap, workFlowNameMap, String.valueOf(submitWfLevel + 1));
  46. mergeHandlerMap(mergedNextHandlerMap, evaObjHandlerMap);
  47. mergedWorkFlowNameMap.putAll(workFlowNameMap);
  48. }
  49. if (allEvaObjSet.isEmpty() || period == null) {
  50. logger.info("无考核对象或考核周期为空,跳过飞书推送");
  51. return;
  52. }
  53. try {
  54. String messageUrl = UrlParamUtil.buildPerfPortalFeishuMessageUrl();
  55. String workFlowName = mergedWorkFlowNameMap.isEmpty() ? "" : mergedWorkFlowNameMap.values().iterator().next();
  56. FeishuMessageUtil.sendAfterScoreSubmit(ctx, evaObjSubmitWfLevelMap, mergedNextHandlerMap,
  57. allEvaObjSet, period, messageUrl, workFlowName, messageUrl);
  58. logger.info("飞书消息推送完成,考核对象数={}", allEvaObjSet.size());
  59. } catch (Exception e) {
  60. logger.error("飞书推送异常", e);
  61. throw new RuntimeException(e);
  62. }
  63. }
  64. private static void mergeHandlerMap(Map<String, Set<String>> target, Map<String, Set<String>> source) {
  65. if (source == null || source.isEmpty()) {
  66. return;
  67. }
  68. for (Map.Entry<String, Set<String>> entry : source.entrySet()) {
  69. target.computeIfAbsent(entry.getKey(), k -> new HashSet<>()).addAll(entry.getValue());
  70. }
  71. }
  72. /**
  73. * 按 wfLevel 分组的飞书推送数据容器
  74. */
  75. public static class FeishuBatchContext {
  76. private final Set<String> evaObjSet = new LinkedHashSet<>();
  77. private PerfPeriodInfo period;
  78. public Set<String> getEvaObjSet() {
  79. return evaObjSet;
  80. }
  81. public PerfPeriodInfo getPeriod() {
  82. return period;
  83. }
  84. public void setPeriod(PerfPeriodInfo period) {
  85. this.period = period;
  86. }
  87. }
  88. }