枚举策略设计模式

策略枚举:

/**
 * webhook策略枚举
 * Date : 2023/8/17 22:33
 *
 * @author xiaobai.jzm
 */
public enum WebHookTypeEnum {

	GENERAL("general", "普通的"),
    FEI_SHU("open.feishu.cn", "飞书消息"),
    WE_CHAT("qyapi.weixin.qq.com", "企业微信消息");

    private String hookUri;
    private String desc;


    public static WebHookTypeEnum getStrategy(String url) {
        for (WebHookTypeEnum webHooksTypeEnum : WebHookTypeEnum.values()) {
            if (url.contains(webHooksTypeEnum.hookUri)) {
                return webHooksTypeEnum;
            }
        }
        //默认策略
        return GENERAL;
    }


    WebHookTypeEnum(String strategy, String desc) {
        this.hookUri = strategy;
        this.desc = desc;
    }

    public String getDesc() {
        return desc;
    }

    public String getHookUri() {
        return hookUri;
    }
}

请求参数策略接口:

/**
 * webhooks 请求参数策略
 *
 * Date : 2023/8/18 10:45
 * @author xiaobai.jzm
 */
public interface WebHookStrategy {

    /**
     * 获取webhook请求参数对象
     *
     * @return
     */
   Object getRequestParameters(WebHookSendParamsModel webHookSendParamsModel);

    /**
     * 获取webhook类型
     *
     * @return
     */
    WebHookTypeEnum getWebHookType();
}

请求参数策略接口具体实现:

/**
 * 飞书群机器人消息请求参数策略
 * Date : 2023/8/18 11:09
 *
 * @author xiaobai.jzm
 */
@Slf4j
@Service
public class FeiShuWebHookStrategy implements WebHookStrategy {

    @Override
    public Object getRequestParameters(WebHookSendParamsModel webHookSendParamsModel) {
        String title = "";
        List<FeiShuRichTextFormatModel> modelList = new ArrayList<>();
        if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.PUSH)) {
            title = "推送提醒";
            PushEventsData pushEventsData = (PushEventsData) webHookSendParamsModel.getObject();
            modelList.add(getPushParams(pushEventsData));
        } else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.TAG_PUSH)) {
            title = "标签推送提醒";
            PushEventsData pushEventsData = (PushEventsData) webHookSendParamsModel.getObject();
            modelList.add(getTagPushParams(pushEventsData));
        } else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.NOTE)) {
            title = "评论提醒";
            //旧版评论
            if (webHookSendParamsModel.getObject() instanceof NoteWebHookDataDTO) {
                NoteWebHookDataDTO noteWebHookDataDTO = (NoteWebHookDataDTO) webHookSendParamsModel.getObject();
                modelList.add(getNoteParams(noteWebHookDataDTO));
            }
            //新版评论
            else if (webHookSendParamsModel.getObject() instanceof CodeupCommentHookData) {
                CodeupCommentHookData noteWebHookDataDTO = (CodeupCommentHookData) webHookSendParamsModel.getObject();
                modelList.add(getNoteParams(noteWebHookDataDTO));
            }
        } else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.MERGE_REQUEST)) {
            title = "合并请求提醒";
            //新版CR
            if (webHookSendParamsModel.getObject() instanceof CodeReviewHookData) {
                CodeReviewHookData codeReviewHookData = (CodeReviewHookData) webHookSendParamsModel.getObject();
                modelList.add(getMergeRequestParams(codeReviewHookData));
            }
            //旧版CR
            else if (webHookSendParamsModel.getObject() instanceof MergeRequestWebHookDataDTO) {
                MergeRequestWebHookDataDTO mergeRequestWebHookDataDTO = (MergeRequestWebHookDataDTO) webHookSendParamsModel.getObject();
                modelList.add(getMergeRequestParams(mergeRequestWebHookDataDTO));
            }
        }
        if (modelList.size() > 0) {
            //主体消息
            return FeiShuRobotMsgUtil.getFeiShuRichTextFormatParams(
                    title, modelList, webHookSendParamsModel.getWebHooks().getSecretToken());
        }
        log.warn("Abnormal assembly of FeiShu parameters :{}", JSON.toString(webHookSendParamsModel));
        //兜底方案, 如果以上策略都不符合,直接返回原对象
        return webHookSendParamsModel.getObject();
    }

    /**
     * 获取推送请求参数
     * @param pushEventsData
     * @return
     */
    private FeiShuRichTextFormatModel getPushParams(PushEventsData pushEventsData) {
        //链接
        List<FeiShuButtonModel> hrefList = new ArrayList<>();
        for (PushDataCommit pushDataCommit : pushEventsData.getCommits()) {
            //描述内容取标题 以/n为结束符进行截取
            String message = pushDataCommit.getMessage();
            //与钉钉消息的commitId格式保持一致 取前面8位
            String commitId = pushDataCommit.getId().substring(0, 8);
            //commit 列表
            hrefList.add(FeiShuButtonModel.builder()
                    .name(commitId)
                    .url(pushDataCommit.getUrl())
                    .description(message.contains(Constants.RETURN) ?
                            message.substring(0, message.indexOf(Constants.RETURN)) : message)
                    .build());
        }
        //兼容合并推送场景
        String ref = pushEventsData.getRef();
        ref = ref.contains(Constants.PATH_SEPARATOR)
                ? ref.substring(ref.lastIndexOf(Constants.PATH_SEPARATOR) + 1)
                : ref;

        FeiShuRichTextFormatModel fuContentModel = FeiShuRichTextFormatModel.builder()
                .contentFirst(pushEventsData.getUserName())
                .content(String.format(" pushed to branch %s", ref))
                .contentLast(String.format(" at repository %s", pushEventsData.getRepository().getName()))
                .hrefList(hrefList)
                .build();
        return fuContentModel;
    }

    /**
     * 获取标签推送请求参数
     *
     * @param pushEventsData
     * @return
     */
    private FeiShuRichTextFormatModel getTagPushParams(PushEventsData pushEventsData) {
        String repoName = pushEventsData.getRepository().getName();
        //获取tag name
        String ref = pushEventsData.getRef();
        ref = ref.contains(Constants.PATH_SEPARATOR)
                ? ref.substring(ref.lastIndexOf(Constants.PATH_SEPARATOR) + 1)
                : ref;
        FeiShuRichTextFormatModel fuContentModel = FeiShuRichTextFormatModel.builder()
                .contentFirst(pushEventsData.getUserName())
                .content(String.format(" pushed tag %s at repository ", ref))
                .hrefContent(repoName).hrefUrl(pushEventsData.getRepository().getUrl())
                .build();
        return fuContentModel;
    }

    /**
     * 获取新版CR请求参数
     *
     * @param codeReviewHookData
     * @return
     */
    public FeiShuRichTextFormatModel getMergeRequestParams(CodeReviewHookData codeReviewHookData) {
        CodeReviewWebHookAttributes objectAttributes = codeReviewHookData.getObjectAttributes();
        String userName = codeReviewHookData.getUser().getName();
        String repoName = codeReviewHookData.getRepository().getName();
        //链接
        List<FeiShuButtonModel> hrefList = new ArrayList<>();
        hrefList.add(FeiShuButtonModel.builder()
                .name(objectAttributes.getTitle())
                .url(objectAttributes.getUrl())
                .build());

        List<String> descLines = new ArrayList<>();
        descLines.add(String.format("Status:%s", objectAttributes.getState()));
        descLines.add(String.format("Repository:%s", repoName));
        FeiShuRichTextFormatModel fuContentModel = FeiShuRichTextFormatModel.builder()
                .contentFirst(String.format("%s %s the merge request", userName, objectAttributes.getAction()))
                .content(String.format(" from branch %s ", objectAttributes.getSourceBranch()))
                .contentLast(String.format("to %s", objectAttributes.getTargetBranch()))
                .hrefList(hrefList)
                .contentLines(descLines)
                .build();
        return fuContentModel;
    }

    /**
     * 获取旧版CR请求参数
     *
     * @param mergeRequestWebHookDataDTO
     * @return
     */
    public FeiShuRichTextFormatModel getMergeRequestParams(MergeRequestWebHookDataDTO mergeRequestWebHookDataDTO) {
        MergeRequestWebHookAttributesDTO objectAttributes = mergeRequestWebHookDataDTO.getObjectAttributes();
        String userName = mergeRequestWebHookDataDTO.getUser().getName();
        String repoName = mergeRequestWebHookDataDTO.getRepository().getName();
        //链接
        List<FeiShuButtonModel> hrefList = new ArrayList<>();
        hrefList.add(FeiShuButtonModel.builder()
                .name(objectAttributes.getTitle())
                .url(objectAttributes.getUrl())
                .build());

        List<String> descLines = new ArrayList<>();
        descLines.add(String.format("Status:%s", objectAttributes.getState()));
        descLines.add(String.format("Repository:%s", repoName));
        FeiShuRichTextFormatModel fuContentModel = FeiShuRichTextFormatModel.builder()
                .contentFirst(String.format("%s %s the merge request", userName, objectAttributes.getAction()))
                .content(String.format(" from branch %s ", objectAttributes.getSourceBranch()))
                .contentLast(String.format("to %s", objectAttributes.getTargetBranch()))
                .hrefList(hrefList)
                .contentLines(descLines)
                .build();
        return fuContentModel;
    }

    /**
     * 获取旧版评论请求参数
     *
     * @param noteWebHookDataDTO
     * @return
     */
    private FeiShuRichTextFormatModel getNoteParams(NoteWebHookDataDTO noteWebHookDataDTO) {
        FeiShuRichTextFormatModel fuContentModel = null;
        //commit note
        if (Objects.nonNull(noteWebHookDataDTO.getPushDataCommit())) {
            //与钉钉消息的commitId格式保持一致 取前面8位
            String commitId = noteWebHookDataDTO.getObjectAttributes().getCommitId().substring(0, 8);
            fuContentModel = FeiShuRichTextFormatModel.builder()
                    .contentFirst(noteWebHookDataDTO.getUser().getName())
                    .firstHrefContent("commented")
                    .firstHrefUrl(noteWebHookDataDTO.getObjectAttributes().getUrl())
                    .content(" on commit ")
                    .contentLast(commitId)
                    .contentLines(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getNote()))
                    .build();

        } else if (Objects.nonNull(noteWebHookDataDTO.getMergeRequest())) {
            //merge note
            fuContentModel = FeiShuRichTextFormatModel.builder()
                    .contentFirst(noteWebHookDataDTO.getUser().getName())
                    .firstHrefContent("commented")
                    .firstHrefUrl(noteWebHookDataDTO.getObjectAttributes().getUrl())
                    .content(String.format(" on merge request from branch %s to ", noteWebHookDataDTO.getMergeRequest().getSourceBranch()))
                    .contentLast(noteWebHookDataDTO.getMergeRequest().getTargetBranch())
                    .contentLines(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getNote()))
                    .build();
        }
        return fuContentModel;
    }

    /**
     * 获取新版评论请求参数
     *
     * @param noteWebHookDataDTO
     * @return
     */
    private FeiShuRichTextFormatModel getNoteParams(CodeupCommentHookData noteWebHookDataDTO) {
        FeiShuRichTextFormatModel fuContentModel = null;
        //commit note
        if (Objects.nonNull(noteWebHookDataDTO.getCommit())) {
            //与钉钉消息的commitId格式保持一致 取前面8位
            String commitId = noteWebHookDataDTO.getObjectAttributes().getCommitId().substring(0, 8);
            fuContentModel = FeiShuRichTextFormatModel.builder()
                    .contentFirst(noteWebHookDataDTO.getUser().getName())
                    .firstHrefContent("commented")
                    .firstHrefUrl(noteWebHookDataDTO.getObjectAttributes().getUrl())
                    .content(" on commit ")
                    .contentLast(commitId)
                    .contentLines(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getContent()))
                    .build();

        } else if (Objects.nonNull(noteWebHookDataDTO.getCodeReviewWebHookAttributes())) {
            //merge note
            fuContentModel = FeiShuRichTextFormatModel.builder()
                    .contentFirst(noteWebHookDataDTO.getUser().getName())
                    .firstHrefContent("commented")
                    .firstHrefUrl(noteWebHookDataDTO.getObjectAttributes().getUrl())
                    .content(String.format(" on merge request from branch %s to ", noteWebHookDataDTO.getCodeReviewWebHookAttributes().getSourceBranch()))
                    .contentLast(noteWebHookDataDTO.getCodeReviewWebHookAttributes().getTargetBranch())
                    .contentLines(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getContent()))
                    .build();
        }
        return fuContentModel;
    }

    @Override
    public WebHookTypeEnum getWebHookType() {
        return WebHookTypeEnum.FEI_SHU;
    }
}

具策略实现类注册器:


/**
 * webhooks 请求参数策略注册器 Date : 2023/8/18 12:24
 *
 * @author xiaobai.jzm
 */

@Component
@Lazy
public class WebHookStrategyFactory {

    /** WebHook发送策略映射表 */
    private static Map<WebHookTypeEnum, WebHookStrategy> WEBHOOKS_STRATEGY_CACHE;

    /**
     * 根据WebHook的URL获取相应的处理策略类
     * @param url webHook的回调URL
     * @return WebHookStrategy
     */
    public static WebHookStrategy getStrategy(@NonNull String url) {
        return getCache().get(WebHookTypeEnum.getStrategy(url));
    }

    private static Map<WebHookTypeEnum, WebHookStrategy> getCache() {
        if (CollectionUtils.isEmpty(WEBHOOKS_STRATEGY_CACHE)) {
            initCache();
        }
        return WEBHOOKS_STRATEGY_CACHE;
    }

    /**
     * 初始化WEBHOOKS_STRATEGY_CACHE
     */
    private static synchronized void initCache() {
        if (!CollectionUtils.isEmpty(WEBHOOKS_STRATEGY_CACHE)) {
            return;
        }
        final String[] beanNamesForType = SpringBeanUtils.getApplicationContext().getBeanNamesForType(WebHookStrategy.class);
        //防止bean未实例化完成就有请求进来
        if (null == beanNamesForType || beanNamesForType.length == 0) {
            return;
        }
        WEBHOOKS_STRATEGY_CACHE = new HashMap<>();
        Arrays.stream(beanNamesForType).forEach(beanName -> {
            WebHookStrategy webhooksStrategy = (WebHookStrategy) SpringBeanUtils.getApplicationContext().getBean(beanName);
            WEBHOOKS_STRATEGY_CACHE.put(webhooksStrategy.getWebHookType(), webhooksStrategy);
        });
    }
}

接入微信群消息机器人

@Slf4j
@Service
public class WeChatWebHookStrategy implements WebHookStrategy {
    @Override
    public Object getRequestParameters(WebHookSendParamsModel webHookSendParamsModel) {
        WeChatMarkDownRichTextModel downRichTextModel = null;
        if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.PUSH)) {
            PushEventsData pushEventsData = (PushEventsData) webHookSendParamsModel.getObject();
            downRichTextModel = getPushParams(pushEventsData);
        } else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.TAG_PUSH)) {
            PushEventsData pushEventsData = (PushEventsData) webHookSendParamsModel.getObject();
            downRichTextModel = getTagPushParams(pushEventsData);
        } else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.NOTE)) {
            //旧版评论
            if (webHookSendParamsModel.getObject() instanceof NoteWebHookDataDTO) {
                NoteWebHookDataDTO noteWebHookDataDTO = (NoteWebHookDataDTO) webHookSendParamsModel.getObject();
                downRichTextModel = getNoteParams(noteWebHookDataDTO);
            }
            //新版评论
            else if (webHookSendParamsModel.getObject() instanceof CodeupCommentHookData) {
                CodeupCommentHookData noteWebHookDataDTO = (CodeupCommentHookData) webHookSendParamsModel.getObject();
                downRichTextModel = getNoteParams(noteWebHookDataDTO);
            }
        } else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.MERGE_REQUEST)) {
            //新版CR
            if (webHookSendParamsModel.getObject() instanceof CodeReviewHookData) {
                CodeReviewHookData codeReviewHookData = (CodeReviewHookData) webHookSendParamsModel.getObject();
                downRichTextModel = getMergeRequestParams(codeReviewHookData);
            }
            //旧版CR
            else if (webHookSendParamsModel.getObject() instanceof MergeRequestWebHookDataDTO) {
                MergeRequestWebHookDataDTO mergeRequestWebHookDataDTO = (MergeRequestWebHookDataDTO) webHookSendParamsModel.getObject();
                downRichTextModel = getMergeRequestParams(mergeRequestWebHookDataDTO);
            }
        }
        if (Objects.nonNull(downRichTextModel)) {
            //主体消息
            return WeChatRobotMsgUtil.getMarkDownFormatMsgContent(downRichTextModel);
        }
        log.warn("Abnormal assembly of wechat parameters :{}", JSON.toString(webHookSendParamsModel));
        //兜底方案, 如果以上策略都不符合,直接返回原对象
        return webHookSendParamsModel.getObject();
    }
    /**
     * 获取推送请求参数
     *
     * @param pushEventsData
     * @return
     */
    private WeChatMarkDownRichTextModel getPushParams(PushEventsData pushEventsData) {
        //链接
        List<FeiShuButtonModel> hrefList = new ArrayList<>();
        for (PushDataCommit pushDataCommit : pushEventsData.getCommits()) {
            //描述内容取标题 以/n为结束符进行截取
            String message = pushDataCommit.getMessage();
            //与钉钉消息的commitId格式保持一致 取前面8位
            String commitId = pushDataCommit.getId().substring(0, 8);
            //commit 列表
            hrefList.add(FeiShuButtonModel.builder().name(commitId).url(pushDataCommit.getUrl()).description(message.contains(Constants.RETURN) ? message.substring(0, message.indexOf(Constants.RETURN)) : message).build());
        }
        //兼容合并推送场景
        String ref = pushEventsData.getRef();
        ref = ref.contains(Constants.PATH_SEPARATOR) ? ref.substring(ref.lastIndexOf(Constants.PATH_SEPARATOR) + 1) : ref;
        String content = String.format("%s pushed to branch %s at repository %s",
                pushEventsData.getUserName(),
                ref,
                pushEventsData.getRepository().getName());
        WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
                .title("推送提醒")
                .content(content)
                .buttonModelList(hrefList)
                .build();
        return weChatMarkDownRichTextModel;
    }
    /**
     * 获取标签推送请求参数
     *
     * @param pushEventsData
     * @return
     */
    private WeChatMarkDownRichTextModel getTagPushParams(PushEventsData pushEventsData) {
        String repoName = pushEventsData.getRepository().getName();
        //获取tag name
        String ref = pushEventsData.getRef();
        ref = ref.contains(Constants.PATH_SEPARATOR) ? ref.substring(ref.lastIndexOf(Constants.PATH_SEPARATOR) + 1) : ref;
        //消息主体
        String content = String.format("%s pushed tag %s at repository %s", pushEventsData.getUserName(), ref, repoName);
        WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
                .title("标签推送提醒")
                .content(content)
                .contentEndLinkUrl(pushEventsData.getRepository().getUrl())
                .build();
        return weChatMarkDownRichTextModel;
    }
    /**
     * 获取新版CR请求参数
     *
     * @param codeReviewHookData
     * @return
     */
    public WeChatMarkDownRichTextModel getMergeRequestParams(CodeReviewHookData codeReviewHookData) {
        CodeReviewWebHookAttributes objectAttributes = codeReviewHookData.getObjectAttributes();
        String userName = codeReviewHookData.getUser().getName();
        String repoName = codeReviewHookData.getRepository().getName();
        //链接
        List<FeiShuButtonModel> hrefList = new ArrayList<>();
        hrefList.add(FeiShuButtonModel.builder().name(objectAttributes.getTitle()).url(objectAttributes.getUrl()).build());
        List<String> descLines = new ArrayList<>();
        descLines.add(String.format("Status:%s", objectAttributes.getState()));
        descLines.add(String.format("Repository:%s", repoName));
        String content = String.format("%s %s the merge request from branch %s to %s",
                userName,
                objectAttributes.getAction(),
                objectAttributes.getSourceBranch(),
                objectAttributes.getTargetBranch());
        WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
                .title("合并请求提醒")
                .content(content)
                .buttonModelList(hrefList)
                .describeLineList(descLines)
                .build();
        return weChatMarkDownRichTextModel;
    }
    /**
     * 获取旧版CR请求参数
     *
     * @param mergeRequestWebHookDataDTO
     * @return
     */
    public WeChatMarkDownRichTextModel getMergeRequestParams(MergeRequestWebHookDataDTO mergeRequestWebHookDataDTO) {
        MergeRequestWebHookAttributesDTO objectAttributes = mergeRequestWebHookDataDTO.getObjectAttributes();
        String userName = mergeRequestWebHookDataDTO.getUser().getName();
        String repoName = mergeRequestWebHookDataDTO.getRepository().getName();
        //链接
        List<FeiShuButtonModel> hrefList = new ArrayList<>();
        hrefList.add(FeiShuButtonModel.builder().name(objectAttributes.getTitle()).url(objectAttributes.getUrl()).build());
        List<String> descLines = new ArrayList<>();
        descLines.add(String.format("Status:%s", objectAttributes.getState()));
        descLines.add(String.format("Repository:%s", repoName));
        String content = String.format("%s %s the merge request from branch %s to %s",
                userName,
                objectAttributes.getAction(),
                objectAttributes.getSourceBranch(),
                objectAttributes.getTargetBranch());
        WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
                .title("合并请求提醒")
                .content(content)
                .buttonModelList(hrefList)
                .describeLineList(descLines)
                .build();
        return weChatMarkDownRichTextModel;
    }
    /**
     * 获取旧版评论请求参数
     *
     * @param noteWebHookDataDTO
     * @return
     */
    private WeChatMarkDownRichTextModel getNoteParams(NoteWebHookDataDTO noteWebHookDataDTO) {
        WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = null;
        //commit note
        if (Objects.nonNull(noteWebHookDataDTO.getPushDataCommit())) {
            //与钉钉消息的commitId格式保持一致 取前面8位
            String commitId = noteWebHookDataDTO.getObjectAttributes().getCommitId().substring(0, 8);
            //消息示例 : 小白 commented on commit d73575d7  \n这是一个评论消息
            //消息主体
            String content = String.format("%s %s on commit %s",
                    noteWebHookDataDTO.getUser().getName(),
                    WeChatRobotMsgUtil.getCommentUrl("commented", noteWebHookDataDTO.getObjectAttributes().getUrl()),
                    commitId);
            weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
                    .title("评论提醒")
                    .content(content)
                    .describeLineList(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getNote()))
                    .build();
        } else if (Objects.nonNull(noteWebHookDataDTO.getMergeRequest())) {
            //merge note
            //消息主体
            String content = String.format("%s %s on merge request from branch %s to %s ",
                    noteWebHookDataDTO.getUser().getName(),
                    WeChatRobotMsgUtil.getCommentUrl("commented", noteWebHookDataDTO.getObjectAttributes().getUrl()),
                    noteWebHookDataDTO.getMergeRequest().getSourceBranch(),
                    noteWebHookDataDTO.getMergeRequest().getTargetBranch());
            weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
                    .title("评论提醒")
                    .content(content)
                    .describeLineList(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getNote()))
                    .build();
        }
        return weChatMarkDownRichTextModel;
    }
    /**
     * 获取新版评论请求参数
     *
     * @param noteWebHookDataDTO
     * @return
     */
    private WeChatMarkDownRichTextModel getNoteParams(CodeupCommentHookData noteWebHookDataDTO) {
        WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = null;
        //commit note
        if (Objects.nonNull(noteWebHookDataDTO.getCommit())) {
            //与钉钉消息的commitId格式保持一致 取前面8位
            String commitId = noteWebHookDataDTO.getObjectAttributes().getCommitId().substring(0, 8);
            //消息主体
            String content = String.format("%s %s on commit %s",
                    noteWebHookDataDTO.getUser().getName(),
                    WeChatRobotMsgUtil.getCommentUrl("commented", noteWebHookDataDTO.getObjectAttributes().getUrl()),
                    commitId);
            weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
                    .title("评论提醒")
                    .content(content)
                    .describeLineList(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getContent()))
                    .build();
        } else if (Objects.nonNull(noteWebHookDataDTO.getCodeReviewWebHookAttributes())) {
            //merge note
            //消息主体
            String content = String.format("%s %s on merge request from branch %s to %s ",
                    noteWebHookDataDTO.getUser().getName(),
                    WeChatRobotMsgUtil.getCommentUrl("commented", noteWebHookDataDTO.getObjectAttributes().getUrl()),
                    noteWebHookDataDTO.getCodeReviewWebHookAttributes().getSourceBranch(),
                    noteWebHookDataDTO.getCodeReviewWebHookAttributes().getTargetBranch());
            weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
                    .title("评论提醒")
                    .content(content)
                    .describeLineList(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getContent()))
                    .build();
        }
        return weChatMarkDownRichTextModel;
    }
    @Override
    public WebHookTypeEnum getWebHookType() {
        return WebHookTypeEnum.WE_CHAT;
    }
}
import lombok.Builder;
import lombok.Data;
import java.util.List;
/**
 * 企业微信群机器人消息模型对象
 *
 * @Author xiaobai.jzm
 * Date : 2023/9/11 14:07
 */
@Data
@Builder
public class WeChatMarkDownRichTextModel {
    /**
     * 标题
     */
    private String title;
    /**
     * 内容-开头
     */
    private String contentStart;
    /**
     * 内容-开头-链接
     */
    private String contentStartLinkUrl;
    /**
     * 内容-主体
     */
    private String content;
    /**
     * 内容-主体-链接
     */
    private String contentLinkUrl;
    /**
     * 内容-结束
     */
    private String contentEnd;
    /**
     * 内容-结束-链接
     */
    private String contentEndLinkUrl;
    /**
     * 多行文本
     */
    private List<String> contentLineList;
    /**
     * 描述信息(多行)
     */
    private List<FeiShuButtonModel> buttonModelList;
    /**
     * 描述信息 多行文本
     */
    private List<String> describeLineList;
}
/**
 * 企业微信机器人群消息请求参数工具类
 *
 * @Author xiaobai.jzm
 * Date : 2023/9/11 11:39
 */
public class WeChatRobotMsgUtil {
    /**
     * 获取markdown格式消息内容
     * 富文本消息
     *
     * @param markDownRichTextModel
     * @return
     */
    public static JSONObject getMarkDownFormatMsgContent(WeChatMarkDownRichTextModel markDownRichTextModel) {
        JSONObject contentJson = new JSONObject();
        //如果传入null 则直接返回 保证后续流程异常
        if (Objects.isNull(markDownRichTextModel)) {
            return contentJson;
        }
        StringBuffer sb = new StringBuffer();
        if (StringUtil.isNotBlank(markDownRichTextModel.getTitle())) {
            sb.append("# ").append(markDownRichTextModel.getTitle()).append(Constants.RETURN_CHAR);
        }
        StringBuffer contentSb = new StringBuffer();
        //开头是否有链接
        if (StringUtil.isNotBlank(markDownRichTextModel.getContentStart())) {
            if (StringUtil.isNotBlank(markDownRichTextModel.getContentStartLinkUrl())) {
                contentSb.append(getCommentUrl(markDownRichTextModel.getContentStart(), markDownRichTextModel.getContentStartLinkUrl()));
            } else {
                contentSb.append(markDownRichTextModel.getContentStart());
            }
        }
        //消息主体
        if (StringUtil.isNotBlank(markDownRichTextModel.getContent())) {
            if (StringUtil.isNotBlank(markDownRichTextModel.getContentLinkUrl())) {
                contentSb.append(getCommentUrl(markDownRichTextModel.getContent(), markDownRichTextModel.getContentLinkUrl()));
            } else {
                contentSb.append(markDownRichTextModel.getContent());
            }
        }
        //消息尾部
        if (StringUtil.isNotBlank(markDownRichTextModel.getContentEnd())) {
            if (StringUtil.isNotBlank(markDownRichTextModel.getContentEndLinkUrl())) {
                contentSb.append(getCommentUrl(markDownRichTextModel.getContentEnd(), markDownRichTextModel.getContentEndLinkUrl()));
            } else {
                contentSb.append(markDownRichTextModel.getContentEnd());
            }
        }
        //上面存在内容则需要换行
        if (StringUtil.isNotBlank(contentSb.toString())) {
            sb.append(contentSb).append(Constants.RETURN_CHAR);
        }
        //组装多行消息
        if (CollectionUtils.isNotEmpty(markDownRichTextModel.getContentLineList())) {
            for (String line : markDownRichTextModel.getContentLineList()) {
                sb.append(line).append(Constants.RETURN_CHAR);
            }
        }
        //描述信息
        if (CollectionUtils.isNotEmpty(markDownRichTextModel.getButtonModelList())) {
            for (FeiShuButtonModel buttonModel : markDownRichTextModel.getButtonModelList()) {
                if (StringUtil.isNotBlank(buttonModel.getName())) {
                    //存在链接
                    if (StringUtil.isNotBlank(buttonModel.getUrl())) {
                        sb.append(">").append(getCommentUrl(buttonModel.getName(), buttonModel.getUrl()));
                    } else {
                        sb.append(buttonModel.getName());
                    }
                    //描述
                    if (StringUtil.isNotBlank(buttonModel.getDescription())) {
                        sb.append(":").append(getCommentText(buttonModel.getDescription()));
                    }
                }
                //存在多行内容 需要换行
                sb.append(Constants.RETURN_CHAR);
            }
        }
        //组装多行消息
        if (CollectionUtils.isNotEmpty(markDownRichTextModel.getDescribeLineList())) {
            for (String line : markDownRichTextModel.getDescribeLineList()) {
                sb.append(">").append(getCommentText(line)).append(Constants.RETURN_CHAR);
            }
        }
        contentJson.put("content", sb);
        //请求参数
        JSONObject paramsJson = new JSONObject();
        paramsJson.put("msgtype", "markdown");
        paramsJson.put("markdown", contentJson);
        return paramsJson;
    }
    /**
     * 获取灰色样式文本 comment 灰色 ,info 绿色 ,warning  橙红色
     *
     * @param text
     * @return
     */
    public static String getCommentText(String text) {
        return StringUtil.isNotBlank(text) ? String.format("<font color='comment'>%s</font>", text) : "";
    }
    public static String getCommentUrl(String name, String url) {
        return String.format("[%s](%s)", name, url);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 中结合策略模式枚举设计支付可以按照以下步骤进行: 1. 定义支付方式的枚举:创建一个枚举类,用于表示不同的支付方式。例如: ```java public enum PaymentMethod { ALIPAY, WECHATPAY, BANKCARD } ``` 2. 定义策略接口和实现类:创建支付策略接口和具体的支付策略实现类。在接口中定义支付方法,实现类中实现具体的支付逻辑。例如: ```java public interface PaymentStrategy { void pay(BigDecimal amount); } @Component public class AlipayStrategy implements PaymentStrategy { public void pay(BigDecimal amount) { // 实现支付宝支付逻辑 } } @Component public class WechatPayStrategy implements PaymentStrategy { public void pay(BigDecimal amount) { // 实现微信支付逻辑 } } @Component public class BankCardStrategy implements PaymentStrategy { public void pay(BigDecimal amount) { // 实现银行卡支付逻辑 } } ``` 3. 创建支付策略工厂类:创建一个支付策略工厂类,用于获取正确的支付策略对象。根据传入的支付方式枚举值,返回对应的支付策略对象。例如: ```java @Component public class PaymentStrategyFactory { @Autowired private AlipayStrategy alipayStrategy; @Autowired private WechatPayStrategy wechatPayStrategy; @Autowired private BankCardStrategy bankCardStrategy; public PaymentStrategy getPaymentStrategy(PaymentMethod paymentMethod) { switch (paymentMethod) { case ALIPAY: return alipayStrategy; case WECHATPAY: return wechatPayStrategy; case BANKCARD: return bankCardStrategy; default: throw new IllegalArgumentException("Unsupported payment method: " + paymentMethod); } } } ``` 4. 在业务逻辑中使用支付策略:在需要使用支付功能的地方,通过支付策略工厂获取正确的支付策略对象,并调用支付方法进行支付。例如: ```java @Service public class PaymentService { @Autowired private PaymentStrategyFactory paymentStrategyFactory; public void processPayment(PaymentMethod paymentMethod, BigDecimal amount) { PaymentStrategy paymentStrategy = paymentStrategyFactory.getPaymentStrategy(paymentMethod); paymentStrategy.pay(amount); } } ``` 通过结合策略模式枚举设计支付,可以更加方便地管理和扩展支付方式,同时提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值