diff --git a/_doc/Task.md b/_doc/Task.md index 5e085a91..a15d70a5 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,22 +1,32 @@ ## 单商户 -2.0.8: 对账完善和系统优化 +2.0.8: 转账/撤销接口和系统优化 - [x] 支持撤销接口 - [ ] 增加转账接口功能 - [ ] 细分各种支付异常类和编码(完成部分) - [ ] 增加分账修复功能 - [ ] DEMO增加获取微信OpenID和支付宝OpenId功能 +- [ ] 支付宝微信等消息通知地址支持一键生成 - [ ] 管理端界面支持扫码绑定对账接收方功能 -- [ ] 支付通道两个独立的配置进行合并为一个 -- [ ] 平台配置和接口配置删除回调地址配置, 只保留接口参数设置 -- [ ] 接口配置删除验签配置, 放到平台配置进行统一处理 +- [x] 支付通道两个独立的配置进行合并为一个 + - [X] 去除有效, icon, 颜色等字段 +- [x] 平台配置改版 + - [x] 平台配置和接口配置删除回调地址配置 + - [X] 删除回调地址配置, 更换为消息通知地址和消息通知类型 +- [X] 接口配置改版 + - [x] 删除是否验签配置和回调地址 + - [x] 去掉上下文相关类 + - [x] 回调通知固定为读取参数传递的数据 - [x] 分账字段统一为Alloc, 不包括接口名称 - [x] 支付订单拆分退款状态为单独的字段 - [x] 策略工厂修改为通用策略工厂 - [x] 支付和退款达到终态不可以再回退回之前的状态 - [x] 修复支付关闭参数名称不正确问题 -2.0.9: 消息通知改版和功能优化 +- [ ] 脚手架优化 + - [ ] 请求权限改版, 使用专用配置类 + - [X] 去除消息通知模块 +2.0.9: 消息通知改版和系统优化 - [ ] 增加类似支付宝应用通知的方式, 先支持http方式通信 -- [ ] 增加支付宝和微信通知回调地址一键生成功能 +- [ ] 优化前端各种状态颜色展示 2.1.x 版本内容 - [ ] 增加收单收银台功能 @@ -34,8 +44,6 @@ - [ ] 针对同步/对账等出现脏数据导致阻塞的问题, 进行优化 - [ ] 同步接口 - [ ] 对账接口 -- [ ] 增加通道开通能力管理,在操作发起前的校验时提前进行拦截 - **任务池** - [ ] 通道费率计算 - [ ] 每日资金流水计算 diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/pom.xml b/bootx-platform/bootx-common-starters/common-starter-dingtalk/pom.xml deleted file mode 100644 index c4b69d15..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - bootx-common-starters - cn.bootx.platform - 1.3.6.2 - - 4.0.0 - - common-starter-dingtalk - 钉钉接口 - - - - org.springframework.boot - spring-boot-starter-web - - - cn.bootx.platform - common-mybatis-plus - - - cn.bootx.platform - common-starter-data-perm - - - diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/DingTalkAutoConfiguration.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/DingTalkAutoConfiguration.java deleted file mode 100644 index 48cdf45a..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/DingTalkAutoConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bootx.platform.starter.dingtalk; - -import org.apache.ibatis.annotations.Mapper; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.ConfigurationPropertiesScan; -import org.springframework.context.annotation.ComponentScan; - -/** - * 钉钉对接 - * - * @author xxm - * @since 2022/4/2 - */ -@ComponentScan -@ConfigurationPropertiesScan -@AutoConfiguration -@MapperScan(annotationClass = Mapper.class) -public class DingTalkAutoConfiguration { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/code/DingTalkCode.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/code/DingTalkCode.java deleted file mode 100644 index 85f12e81..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/code/DingTalkCode.java +++ /dev/null @@ -1,123 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.code; - -/** - * 钉钉消息类型 - * - * @author xxm - * @since 2020/11/30 - */ -public interface DingTalkCode { - - /** 钉钉Access参数 */ - String ACCESS_TOKEN_PARAM = "?access_token={}"; - - /** 内部应用获取access_token */ - String APP_ACCESS_TOKEN_URL = "https://oapi.dingtalk.com/gettoken?appkey={appKey}&appsecret={appSecret}"; - - /** 带sign的机器人消息发送请求 */ - String ROBOT_SEND_SIGN_URL = "https://oapi.dingtalk.com/robot/send?access_token={accessToken}×tamp={timestamp}&sign={sign}"; - - /** 不带sign的机器人消息发送请求 */ - String ROBOT_SEND_NOT_SIGN_URL = "https://oapi.dingtalk.com/robot/send" + ACCESS_TOKEN_PARAM; - - /** 发送工作通知 */ - String NOTICE_CORP_SEND_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2" - + ACCESS_TOKEN_PARAM; - - /** 更新工作通知(OA消息) */ - String NOTICE_CORP_UPDATE_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/status_bar/update" - + ACCESS_TOKEN_PARAM; - - /** 撤回工作通知 */ - String NOTICE_CORP_RECALL_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/recall" - + ACCESS_TOKEN_PARAM; - - /** 发送企业群通知 */ - String NOTICE_CHAT_URL = "https://oapi.dingtalk.com/chat/send" + ACCESS_TOKEN_PARAM; - - /** 发送普通消息通知 */ - String NOTICE_MESSAGE_URL = "https://oapi.dingtalk.com/message/send_to_conversation" + ACCESS_TOKEN_PARAM; - - /** 根据unionid获取用户userid */ - String USER_GET_URL = "https://oapi.dingtalk.com/topapi/user/getbyunionid" + ACCESS_TOKEN_PARAM; - - /** 媒体文件上传 */ - String MEDIA_UPLOAD_URL = "https://oapi.dingtalk.com/media/upload" + ACCESS_TOKEN_PARAM; - - /** 钉钉字段 */ - String ACCESS_TOKEN = "accessToken"; - - String SIGN = "sign"; - - String TIMESTAMP = "timestamp"; - - String APP_KEY = "appKey"; - - String APP_SECRET = "appSecret"; - - /** 应用id */ - String CLIENT_ID = "clientId"; - - // 应用密钥 - String CLIENT_SECRET = "clientSecret"; - - String CODE = "code"; - - // OAuth2.0刷新令牌,从返回结果里面获取。 - String REFRESH_TOKEN = "refreshToken"; - - String GRANT_TYPE = "grantType"; - - String RESPONSE_TYPE = "responseType"; - - String SCOPE = "scope"; - - String REDIRECT_URI = "redirectUri"; - - String STATE = "state"; - - String PROMPT = "prompt"; - - /** 媒体 */ - String MEDIA = "media"; - - /** 类型 */ - String TYPE = "type"; - - /** 请求头参数调用服务端接口的授权凭证 */ - String HEADER_TOKEN = "x-acs-dingtalk-access-token"; - - /* 认证字段 */ - /** 授权码换token */ - String AUTH_AUTHORIZATION_CODE = "authorization_code"; - - /** 刷新token换用户token */ - String AUTH_REFRESH_TOKEN = "refresh_token"; - - /** openid */ - String OPEN_ID = "openid"; - - /** union_id */ - String UNION_ID = "unionid"; - - /* 响应值 */ - /** 成功 */ - int SUCCESS_CODE = 0; - - /** 未找到对应员工 */ - int NOT_FUND_STAFF = 60121; - - /* 媒体类型 */ - /** 图片 */ - String MEDIA_IMAGE = "image"; - - /** 语音 */ - String MEDIA_VOICE = "voice"; - - /** 视频 */ - String MEDIA_VIDEO = "video"; - - /** 普通文件 */ - String MEDIA_FILE = "file"; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/code/DingTalkNoticeCode.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/code/DingTalkNoticeCode.java deleted file mode 100644 index 45e94266..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/code/DingTalkNoticeCode.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.code; - -/** - * 钉钉通知消息常量 - * - * @author xxm - * @since 2022/4/2 - */ -public interface DingTalkNoticeCode { - - /* 消息类型 */ - /** 文本消息 */ - String MSG_TEXT = "text"; - - /** 图片消息 */ - String MSG_IMAGE = "image"; - - /** 语音消息 */ - String MSG_VOICE = "voice"; - - /** 文件消息 */ - String MSG_FILE = "file"; - - /** 链接消息 */ - String MSG_LINK = "link"; - - /** OA消息 */ - String MSG_OA = "oa"; - - /** markdown消息 */ - String MSG_MARKDOWN = "markdown"; - - /** 卡片消息 */ - String MSG_ACTION_CARD = "action_card"; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/configuration/DingTalkProperties.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/configuration/DingTalkProperties.java deleted file mode 100644 index ee8f4aff..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/configuration/DingTalkProperties.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.configuration; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * 钉钉应用配置 - * - * @author xxm - * @since 2022/7/15 - */ -@Getter -@Setter -@ConfigurationProperties("bootx.starter.third.ding-talk") -public class DingTalkProperties { - - /** AppKey */ - private String appKey; - - /** AppSecret */ - private String appSecret; - - /** 应用id */ - private Long agentId; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/controller/DingRobotConfigController.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/controller/DingRobotConfigController.java deleted file mode 100644 index 07d8806b..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/controller/DingRobotConfigController.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.dingtalk.core.robot.service.DingRobotConfigService; -import cn.bootx.platform.starter.dingtalk.dto.robot.DingRobotConfigDto; -import cn.bootx.platform.starter.dingtalk.param.robot.DingRobotConfigParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * @author xxm - * @since 2021/9/25 - */ -@Tag(name = "钉钉机器人配置") -@RestController -@RequestMapping("/ding/robot/config") -@RequiredArgsConstructor -public class DingRobotConfigController { - - private final DingRobotConfigService dingRobotConfigService; - - @Operation(summary = "新增机器人配置") - @PostMapping("/add") - public ResResult add(@RequestBody DingRobotConfigParam param) { - return Res.ok(dingRobotConfigService.add(param)); - } - - @Operation(summary = "修改机器人配置") - @PostMapping("/update") - public ResResult update(@RequestBody DingRobotConfigParam param) { - return Res.ok(dingRobotConfigService.update(param)); - } - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, DingRobotConfigParam param) { - return Res.ok(dingRobotConfigService.page(pageParam, param)); - } - - @Operation(summary = "查询全部") - @GetMapping("/findAll") - public ResResult> findAll() { - return Res.ok(dingRobotConfigService.findAll()); - } - - @Operation(summary = "获取详情") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(dingRobotConfigService.findById(id)); - } - - @Operation(summary = "删除") - @DeleteMapping("/delete") - public ResResult delete(Long id) { - dingRobotConfigService.delete(id); - return Res.ok(); - } - - @Operation(summary = "编码是否被使用") - @GetMapping("/existsByCode") - public ResResult existsByCode(String code) { - return Res.ok(dingRobotConfigService.existsByCode(code)); - } - - @Operation(summary = "编码是否被使用(不包含自己)") - @GetMapping("/existsByCodeNotId") - public ResResult existsByCode(String code, Long id) { - return Res.ok(dingRobotConfigService.existsByCode(code, id)); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/result/AccessTokenResult.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/result/AccessTokenResult.java deleted file mode 100644 index a0b6f2f5..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/result/AccessTokenResult.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.base.result; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "AccessToken响应类") -public class AccessTokenResult extends DingTalkResult { - - @JsonProperty("access_token") - @Schema(description = "访问凭证") - private String accessToken; - - @JsonProperty("expires_in") - @Schema(description = "过期时间") - private Integer expiresIn; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/result/DingTalkResult.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/result/DingTalkResult.java deleted file mode 100644 index ceb76aad..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/result/DingTalkResult.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.base.result; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * 钉钉响应结果 - * - * @author xxm - * @since 2020/11/30 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉发送响应类") -public class DingTalkResult implements Serializable { - - private static final long serialVersionUID = 4298060961428118100L; - - @JsonProperty("errcode") - @Schema(description = "错误码") - private Integer code; - - @Schema(description = "返回数据") - private T result; - - @JsonProperty("errmsg") - @Schema(description = "返回码描述") - private String msg; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/result/MediaResult.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/result/MediaResult.java deleted file mode 100644 index c9cc5698..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/result/MediaResult.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.base.result; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 钉钉媒体上传返回类 - * - * @author xxm - * @since 2022/7/25 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉媒体上传返回类") -public class MediaResult { - - @JsonProperty("errcode") - @Schema(description = "错误码") - private Integer code; - - @JsonProperty("errmsg") - @Schema(description = "返回码描述") - private String msg; - - @JsonProperty("type") - @Schema(description = "媒体文件类型") - private String type; - - @JsonProperty("media_id") - @Schema(description = "唯一标识") - private String mediaId; - - @JsonProperty("created_at") - @Schema(description = "媒体文件上传时间戳") - private long createdAt; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/service/DingAccessService.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/service/DingAccessService.java deleted file mode 100644 index c5d658d5..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/base/service/DingAccessService.java +++ /dev/null @@ -1,97 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.base.service; - -import cn.bootx.platform.starter.dingtalk.configuration.DingTalkProperties; -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.starter.dingtalk.core.base.result.AccessTokenResult; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import cn.hutool.http.HttpException; -import cn.hutool.http.HttpUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.retry.annotation.Retryable; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -import static cn.bootx.platform.starter.dingtalk.code.DingTalkCode.*; - -/** - * 钉钉访问凭证 - * - * @author xxm - * @since 2022/4/2 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class DingAccessService { - - private final DingTalkProperties dingTalkProperties; - - private long expiresTime; - - private String accessToken; - - /** - * 企业内部应用的access_token - */ - public String getAccessToken() { - if (System.currentTimeMillis() < expiresTime) { - return accessToken; - } - Lock lock = new ReentrantLock(); - boolean locked = false; - try { - do { - locked = lock.tryLock(100, TimeUnit.MILLISECONDS); - if (System.currentTimeMillis() < expiresTime) { - return accessToken; - } - } - while (!locked); - SpringUtil.getBean(getClass()) - .getAppAccessToken(dingTalkProperties.getAppKey(), dingTalkProperties.getAppSecret()); - } - catch (InterruptedException e) { - throw new BizException("获取钉钉应用AccessToken失败"); - } - finally { - if (locked) { - lock.unlock(); - } - } - return accessToken; - } - - /** - * 企业内部应用的access_token - */ - @Retryable(value = RetryableException.class) - public void getAppAccessToken(String appKey, String appSecret) { - // 获取accessToken - Map map = new HashMap<>(); - map.put(APP_KEY, appKey); - map.put(APP_SECRET, appSecret); - try { - String responseBody = HttpUtil.createGet(StrUtil.format(APP_ACCESS_TOKEN_URL, map)).execute().body(); - AccessTokenResult> dingTalkResult = JacksonUtil.toBean(responseBody, AccessTokenResult.class); - if (StrUtil.isBlank(dingTalkResult.getAccessToken())) { - throw new RetryableException(); - } - this.accessToken = dingTalkResult.getAccessToken(); - // 设置超时时间 - this.expiresTime = System.currentTimeMillis() + (dingTalkResult.getExpiresIn() - 200) * 1000L; - } - catch (HttpException e) { - throw new RetryableException(); - } - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/dao/DingMediaMd5Manager.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/dao/DingMediaMd5Manager.java deleted file mode 100644 index 1ba98a15..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/dao/DingMediaMd5Manager.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.media.dao; - -import cn.bootx.platform.starter.dingtalk.core.media.entity.DingMediaMd5; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 钉钉 - * - * @author xxm - * @since 2022/7/26 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class DingMediaMd5Manager extends BaseManager { - - /** - * 根据md5查询 - */ - public Optional findByMd5(String md5) { - return findByField(DingMediaMd5::getMd5, md5); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/dao/DingMediaMd5Mapper.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/dao/DingMediaMd5Mapper.java deleted file mode 100644 index 6d9ae7c6..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/dao/DingMediaMd5Mapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.media.dao; - -import cn.bootx.platform.starter.dingtalk.core.media.entity.DingMediaMd5; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2022/7/26 - */ -@Mapper -public interface DingMediaMd5Mapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/entity/DingMediaMd5.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/entity/DingMediaMd5.java deleted file mode 100644 index 6b9800f4..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/entity/DingMediaMd5.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.media.entity; - -import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.RequiredArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 钉钉媒体文件MD5值关联关系 - * - * @author xxm - * @since 2022/7/26 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@AllArgsConstructor -@RequiredArgsConstructor -@TableName("starter_ding_media_md5") -public class DingMediaMd5 extends MpCreateEntity { - - /** 媒体文件id */ - private String mediaId; - - /** 媒体文件的md5值 */ - private String md5; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/service/DingMediaMd5Service.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/service/DingMediaMd5Service.java deleted file mode 100644 index cd4c27d1..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/service/DingMediaMd5Service.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.media.service; - -import cn.bootx.platform.starter.dingtalk.core.media.dao.DingMediaMd5Manager; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * @author xxm - * @since 2022/7/26 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class DingMediaMd5Service { - - private final DingMediaMd5Manager dingMediaMd5Manager; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/service/DingMediaService.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/service/DingMediaService.java deleted file mode 100644 index 0bd7b1dd..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/media/service/DingMediaService.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.media.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.util.FileUtil; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.bootx.platform.starter.dingtalk.code.DingTalkCode; -import cn.bootx.platform.starter.dingtalk.core.base.result.MediaResult; -import cn.bootx.platform.starter.dingtalk.core.base.service.DingAccessService; -import cn.bootx.platform.starter.dingtalk.core.media.dao.DingMediaMd5Manager; -import cn.hutool.core.io.FileTypeUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.io.file.FileNameUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.InputStream; -import java.util.Objects; - -import static cn.bootx.platform.starter.dingtalk.code.DingTalkCode.*; - -/** - * 钉钉媒体文件管理 - * - * @author xxm - * @since 2022/7/25 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class DingMediaService { - - private final DingAccessService dingAccessService; - - private final DingMediaMd5Manager dingMediaMd5Manager; - - /** - * 文件上传 - */ - @SneakyThrows - public String uploadMedia(InputStream inputStream, String fileName, String mediaType) { - // 判断md5是否是已经上传过的, 上传过的直接使用媒体id( 发现钉钉媒体id只能使用一次, 和文档描述不一致 ) - byte[] bytes = IoUtil.readBytes(inputStream); - String filePrefix = FileNameUtil.mainName(fileName); - String fileType = FileTypeUtil.getType(new ByteArrayInputStream(bytes), fileName); - File tmpFile = FileUtil.createTempFile(new ByteArrayInputStream(bytes), filePrefix, fileType); - String body = HttpUtil - .createPost(StrUtil.format(DingTalkCode.MEDIA_UPLOAD_URL, dingAccessService.getAccessToken())) - .form(MEDIA, tmpFile, fileName) - .form(TYPE, mediaType) - .execute() - .body(); - MediaResult mediaResult = JacksonUtil.toBean(body, MediaResult.class); - if (!Objects.equals(mediaResult.getCode(), SUCCESS_CODE)) { - throw new BizException(mediaResult.getMsg()); - } - String mediaId = mediaResult.getMediaId(); - // dingMediaMd5Manager.save(new DingMediaMd5(mediaId,md5)); - return mediaId; - } - - /** - * 文件上传 - */ - @SneakyThrows - public String uploadMedia(InputStream inputStream, String mediaType) { - byte[] bytes = IoUtil.readBytes(inputStream); - - String fileType = FileTypeUtil.getType(new ByteArrayInputStream(bytes)); - File tmpFile = FileUtil.createTempFile(new ByteArrayInputStream(bytes), IdUtil.getSnowflakeNextIdStr(), - fileType); - String body = HttpUtil - .createPost(StrUtil.format(DingTalkCode.MEDIA_UPLOAD_URL, dingAccessService.getAccessToken())) - .form(MEDIA, tmpFile) - .form(TYPE, mediaType) - .execute() - .body(); - MediaResult mediaResult = JacksonUtil.toBean(body, MediaResult.class); - if (!Objects.equals(mediaResult.getCode(), SUCCESS_CODE)) { - throw new BizException(mediaResult.getMsg()); - } - return mediaResult.getMediaId(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/notice/result/ChatNoticeResult.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/notice/result/ChatNoticeResult.java deleted file mode 100644 index 6494bc73..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/notice/result/ChatNoticeResult.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.notice.result; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2022/7/20 - */ -@Data -@Accessors(chain = true) -@Schema(title = "通知消息返回值") -public class ChatNoticeResult { - - @JsonProperty("errcode") - @Schema(description = "错误码") - private Integer code; - - @JsonProperty("errmsg") - @Schema(description = "返回码描述") - private String msg; - - @Schema(description = "异步发送任务ID") - private String messageId; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/notice/result/CorpNoticeResult.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/notice/result/CorpNoticeResult.java deleted file mode 100644 index 89a42eeb..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/notice/result/CorpNoticeResult.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.notice.result; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 钉钉消息响应 - * - * @author xxm - * @since 2022/7/17 - */ -@Data -@Accessors(chain = true) -@Schema(title = "通知消息返回值") -public class CorpNoticeResult { - - @JsonProperty("errcode") - @Schema(description = "错误码") - private Integer code; - - @JsonProperty("errmsg") - @Schema(description = "返回码描述") - private String msg; - - @JsonProperty("task_id") - @Schema(description = "异步发送任务ID") - private Long taskId; - - @JsonProperty("request_id") - @Schema(description = "请求ID") - private String requestId; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/notice/service/DingNoticeService.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/notice/service/DingNoticeService.java deleted file mode 100644 index 34d689ee..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/notice/service/DingNoticeService.java +++ /dev/null @@ -1,101 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.notice.service; - -import cn.bootx.platform.starter.dingtalk.param.notice.ChatNotice; -import cn.bootx.platform.starter.dingtalk.param.notice.CorpNotice; -import cn.bootx.platform.starter.dingtalk.param.notice.RecallCorpNotice; -import cn.bootx.platform.starter.dingtalk.param.notice.UpdateCorpNotice; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.bootx.platform.starter.dingtalk.core.base.service.DingAccessService; -import cn.bootx.platform.starter.dingtalk.core.base.result.DingTalkResult; -import cn.bootx.platform.starter.dingtalk.core.notice.result.ChatNoticeResult; -import cn.bootx.platform.starter.dingtalk.core.notice.result.CorpNoticeResult; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import static cn.bootx.platform.starter.dingtalk.code.DingTalkCode.*; - -/** - * 钉钉通知发送服务 - * - * @author xxm - * @since 2022/7/17 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class DingNoticeService { - - private final DingAccessService dingAccessService; - - /** - * 发送普通消息, 支持普通群和个人会话 - * - * ... - */ - public void sendNotice() { - } - - /** - * 发送企业群消息 - * - * ... - */ - public ChatNoticeResult sendChatNotice(ChatNotice param) { - String accessToken = dingAccessService.getAccessToken(); - String responseBody = HttpUtil.createPost(StrUtil.format(NOTICE_CHAT_URL, accessToken)) - .body(param.toParam()) - .execute() - .body(); - return JacksonUtil.toBean(responseBody, ChatNoticeResult.class); - } - - /** - * 发送工作通知 - * - * ... - */ - public CorpNoticeResult sendCorpNotice(CorpNotice param) { - String accessToken = dingAccessService.getAccessToken(); - String responseBody = HttpUtil.createPost(StrUtil.format(NOTICE_CORP_SEND_URL, accessToken)) - .body(param.toParam()) - .execute() - .body(); - return JacksonUtil.toBean(responseBody, CorpNoticeResult.class); - } - - /** - * 更新工作通知状态栏 - * @url ... - */ - public CorpNoticeResult updateCorpNotice(UpdateCorpNotice param) { - String accessToken = dingAccessService.getAccessToken(); - String responseBody = HttpUtil.createPost(StrUtil.format(NOTICE_CORP_UPDATE_URL, accessToken)) - .body(param.toParam()) - .execute() - .body(); - return JacksonUtil.toBean(responseBody, CorpNoticeResult.class); - } - - /** - * 撤回工作通知消息 - * @url ... - */ - public DingTalkResult> recallCorpNotice(RecallCorpNotice param) { - - String accessToken = dingAccessService.getAccessToken(); - String responseBody = HttpUtil.createPost(StrUtil.format(NOTICE_CORP_RECALL_URL, accessToken)) - .body(param.toParam()) - .execute() - .body(); - return JacksonUtil.toBean(responseBody, DingTalkResult.class); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/convert/DingRobotConvert.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/convert/DingRobotConvert.java deleted file mode 100644 index a6b586b6..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/convert/DingRobotConvert.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.robot.convert; - -import cn.bootx.platform.starter.dingtalk.param.robot.DingRobotConfigParam; -import cn.bootx.platform.starter.dingtalk.core.robot.entity.DingRobotConfig; -import cn.bootx.platform.starter.dingtalk.dto.robot.DingRobotConfigDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 钉钉相关类转换 - * - * @author xxm - * @since 2021/8/5 - */ -@Mapper -public interface DingRobotConvert { - - DingRobotConvert CONVERT = Mappers.getMapper(DingRobotConvert.class); - - DingRobotConfig convert(DingRobotConfigParam in); - - DingRobotConfigDto convert(DingRobotConfig in); - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/dao/DingRobotConfigManager.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/dao/DingRobotConfigManager.java deleted file mode 100644 index be0f01b2..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/dao/DingRobotConfigManager.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.robot.dao; - -import cn.bootx.platform.starter.dingtalk.core.robot.entity.DingRobotConfig; -import cn.bootx.platform.starter.dingtalk.param.robot.DingRobotConfigParam; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 钉钉机器人 - * - * @author xxm - * @since 2020/11/29 - */ -@Repository -@RequiredArgsConstructor -public class DingRobotConfigManager extends BaseManager { - - public Optional findByCode(String code) { - return findByField(DingRobotConfig::getCode, code); - } - - public boolean existsByCode(String code) { - return existedByField(DingRobotConfig::getCode, code); - } - - public boolean existsByCode(String code, Long id) { - return lambdaQuery().eq(DingRobotConfig::getCode, code).ne(MpIdEntity::getId, id).exists(); - } - - public Page page(PageParam pageParam, DingRobotConfigParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, DingRobotConfig.class); - return lambdaQuery().orderByDesc(MpIdEntity::getId) - .like(StrUtil.isNotBlank(param.getCode()), DingRobotConfig::getCode, param.getCode()) - .like(StrUtil.isNotBlank(param.getName()), DingRobotConfig::getName, param.getName()) - .like(StrUtil.isNotBlank(param.getAccessToken()), DingRobotConfig::getAccessToken, param.getAccessToken()) - .page(mpPage); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/dao/DingRobotConfigMapper.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/dao/DingRobotConfigMapper.java deleted file mode 100644 index f1514179..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/dao/DingRobotConfigMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.robot.dao; - -import cn.bootx.platform.starter.dingtalk.core.robot.entity.DingRobotConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 钉钉机器人配置 - * - * @author xxm - * @since 2021/8/5 - */ -@Mapper -public interface DingRobotConfigMapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/entity/DingRobotConfig.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/entity/DingRobotConfig.java deleted file mode 100644 index 2532efee..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/entity/DingRobotConfig.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.robot.entity; - -import cn.bootx.platform.starter.dingtalk.core.robot.convert.DingRobotConvert; -import cn.bootx.platform.starter.dingtalk.param.robot.DingRobotConfigParam; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.starter.dingtalk.dto.robot.DingRobotConfigDto; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 钉钉机器人配置 - * - * @author xxm - * @since 2020/11/29 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("starter_ding_robot_config") -public class DingRobotConfig extends MpBaseEntity implements EntityBaseFunction { - - /** 机器人编号编号 */ - private String code; - - /** 机器人配置名称 */ - private String name; - - /** 钉钉机器人的accessToken */ - private String accessToken; - - /** 是否开启验签 */ - private boolean enableSignatureCheck; - - /** 验签秘钥 */ - private String signSecret; - - /** 备注 */ - private String remark; - - public static DingRobotConfig init(DingRobotConfigParam in) { - return DingRobotConvert.CONVERT.convert(in); - } - - @Override - public DingRobotConfigDto toDto() { - return DingRobotConvert.CONVERT.convert(this); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/service/DingRobotConfigService.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/service/DingRobotConfigService.java deleted file mode 100644 index 72d4781e..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/service/DingRobotConfigService.java +++ /dev/null @@ -1,102 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.robot.service; - -import cn.bootx.platform.starter.dingtalk.param.robot.DingRobotConfigParam; -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.ResultConvertUtil; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.starter.dingtalk.core.robot.dao.DingRobotConfigManager; -import cn.bootx.platform.starter.dingtalk.core.robot.entity.DingRobotConfig; -import cn.bootx.platform.starter.dingtalk.dto.robot.DingRobotConfigDto; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * 钉钉机器人消息发送 - * - * @author xxm - * @since 2020/11/29 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class DingRobotConfigService { - - private final DingRobotConfigManager robotConfigManager; - - /** - * 添加新配置 - */ - @Transactional(rollbackFor = Exception.class) - public DingRobotConfigDto add(DingRobotConfigParam param) { - if (robotConfigManager.existsByCode(param.getCode())) { - throw new BizException("code重复"); - } - - DingRobotConfig dingRobotConfig = DingRobotConfig.init(param); - - return robotConfigManager.save(dingRobotConfig).toDto(); - } - - /** - * 更新钉钉机器人配置 - */ - @Transactional(rollbackFor = Exception.class) - public DingRobotConfigDto update(DingRobotConfigParam param) { - DingRobotConfig dingRobotConfig = robotConfigManager.findById(param.getId()) - .orElseThrow(DataNotExistException::new); - BeanUtil.copyProperties(param, dingRobotConfig, CopyOptions.create().ignoreNullValue()); - return robotConfigManager.updateById(dingRobotConfig).toDto(); - } - - /** - * 获取所有配置 - */ - public List findAll() { - return ResultConvertUtil.dtoListConvert(robotConfigManager.findAll()); - } - - /** - * 获取所有配置 - */ - public PageResult page(PageParam pageParam, DingRobotConfigParam param) { - return MpUtil.convert2DtoPageResult(robotConfigManager.page(pageParam, param)); - } - - /** - * 根据 id 获取相应的配置 - */ - public DingRobotConfigDto findById(Long id) { - return ResultConvertUtil.dtoConvert(robotConfigManager.findById(id)); - } - - /** - * 根据 id 删除相应的机器人配置 - */ - public void delete(Long id) { - robotConfigManager.deleteById(id); - } - - /** - * 编码是否已经存在 - */ - public boolean existsByCode(String code) { - return robotConfigManager.existsByCode(code); - } - - /** - * 编码是否已经存在(不包含自身) - */ - public boolean existsByCode(String code, Long id) { - return robotConfigManager.existsByCode(code, id); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/service/DingRobotSendService.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/service/DingRobotSendService.java deleted file mode 100644 index 3cf12784..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/robot/service/DingRobotSendService.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.robot.service; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import cn.bootx.platform.starter.dingtalk.util.DingTalkUtil; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.bootx.platform.starter.dingtalk.code.DingTalkCode; -import cn.bootx.platform.starter.dingtalk.core.robot.dao.DingRobotConfigManager; -import cn.bootx.platform.starter.dingtalk.core.robot.entity.DingRobotConfig; -import cn.bootx.platform.starter.dingtalk.core.base.result.DingTalkResult; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import static cn.bootx.platform.starter.dingtalk.code.DingTalkCode.SUCCESS_CODE; - -/** - * 钉钉机器人消息发送 - * - * @author xxm - * @since 2020/11/29 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class DingRobotSendService { - - private final DingRobotConfigManager dingRobotConfigManager; - - /** - * 发送钉钉机器人消息 - */ - public void sendNotice(String code, Msg body) { - DingRobotConfig dingRobotConfig = dingRobotConfigManager.findByCode(code) - .orElseThrow(() -> new DataNotExistException("钉钉机器人配置不存在")); - long timestamp = System.currentTimeMillis(); - - Map map = new HashMap<>(3); - map.put(DingTalkCode.ACCESS_TOKEN, dingRobotConfig.getAccessToken()); - String url; - // 验签 - if (dingRobotConfig.isEnableSignatureCheck()) { - url = DingTalkCode.ROBOT_SEND_SIGN_URL; - map.put(DingTalkCode.SIGN, DingTalkUtil.generateSign(timestamp, dingRobotConfig.getSignSecret())); - map.put(DingTalkCode.TIMESTAMP, timestamp); - } - else { - url = DingTalkCode.ROBOT_SEND_NOT_SIGN_URL; - } - - // 请求消息 - String responseBody = HttpUtil.createPost(StrUtil.format(url, map)) - .body(JacksonUtil.toJson(body)) - .execute() - .body(); - DingTalkResult> dingTalkResult = JacksonUtil.toBean(responseBody, DingTalkResult.class); - if (!Objects.equals(SUCCESS_CODE, dingTalkResult.getCode())) { - log.error("钉钉机器人发送消息失败: {}", dingTalkResult.getMsg()); - } - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/user/entity/UserIdResult.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/user/entity/UserIdResult.java deleted file mode 100644 index 82bb8f86..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/user/entity/UserIdResult.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.user.entity; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2022/7/21 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉id消息") -public class UserIdResult { - - @JsonProperty("contact_type") - @Schema(description = "联系类型") - private String contactType; - - @JsonProperty("userid") - @Schema(description = "用户id") - private String userId; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/user/service/DingUserService.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/user/service/DingUserService.java deleted file mode 100644 index 83a40902..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/core/user/service/DingUserService.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.core.user.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.bootx.platform.starter.dingtalk.core.base.result.DingTalkResult; -import cn.bootx.platform.starter.dingtalk.core.base.service.DingAccessService; -import cn.bootx.platform.starter.dingtalk.core.user.entity.UserIdResult; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import com.fasterxml.jackson.core.type.TypeReference; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import static cn.bootx.platform.starter.dingtalk.code.DingTalkCode.*; - -/** - * 钉钉用户信息 - * - * @author xxm - * @since 2022/7/17 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class DingUserService { - - private final DingAccessService dingAccessService; - - /** - * 根据unionid获取用户userid ... - */ - public String getUserIdByUnionId(String unionId) { - String accessToken = dingAccessService.getAccessToken(); - Map map = new HashMap<>(1); - map.put(UNION_ID, unionId); - String responseBody = HttpUtil.createPost(StrUtil.format(USER_GET_URL, accessToken)) - .body(JacksonUtil.toJson(map)) - .execute() - .body(); - DingTalkResult dingTalkResult = JacksonUtil.toBean(responseBody, - new TypeReference>() { - }); - // 未找到用户, 返回空 - if (Objects.equals(dingTalkResult.getCode(), NOT_FUND_STAFF)) { - return null; - } - // 错误 - if (!Objects.equals(dingTalkResult.getCode(), SUCCESS_CODE)) { - throw new BizException(dingTalkResult.getMsg()); - } - return dingTalkResult.getResult().getUserId(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/dto/robot/DingRobotConfigDto.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/dto/robot/DingRobotConfigDto.java deleted file mode 100644 index d9042be1..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/dto/robot/DingRobotConfigDto.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.dto.robot; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.starter.data.perm.sensitive.SensitiveInfo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钉钉机器人配置") -public class DingRobotConfigDto extends BaseDto implements Serializable { - - private static final long serialVersionUID = -5642207413191556792L; - - @Schema(description = "编号") - private String code; - - @Schema(description = "配置名称") - private String name; - - @Schema(description = "钉钉机器人的AccessToken") - @SensitiveInfo - private String accessToken; - - @Schema(description = "是否开启验签") - private boolean enableSignatureCheck; - - @Schema(description = "验签秘钥") - @SensitiveInfo - private String signSecret; - - @Schema(description = "描述") - private String remark; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/ChatNotice.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/ChatNotice.java deleted file mode 100644 index 6d8c0e3a..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/ChatNotice.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 钉钉发送企业群消息参数 - * - * @author xxm - * @since 2022/7/20 - */ -@Data -@Accessors(chain = true) -@AllArgsConstructor -@NoArgsConstructor -@Schema(title = "钉钉发送企业群消息参数") -public class ChatNotice { - - @JsonProperty("chatid") - @Schema(description = "群Id") - private String chatId; - - @Schema(description = "消息内容") - private Msg msg; - - /** - * 输出参数 - */ - public String toParam() { - return JacksonUtil.toJson(this); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/CorpNotice.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/CorpNotice.java deleted file mode 100644 index 7023a4d4..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/CorpNotice.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.hutool.core.lang.Opt; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 钉钉发送工作通知参数 - * - * @author xxm - * @since 2022/7/17 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉发送工作通知参数") -public class CorpNotice { - - @Schema(description = "发送消息时使用的微应用的AgentID") - private Long agentId; - - @Schema(description = "接收者的userid列表,最大用户列表长度100") - private List useridList; - - @Schema(description = "接收者的部门id列表,最大列表长度20") - private List deptIdList; - - @Schema(description = "是否发送给企业全部用户") - private boolean toAllUser; - - @Schema(description = "消息内容") - private Msg msg; - - /** - * 输出参数 - */ - public String toParam() { - Map map = new HashMap<>(5); - String useridList = Opt.ofEmptyAble(this.useridList).map(list -> String.join(",", list)).orElse(null); - String deptIdList = Opt.ofEmptyAble(this.deptIdList).map(list -> String.join(",", list)).orElse(null); - map.put("agent_id", agentId); - map.put("userid_list", useridList); - map.put("dept_id_list", deptIdList); - map.put("to_all_user", toAllUser); - map.put("msg", msg); - return JacksonUtil.toJson(map); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/RecallCorpNotice.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/RecallCorpNotice.java deleted file mode 100644 index 805cbe72..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/RecallCorpNotice.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice; - -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 钉钉撤回工作通知 - * - * @author xxm - * @since 2022/7/20 - */ -@Data -@Accessors(chain = true) -@AllArgsConstructor -@NoArgsConstructor -@Schema(title = "钉钉撤回工作通知") -public class RecallCorpNotice { - - @JsonProperty("agent_id") - @Schema(description = "发送消息时使用的微应用的AgentID") - private Long agentId; - - @JsonProperty("msg_task_id") - @Schema(description = "发送消息时钉钉返回的任务ID") - private Long taskId; - - public String toParam() { - return JacksonUtil.toJson(this); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/UpdateCorpNotice.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/UpdateCorpNotice.java deleted file mode 100644 index d6e03630..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/UpdateCorpNotice.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice; - -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 钉钉 更新工作通知状态栏 - * - * @author xxm - * @since 2022/7/17 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉更新工作通知状态栏") -public class UpdateCorpNotice { - - @JsonProperty("agent_id") - @Schema(description = "发送消息时使用的微应用的AgentID") - private Long agentId; - - @JsonProperty("task_id") - @Schema(description = "发送消息时使用的微应用的AgentID") - private Long taskId; - - @JsonProperty("status_value") - @Schema(description = "状态栏值") - private String statusValue; - - @JsonProperty("status_bg") - @Schema(description = "状态栏背景色,推荐0xFF加六位颜色值") - private String statusBg; - - public String toParam() { - return JacksonUtil.toJson(this); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/ActionCardMsg.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/ActionCardMsg.java deleted file mode 100644 index 20ee7b85..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/ActionCardMsg.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * 钉钉卡片消息 - * - * @author xxm - * @since 2022/7/19 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钉钉卡片消息") -public class ActionCardMsg extends Msg { - - @Schema(description = "消息内容,支持markdown") - @JsonProperty("action_card") - private ActionCard actionCard; - - @Data - @Accessors(chain = true) - @Schema(title = "消息内容,支持markdown") - public static class ActionCard { - - @Schema(description = "透出到会话列表和通知的文案") - private String title; - - @Schema(description = "消息内容") - private String markdown; - - @JsonProperty("single_title") - @Schema(description = "标题") - private String singleTitle; - - @JsonProperty("single_url") - @Schema(description = "消息点击链接地址") - private String singleUrl; - - @JsonProperty("btn_orientation") - @Schema(description = "使用独立跳转ActionCard样式时的按钮排列方式") - private String btnOrientation; - - @JsonProperty("btn_json_list") - @Schema(description = "使用独立跳转ActionCard样式时的按钮列表") - private List btnJsonList; - - @Data - @Accessors(chain = true) - @Schema(title = "使用独立跳转ActionCard样式时的按钮列表") - public static class BtnJson { - - @Schema(description = "按钮的标题") - private String title; - - @JsonProperty("action_url") - @Schema(description = "跳转链接") - private String actionUrl; - - } - - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/At.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/At.java deleted file mode 100644 index 3aef3982..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/At.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import cn.hutool.core.collection.CollUtil; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.List; - -/** - * 钉钉At - * - * @author xxm - * @since 2020/11/29 - */ -@Data -@Accessors(chain = true) -@NoArgsConstructor -@Schema(title = "钉钉@指定用户") -public class At implements Serializable { - - private static final long serialVersionUID = -8677524557109058147L; - - @Schema(description = "@的用户手机号") - private List atMobiles; - - @Schema(description = "@被@人的用户userid") - private List atUserIds; - - @Schema(description = "是否@全体") - private boolean isAtAll = false; - - public At(List atMobiles) { - this.atMobiles = atMobiles; - } - - /** - * 输出@xxx文本 - */ - public String toAtMobiles() { - if (CollUtil.isNotEmpty(atMobiles)) { - return " @" + String.join(" @", atMobiles); - } - return ""; - } - - /** - * 输出@xxx文本 - */ - public String toAtUserIds() { - if (CollUtil.isNotEmpty(atUserIds)) { - return " @" + String.join(" @", atUserIds); - } - return ""; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/DingMedia.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/DingMedia.java deleted file mode 100644 index 28012efd..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/DingMedia.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 钉钉图片 - * - * @author xxm - * @since 2022/7/17 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉媒体") -@NoArgsConstructor -@AllArgsConstructor -public class DingMedia { - - @JsonProperty("media_id") - @Schema(description = "媒体文件id") - private String mediaId; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/FileMsg.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/FileMsg.java deleted file mode 100644 index d948b44d..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/FileMsg.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import cn.bootx.platform.starter.dingtalk.code.DingTalkNoticeCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * 钉钉图片通知 - * - * @author xxm - * @since 2022/7/17 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钉钉文件通知") -public class FileMsg extends Msg implements Serializable { - - private static final long serialVersionUID = -835679566138176L; - - @Schema(description = "钉钉文件") - private DingMedia file; - - public FileMsg() { - super(DingTalkNoticeCode.MSG_FILE); - } - - public FileMsg(String mediaId) { - super(DingTalkNoticeCode.MSG_FILE); - this.file = new DingMedia(mediaId); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/ImageMsg.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/ImageMsg.java deleted file mode 100644 index a1fa6cb8..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/ImageMsg.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import cn.bootx.platform.starter.dingtalk.code.DingTalkNoticeCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * 钉钉图片通知 - * - * @author xxm - * @since 2022/7/17 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钉钉图片通知") -public class ImageMsg extends Msg implements Serializable { - - private static final long serialVersionUID = -835679566138176L; - - @Schema(description = "钉钉图片") - private DingMedia image; - - public ImageMsg() { - super(DingTalkNoticeCode.MSG_IMAGE); - } - - public ImageMsg(String mediaId) { - super(DingTalkNoticeCode.MSG_IMAGE); - this.image = new DingMedia(mediaId); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/LinkMsg.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/LinkMsg.java deleted file mode 100644 index 20b1ab0c..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/LinkMsg.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import cn.bootx.platform.starter.dingtalk.code.DingTalkNoticeCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * 钉钉链接消息 - * - * @author xxm - * @since 2020/11/30 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钉钉链接消息") -public class LinkMsg extends Msg implements Serializable { - - private static final long serialVersionUID = -3094638065840434973L; - - @Schema(description = "钉钉link消息体") - private DingLink link; - - public LinkMsg() { - super(DingTalkNoticeCode.MSG_LINK); - } - - public LinkMsg(String title, String msg, String messageUrl) { - super(DingTalkNoticeCode.MSG_LINK); - link = new DingLink(title, msg, messageUrl); - } - - public LinkMsg(String title, String msg, String messageUrl, String picUrl) { - super(DingTalkNoticeCode.MSG_LINK); - link = new DingLink(title, msg, messageUrl, picUrl); - } - - @Data - @Accessors(chain = true) - @Schema(title = "钉钉link") - @NoArgsConstructor - public static class DingLink implements Serializable { - - private static final long serialVersionUID = 8191181631664337904L; - - @Schema(description = "标题") - private String title; - - @Schema(description = "内容") - private String text; - - @Schema(description = "点击消息跳转的URL") - private String messageUrl; - - @Schema(description = "图片URL") - private String picUrl; - - public DingLink(String title, String text, String messageUrl) { - this.title = title; - this.text = text; - this.messageUrl = messageUrl; - } - - public DingLink(String title, String text, String messageUrl, String picUrl) { - this.title = title; - this.text = text; - this.messageUrl = messageUrl; - this.picUrl = picUrl; - } - - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/MarkdownMsg.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/MarkdownMsg.java deleted file mode 100644 index 40548c1d..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/MarkdownMsg.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import cn.bootx.platform.starter.dingtalk.code.DingTalkNoticeCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.List; - -/** - * 钉钉markdown消息 - * - * @author xxm - * @since 2020/11/30 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钉钉文本消息") -public class MarkdownMsg extends Msg implements Serializable { - - private static final long serialVersionUID = -2724590259000709240L; - - @Schema(description = "markdown消息体") - private DingMarkdown markdown; - - public MarkdownMsg() { - super(DingTalkNoticeCode.MSG_MARKDOWN); - } - - /** - * @param title 标题 - * @param msg 内容 - * @param phones @谁 - */ - public MarkdownMsg(String title, String msg, List phones) { - super(new At(phones), DingTalkNoticeCode.MSG_MARKDOWN); - this.markdown = new DingMarkdown(title, msg); - } - - public MarkdownMsg(String title, String msg) { - super(DingTalkNoticeCode.MSG_MARKDOWN); - this.markdown = new DingMarkdown(title, msg); - } - - @Data - @Accessors(chain = true) - @NoArgsConstructor - @Schema(title = "钉钉markdown格式信息") - public static class DingMarkdown implements Serializable { - - private static final long serialVersionUID = 2353543901449818541L; - - @Schema(description = "标题") - private String title; - - @Schema(description = "内容") - private String text; - - public DingMarkdown(String title, String text) { - this.title = title; - this.text = text; - } - - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/Msg.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/Msg.java deleted file mode 100644 index 656371c4..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/Msg.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import cn.bootx.platform.starter.dingtalk.code.DingTalkNoticeCode; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * 钉钉消息 - * - * @author xxm - * @since 2020/11/30 - */ -@Data -@Accessors(chain = true) -@NoArgsConstructor -@Schema(title = "钉钉消息基础类") -public class Msg implements Serializable { - - private static final long serialVersionUID = -8548175773944126488L; - - /** - * ... - */ - @JsonInclude(JsonInclude.Include.NON_NULL) - @Schema(description = "@谁(机器人消息用)") - private At at; - - /** - * @see DingTalkNoticeCode - */ - @JsonProperty("msgtype") - @Schema(description = "消息类型") - private String msgType; - - public Msg(At at, String msgType) { - this.at = at; - this.msgType = msgType; - } - - public Msg(String msgType) { - this.msgType = msgType; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/OaMsg.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/OaMsg.java deleted file mode 100644 index fbaab913..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/OaMsg.java +++ /dev/null @@ -1,139 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * 钉钉OA消息 - * - * @author xxm - * @since 2022/7/19 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@AllArgsConstructor -@NoArgsConstructor -@Schema(title = "钉钉OA消息") -public class OaMsg extends Msg { - - @Schema(description = "OA消息体") - private Oa oa; - - @Data - @Accessors(chain = true) - @Schema(title = "OA消息体") - public static class Oa { - - @JsonProperty("message_url") - @Schema(description = "消息点击链接地址") - private String messageUrl; - - @JsonProperty("pc_message_url") - @Schema(description = "PC端点击消息时跳转到的地址") - private String pcMessageUrl; - - @Schema(description = "消息头部内容") - private Head head; - - @Schema(description = "消息体") - private Body body; - - @JsonProperty("status_bar") - @Schema(description = "消息状态栏") - private StatusBar statusBar; - - @Data - @Accessors(chain = true) - @Schema(title = "消息头部内容") - public static class Head { - - @JsonProperty("bgcolor") - @Schema(description = "消息头部的背景颜色") - private String bgColor; - - @Schema(description = "消息的头部标题") - private String text; - - } - - @Data - @Accessors(chain = true) - @Schema(title = "消息状态栏") - public static class StatusBar { - - @Schema(description = "状态栏文案") - @JsonProperty("status_value") - private String statusValue; - - @Schema(description = "状态栏背景色") - @JsonProperty("status_bg") - private String statusBg; - - } - - @Data - @Accessors(chain = true) - @Schema(title = "消息体") - public static class Body { - - @Schema(description = "消息体的标题") - private String title; - - @Schema(description = "消息体的表单") - private List form; - - @Schema(description = "单行富文本信息") - private Rich rich; - - @Schema(description = "消息体的内容") - private String content; - - @Schema(description = "消息体中的图片(媒体id)") - private String image; - - @Schema(description = "自定义的附件数目") - @JsonProperty("file_count") - private String fileCount; - - @Schema(description = "自定义的作者名字") - private String author; - - @Data - @Accessors(chain = true) - @Schema(title = "消息体的表单,最多显示6个,超过会被隐藏") - public static class Form { - - @Schema(description = "消息体的关键字") - private String key; - - @Schema(description = "消息体的关键字对应的值") - private String value; - - } - - @Data - @Accessors(chain = true) - @Schema(title = "单行富文本信息") - public static class Rich { - - @Schema(description = "单行富文本信息的数目") - private String num; - - @Schema(description = "单行富文本信息的单位") - private String unit; - - } - - } - - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/TextMsg.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/TextMsg.java deleted file mode 100644 index 72e71d04..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/TextMsg.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import cn.bootx.platform.starter.dingtalk.code.DingTalkNoticeCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * @author xxm - * @since 2020/11/29 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钉钉文本消息") -public class TextMsg extends Msg implements Serializable { - - private static final long serialVersionUID = 8237431306046852539L; - - @Schema(description = "文本消息体") - private DingText text; - - public TextMsg() { - super(DingTalkNoticeCode.MSG_TEXT); - } - - public TextMsg(String msg) { - super(DingTalkNoticeCode.MSG_TEXT); - text = new DingText(msg); - } - - @Data - @Accessors(chain = true) - @NoArgsConstructor - @AllArgsConstructor - @Schema(title = "钉钉文本") - public static class DingText implements Serializable { - - private static final long serialVersionUID = 3582073816491238620L; - - @Schema(description = "文本") - private String content; - - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/VoiceMsg.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/VoiceMsg.java deleted file mode 100644 index d4b95c51..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/notice/msg/VoiceMsg.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.notice.msg; - -import cn.bootx.platform.starter.dingtalk.code.DingTalkNoticeCode; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * 钉钉语音消息 - * - * @author xxm - * @since 2022/7/17 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钉钉语音消息") -public class VoiceMsg extends Msg implements Serializable { - - @Schema(description = "钉钉语音") - private DingVoice voice; - - public VoiceMsg() { - super(DingTalkNoticeCode.MSG_VOICE); - } - - public VoiceMsg(String mediaId, String duration) { - super(DingTalkNoticeCode.MSG_VOICE); - this.voice = new DingVoice(mediaId, duration); - } - - @Data - @Accessors(chain = true) - @Schema(title = "钉钉语音") - @NoArgsConstructor - @AllArgsConstructor - public static class DingVoice { - - @JsonProperty("media_id") - @Schema(description = "媒体文件id") - private String mediaId; - - @JsonProperty("duration") - @Schema(description = "音频时长") - private String duration; - - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/robot/DingRobotConfigParam.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/robot/DingRobotConfigParam.java deleted file mode 100644 index 620604d8..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/param/robot/DingRobotConfigParam.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.param.robot; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * @author xxm - * @since 2021/8/5 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉机器人配置参数") -public class DingRobotConfigParam implements Serializable { - - private static final long serialVersionUID = -3979174622716815670L; - - @Schema(description = "主键") - private Long id; - - @Schema(description = "编号") - private String code; - - @Schema(description = "配置名称") - private String name; - - @Schema(description = "钉钉机器人的accessToken") - private String accessToken; - - @Schema(description = "是否开启验签") - private boolean enableSignatureCheck; - - @Schema(description = "验签秘钥") - private String signSecret; - - @Schema(description = "描述") - private String remark; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/util/DingTalkUtil.java b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/util/DingTalkUtil.java deleted file mode 100644 index ba4494ed..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/java/cn/bootx/platform/starter/dingtalk/util/DingTalkUtil.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.bootx.platform.starter.dingtalk.util; - -import cn.hutool.crypto.digest.HmacAlgorithm; -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Base64; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -/** - * 钉钉工具类 - * - * @author xxm - * @since 2022/4/2 - */ -@Slf4j -@UtilityClass -public class DingTalkUtil { - - /** - * 生成sign - */ - public String generateSign(Long timestamp, String sec) { - String combine = String.format("%d\n%s", timestamp, sec); - try { - Mac mac = Mac.getInstance(HmacAlgorithm.HmacSHA256.getValue()); - mac.init(new SecretKeySpec(sec.getBytes(StandardCharsets.UTF_8), HmacAlgorithm.HmacSHA256.getValue())); - byte[] signData = mac.doFinal(combine.getBytes(StandardCharsets.UTF_8)); - return Base64.encodeBase64String(signData); - } - catch (NoSuchAlgorithmException | InvalidKeyException e) { - log.warn(e.getMessage(), e); - } - return null; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 73283971..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-dingtalk/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.bootx.platform.starter.dingtalk.DingTalkAutoConfiguration diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/pom.xml b/bootx-platform/bootx-common-starters/common-starter-wechat/pom.xml deleted file mode 100644 index f2d39d7e..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - bootx-common-starters - cn.bootx.platform - 1.3.6.2 - - 4.0.0 - - common-starter-wechat - jar - - - - - org.springframework.boot - spring-boot-starter-web - - - - cn.bootx.platform - common-mybatis-plus - - - - com.github.binarywang - weixin-java-mp - ${wxjava.version} - - - commons-io - commons-io - - - guava - com.google.guava - - - com.thoughtworks.xstream - xstream - - - - - - com.github.binarywang - weixin-java-miniapp - ${wxjava.version} - - - commons-io - commons-io - - - guava - com.google.guava - - - com.thoughtworks.xstream - xstream - - - - - - com.thoughtworks.xstream - xstream - 1.4.20 - - - cn.bootx.platform - common-websocket - - - cn.bootx.platform - common-starter-auth - - - diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/WeChatAutoConfiguration.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/WeChatAutoConfiguration.java deleted file mode 100644 index 42089c6f..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/WeChatAutoConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bootx.platform.starter.wechat; - -import org.apache.ibatis.annotations.Mapper; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.ConfigurationPropertiesScan; -import org.springframework.context.annotation.ComponentScan; - -/** - * 微信操作封装 - * - * @author xxm - * @since 2022/7/15 - */ -@ComponentScan -@MapperScan(annotationClass = Mapper.class) -@AutoConfiguration -@ConfigurationPropertiesScan -public class WeChatAutoConfiguration { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/code/WeChatCode.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/code/WeChatCode.java deleted file mode 100644 index edf7660e..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/code/WeChatCode.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.bootx.platform.starter.wechat.code; - -/** - * 微信编码 - * - * @author xxm - * @since 2022/8/5 - */ -public interface WeChatCode { - - /** qrscene_为前缀,后面为二维码的参数值 */ - String EVENT_KEY_QRSCENE = "qrscene_"; - - /* 带参数的扫码事件(qrscene_为前缀)参数前缀, 需要配合 qrscene_ 一起使用 */ - /** 扫码登录 */ - String QRSCENE_LOGIN = "login_"; - - /* 扫码登录状态 */ - /** 已过期 */ - String QR_LOGIN_EXPIRED = "expired"; - - /** 等待中 */ - String QR_LOGIN_WAIT = "wait"; - - /** */ - String QR_LOGIN_OK = "ok"; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatAppletProperties.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatAppletProperties.java deleted file mode 100644 index 1a95ed7d..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatAppletProperties.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bootx.platform.starter.wechat.configuration; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * 微信公众平台配置 - * - * @author xxm - * @since 2022/7/15 - */ -@Getter -@Setter -@ConfigurationProperties("bootx.starter.third.wechat-applet") -public class WeChatAppletProperties { - - /** AppKey */ - private String appId = "?"; - - /** AppSecret */ - private String appSecret = "?"; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatConfiguration.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatConfiguration.java deleted file mode 100644 index d1bce120..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatConfiguration.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.bootx.platform.starter.wechat.configuration; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; -import cn.binarywang.wx.miniapp.config.WxMaConfig; -import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; -import lombok.RequiredArgsConstructor; -import me.chanjar.weixin.mp.api.*; -import me.chanjar.weixin.mp.api.impl.*; -import me.chanjar.weixin.mp.config.WxMpConfigStorage; -import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * 微信配置 - * - * @author xxm - * @since 2022/7/15 - */ -@Configuration -@RequiredArgsConstructor -public class WeChatConfiguration { - - private final WeChatProperties weChatProperties; - - private final WeChatAppletProperties weChatAppletProperties; - - /** - * 微信公众号APIService - */ - @Bean - public WxMpService wxMpService(WxMpConfigStorage wxMpConfigStorage) { - WxMpService wxMpService = new WxMpServiceImpl(); - wxMpService.setWxMpConfigStorage(wxMpConfigStorage); - return wxMpService; - } - - /** - * 微信配置 - */ - @Bean - public WxMpConfigStorage wxMpConfigStorage() { - WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl(); - config.setAppId(weChatProperties.getAppId()); // 设置微信公众号的appid - config.setSecret(weChatProperties.getAppSecret()); // 设置微信公众号的app corpSecret - config.setToken(weChatProperties.getToken()); // 设置微信公众号的Token - config.setAesKey(weChatProperties.getEncodingAesKey()); // 消息加解密密钥 - return config; - } - @Bean - public WxMaService wxMaService(WxMaConfig wxMaConfigStorage) { - WxMaService wxMpService = new WxMaServiceImpl(); - wxMpService.setWxMaConfig(wxMaConfigStorage); - return wxMpService; - } - @Bean - public WxMaConfig wxMaConfigStorage() { - WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); - config.setAppid(weChatAppletProperties.getAppId()); // 设置微信公众号的appid - config.setSecret(weChatAppletProperties.getAppSecret()); // 设置微信公众号的app corpSecret - return config; - } -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatMessageRouterConfiguration.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatMessageRouterConfiguration.java deleted file mode 100644 index 9799789b..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatMessageRouterConfiguration.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bootx.platform.starter.wechat.configuration; - -import cn.bootx.platform.starter.wechat.handler.WeChatMpMessageHandler; -import cn.bootx.platform.starter.wechat.handler.WeChatMsgHandler; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpMessageRouter; -import me.chanjar.weixin.mp.api.WxMpService; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -/** - * 微信信息路由配置 - * - * @author xxm - * @since 2022/7/16 - */ -@Slf4j -@Configuration -@RequiredArgsConstructor -public class WeChatMessageRouterConfiguration { - - private final List weChatMpMessageHandlers; - - private final WeChatMsgHandler weChatMsgHandler; - - @Bean - public WxMpMessageRouter wxMpMessageRouter(WxMpService wxMpService) { - WxMpMessageRouter router = new WxMpMessageRouter(wxMpService); - // 记录日志 - - // 消息路由绑定 - for (WeChatMpMessageHandler weChatMpMessageHandler : weChatMpMessageHandlers) { - router.rule() - .async(false) - .msgType(weChatMpMessageHandler.getMsgType()) - .event(weChatMpMessageHandler.getEvent()) - .handler(weChatMpMessageHandler) - .end(); - } - // 默认的 文本消息处理 - router.rule().async(false).handler(weChatMsgHandler).end(); - return router; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatProperties.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatProperties.java deleted file mode 100644 index b6246580..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatProperties.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.bootx.platform.starter.wechat.configuration; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * 微信公众平台配置 - * - * @author xxm - * @since 2022/7/15 - */ -@Getter -@Setter -@ConfigurationProperties("bootx.starter.third.wechat") -public class WeChatProperties { - - /** AppKey */ - private String appId = "?"; - - /** AppSecret */ - private String appSecret = "?"; - - /** token */ - private String token = "?"; - - /** 消息加解密密钥 */ - private String encodingAesKey = "?"; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatArticleController.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatArticleController.java deleted file mode 100644 index 29749eaa..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatArticleController.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bootx.platform.starter.wechat.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.wechat.core.article.service.WeChatArticleService; -import cn.bootx.platform.starter.wechat.dto.article.WeChatArticleDto; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author xxm - * @since 2022/8/11 - */ -@Tag(name = "微信文章管理") -@RestController -@RequestMapping("/wechat/article") -@RequiredArgsConstructor -public class WeChatArticleController { - - private final WeChatArticleService weChatArticleService; - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam) { - return Res.ok(weChatArticleService.page(pageParam)); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatMediaController.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatMediaController.java deleted file mode 100644 index bfd82f4e..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatMediaController.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bootx.platform.starter.wechat.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.wechat.core.media.service.WeChatMediaService; -import cn.bootx.platform.starter.wechat.dto.media.WeChatMediaDto; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import static me.chanjar.weixin.mp.bean.material.WxMpMaterialNewsBatchGetResult.WxMaterialNewsBatchGetNewsItem; - -/** - * @author xxm - * @since 2022/8/9 - */ -@Tag(name = "微信素材管理") -@RestController -@RequestMapping("/wechat/media") -@RequiredArgsConstructor -public class WeChatMediaController { - - private final WeChatMediaService weChatMediaService; - - @Operation(summary = "非图文素材分页") - @GetMapping("/pageFile") - public ResResult> pageFile(PageParam pageParam, String type) { - return Res.ok(weChatMediaService.pageFile(pageParam, type)); - } - - @Operation(summary = "图文素材分页") - @GetMapping("/pageNews") - public ResResult> pageNews(PageParam pageParam) { - return Res.ok(weChatMediaService.pageNews(pageParam)); - } - - @Operation(summary = "删除素材") - @DeleteMapping("/deleteFile") - public ResResult deleteFile(String mediaId) { - weChatMediaService.deleteFile(mediaId); - return Res.ok(); - } - - @Operation(summary = "上传素材") - @PostMapping("/uploadFile") - public ResResult uploadFile(String mediaType, MultipartFile file) { - weChatMediaService.uploadFile(mediaType, file); - return Res.ok(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatMenuController.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatMenuController.java deleted file mode 100644 index 1c556776..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatMenuController.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.bootx.platform.starter.wechat.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.wechat.core.menu.service.WeChatMenuService; -import cn.bootx.platform.starter.wechat.dto.menu.WeChatMenuDto; -import cn.bootx.platform.starter.wechat.param.menu.WeChatMenuParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 微信菜单管理 - * - * @author xxm - * @since 2022/8/6 - */ -@Tag(name = "微信菜单管理") -@RestController -@RequestMapping("/wechat/menu") -@RequiredArgsConstructor -public class WeChatMenuController { - - private final WeChatMenuService weChatMenuService; - - @Operation(summary = "添加") - @PostMapping(value = "/add") - public ResResult add(@RequestBody WeChatMenuParam param) { - weChatMenuService.add(param); - return Res.ok(); - } - - @Operation(summary = "修改") - @PostMapping(value = "/update") - public ResResult update(@RequestBody WeChatMenuParam param) { - weChatMenuService.update(param); - return Res.ok(); - } - - @Operation(summary = "删除") - @DeleteMapping(value = "/delete") - public ResResult delete(Long id) { - weChatMenuService.delete(id); - return Res.ok(); - } - - @Operation(summary = "通过ID查询") - @GetMapping(value = "/findById") - public ResResult findById(Long id) { - return Res.ok(weChatMenuService.findById(id)); - } - - @Operation(summary = "查询所有") - @GetMapping(value = "/findAll") - public ResResult> findAll() { - return Res.ok(weChatMenuService.findAll()); - } - - @Operation(summary = "分页查询") - @GetMapping(value = "/page") - public ResResult> page(PageParam pageParam, WeChatMenuParam weChatMenuParam) { - return Res.ok(weChatMenuService.page(pageParam, weChatMenuParam)); - } - - @Operation(summary = "发布菜单") - @PostMapping("/publish") - public ResResult publish(Long id) { - weChatMenuService.publish(id); - return Res.ok(); - } - - @Operation(summary = "导入微信自定义菜单到系统中") - @PostMapping("/importMenu") - public ResResult importMenu() { - weChatMenuService.importMenu(); - return Res.ok(); - } - - @Operation(summary = "清空微信自定义菜单") - @PostMapping("/clearMenu") - public ResResult clearMenu() { - weChatMenuService.clearMenu(); - return Res.ok(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatPortalController.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatPortalController.java deleted file mode 100644 index 5028b4a0..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatPortalController.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bootx.platform.starter.wechat.controller; - -import cn.bootx.platform.common.core.annotation.IgnoreAuth; -import cn.bootx.platform.starter.wechat.core.portal.service.WeChatPortalService; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; - -/** - * 微信工作台接入入口 - * - * @author xxm - * @since 2022/7/16 - */ -@IgnoreAuth -@Slf4j -@Tag(name = "微信接入入口") -@RestController -@RequestMapping("/wechat/portal") -@RequiredArgsConstructor -public class WeChatPortalController { - - private final WeChatPortalService weChatPortalService; - - /** - * 微信接入校验处理 - * @param signature 微信签名 - * @param timestamp 时间戳 - * @param nonce 随机数 - * @param echostr 随机字符串 - */ - @GetMapping(produces = "text/plain;charset=utf-8") - public String auth(String signature, String timestamp, String nonce, String echostr) { - return weChatPortalService.auth(signature, timestamp, nonce, echostr); - } - - /** - * 微信消息处理 - * @param requestBody 请求报文体 - * @param signature 微信签名 - * @param encType 加签方式 - * @param msgSignature 微信签名 - * @param timestamp 时间戳 - * @param nonce 随机数 - */ - @PostMapping(produces = "application/xml; charset=UTF-8") - public String post(@RequestBody String requestBody, String signature, String timestamp, String nonce, String openid, - @RequestParam(name = "encrypt_type", required = false) String encType, - @RequestParam(name = "msg_signature", required = false) String msgSignature) { - return weChatPortalService.handleMessage(requestBody, signature, timestamp, nonce, openid, encType, - msgSignature); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatQrLoginController.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatQrLoginController.java deleted file mode 100644 index 825f5630..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatQrLoginController.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bootx.platform.starter.wechat.controller; - -import cn.bootx.platform.common.core.annotation.IgnoreAuth; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.starter.wechat.core.login.service.WeChatQrLoginService; -import cn.bootx.platform.starter.wechat.dto.login.WeChatLoginQrCode; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 微信 - * - * @author xxm - * @since 2022/8/4 - */ -@IgnoreAuth -@Tag(name = "微信扫码登录") -@RestController -@RequestMapping("/token/wechat/qr") -@RequiredArgsConstructor -public class WeChatQrLoginController { - - private final WeChatQrLoginService weChatQrLoginService; - - @Operation(summary = "申请登录用QR码") - @PostMapping("/applyQrCode") - public ResResult applyQrCode() { - return Res.ok(weChatQrLoginService.applyQrCode()); - } - - @Operation(summary = "获取扫码状态") - @GetMapping("/getStatus") - public ResResult getStatus(String qrCodeKey) { - return Res.ok(weChatQrLoginService.getStatus(qrCodeKey)); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatTemplateController.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatTemplateController.java deleted file mode 100644 index d618de59..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatTemplateController.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.bootx.platform.starter.wechat.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.bootx.platform.starter.wechat.core.notice.service.WeChatTemplateService; -import cn.bootx.platform.starter.wechat.dto.notice.WeChatTemplateDto; -import cn.bootx.platform.starter.wechat.param.notice.WeChatTemplateParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - * @author xxm - * @since 2022/7/16 - */ -@Tag(name = "微信模板消息") -@RestController -@RequestMapping("/wechat/template") -@RequiredArgsConstructor -public class WeChatTemplateController { - - private final WeChatTemplateService weChatTemplateService; - - @Operation(summary = "修改") - @PostMapping(value = "/update") - public ResResult update(@RequestBody WeChatTemplateParam param) { - weChatTemplateService.update(param); - return Res.ok(); - } - - @Operation(summary = "通过ID查询") - @GetMapping(value = "/findById") - public ResResult findById(Long id) { - return Res.ok(weChatTemplateService.findById(id)); - } - - @Operation(summary = "分页查询") - @GetMapping(value = "/page") - public ResResult> page(PageParam pageParam, WeChatTemplateParam weChatTemplateParam) { - return Res.ok(weChatTemplateService.page(pageParam, weChatTemplateParam)); - } - - @Operation(summary = "编码是否被使用(不包含自己)") - @GetMapping("/existsByCodeNotId") - public ResResult existsByCode(String code, Long id) { - return Res.ok(weChatTemplateService.existsByCode(code, id)); - } - - @Operation(summary = "同步消息模板数据") - @PostMapping("/sync") - public ResResult sync() { - // 为了获取用户生效, 测试用 - SecurityUtil.getUserId(); - weChatTemplateService.sync(); - return Res.ok(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/article/service/WeChatArticleService.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/article/service/WeChatArticleService.java deleted file mode 100644 index ade2a2b1..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/article/service/WeChatArticleService.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.article.service; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.wechat.dto.article.WeChatArticleDto; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import me.chanjar.weixin.mp.api.WxMpService; -import org.springframework.stereotype.Service; - -import java.util.stream.Collectors; - -/** - * @author xxm - * @since 2022/8/11 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatArticleService { - - private final WxMpService wxMpService; - - /** - * 查询图文 - * @return - */ - @SneakyThrows - public PageResult page(PageParam pageParam) { - val freePublishService = wxMpService.getFreePublishService(); - val result = freePublishService.getPublicationRecords(pageParam.start(), pageParam.getSize()); - val items = result.getItems().stream().map(WeChatArticleDto::init).collect(Collectors.toList()); - PageResult pageResult = new PageResult<>(); - pageResult.setCurrent(pageParam.getCurrent()) - .setRecords(items) - .setSize(pageParam.getSize()) - .setTotal(result.getTotalCount()); - return pageResult; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/login/service/WeChatQrLoginService.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/login/service/WeChatQrLoginService.java deleted file mode 100644 index 19af0f27..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/login/service/WeChatQrLoginService.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.login.service; - -import cn.bootx.platform.starter.auth.exception.LoginFailureException; -import cn.bootx.platform.common.redis.RedisClient; -import cn.bootx.platform.starter.wechat.dto.login.WeChatLoginQrCode; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpQrcodeService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; -import org.springframework.stereotype.Service; - -import java.util.Objects; - -import static cn.bootx.platform.starter.wechat.code.WeChatCode.*; - -/** - * 扫码事件 - * - * @author xxm - * @since 2022/8/4 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatQrLoginService { - - private final RedisClient redisClient; - - private final WxMpService wxMpService; - - private final String PREFIX_KEY = "third:wechat:login:qr:"; - - /** - * 申请待扫描的二维码 - */ - @SneakyThrows - public WeChatLoginQrCode applyQrCode() { - WxMpQrcodeService qrcodeService = wxMpService.getQrcodeService(); - long timeout = 5 * 60 * 1000; - String qrCodeKey = IdUtil.getSnowflakeNextIdStr(); - // 创建微信临时Key, 需要有指定的前缀 - String wxKey = QRSCENE_LOGIN + qrCodeKey; - WxMpQrCodeTicket wxMpQrCodeTicket = qrcodeService.qrCodeCreateTmpTicket(wxKey, (int) timeout); - String url = wxMpQrCodeTicket.getUrl(); - redisClient.setWithTimeout(PREFIX_KEY + qrCodeKey, "", timeout); - return new WeChatLoginQrCode(qrCodeKey, url); - } - - /** - * 查询二维码状态 等待扫码/登录成功/过期 - */ - public String getStatus(String key) { - String openId = redisClient.get(PREFIX_KEY + key); - // 超时 - if (Objects.isNull(openId)) { - return QR_LOGIN_EXPIRED; - } - // 等待 - else if (StrUtil.isBlank(openId)) { - return QR_LOGIN_WAIT; - } - // 登录成功 - else { - return QR_LOGIN_OK; - } - } - - /** - * 设置微信openId - */ - public void setOpenId(String key, String openId) { - if (redisClient.exists(PREFIX_KEY + key)) { - redisClient.set(PREFIX_KEY + key, openId); - } - } - - /** - * 获取 openId - */ - public String getOpenId(String key) { - String openId = redisClient.get(PREFIX_KEY + key); - if (StrUtil.isBlank(openId)) { - throw new LoginFailureException("数据已过期或不存在"); - } - return openId; - } - - /** - * 清除扫码信息 - */ - public void clear(String key) { - redisClient.deleteKey(PREFIX_KEY + key); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/media/service/WeChatMediaService.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/media/service/WeChatMediaService.java deleted file mode 100644 index bfbb2095..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/media/service/WeChatMediaService.java +++ /dev/null @@ -1,103 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.media.service; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.FileUtil; -import cn.bootx.platform.starter.wechat.dto.media.WeChatMediaDto; -import cn.hutool.core.io.FileTypeUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.io.file.FileNameUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.api.WxMpMaterialService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.material.WxMpMaterial; -import me.chanjar.weixin.mp.bean.material.WxMpMaterialNewsBatchGetResult.WxMaterialNewsBatchGetNewsItem; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 素材管理 - * - * @author xxm - * @since 2022/8/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatMediaService { - - private final WxMpService wxMpService; - - /** - * 分页查询 - */ - @SneakyThrows - public PageResult pageFile(PageParam pageParam, String type) { - WxMpMaterialService materialService = wxMpService.getMaterialService(); - val result = materialService.materialFileBatchGet(type, pageParam.start(), pageParam.getSize()); - // val result = new WxMpMaterialFileBatchGetResult(); - val items = result.getItems().stream().map(WeChatMediaDto::init).collect(Collectors.toList()); - PageResult pageResult = new PageResult<>(); - pageResult.setCurrent(pageParam.getCurrent()) - .setRecords(items) - .setSize(pageParam.getSize()) - .setTotal(result.getTotalCount()); - return pageResult; - } - - /** - * 分页查询(图文) - */ - @SneakyThrows - public PageResult pageNews(PageParam pageParam) { - WxMpMaterialService materialService = wxMpService.getMaterialService(); - val result = materialService.materialNewsBatchGet(pageParam.start(), pageParam.getSize()); - val items = result.getItems(); - PageResult pageResult = new PageResult<>(); - pageResult.setCurrent(pageParam.getCurrent()) - .setRecords(items) - .setSize(pageParam.getSize()) - .setTotal(result.getTotalCount()); - return pageResult; - } - - /** - * 删除素材 - */ - @SneakyThrows - public void deleteFile(String mediaId) { - WxMpMaterialService materialService = wxMpService.getMaterialService(); - materialService.materialDelete(mediaId); - } - - /** - * 上传 非图文素材 - * @see WxConsts.MediaFileType - */ - @SneakyThrows - public void uploadFile(String mediaType, MultipartFile multipartFile) { - WxMpMaterialService materialService = wxMpService.getMaterialService(); - byte[] bytes = IoUtil.readBytes(multipartFile.getInputStream()); - String originalFilename = multipartFile.getOriginalFilename(); - String fileName = FileNameUtil.mainName(originalFilename); - String fileType = FileTypeUtil.getType(new ByteArrayInputStream(bytes), originalFilename); - File tempFile = FileUtil.createTempFile(new ByteArrayInputStream(bytes), fileName, fileType); - WxMpMaterial material = new WxMpMaterial(); - material.setFile(tempFile); - if (Objects.equals(mediaType, WxConsts.MediaFileType.VIDEO)) { - material.setVideoTitle(fileName); - material.setVideoIntroduction(fileName); - } - materialService.materialFileUpload(mediaType, material); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/convert/WeChatMenuConvert.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/convert/WeChatMenuConvert.java deleted file mode 100644 index 0b27d719..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/convert/WeChatMenuConvert.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.menu.convert; - -import cn.bootx.platform.starter.wechat.param.menu.WeChatMenuParam; -import cn.bootx.platform.starter.wechat.core.menu.domin.WeChatMenuInfo; -import cn.bootx.platform.starter.wechat.core.menu.entity.WeChatMenu; -import cn.bootx.platform.starter.wechat.dto.menu.WeChatMenuDto; -import me.chanjar.weixin.common.bean.menu.WxMenu; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 微信自定义菜单 - * - * @author xxm - * @since 2022-08-08 - */ -@Mapper -public interface WeChatMenuConvert { - - WeChatMenuConvert CONVERT = Mappers.getMapper(WeChatMenuConvert.class); - - WeChatMenu convert(WeChatMenuParam in); - - WeChatMenuDto convert(WeChatMenu in); - - WeChatMenuInfo convert(WxMenu in); - - WxMenu convert(WeChatMenuInfo in); - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/dao/WeChatMenuManager.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/dao/WeChatMenuManager.java deleted file mode 100644 index d60b693f..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/dao/WeChatMenuManager.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.menu.dao; - -import cn.bootx.platform.starter.wechat.core.menu.entity.WeChatMenu; -import cn.bootx.platform.starter.wechat.param.menu.WeChatMenuParam; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -/** - * 微信自定义菜单 - * - * @author xxm - * @since 2022-08-08 - */ -@Repository -@RequiredArgsConstructor -public class WeChatMenuManager extends BaseManager { - - /** - * 分页 - */ - public Page page(PageParam pageParam, WeChatMenuParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, WeChatMenu.class); - return lambdaQuery().select(this.getEntityClass(), MpUtil::excludeBigField) - .like(StrUtil.isNotBlank(param.getName()), WeChatMenu::getName, param.getName()) - .orderByDesc(MpIdEntity::getId) - .page(mpPage); - } - - /** - * 清除其他发布状态 - */ - public void clearPublish() { - lambdaUpdate().eq(WeChatMenu::isPublish, true).set(WeChatMenu::isPublish, false).update(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/dao/WeChatMenuMapper.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/dao/WeChatMenuMapper.java deleted file mode 100644 index 6934ab0e..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/dao/WeChatMenuMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.menu.dao; - -import cn.bootx.platform.starter.wechat.core.menu.entity.WeChatMenu; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 微信自定义菜单 - * - * @author xxm - * @since 2022-08-08 - */ -@Mapper -public interface WeChatMenuMapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/domin/WeChatMenuInfo.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/domin/WeChatMenuInfo.java deleted file mode 100644 index aeb482c9..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/domin/WeChatMenuInfo.java +++ /dev/null @@ -1,164 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.menu.domin; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; -import me.chanjar.weixin.common.bean.menu.WxMenu; -import me.chanjar.weixin.common.bean.menu.WxMenuButton; -import me.chanjar.weixin.mp.bean.menu.WxMpMenu; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 微信自定义菜单 - * - * @author xxm - * @since 2022/8/8 - */ -@Data -@Accessors(chain = true) -@Schema(title = "微信自定义菜单") -public class WeChatMenuInfo { - - private List buttons = new ArrayList<>(); - - @Data - @Accessors(chain = true) - @Schema(title = "菜单按钮") - public static class Button { - - /** - * - * 菜单的响应动作类型. - * view表示网页类型, - * click表示点击类型, - * miniprogram表示小程序类型 - * - */ - private String type; - - /** - * 菜单标题,不超过16个字节,子菜单不超过60个字节. - */ - private String name; - - /** - * - * 菜单KEY值,用于消息接口推送,不超过128字节. - * click等点击类型必须 - * - */ - private String key; - - /** - * - * 网页链接. - * 用户点击菜单可打开链接,不超过1024字节。type为miniprogram时,不支持小程序的老版本客户端将打开本url。 - * view、miniprogram类型必须 - * - */ - private String url; - - /** - * - * 调用新增永久素材接口返回的合法media_id. - * media_id类型和view_limited类型必须 - * - */ - private String mediaId; - - /** - * - * 调用发布图文接口获得的article_id. - * article_id类型和article_view_limited类型必须 - * - */ - private String articleId; - - /** - * - * 小程序的appid. - * miniprogram类型必须 - * - */ - private String appId; - - /** - * - * 小程序的页面路径. - * miniprogram类型必须 - * - */ - private String pagePath; - - private List subButtons = new ArrayList<>(); - - } - - /** - * 转换成wxJava的对象 - */ - public WxMenu toWxMenu() { - WxMenu wxMenu = new WxMenu(); - List collect = this.getButtons().stream().map(this::toWxButton).collect(Collectors.toList()); - wxMenu.setButtons(collect); - return wxMenu; - } - - private WxMenuButton toWxButton(Button button) { - List subButtons = button.getSubButtons() - .stream() - .map(this::toWxButton) - .collect(Collectors.toList()); - WxMenuButton wxMenuButton = new WxMenuButton(); - wxMenuButton.setType(button.getType()); - wxMenuButton.setName(button.getName()); - wxMenuButton.setKey(button.getKey()); - wxMenuButton.setUrl(button.getUrl()); - wxMenuButton.setMediaId(button.getMediaId()); - wxMenuButton.setArticleId(button.getArticleId()); - wxMenuButton.setAppId(button.getAppId()); - wxMenuButton.setPagePath(button.getPagePath()); - wxMenuButton.setSubButtons(subButtons); - return wxMenuButton; - } - - /** - * 从WxJava对象转成 - */ - public static WeChatMenuInfo init(WxMpMenu wxMpMenu) { - WeChatMenuInfo weChatMenuInfo = new WeChatMenuInfo(); - List buttons = wxMpMenu.getMenu() - .getButtons() - .stream() - .map(WeChatMenuInfo::initButton) - .collect(Collectors.toList()); - - weChatMenuInfo.setButtons(buttons); - return weChatMenuInfo; - } - - /** - * 菜单按钮转换 - */ - private static Button initButton(WxMenuButton wxMenuButton) { - List subButtons = wxMenuButton.getSubButtons() - .stream() - .map(WeChatMenuInfo::initButton) - .collect(Collectors.toList()); - Button button = new Button(); - button.setType(wxMenuButton.getType()); - button.setName(wxMenuButton.getName()); - button.setKey(wxMenuButton.getKey()); - button.setUrl(wxMenuButton.getUrl()); - button.setMediaId(wxMenuButton.getMediaId()); - button.setArticleId(wxMenuButton.getArticleId()); - button.setAppId(wxMenuButton.getAppId()); - button.setPagePath(wxMenuButton.getPagePath()); - button.setSubButtons(subButtons); - return button; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/entity/WeChatMenu.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/entity/WeChatMenu.java deleted file mode 100644 index b983003c..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/entity/WeChatMenu.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.menu.entity; - -import cn.bootx.platform.starter.wechat.core.menu.convert.WeChatMenuConvert; -import cn.bootx.platform.starter.wechat.param.menu.WeChatMenuParam; -import cn.bootx.platform.common.core.annotation.BigField; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.starter.wechat.core.menu.domin.WeChatMenuInfo; -import cn.bootx.platform.starter.wechat.dto.menu.WeChatMenuDto; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 微信自定义菜单 - * - * @author xxm - * @since 2022-08-08 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName(value = "starter_wx_menu", autoResultMap = true) -public class WeChatMenu extends MpBaseEntity implements EntityBaseFunction { - - /** 名称 */ - private String name; - - /** 菜单信息 */ - @BigField - @TableField(typeHandler = JacksonTypeHandler.class) - private WeChatMenuInfo menuInfo; - - /** 是否发布 */ - private boolean publish; - - /** 备注 */ - private String remark; - - /** 创建对象 */ - public static WeChatMenu init(WeChatMenuParam in) { - return WeChatMenuConvert.CONVERT.convert(in); - } - - /** 转换成dto */ - @Override - public WeChatMenuDto toDto() { - return WeChatMenuConvert.CONVERT.convert(this); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/service/WeChatMenuService.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/service/WeChatMenuService.java deleted file mode 100644 index b1b5ace7..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/menu/service/WeChatMenuService.java +++ /dev/null @@ -1,130 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.menu.service; - -import cn.bootx.platform.starter.wechat.param.menu.WeChatMenuParam; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.ResultConvertUtil; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.starter.wechat.core.menu.dao.WeChatMenuManager; -import cn.bootx.platform.starter.wechat.core.menu.domin.WeChatMenuInfo; -import cn.bootx.platform.starter.wechat.core.menu.entity.WeChatMenu; -import cn.bootx.platform.starter.wechat.dto.menu.WeChatMenuDto; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.date.DateUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.bean.menu.WxMenu; -import me.chanjar.weixin.mp.api.WxMpMenuService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.menu.WxMpMenu; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * 微信菜单 - * - * @author xxm - * @since 2022/8/6 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatMenuService { - - private final WxMpService wxMpService; - - private final WeChatMenuManager weChatMenuManager; - - /** - * 添加 - */ - public void add(WeChatMenuParam param) { - WeChatMenu weChatMenu = WeChatMenu.init(param); - weChatMenuManager.save(weChatMenu); - } - - /** - * 修改 - */ - public void update(WeChatMenuParam param) { - WeChatMenu weChatMenu = weChatMenuManager.findById(param.getId()).orElseThrow(DataNotExistException::new); - - BeanUtil.copyProperties(param, weChatMenu, CopyOptions.create().ignoreNullValue()); - weChatMenuManager.updateById(weChatMenu); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, WeChatMenuParam weChatMenuParam) { - return MpUtil.convert2DtoPageResult(weChatMenuManager.page(pageParam, weChatMenuParam)); - } - - /** - * 获取单条 - */ - public WeChatMenuDto findById(Long id) { - return weChatMenuManager.findById(id).map(WeChatMenu::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 获取全部 - */ - public List findAll() { - return ResultConvertUtil.dtoListConvert(weChatMenuManager.findAll()); - } - - /** - * 删除 - */ - public void delete(Long id) { - weChatMenuManager.deleteById(id); - } - - /** - * 发布菜单 - */ - @SneakyThrows - @Transactional(rollbackFor = Exception.class) - public void publish(Long id) { - WeChatMenu weChatMenu = weChatMenuManager.findById(id).orElseThrow(() -> new DataNotExistException("菜单信息不存在")); - WxMenu wxMenu = weChatMenu.getMenuInfo().toWxMenu(); - WxMpMenuService menuService = wxMpService.getMenuService(); - menuService.menuCreate(wxMenu); - weChatMenu.setPublish(true); - weChatMenuManager.clearPublish(); - weChatMenuManager.updateById(weChatMenu); - } - - /** - * 导入当前微信菜单 - */ - @Transactional(rollbackFor = Exception.class) - @SneakyThrows - public void importMenu() { - WxMpMenuService menuService = wxMpService.getMenuService(); - WxMpMenu wxMpMenu = menuService.menuGet(); - WeChatMenuInfo weChatMenuInfo = WeChatMenuInfo.init(wxMpMenu); - WeChatMenu weChatMenu = new WeChatMenu().setName("微信自定义菜单") - .setRemark("导入时间" + DateUtil.now()) - .setPublish(true) - .setMenuInfo(weChatMenuInfo); - weChatMenuManager.clearPublish(); - weChatMenuManager.save(weChatMenu); - } - - /** - * 清空菜单 - */ - @SneakyThrows - public void clearMenu() { - WxMpMenuService menuService = wxMpService.getMenuService(); - menuService.menuDelete(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/convert/WeChatTemplateConvert.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/convert/WeChatTemplateConvert.java deleted file mode 100644 index 1b2ab3a1..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/convert/WeChatTemplateConvert.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.notice.convert; - -import cn.bootx.platform.starter.wechat.param.notice.WeChatTemplateParam; -import cn.bootx.platform.starter.wechat.core.notice.entity.WeChatTemplate; -import cn.bootx.platform.starter.wechat.dto.notice.WeChatTemplateDto; -import me.chanjar.weixin.mp.bean.template.WxMpTemplate; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.factory.Mappers; - -/** - * @author xxm - * @since 2022/7/17 - */ -@Mapper -public interface WeChatTemplateConvert { - - WeChatTemplateConvert CONVERT = Mappers.getMapper(WeChatTemplateConvert.class); - - @Mapping(source = "title", target = "name") - WeChatTemplate convert(WxMpTemplate in); - - WeChatTemplate convert(WeChatTemplateParam in); - - WeChatTemplateDto convert(WeChatTemplate in); - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/dao/WeChatTemplateManager.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/dao/WeChatTemplateManager.java deleted file mode 100644 index 888a9b30..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/dao/WeChatTemplateManager.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.notice.dao; - -import cn.bootx.platform.starter.wechat.core.notice.entity.WeChatTemplate; -import cn.bootx.platform.starter.wechat.param.notice.WeChatTemplateParam; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * @author xxm - * @since 2022/7/17 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class WeChatTemplateManager extends BaseManager { - - public Page page(PageParam pageParam, WeChatTemplateParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, WeChatTemplate.class); - return this.lambdaQuery() - .select(WeChatTemplate.class, MpUtil::excludeBigField) - .like(StrUtil.isNotBlank(param.getTemplateId()), WeChatTemplate::getTemplateId, param.getTemplateId()) - .like(StrUtil.isNotBlank(param.getName()), WeChatTemplate::getName, param.getName()) - .like(StrUtil.isNotBlank(param.getCode()), WeChatTemplate::getCode, param.getCode()) - .orderByDesc(MpIdEntity::getId) - .page(mpPage); - } - - public boolean existsByCode(String code, Long id) { - return existedByField(WeChatTemplate::getCode, code, id); - } - - /** - * 根据code查询 - */ - public Optional findByCode(String code) { - return this.findByField(WeChatTemplate::getCode, code); - } - - /** - * 根据code查询 - */ - public Optional findTemplateIdByCode(String code) { - return lambdaQuery().select(WeChatTemplate::getTemplateId).eq(WeChatTemplate::getCode, code).oneOpt(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/dao/WeChatTemplateMapper.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/dao/WeChatTemplateMapper.java deleted file mode 100644 index 6cafda22..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/dao/WeChatTemplateMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.notice.dao; - -import cn.bootx.platform.starter.wechat.core.notice.entity.WeChatTemplate; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2022/7/17 - */ -@Mapper -public interface WeChatTemplateMapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/entity/WeChatTemplate.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/entity/WeChatTemplate.java deleted file mode 100644 index 54b835f8..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/entity/WeChatTemplate.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.notice.entity; - -import cn.bootx.platform.starter.wechat.core.notice.convert.WeChatTemplateConvert; -import cn.bootx.platform.starter.wechat.param.notice.WeChatTemplateParam; -import cn.bootx.platform.common.core.annotation.BigField; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpDelEntity; -import com.baomidou.mybatisplus.annotation.TableName; -import cn.bootx.platform.starter.wechat.dto.notice.WeChatTemplateDto; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import lombok.experimental.FieldNameConstants; -import me.chanjar.weixin.mp.bean.template.WxMpTemplate; - -/** - * 微信消息模板 - * - * @author xxm - * @since 2022-08-03 - */ -@FieldNameConstants -@EqualsAndHashCode(callSuper = true) -@Data -@TableName("starter_wx_template") -@Accessors(chain = true) -public class WeChatTemplate extends MpDelEntity implements EntityBaseFunction { - - /** 名称 */ - private String name; - - /** 编码 */ - private String code; - - /** 是否启用 */ - private Boolean enable; - - /** 模板ID */ - private String templateId; - - /** 模板标题 */ - private String title; - - /** 模板所属行业的一级行业 */ - private String primaryIndustry; - - /** 模板所属行业的二级行业 */ - private String deputyIndustry; - - /** 模板内容 */ - @BigField - private String content; - - /** 示例 */ - @BigField - private String example; - - /** 创建对象 */ - public static WeChatTemplate init(WeChatTemplateParam in) { - return WeChatTemplateConvert.CONVERT.convert(in); - } - - public static WeChatTemplate init(WxMpTemplate wxMpTemplate) { - WeChatTemplate template = WeChatTemplateConvert.CONVERT.convert(wxMpTemplate); - template.setEnable(true); - return template; - } - - /** 转换成dto */ - @Override - public WeChatTemplateDto toDto() { - return WeChatTemplateConvert.CONVERT.convert(this); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/service/WeChatTemplateService.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/service/WeChatTemplateService.java deleted file mode 100644 index b91c7507..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/service/WeChatTemplateService.java +++ /dev/null @@ -1,125 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.notice.service; - -import cn.bootx.platform.common.websocket.entity.WsRes; -import cn.bootx.platform.common.websocket.service.UserWsNoticeService; -import cn.bootx.platform.starter.wechat.param.notice.WeChatTemplateParam; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.ResultConvertUtil; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.bootx.platform.starter.wechat.core.notice.dao.WeChatTemplateManager; -import cn.bootx.platform.starter.wechat.core.notice.entity.WeChatTemplate; -import cn.bootx.platform.starter.wechat.dto.notice.WeChatTemplateDto; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.api.WxMpTemplateMsgService; -import me.chanjar.weixin.mp.bean.template.WxMpTemplate; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 微信消息模板 - * - * @author xxm - * @since 2022/7/15 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatTemplateService { - - private final WxMpService wxMpService; - - private final WeChatTemplateManager weChatTemplateManager; - - private final UserWsNoticeService userWsNoticeService; - - /** - * 修改 - */ - public void update(WeChatTemplateParam param) { - WeChatTemplate weChatTemplate = weChatTemplateManager.findById(param.getId()) - .orElseThrow(DataNotExistException::new); - BeanUtil.copyProperties(param, weChatTemplate, CopyOptions.create().ignoreNullValue()); - weChatTemplateManager.updateById(weChatTemplate); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, WeChatTemplateParam weChatTemplateParam) { - return MpUtil.convert2DtoPageResult(weChatTemplateManager.page(pageParam, weChatTemplateParam)); - } - - /** - * 获取单条 - */ - public WeChatTemplateDto findById(Long id) { - return weChatTemplateManager.findById(id).map(WeChatTemplate::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 获取全部 - */ - public List findAll() { - return ResultConvertUtil.dtoListConvert(weChatTemplateManager.findAll()); - } - - /** - * 编码是否已经存在(不包含自身) - */ - public boolean existsByCode(String code, Long id) { - return weChatTemplateManager.existsByCode(code, id); - } - - /** - * 同步 - */ - @SneakyThrows - @Async("asyncExecutor") - @Transactional(rollbackFor = Exception.class) - public void sync() { - WxMpTemplateMsgService templateMsgService = wxMpService.getTemplateMsgService(); - // 微信公众号订阅模板 - List wxTemplates = templateMsgService.getAllPrivateTemplate() - .stream() - .filter(o -> StrUtil.isNotBlank(o.getPrimaryIndustry())) - .collect(Collectors.toList()); - List wxTemplateIds = wxTemplates.stream().map(WxMpTemplate::getTemplateId).collect(Collectors.toList()); - - // 系统中模板 - List weChatTemplates = weChatTemplateManager.findAll(); - List weChatTemplatesIds = weChatTemplates.stream() - .map(WeChatTemplate::getTemplateId) - .collect(Collectors.toList()); - - // 删除 本地有有,服务端没有 - List deleteIds = weChatTemplates.stream() - .filter(o -> !wxTemplateIds.contains(o.getTemplateId())) - .map(MpIdEntity::getId) - .collect(Collectors.toList()); - // 新增 服务端有且本地没有 - List saveTemplate = wxTemplates.stream() - .filter(o -> !weChatTemplatesIds.contains(o.getTemplateId())) - .map(WeChatTemplate::init) - .collect(Collectors.toList()); - weChatTemplateManager.saveAll(saveTemplate); - weChatTemplateManager.deleteByIds(deleteIds); - SecurityUtil.getCurrentUser() - .ifPresent(userDetail -> userWsNoticeService.sendMessageByUser(WsRes.notificationInfo("微信消息模板同步成功"), - userDetail.getId())); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/service/WechatNoticeService.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/service/WechatNoticeService.java deleted file mode 100644 index 83eae983..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/notice/service/WechatNoticeService.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.notice.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.dto.KeyValue; -import cn.bootx.platform.starter.wechat.core.notice.dao.WeChatTemplateManager; -import cn.bootx.platform.starter.wechat.core.notice.entity.WeChatTemplate; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.api.WxMpTemplateMsgService; -import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; -import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 微信消息通知功能 - * - * @author xxm - * @since 2022/7/15 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WechatNoticeService { - - private final WxMpService wxMpService; - - private final WeChatTemplateManager weChatTemplateManager; - - /** - * 发送模板信息 根据模板编号 - */ - @SneakyThrows - public String sentNotice(String code, String wxOpenId, List keyValues) { - WeChatTemplate weChatTemplate = weChatTemplateManager.findTemplateIdByCode(code) - .orElseThrow(() -> new DataNotExistException("微信消息模板不存在")); - return this.sentNoticeByTemplateId(weChatTemplate.getTemplateId(), wxOpenId, keyValues); - } - - /** - * 发送模板信息 根据微信消息模板ID - */ - @SneakyThrows - public String sentNoticeByTemplateId(String templateId, String wxOpenId, List keyValues) { - WxMpTemplateMsgService templateMsgService = wxMpService.getTemplateMsgService(); - WxMpTemplateMessage message = new WxMpTemplateMessage(); - message.setToUser(wxOpenId); - message.setTemplateId(templateId); - - List wxMpTemplateData = keyValues.stream() - .map(keyValue -> new WxMpTemplateData(keyValue.getKey(), keyValue.getValue())) - .collect(Collectors.toList()); - message.setData(wxMpTemplateData); - return templateMsgService.sendTemplateMsg(message); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/portal/service/WeChatPortalService.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/portal/service/WeChatPortalService.java deleted file mode 100644 index 6b8d7c23..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/portal/service/WeChatPortalService.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.portal.service; - -import cn.bootx.platform.common.core.exception.ValidationFailedException; -import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.symmetric.SymmetricAlgorithm; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpMessageRouter; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Service; - -/** - * 微信门户处理 - * - * @author xxm - * @since 2022/7/16 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPortalService { - - private final WxMpService wxMpService; - - private final WxMpMessageRouter wxMpMessageRouter; - - /** - * 微信接入校验处理 - * @param signature 微信签名 - * @param timestamp 时间戳 - * @param nonce 随机数 - * @param echostr 随机字符串 - */ - public String auth(String signature, String timestamp, String nonce, String echostr) { - log.info("接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature, timestamp, nonce, echostr); - if (StrUtil.isAllBlank(signature, timestamp, nonce, echostr)) { - throw new ValidationFailedException(); - } - - if (wxMpService.checkSignature(timestamp, nonce, signature)) { - return echostr; - } - return "非法请求"; - } - - /** - * 微信消息处理 - * @param requestBody 请求报文体 - * @param signature 微信签名 - * @param encType 加签方式 - * @param msgSignature 微信签名 - * @param timestamp 时间戳 - * @param nonce 随机数 - */ - public String handleMessage(String requestBody, String signature, String timestamp, String nonce, String openid, - String encType, String msgSignature) { - if (!wxMpService.checkSignature(timestamp, nonce, signature)) { - throw new ValidationFailedException("非法请求,可能属于伪造的请求!"); - } - String out = "success"; - - // 明文模式 - if (StrUtil.isBlank(encType)) { - WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody); - WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage); - if (outMessage != null) { - out = outMessage.toXml(); - } - } - - // aes加密模式 - if (SymmetricAlgorithm.AES.name().equalsIgnoreCase(encType)) { - WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxMpService.getWxMpConfigStorage(), - timestamp, nonce, msgSignature); - - log.debug("消息解密后内容为:{} ", inMessage.toString()); - - WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage); - if (outMessage != null) { - out = outMessage.toEncryptedXml(wxMpService.getWxMpConfigStorage()); - } - } - - log.debug("组装回复信息:{}", out); - return out; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/convert/WechatFansConvert.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/convert/WechatFansConvert.java deleted file mode 100644 index 125f4686..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/convert/WechatFansConvert.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.user.convert; - -import cn.bootx.platform.starter.wechat.param.user.WechatFansParam; -import cn.bootx.platform.starter.wechat.core.user.entity.WechatFans; -import cn.bootx.platform.starter.wechat.dto.user.WechatFansDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 微信公众号粉丝 - * - * @author xxm - * @since 2022-07-16 - */ -@Mapper -public interface WechatFansConvert { - - WechatFansConvert CONVERT = Mappers.getMapper(WechatFansConvert.class); - - WechatFans convert(WechatFansParam in); - - WechatFansDto convert(WechatFans in); - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/dao/WechatFansManager.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/dao/WechatFansManager.java deleted file mode 100644 index e526a91b..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/dao/WechatFansManager.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.user.dao; - -import cn.bootx.platform.starter.wechat.core.user.entity.WechatFans; -import cn.bootx.platform.starter.wechat.param.user.WechatFansParam; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 微信公众号粉丝 - * - * @author xxm - * @since 2022-07-16 - */ -@Repository -@RequiredArgsConstructor -public class WechatFansManager extends BaseManager { - - /** - * 分页 - */ - public Page page(PageParam pageParam, WechatFansParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, WechatFans.class); - return lambdaQuery().orderByDesc(MpIdEntity::getId).page(mpPage); - } - - /** - * 获取最新的一条 - */ - public Optional findLatest() { - Page mpPage = new Page<>(0, 1); - Page fansPage = this.lambdaQuery().orderByDesc(MpIdEntity::getId).page(mpPage); - if (fansPage.getTotal() > 0) { - return Optional.of(fansPage.getRecords().get(0)); - } - return Optional.empty(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/dao/WechatFansMapper.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/dao/WechatFansMapper.java deleted file mode 100644 index fcea7f9e..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/dao/WechatFansMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.user.dao; - -import cn.bootx.platform.starter.wechat.core.user.entity.WechatFans; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 微信公众号粉丝 - * - * @author xxm - * @since 2022-07-16 - */ -@Mapper -public interface WechatFansMapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/entity/WechatFans.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/entity/WechatFans.java deleted file mode 100644 index ce1a61ea..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/entity/WechatFans.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.user.entity; - -import cn.bootx.platform.starter.wechat.core.user.convert.WechatFansConvert; -import cn.bootx.platform.starter.wechat.param.user.WechatFansParam; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.starter.wechat.dto.user.WechatFansDto; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 微信粉丝 - * - * @author xxm - * @since 2022/7/15 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("starter_wx_fans") -public class WechatFans extends MpIdEntity implements EntityBaseFunction { - - /** 关联OpenId */ - private String openid; - - /** unionId */ - private String unionId; - - /** 订阅状态,未关注/已关注 */ - private Boolean subscribe; - - /** 订阅时间 */ - private LocalDateTime subscribeTime; - - /** 语言 */ - private String language; - - /** 备注 */ - private String remark; - - /** 创建对象 */ - public static WechatFans init(WechatFansParam in) { - return WechatFansConvert.CONVERT.convert(in); - } - - /** 转换成dto */ - @Override - public WechatFansDto toDto() { - return WechatFansConvert.CONVERT.convert(this); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/service/WeChatUserService.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/service/WeChatUserService.java deleted file mode 100644 index 7da1a592..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/core/user/service/WeChatUserService.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.bootx.platform.starter.wechat.core.user.service; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.starter.wechat.core.user.entity.WechatFans; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.api.WxMpUserService; -import me.chanjar.weixin.mp.bean.WxMpUserQuery; -import me.chanjar.weixin.mp.bean.result.WxMpUser; -import me.chanjar.weixin.mp.bean.result.WxMpUserList; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 微信用户相关接口 (获取不到详细信息了) - * - * @author xxm - * @since 2022/7/15 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatUserService { - - private final WxMpService wxMpService; - - private static final int SIZE = 100; - - /** - * 获取关注用户列表 - */ - public void page(PageParam pageParam) { - WxMpUserService userService = wxMpService.getUserService(); - WxMpUserQuery userQuery = new WxMpUserQuery(); - } - - /** - * 同步粉丝 - */ - @Async("asyncExecutor") - public void sync() { - // 根据公众号查询已同步用户openid 查询最新的一条 - } - - /** - * 获取微信用户 (获取不到昵称和头像了, 感觉没什么用了) - * @param nextOpenid 下一组开始的openid - */ - @SneakyThrows - public void fetchUser(String nextOpenid) { - WxMpUserList wxMpUserList = wxMpService.getUserService().userList(nextOpenid); - // openId 分组 每组 100个 openid - List> openIdsList = CollUtil.split(wxMpUserList.getOpenids(), SIZE) - .stream() - .filter(CollUtil::isNotEmpty) - .collect(Collectors.toList()); - // 处理每个分组. 调用查询用户信息 - for (List openIdList : openIdsList) { - log.info("开始批量获取用户信息 {}", openIdList); - List wxAccountFansList = new ArrayList<>(); - log.info("批量插入用户信息完成 {}", openIdList); - } - // 如果nextOpenId 不为空,则继续获取 - } - - /** - * 构建对象 - */ - private WechatFans buildFans(WxMpUser wxMpUser) { - return new WechatFans().setOpenid(wxMpUser.getOpenId()) - .setUnionId(wxMpUser.getUnionId()) - .setSubscribe(true) - .setSubscribeTime(LocalDateTimeUtil.of(wxMpUser.getSubscribeTime())) - .setLanguage(wxMpUser.getLanguage()) - .setRemark(wxMpUser.getRemark()); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/article/WeChatArticleDto.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/article/WeChatArticleDto.java deleted file mode 100644 index c7b145a7..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/article/WeChatArticleDto.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bootx.platform.starter.wechat.dto.article; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; -import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishArticles; -import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishItem; - -import java.time.LocalDateTime; -import java.util.stream.Collectors; - -/** - * 微信文章 - * - * @author xxm - * @since 2022/8/12 - */ -@Data -@Accessors(chain = true) -@Schema(title = "微信文章") -public class WeChatArticleDto { - - @Schema(description = "文章id") - private String articleId; - - @Schema(description = "标题组") - private String titles; - - @Schema(description = "更新时间") - private LocalDateTime updateTime; - - /** - * 构建 - */ - public static WeChatArticleDto init(WxMpFreePublishItem item) { - DateTime date = DateUtil.date(Long.parseLong(item.getUpdateTime())); - LocalDateTime localDateTime = DateUtil.toLocalDateTime(date); - String titles = item.getContent() - .getNewsItem() - .stream() - .map(WxMpFreePublishArticles::getTitle) - .collect(Collectors.joining(",")); - return new WeChatArticleDto().setArticleId(item.getArticleId()).setUpdateTime(localDateTime).setTitles(titles); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/login/WeChatLoginQrCode.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/login/WeChatLoginQrCode.java deleted file mode 100644 index adab6d5f..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/login/WeChatLoginQrCode.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.starter.wechat.dto.login; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2022/8/4 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = true) -@Schema(title = "登录二维码") -public class WeChatLoginQrCode { - - @Schema(description = "key") - private String qrCodeKey; - - @Schema(description = "qrCode") - private String qrCodeUrl; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/media/WeChatMediaDto.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/media/WeChatMediaDto.java deleted file mode 100644 index 850a3028..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/media/WeChatMediaDto.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.bootx.platform.starter.wechat.dto.media; - -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; -import me.chanjar.weixin.mp.bean.material.WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem; - -import java.time.LocalDateTime; - -/** - * @author xxm - * @since 2022/8/12 - */ -@Data -@Accessors(chain = true) -@Schema(title = "微信素材") -public class WeChatMediaDto { - - @Schema(description = "媒体id") - private String mediaId; - - @Schema(description = "名称") - private String name; - - @Schema(description = "链接地址") - private String url; - - @Schema(description = "更新时间") - private LocalDateTime updateTime; - - public static WeChatMediaDto init(WxMaterialFileBatchGetNewsItem item) { - return new WeChatMediaDto().setMediaId(item.getMediaId()) - .setName(item.getName()) - .setUrl(item.getUrl()) - .setUpdateTime(LocalDateTimeUtil.of(item.getUpdateTime())); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/menu/WeChatMenuDto.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/menu/WeChatMenuDto.java deleted file mode 100644 index e9a93a59..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/menu/WeChatMenuDto.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bootx.platform.starter.wechat.dto.menu; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.starter.wechat.core.menu.domin.WeChatMenuInfo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 微信自定义菜单 - * - * @author xxm - * @since 2022-08-08 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "微信自定义菜单") -@Accessors(chain = true) -public class WeChatMenuDto extends BaseDto { - - @Schema(description = "名称") - private String name; - - @Schema(description = "菜单信息") - private WeChatMenuInfo menuInfo; - - @Schema(description = "是否发布") - private boolean publish; - - @Schema(description = "备注") - private String remark; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/notice/WeChatTemplateDto.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/notice/WeChatTemplateDto.java deleted file mode 100644 index c2a42b8d..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/notice/WeChatTemplateDto.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bootx.platform.starter.wechat.dto.notice; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 微信消息模板 - * - * @author xxm - * @since 2022-08-03 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "微信消息模板") -@Accessors(chain = true) -public class WeChatTemplateDto extends BaseDto { - - @Schema(description = "名称") - private String name; - - @Schema(description = "编码") - private String code; - - @Schema(description = "是否启用") - private Boolean enable; - - @Schema(description = "模板ID") - private String templateId; - - @Schema(description = "模板标题") - private String title; - - @Schema(description = "模板所属行业的一级行业") - private String primaryIndustry; - - @Schema(description = "模板所属行业的二级行业") - private String deputyIndustry; - - @Schema(description = "模板内容") - private String content; - - @Schema(description = "示例") - private String example; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/user/WechatFansDto.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/user/WechatFansDto.java deleted file mode 100644 index a0024f9e..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/dto/user/WechatFansDto.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.bootx.platform.starter.wechat.dto.user; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 微信公众号粉丝 - * - * @author xxm - * @since 2022-07-16 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "微信公众号粉丝") -@Accessors(chain = true) -public class WechatFansDto extends BaseDto { - - @Schema(description = "关联OpenId") - private String openid; - - @Schema(description = "订阅状态") - private Boolean subscribeStatus; - - @Schema(description = "订阅时间") - private LocalDateTime subscribeTime; - - @Schema(description = "昵称") - private String nickname; - - @Schema(description = "性别") - private String sex; - - @Schema(description = "语言") - private String language; - - @Schema(description = "国家") - private String country; - - @Schema(description = "省份") - private String province; - - @Schema(description = "城市") - private String city; - - @Schema(description = "头像地址") - private String avatarUrl; - - @Schema(description = "备注") - private String remark; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/event/WeChatQrScanEvent.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/event/WeChatQrScanEvent.java deleted file mode 100644 index b055a405..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/event/WeChatQrScanEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.starter.wechat.event; - -import lombok.Getter; -import org.springframework.context.ApplicationEvent; - -/** - * 微信扫码关注事件 - * - * @author xxm - * @since 2022/8/4 - */ -@Getter -public class WeChatQrScanEvent extends ApplicationEvent { - - /** 微信id */ - private final String openId; - - /** key值 */ - private final String eventKey; - - public WeChatQrScanEvent(Object source, String openId, String eventKey) { - super(source); - this.openId = openId; - this.eventKey = eventKey; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatMpMessageHandler.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatMpMessageHandler.java deleted file mode 100644 index c49f32a5..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatMpMessageHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.bootx.platform.starter.wechat.handler; - -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.api.WxMpMessageHandler; -import me.chanjar.weixin.mp.constant.WxMpEventConstants; - -/** - * 处理微信推送消息的处理器接口 (进行微封装) - * - * @author xxm - * @since 2022/7/16 - */ -public interface WeChatMpMessageHandler extends WxMpMessageHandler { - - /** - * 消息类型 - * @see WxConsts.XmlMsgType - */ - default String getMsgType() { - return WxConsts.XmlMsgType.EVENT; - } - - /** - * event值 - * @see WxMpEventConstants - * @see WxConsts.XmlMsgType - */ - String getEvent(); - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatMsgHandler.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatMsgHandler.java deleted file mode 100644 index e2aa40b4..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatMsgHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.bootx.platform.starter.wechat.handler; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpMessageHandler; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * 微信接受文本消息处理 - * - * @author xxm - * @since 2022/7/16 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class WeChatMsgHandler implements WxMpMessageHandler { - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - - // 回复消息的时候发送人和接收人要反过来 - return WxMpXmlOutMessage.TEXT() - .toUser(wxMessage.getFromUser()) - .fromUser(wxMessage.getToUser()) - .content("我复述了一遍: " + wxMessage.getContent()) - .build(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatQrScanHandler.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatQrScanHandler.java deleted file mode 100644 index e7df4b35..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatQrScanHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.bootx.platform.starter.wechat.handler; - -import cn.bootx.platform.starter.wechat.handler.qrscene.WeChatQrSceneMsgHandler; -import cn.bootx.platform.starter.wechat.core.login.service.WeChatQrLoginService; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.builder.outxml.TextBuilder; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * 微信扫码事件 - * - * @author xxm - * @since 2022/8/4 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class WeChatQrScanHandler implements WeChatMpMessageHandler { - - private final WeChatQrLoginService weChatQrLoginService; - - private final List weChatQrSceneMsgHandlers; - - @Override - public String getEvent() { - return WxConsts.EventType.SCAN; - } - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map map, WxMpService wxMpService, - WxSessionManager wxSessionManager) { - // 扫描用户的OpenId - String openId = wxMessage.getFromUser(); - // 判断是否携带扫码参数 - for (WeChatQrSceneMsgHandler msgHandler : weChatQrSceneMsgHandlers) { - if (StrUtil.startWith(wxMessage.getEventKey(), msgHandler.getPrefix())) { - WxMpXmlOutMessage message = msgHandler.handler(wxMessage, map, wxMpService, wxSessionManager); - if (Objects.nonNull(message)) { - return message; - } - } - } - // 二维码key值 - String qrCodeKey = wxMessage.getEventKey(); - weChatQrLoginService.setOpenId(qrCodeKey, openId); - - return new TextBuilder().fromUser(wxMessage.getToUser()) - .toUser(wxMessage.getFromUser()) - .content("感谢关注") - .build(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatSubscribeHandler.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatSubscribeHandler.java deleted file mode 100644 index 92018552..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatSubscribeHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.bootx.platform.starter.wechat.handler; - -import cn.bootx.platform.starter.wechat.handler.qrscene.WeChatQrSceneMsgHandler; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.builder.outxml.TextBuilder; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * 新增关注订阅消息 - * - * @author xxm - * @since 2022/7/16 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class WeChatSubscribeHandler implements WeChatMpMessageHandler { - - private final List weChatQrSceneMsgHandlers; - - @Override - public String getEvent() { - return WxConsts.EventType.SUBSCRIBE; - } - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - String openId = wxMessage.getFromUser(); - // 处理关注事件 - log.info("新关注用户 OPENID: " + openId); - - // 判断是否携带扫码参数 - for (WeChatQrSceneMsgHandler msgHandler : weChatQrSceneMsgHandlers) { - if (StrUtil.startWith(wxMessage.getEventKey(), msgHandler.getPrefix())) { - WxMpXmlOutMessage message = msgHandler.handler(wxMessage, context, wxMpService, sessionManager); - if (Objects.nonNull(message)) { - return message; - } - } - } - return new TextBuilder().fromUser(wxMessage.getToUser()) - .toUser(wxMessage.getFromUser()) - .content("感谢关注") - .build(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatUnSubscribeHandler.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatUnSubscribeHandler.java deleted file mode 100644 index e1cd0b82..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WeChatUnSubscribeHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.starter.wechat.handler; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * 用户取消关注订阅消息 - * - * @author xxm - * @since 2022/7/16 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class WeChatUnSubscribeHandler implements WeChatMpMessageHandler { - - @Override - public String getEvent() { - return WxConsts.EventType.UNSUBSCRIBE; - } - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - log.info("取消关注用户 OPENID: " + wxMessage.getFromUser()); - return null; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WechatMenuHandler.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WechatMenuHandler.java deleted file mode 100644 index d3ebe7a1..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/WechatMenuHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bootx.platform.starter.wechat.handler; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * 菜单点击事件 - * - * @author xxm - * @since 2022/7/16 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class WechatMenuHandler implements WeChatMpMessageHandler { - - @Override - public String getEvent() { - return WxConsts.MenuButtonType.CLICK; - } - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - return null; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/qrscene/WeChatQrLoginHandler.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/qrscene/WeChatQrLoginHandler.java deleted file mode 100644 index 5e9b012a..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/qrscene/WeChatQrLoginHandler.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.bootx.platform.starter.wechat.handler.qrscene; - -import cn.bootx.platform.starter.wechat.core.login.service.WeChatQrLoginService; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.builder.outxml.TextBuilder; -import org.springframework.stereotype.Component; - -import java.util.Map; - -import static cn.bootx.platform.starter.wechat.code.WeChatCode.EVENT_KEY_QRSCENE; -import static cn.bootx.platform.starter.wechat.code.WeChatCode.QRSCENE_LOGIN; - -/** - * 微信扫码登录 - * - * @author xxm - * @since 2023/3/21 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class WeChatQrLoginHandler implements WeChatQrSceneMsgHandler { - - private final WeChatQrLoginService weChatQrLoginService; - - /** - * 消息前缀 - */ - @Override - public String getPrefix() { - return EVENT_KEY_QRSCENE + QRSCENE_LOGIN; - } - - /** - * 处理消息 - */ - @Override - public WxMpXmlOutMessage handler(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - String openId = wxMessage.getFromUser(); - // 将扫码获取的二维码key值进行保存 - String qrCodeKey = StrUtil.subAfter(wxMessage.getEventKey(), getPrefix(), false); - weChatQrLoginService.setOpenId(qrCodeKey, openId); - return new TextBuilder().fromUser(wxMessage.getToUser()) - .toUser(wxMessage.getFromUser()) - .content("感谢关注") - .build(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/qrscene/WeChatQrSceneMsgHandler.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/qrscene/WeChatQrSceneMsgHandler.java deleted file mode 100644 index 8bd427f3..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/handler/qrscene/WeChatQrSceneMsgHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.starter.wechat.handler.qrscene; - -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; - -import java.util.Map; - -/** - * 微信扫码消息处理 - * - * @author xxm - * @since 2023/3/21 - */ -public interface WeChatQrSceneMsgHandler { - - /** - * 消息前缀 - */ - String getPrefix(); - - /** - * 处理消息 - */ - WxMpXmlOutMessage handler(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, - WxSessionManager sessionManager); - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/menu/WeChatMenuParam.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/menu/WeChatMenuParam.java deleted file mode 100644 index 22b95030..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/menu/WeChatMenuParam.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bootx.platform.starter.wechat.param.menu; - -import cn.bootx.platform.starter.wechat.core.menu.domin.WeChatMenuInfo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 微信自定义菜单 - * - * @author xxm - * @since 2022-08-08 - */ -@Data -@Schema(title = "微信自定义菜单") -@Accessors(chain = true) -public class WeChatMenuParam { - - @Schema(description = "主键") - private Long id; - - @Schema(description = "名称") - private String name; - - @Schema(description = "菜单信息") - private WeChatMenuInfo menuInfo = new WeChatMenuInfo(); - - @Schema(description = "是否发布") - private boolean publish; - - @Schema(description = "备注") - private String remark; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/notice/WeChatTemplateParam.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/notice/WeChatTemplateParam.java deleted file mode 100644 index 53bfe8e9..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/notice/WeChatTemplateParam.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bootx.platform.starter.wechat.param.notice; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 微信消息模板 - * - * @author xxm - * @since 2022-08-03 - */ -@Data -@Schema(title = "微信消息模板") -@Accessors(chain = true) -public class WeChatTemplateParam { - - @Schema(description = "主键") - private Long id; - - @Schema(description = "名称") - private String name; - - @Schema(description = "编码") - private String code; - - @Schema(description = "是否启用") - private Boolean enable; - - @Schema(description = "模板ID") - private String templateId; - - @Schema(description = "模板标题") - private String title; - - @Schema(description = "模板所属行业的一级行业") - private String primaryIndustry; - - @Schema(description = "模板所属行业的二级行业") - private String deputyIndustry; - - @Schema(description = "模板内容") - private String content; - - @Schema(description = "示例") - private String example; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/portal/WeChatPortalParam.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/portal/WeChatPortalParam.java deleted file mode 100644 index 8e3aec90..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/portal/WeChatPortalParam.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.bootx.platform.starter.wechat.param.portal; - -/** - * 微信返回的消息入参 - * - * @author xxm - * @since 2022/7/16 - */ -public class WeChatPortalParam { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/user/WechatFansParam.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/user/WechatFansParam.java deleted file mode 100644 index 17b198b9..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/param/user/WechatFansParam.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.bootx.platform.starter.wechat.param.user; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 微信公众号粉丝 - * - * @author xxm - * @since 2022-07-16 - */ -@Data -@Schema(title = "微信公众号粉丝") -@Accessors(chain = true) -public class WechatFansParam { - - @Schema(description = "主键") - private Long id; - - @Schema(description = "关联OpenId") - private String openid; - - @Schema(description = "订阅状态") - private Boolean subscribeStatus; - - @Schema(description = "订阅时间") - private LocalDateTime subscribeTime; - - @Schema(description = "昵称") - private String nickname; - - @Schema(description = "性别") - private String sex; - - @Schema(description = "语言") - private String language; - - @Schema(description = "国家") - private String country; - - @Schema(description = "省份") - private String province; - - @Schema(description = "城市") - private String city; - - @Schema(description = "头像地址") - private String avatarUrl; - - @Schema(description = "备注") - private String remark; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/util/WeChatUtil.java b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/util/WeChatUtil.java deleted file mode 100644 index 9995319c..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/util/WeChatUtil.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.bootx.platform.starter.wechat.util; - -import cn.hutool.core.util.StrUtil; -import lombok.experimental.UtilityClass; - -/** - * 微信工具类 - * - * @author xxm - * @since 2022/8/5 - */ -@UtilityClass -public class WeChatUtil { - - /** - * 获取微信二维码链接的参数值 - */ - public String getKeyByUrl(String url) { - return StrUtil.subAfter(url, "/q/", true); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 21bbc213..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wechat/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.bootx.platform.starter.wechat.WeChatAutoConfiguration diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/pom.xml b/bootx-platform/bootx-common-starters/common-starter-wecom/pom.xml deleted file mode 100644 index 95b8d19f..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - cn.bootx.platform - bootx-common-starters - 1.3.6.2 - - 4.0.0 - jar - - common-starter-wecom - - - - com.github.binarywang - weixin-java-cp - ${wxjava.version} - - - commons-io - commons-io - - - guava - com.google.guava - - - - - cn.bootx.platform - common-mybatis-plus - - - cn.bootx.platform - common-starter-data-perm - - - diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/WeComAutoConfiguration.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/WeComAutoConfiguration.java deleted file mode 100644 index 1f2b4f74..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/WeComAutoConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bootx.platform.starter.wecom; - -import org.apache.ibatis.annotations.Mapper; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.ConfigurationPropertiesScan; -import org.springframework.context.annotation.ComponentScan; - -/** - * 企业微信 - * - * @author xxm - * @since 2022/7/22 - */ -@ComponentScan -@ConfigurationPropertiesScan -@AutoConfiguration -@MapperScan(annotationClass = Mapper.class) -public class WeComAutoConfiguration { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/code/WeComCode.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/code/WeComCode.java deleted file mode 100644 index 802a2367..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/code/WeComCode.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.bootx.platform.starter.wecom.code; - -/** - * 企微常量 - * - * @author xxm - * @since 2022/7/23 - */ -public interface WeComCode { - - /* 请求地址 */ - /** 撤回应用消息 */ - String NOTICE_RECALL_URL = "https://qyapi.weixin.qq.com/cgi-bin/message/recall"; - - /** 机器人webhook */ - String ROBOT_WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={}"; - - /** 机器人文件上传 */ - String ROBOT_UPLOAD_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key={}&type=file"; - - /* 消息通知 */ - /** 消息ID */ - String NOTICE_MSG_ID = "msgid"; - - /* 请求参数 */ - /** 文件名称 */ - String FILE_NAME = "filename"; - - /** 文件长度 */ - String FILE_LENGTH = "filelength"; - - /** 文件类型 */ - String CONTENT_TYPE = "content-type"; - - /** 文件 */ - String MEDIA = "media"; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/configuration/WeComConfiguration.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/configuration/WeComConfiguration.java deleted file mode 100644 index 7eb779a1..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/configuration/WeComConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.bootx.platform.starter.wecom.configuration; - -import lombok.RequiredArgsConstructor; -import me.chanjar.weixin.cp.api.WxCpService; -import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; -import me.chanjar.weixin.cp.config.WxCpConfigStorage; -import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @author xxm - * @since 2022/7/23 - */ -@Configuration -@RequiredArgsConstructor -public class WeComConfiguration { - - private final WeComProperties weComProperties; - - /** - * 微信公众号APIService - */ - @Bean - public WxCpService wxCpService(WxCpConfigStorage wxMpConfigStorage) { - WxCpService wxMpService = new WxCpServiceImpl(); - wxMpService.setWxCpConfigStorage(wxMpConfigStorage); - return wxMpService; - } - - /** - * 微信配置 - */ - @Bean - public WxCpConfigStorage wxCpConfigStorage() { - WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl(); - config.setAgentId(weComProperties.getAgentId()); - config.setCorpId(weComProperties.getCorpId()); - config.setCorpSecret(weComProperties.getCorpSecret()); - config.setToken(weComProperties.getToken()); // 设置微信公众号的Token - config.setAesKey(weComProperties.getEncodingAesKey()); // 消息加解密密钥 - return config; - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/configuration/WeComProperties.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/configuration/WeComProperties.java deleted file mode 100644 index d3ee837a..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/configuration/WeComProperties.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.bootx.platform.starter.wecom.configuration; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * 企业微信配置 - * - * @author xxm - * @since 2022/7/22 - */ -@Getter -@Setter -@ConfigurationProperties("bootx.starter.third.wecom") -public class WeComProperties { - - /** 应用id */ - private Integer agentId; - - /** 企业id */ - private String corpId; - - /** 企业Secret */ - private String corpSecret; - - /** token */ - private String token; - - /** 消息加解密密钥 */ - private String encodingAesKey; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/controller/WecomRobotConfigController.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/controller/WecomRobotConfigController.java deleted file mode 100644 index c0cd78d4..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/controller/WecomRobotConfigController.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.bootx.platform.starter.wecom.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.wecom.core.robot.service.WecomRobotConfigService; -import cn.bootx.platform.starter.wecom.dto.robot.WecomRobotConfigDto; -import cn.bootx.platform.starter.wecom.param.robot.WecomRobotConfigParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * @author xxm - * @since 2022/7/26 - */ -@Tag(name = "企业微信机器人配置") -@RestController -@RequestMapping("/wecom/robot/config") -@RequiredArgsConstructor -public class WecomRobotConfigController { - - private final WecomRobotConfigService robotConfigService; - - @Operation(summary = "新增机器人配置") - @PostMapping("/add") - public ResResult add(@RequestBody WecomRobotConfigParam param) { - robotConfigService.add(param); - return Res.ok(); - } - - @Operation(summary = "修改机器人配置") - @PostMapping("/update") - public ResResult update(@RequestBody WecomRobotConfigParam param) { - robotConfigService.update(param); - return Res.ok(); - } - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, WecomRobotConfigParam param) { - return Res.ok(robotConfigService.page(pageParam, param)); - } - - @Operation(summary = "查询全部") - @GetMapping("/findAll") - public ResResult> findAll() { - return Res.ok(robotConfigService.findAll()); - } - - @Operation(summary = "获取详情") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(robotConfigService.findById(id)); - } - - @Operation(summary = "删除") - @DeleteMapping("/delete") - public ResResult delete(Long id) { - robotConfigService.delete(id); - return Res.ok(); - } - - @Operation(summary = "编码是否被使用") - @GetMapping("/existsByCode") - public ResResult existsByCode(String code) { - return Res.ok(robotConfigService.existsByCode(code)); - } - - @Operation(summary = "编码是否被使用(不包含自己)") - @GetMapping("/existsByCodeNotId") - public ResResult existsByCode(String code, Long id) { - return Res.ok(robotConfigService.existsByCode(code, id)); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/notice/domain/WxCpRecallNoticeResult.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/notice/domain/WxCpRecallNoticeResult.java deleted file mode 100644 index d7ea241a..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/notice/domain/WxCpRecallNoticeResult.java +++ /dev/null @@ -1,5 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.notice.domain; - -public class WxCpRecallNoticeResult { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/notice/executor/RecallNoticeRequestExecutor.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/notice/executor/RecallNoticeRequestExecutor.java deleted file mode 100644 index 6283acee..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/notice/executor/RecallNoticeRequestExecutor.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.notice.executor; - -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.hutool.http.HttpUtil; -import me.chanjar.weixin.common.enums.WxType; -import me.chanjar.weixin.common.error.WxError; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.util.http.RequestExecutor; -import me.chanjar.weixin.common.util.http.ResponseHandler; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import static cn.bootx.platform.starter.wecom.code.WeComCode.NOTICE_MSG_ID; - -/** - * 消息撤回请求执行器. - * - * @author xxm - * @since 2022/7/23 - */ -public class RecallNoticeRequestExecutor implements RequestExecutor { - - @Override - public WxError execute(String uri, String data, WxType wxType) throws WxErrorException { - - Map map = new HashMap<>(1); - map.put(NOTICE_MSG_ID, data); - String response = HttpUtil.createPost(uri).body(JacksonUtil.toJson(map)).execute().body(); - - WxError result = WxError.fromJson(response); - if (result.getErrorCode() != 0) { - throw new WxErrorException(result); - } - return result; - } - - @Override - public void execute(String uri, String data, ResponseHandler handler, WxType wxType) - throws WxErrorException, IOException { - handler.handle(this.execute(uri, data, wxType)); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/notice/service/WeComNoticeService.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/notice/service/WeComNoticeService.java deleted file mode 100644 index 9c5f7c72..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/notice/service/WeComNoticeService.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.notice.service; - -import cn.bootx.platform.starter.wecom.configuration.WeComProperties; -import cn.bootx.platform.starter.wecom.core.notice.executor.RecallNoticeRequestExecutor; -import cn.hutool.core.io.FileTypeUtil; -import cn.hutool.core.io.IoUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.cp.api.WxCpMediaService; -import me.chanjar.weixin.cp.api.WxCpMessageService; -import me.chanjar.weixin.cp.api.WxCpService; -import me.chanjar.weixin.cp.bean.message.WxCpMessage; -import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult; -import org.springframework.stereotype.Service; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import static cn.bootx.platform.starter.wecom.code.WeComCode.NOTICE_RECALL_URL; - -/** - * 企业微信消息发送 - * - * @author xxm - * @since 2022/7/23 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeComNoticeService { - - private final WxCpService wxCpService; - - private final WeComProperties weComProperties; - - /** - * 发送应用消息 - * @return 消息id, 可用于撤回 - */ - @SneakyThrows - public String sendNotice(WxCpMessage message) { - WxCpMessageService messageService = wxCpService.getMessageService(); - message.setAgentId(weComProperties.getAgentId()); - WxCpMessageSendResult result = messageService.send(message); - return result.getMsgId(); - } - - /** - * 撤回应用消息 - * @param msgId 消息id - */ - @SneakyThrows - public void recallNotice(String msgId) { - wxCpService.execute(new RecallNoticeRequestExecutor(), NOTICE_RECALL_URL, msgId); - } - - /** - * 上传临时素材 - */ - @SneakyThrows - public String updatedMedia(InputStream inputStream, String mediaType) { - WxCpMediaService mediaService = wxCpService.getMediaService(); - byte[] bytes = IoUtil.readBytes(inputStream); - String fileType = FileTypeUtil.getType(new ByteArrayInputStream(bytes)); - WxMediaUploadResult result = mediaService.upload(mediaType, fileType, new ByteArrayInputStream(bytes)); - return result.getMediaId(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/convert/WecomRobotConfigConvert.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/convert/WecomRobotConfigConvert.java deleted file mode 100644 index 35d481ed..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/convert/WecomRobotConfigConvert.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.robot.convert; - -import cn.bootx.platform.starter.wecom.param.robot.WecomRobotConfigParam; -import cn.bootx.platform.starter.wecom.core.robot.entity.WecomRobotConfig; -import cn.bootx.platform.starter.wecom.dto.robot.WecomRobotConfigDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 企业微信机器人配置 - * - * @author bootx - * @since 2022-07-23 - */ -@Mapper -public interface WecomRobotConfigConvert { - - WecomRobotConfigConvert CONVERT = Mappers.getMapper(WecomRobotConfigConvert.class); - - WecomRobotConfig convert(WecomRobotConfigParam in); - - WecomRobotConfigDto convert(WecomRobotConfig in); - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/dao/WecomRobotConfigManager.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/dao/WecomRobotConfigManager.java deleted file mode 100644 index f69bbd12..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/dao/WecomRobotConfigManager.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.robot.dao; - -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.starter.wecom.core.robot.entity.WecomRobotConfig; -import cn.bootx.platform.starter.wecom.param.robot.WecomRobotConfigParam; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 企业微信机器人配置 - * - * @author bootx - * @since 2022-07-23 - */ -@Repository -@RequiredArgsConstructor -public class WecomRobotConfigManager extends BaseManager { - - /** - * 根据code获取机器人配置 - */ - public Optional findByCode(String code) { - return findByField(WecomRobotConfig::getCode, code); - } - - public boolean existsByCode(String code) { - return existedByField(WecomRobotConfig::getCode, code); - } - - public boolean existsByCode(String code, Long id) { - return lambdaQuery().eq(WecomRobotConfig::getCode, code).ne(MpIdEntity::getId, id).exists(); - } - - /** - * 分页 - */ - public Page page(PageParam pageParam, WecomRobotConfigParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, WecomRobotConfig.class); - return lambdaQuery().like(StrUtil.isNotBlank(param.getCode()), WecomRobotConfig::getCode, param.getCode()) - .like(StrUtil.isNotBlank(param.getName()), WecomRobotConfig::getCode, param.getName()) - .like(StrUtil.isNotBlank(param.getWebhookKey()), WecomRobotConfig::getWebhookKey, param.getWebhookKey()) - .orderByDesc(MpIdEntity::getId) - .page(mpPage); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/dao/WecomRobotConfigMapper.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/dao/WecomRobotConfigMapper.java deleted file mode 100644 index 3eee2d08..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/dao/WecomRobotConfigMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.robot.dao; - -import cn.bootx.platform.starter.wecom.core.robot.entity.WecomRobotConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 企业微信机器人配置 - * - * @author bootx - * @since 2022-07-23 - */ -@Mapper -public interface WecomRobotConfigMapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/domin/UploadMedia.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/domin/UploadMedia.java deleted file mode 100644 index 8a4bb67d..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/domin/UploadMedia.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.robot.domin; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.InputStream; - -/** - * 企微文件上传 - * - * @author xxm - * @since 2022/7/24 - */ -@Data -@Accessors(chain = true) -@Schema(title = "企微文件上传") -public class UploadMedia { - - @Schema(description = "文件名称") - private String filename; - - @Schema(description = "文件类型") - private String fileType; - - @Schema(description = "文件流") - private InputStream inputStream; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/entity/WecomRobotConfig.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/entity/WecomRobotConfig.java deleted file mode 100644 index b38199c7..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/entity/WecomRobotConfig.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.robot.entity; - -import cn.bootx.platform.starter.wecom.core.robot.convert.WecomRobotConfigConvert; -import cn.bootx.platform.starter.wecom.param.robot.WecomRobotConfigParam; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.starter.wecom.code.WeComCode; -import cn.bootx.platform.starter.wecom.dto.robot.WecomRobotConfigDto; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 企业微信机器人配置 - * - * @author bootx - * @since 2022-07-23 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@TableName("starter_wecom_robot_config") -@Accessors(chain = true) -public class WecomRobotConfig extends MpBaseEntity implements EntityBaseFunction { - - /** 名称 */ - private String name; - - /** 编号 */ - private String code; - - /** webhook地址的key */ - private String webhookKey; - - /** 备注 */ - private String remark; - - /** - * 获取webhook的地址 - */ - public String toWebhookUrl() { - return StrUtil.format(WeComCode.ROBOT_WEBHOOK_URL, webhookKey); - } - - /** 创建对象 */ - public static WecomRobotConfig init(WecomRobotConfigParam in) { - return WecomRobotConfigConvert.CONVERT.convert(in); - } - - /** 转换成dto */ - @Override - public WecomRobotConfigDto toDto() { - return WecomRobotConfigConvert.CONVERT.convert(this); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/executor/RobotMediaFileUploadRequestExecutor.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/executor/RobotMediaFileUploadRequestExecutor.java deleted file mode 100644 index b8abd006..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/executor/RobotMediaFileUploadRequestExecutor.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.robot.executor; - -import cn.bootx.platform.starter.wecom.code.WeComCode; -import cn.bootx.platform.starter.wecom.core.robot.domin.UploadMedia; -import cn.hutool.http.HttpUtil; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.common.enums.WxType; -import me.chanjar.weixin.common.error.WxError; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.util.fs.FileUtils; -import me.chanjar.weixin.common.util.http.RequestExecutor; -import me.chanjar.weixin.common.util.http.ResponseHandler; - -import java.io.File; -import java.io.IOException; - -/** - * 机器人文件素材上传 - * - * @author xxm - * @since 2022/7/23 - */ -public class RobotMediaFileUploadRequestExecutor implements RequestExecutor { - - @Override - public WxMediaUploadResult execute(String uri, UploadMedia uploadMedia, WxType wxType) - throws WxErrorException, IOException { - File tmpFile = FileUtils.createTmpFile(uploadMedia.getInputStream(), uploadMedia.getFilename(), - uploadMedia.getFileType()); - String filename = uploadMedia.getFilename() + "." + uploadMedia.getFileType(); - String response; - response = HttpUtil.createPost(uri).form(WeComCode.MEDIA, tmpFile, filename).execute().body(); - - WxError result = WxError.fromJson(response); - if (result.getErrorCode() != 0) { - throw new WxErrorException(result); - } - return WxMediaUploadResult.fromJson(response); - } - - @Override - public void execute(String uri, UploadMedia data, ResponseHandler handler, WxType wxType) - throws WxErrorException, IOException { - handler.handle(this.execute(uri, data, wxType)); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/service/WeComRobotNoticeService.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/service/WeComRobotNoticeService.java deleted file mode 100644 index ee14630e..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/service/WeComRobotNoticeService.java +++ /dev/null @@ -1,132 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.robot.service; - -import cn.bootx.platform.starter.wecom.core.robot.executor.RobotMediaFileUploadRequestExecutor; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.starter.wecom.core.robot.dao.WecomRobotConfigManager; -import cn.bootx.platform.starter.wecom.core.robot.domin.UploadMedia; -import cn.bootx.platform.starter.wecom.core.robot.entity.WecomRobotConfig; -import cn.hutool.core.io.FileTypeUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.io.file.FileNameUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.cp.api.WxCpGroupRobotService; -import me.chanjar.weixin.cp.api.WxCpService; -import me.chanjar.weixin.cp.bean.article.NewArticle; -import org.springframework.stereotype.Service; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.List; - -import static cn.bootx.platform.starter.wecom.code.WeComCode.ROBOT_UPLOAD_URL; - -/** - * 企微机器人消息通知 - * - * @author xxm - * @since 2022/7/23 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeComRobotNoticeService { - - private final WxCpService wxCpService; - - private final WecomRobotConfigManager robotConfigManager; - - /** - * 发送文本消息 - */ - @SneakyThrows - public void sendTextNotice(String code, String content, List mentionedList, List mobileList) { - WecomRobotConfig robotConfig = robotConfigManager.findByCode(code) - .orElseThrow(() -> new DataNotExistException("企业微信机器人配置未找到")); - WxCpGroupRobotService robotService = wxCpService.getGroupRobotService(); - robotService.sendText(robotConfig.toWebhookUrl(), content, mentionedList, mobileList); - } - - /** - * 发送markdown消息 - */ - @SneakyThrows - public void sendMarkdownNotice(String code, String content) { - WecomRobotConfig robotConfig = robotConfigManager.findByCode(code) - .orElseThrow(() -> new DataNotExistException("企业微信机器人配置未找到")); - WxCpGroupRobotService robotService = wxCpService.getGroupRobotService(); - robotService.sendMarkdown(robotConfig.toWebhookUrl(), content); - } - - /** - * 发送图片消息 - */ - @SneakyThrows - public void sendImageNotice(String code, String imageBase64, String md5) { - WecomRobotConfig robotConfig = robotConfigManager.findByCode(code) - .orElseThrow(() -> new DataNotExistException("企业微信机器人配置未找到")); - WxCpGroupRobotService robotService = wxCpService.getGroupRobotService(); - robotService.sendImage(robotConfig.toWebhookUrl(), imageBase64, md5); - } - - /** - * 发送图文消息 - */ - @SneakyThrows - public void sendNewsNotice(String code, List articleList) { - WecomRobotConfig robotConfig = robotConfigManager.findByCode(code) - .orElseThrow(() -> new DataNotExistException("企业微信机器人配置未找到")); - WxCpGroupRobotService robotService = wxCpService.getGroupRobotService(); - robotService.sendNews(robotConfig.toWebhookUrl(), articleList); - } - - /** - * 发送文件消息 - */ - @SneakyThrows - public void sendFIleNotice(String code, String mediaId) { - WecomRobotConfig robotConfig = robotConfigManager.findByCode(code) - .orElseThrow(() -> new DataNotExistException("企业微信机器人配置未找到")); - WxCpGroupRobotService robotService = wxCpService.getGroupRobotService(); - robotService.sendFile(robotConfig.toWebhookUrl(), mediaId); - } - - /** - * 机器人临时文件上传 - */ - @SneakyThrows - public String updatedMedia(String code, InputStream inputStream) { - byte[] bytes = IoUtil.readBytes(inputStream); - String fileType = FileTypeUtil.getType(new ByteArrayInputStream(bytes)); - UploadMedia uploadMedia = new UploadMedia().setFileType(fileType) - .setFilename(IdUtil.getSnowflakeNextIdStr()) - .setInputStream(new ByteArrayInputStream(bytes)); - WecomRobotConfig robotConfig = robotConfigManager.findByCode(code) - .orElseThrow(() -> new DataNotExistException("企业微信机器人配置未找到")); - String url = StrUtil.format(ROBOT_UPLOAD_URL, robotConfig.getWebhookKey()); - WxMediaUploadResult result = wxCpService.execute(new RobotMediaFileUploadRequestExecutor(), url, uploadMedia); - return result.getMediaId(); - } - - /** - * 机器人临时文件上传 - */ - @SneakyThrows - public String updatedMedia(String code, InputStream inputStream, String filename) { - byte[] bytes = IoUtil.readBytes(inputStream); - String fileType = FileTypeUtil.getType(new ByteArrayInputStream(bytes), filename); - UploadMedia uploadMedia = new UploadMedia().setFileType(fileType) - .setFilename(FileNameUtil.mainName(filename)) - .setInputStream(new ByteArrayInputStream(bytes)); - WecomRobotConfig robotConfig = robotConfigManager.findByCode(code) - .orElseThrow(() -> new DataNotExistException("企业微信机器人配置未找到")); - String url = StrUtil.format(ROBOT_UPLOAD_URL, robotConfig.getWebhookKey()); - WxMediaUploadResult result = wxCpService.execute(new RobotMediaFileUploadRequestExecutor(), url, uploadMedia); - return result.getMediaId(); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/service/WecomRobotConfigService.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/service/WecomRobotConfigService.java deleted file mode 100644 index c29ab88e..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/core/robot/service/WecomRobotConfigService.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.bootx.platform.starter.wecom.core.robot.service; - -import cn.bootx.platform.starter.wecom.param.robot.WecomRobotConfigParam; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.ResultConvertUtil; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.starter.wecom.core.robot.dao.WecomRobotConfigManager; -import cn.bootx.platform.starter.wecom.core.robot.entity.WecomRobotConfig; -import cn.bootx.platform.starter.wecom.dto.robot.WecomRobotConfigDto; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 企业微信机器人配置 - * - * @author bootx - * @since 2022-07-23 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WecomRobotConfigService { - - private final WecomRobotConfigManager robotConfigManager; - - /** - * 添加 - */ - public void add(WecomRobotConfigParam param) { - WecomRobotConfig wecomRobotConfig = WecomRobotConfig.init(param); - robotConfigManager.save(wecomRobotConfig); - } - - /** - * 修改 - */ - public void update(WecomRobotConfigParam param) { - WecomRobotConfig wecomRobotConfig = robotConfigManager.findById(param.getId()) - .orElseThrow(DataNotExistException::new); - - BeanUtil.copyProperties(param, wecomRobotConfig, CopyOptions.create().ignoreNullValue()); - robotConfigManager.updateById(wecomRobotConfig); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, WecomRobotConfigParam wecomRobotConfigParam) { - return MpUtil.convert2DtoPageResult(robotConfigManager.page(pageParam, wecomRobotConfigParam)); - } - - /** - * 获取单条 - */ - public WecomRobotConfigDto findById(Long id) { - return robotConfigManager.findById(id).map(WecomRobotConfig::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 获取全部 - */ - public List findAll() { - return ResultConvertUtil.dtoListConvert(robotConfigManager.findAll()); - } - - /** - * 删除 - */ - public void delete(Long id) { - robotConfigManager.deleteById(id); - } - - /** - * 编码是否已经存在 - */ - public boolean existsByCode(String code) { - return robotConfigManager.existsByCode(code); - } - - /** - * 编码是否已经存在(不包含自身) - */ - public boolean existsByCode(String code, Long id) { - return robotConfigManager.existsByCode(code, id); - } - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/dto/robot/WecomRobotConfigDto.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/dto/robot/WecomRobotConfigDto.java deleted file mode 100644 index caa74343..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/dto/robot/WecomRobotConfigDto.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.starter.wecom.dto.robot; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.starter.data.perm.sensitive.SensitiveInfo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 企业微信机器人配置 - * - * @author bootx - * @since 2022-07-23 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "企业微信机器人配置") -@Accessors(chain = true) -public class WecomRobotConfigDto extends BaseDto { - - @Schema(description = "名称") - private String name; - - @Schema(description = "编号") - private String code; - - @SensitiveInfo - @Schema(description = "webhook地址的key值") - private String webhookKey; - - @Schema(description = "备注") - private String remark; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/param/robot/WecomRobotConfigParam.java b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/param/robot/WecomRobotConfigParam.java deleted file mode 100644 index 6207c2c6..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/java/cn/bootx/platform/starter/wecom/param/robot/WecomRobotConfigParam.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.bootx.platform.starter.wecom.param.robot; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 企业微信机器人配置 - * - * @author bootx - * @since 2022-07-23 - */ -@Data -@Schema(title = "企业微信机器人配置") -@Accessors(chain = true) -public class WecomRobotConfigParam { - - @Schema(description = "主键") - private Long id; - - @Schema(description = "名称") - private String name; - - @Schema(description = "编号") - private String code; - - @Schema(description = "webhook地址的key值") - private String webhookKey; - - @Schema(description = "备注") - private String remark; - -} diff --git a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 79adedc8..00000000 --- a/bootx-platform/bootx-common-starters/common-starter-wecom/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.bootx.platform.starter.wecom.WeComAutoConfiguration diff --git a/bootx-platform/bootx-common-starters/pom.xml b/bootx-platform/bootx-common-starters/pom.xml index 7083810d..dc01a88f 100644 --- a/bootx-platform/bootx-common-starters/pom.xml +++ b/bootx-platform/bootx-common-starters/pom.xml @@ -18,10 +18,7 @@ common-starter-audit-log common-starter-data-perm common-starter-file - common-starter-dingtalk common-starter-monitor - common-starter-wechat - common-starter-wecom diff --git a/bootx-platform/bootx-services/pom.xml b/bootx-platform/bootx-services/pom.xml index 5e2f2746..a20e23f7 100644 --- a/bootx-platform/bootx-services/pom.xml +++ b/bootx-platform/bootx-services/pom.xml @@ -17,7 +17,6 @@ service-baseapi service-iam - service-notice @@ -168,7 +167,6 @@ common-exception-handler - cn.bootx.platform diff --git a/bootx-platform/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/handler/region/ChinaRegionInitSqlHandler.java b/bootx-platform/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/handler/region/ChinaRegionInitSqlHandler.java deleted file mode 100644 index df05b34d..00000000 --- a/bootx-platform/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/handler/region/ChinaRegionInitSqlHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.bootx.platform.baseapi.handler.region; - -import com.baomidou.mybatisplus.extension.ddl.SimpleDdl; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.List; - -/** - * 行政区域初始化 - * - * @author xxm - * @since 2023/2/7 - */ -@Component -public class ChinaRegionInitSqlHandler extends SimpleDdl { - - /** - * 速度太慢, 还是走手动SQL导入的方式 - */ - @Override - public List getSqlFiles() { - return Arrays.asList( - // "db/region/base_province.sql", - // "db/region/base_city.sql", - // "db/region/base_area.sql", - // "db/region/base_street.sql" - ); - } - -} diff --git a/bootx-platform/bootx-services/service-iam/pom.xml b/bootx-platform/bootx-services/service-iam/pom.xml index 40bbb5b4..1047d42e 100644 --- a/bootx-platform/bootx-services/service-iam/pom.xml +++ b/bootx-platform/bootx-services/service-iam/pom.xml @@ -53,16 +53,6 @@ cn.bootx.platform common-websocket - - - cn.bootx.platform - common-starter-dingtalk - - - - cn.bootx.platform - common-starter-wechat - org.quartz-scheduler quartz diff --git a/bootx-platform/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/DingTalkLoginHandler.java b/bootx-platform/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/DingTalkLoginHandler.java deleted file mode 100644 index af48a97f..00000000 --- a/bootx-platform/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/DingTalkLoginHandler.java +++ /dev/null @@ -1,146 +0,0 @@ -package cn.bootx.platform.iam.core.auth.login; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.iam.core.third.dao.UserThirdManager; -import cn.bootx.platform.iam.core.third.entity.UserThird; -import cn.bootx.platform.iam.core.third.entity.UserThirdInfo; -import cn.bootx.platform.iam.core.third.service.UserTiredOperateService; -import cn.bootx.platform.iam.core.user.dao.UserInfoManager; -import cn.bootx.platform.iam.core.user.entity.UserInfo; -import cn.bootx.platform.starter.auth.authentication.OpenIdAuthentication; -import cn.bootx.platform.starter.auth.code.AuthLoginTypeCode; -import cn.bootx.platform.starter.auth.configuration.AuthProperties; -import cn.bootx.platform.starter.auth.entity.AuthInfoResult; -import cn.bootx.platform.starter.auth.entity.LoginAuthContext; -import cn.bootx.platform.starter.auth.exception.LoginFailureException; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.bootx.platform.starter.dingtalk.core.user.service.DingUserService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import me.zhyd.oauth.config.AuthConfig; -import me.zhyd.oauth.model.AuthCallback; -import me.zhyd.oauth.model.AuthResponse; -import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.request.AuthDingTalkRequest; -import me.zhyd.oauth.request.AuthRequest; -import me.zhyd.oauth.utils.AuthStateUtils; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -/** - * 钉钉登录 - * - * @author xxm - * @since 2022/4/2 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class DingTalkLoginHandler implements OpenIdAuthentication { - - private final UserTiredOperateService userTiredOperateService; - - private final DingUserService dingUserService; - - private final UserThirdManager userThirdManager; - - private final UserInfoManager userInfoManager; - - private final AuthProperties authProperties; - - /** - * 钉钉登录 - */ - @Override - public String getLoginType() { - return AuthLoginTypeCode.DING_TALK; - } - - /** - * 尝试认证, 获取用户 - */ - @Override - public AuthInfoResult attemptAuthentication(LoginAuthContext context) { - String authCode = context.getRequest().getParameter(AuthLoginTypeCode.AUTH_CODE); - String state = context.getRequest().getParameter(AuthLoginTypeCode.STATE); - - AuthUser authUser = this.getAuthUser(authCode, state); - // 获取钉钉关联的用户id - UserThird userThird = userThirdManager.findByField(UserThird::getDingTalkId, authUser.getUuid()) - .orElseThrow(() -> new LoginFailureException("钉钉没有找到绑定的用户")); - - // 获取用户信息 - UserInfo userInfo = userInfoManager.findById(userThird.getUserId()) - .orElseThrow(() -> new LoginFailureException("用户不存在")); - - return new AuthInfoResult().setUserDetail(userInfo.toUserDetail()).setId(userInfo.getId()); - } - - /** - * 获取登录地址 - */ - @Override - public String getLoginUrl() { - AuthRequest authRequest = this.getAuthRequest(); - return authRequest.authorize(AuthStateUtils.createState()); - } - - /** - * 获取关联的的第三方平台用户信息 - */ - @Override - @SuppressWarnings("unchecked") - public AuthUser getAuthUser(String authCode, String state) { - AuthRequest authRequest = this.getAuthRequest(); - AuthCallback callback = AuthCallback.builder().code(authCode).state(state).build(); - AuthResponse response = authRequest.login(callback); - if (!Objects.equals(response.getCode(), AuthLoginTypeCode.SUCCESS)) { - log.error("钉钉登录报错: {}", response.getMsg()); - throw new LoginFailureException("钉钉登录出错"); - } - return response.getData(); - } - - /** - * 绑定用户 - */ - @Override - public void bindUser(String authCode, String state) { - Long userId = SecurityUtil.getUserId(); - AuthUser authUser = this.getAuthUser(authCode, state); - userTiredOperateService.checkOpenIdBind(authUser.getUuid(), UserThird::getDingTalkId); - userTiredOperateService.bindOpenId(userId, authUser.getUuid(), UserThird::setDingTalkId); - String thirdUserId = dingUserService.getUserIdByUnionId(authUser.getUuid()); - - // 检查是否允许不在组织中的钉钉人员进行绑定 - if (!authProperties.getThirdLogin().getDingTalk().isCheckBelongOrg() && Objects.isNull(thirdUserId)) { - throw new BizException("未在钉钉组织找到该用户,无法进行绑定"); - } - - UserThirdInfo userThirdInfo = new UserThirdInfo().setUserId(userId) - .setClientCode(AuthLoginTypeCode.DING_TALK) - .setUsername(authUser.getUsername()) - .setNickname(authUser.getNickname()) - .setAvatar(authUser.getAvatar()) - .setThirdUserId(thirdUserId); - userTiredOperateService.bindOpenInfo(userThirdInfo); - } - - /** - * 获取钉钉认证请求 - */ - private AuthDingTalkRequest getAuthRequest() { - val thirdLogin = authProperties.getThirdLogin().getDingTalk(); - if (Objects.isNull(thirdLogin)) { - throw new LoginFailureException("钉钉开放登录配置有误"); - } - return new AuthDingTalkRequest(AuthConfig.builder() - .clientId(thirdLogin.getClientId()) - .clientSecret(thirdLogin.getClientSecret()) - .redirectUri(thirdLogin.getRedirectUri()) - .build()); - } - -} diff --git a/bootx-platform/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/WeChatAppletLoginHandler.java b/bootx-platform/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/WeChatAppletLoginHandler.java deleted file mode 100644 index ebd68be0..00000000 --- a/bootx-platform/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/WeChatAppletLoginHandler.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.bootx.platform.iam.core.auth.login; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.bootx.platform.iam.core.third.dao.UserThirdManager; -import cn.bootx.platform.iam.core.third.entity.UserThird; -import cn.bootx.platform.iam.core.third.entity.UserThirdInfo; -import cn.bootx.platform.iam.core.third.service.UserTiredOperateService; -import cn.bootx.platform.iam.core.user.dao.UserInfoManager; -import cn.bootx.platform.iam.core.user.entity.UserInfo; -import cn.bootx.platform.starter.auth.authentication.OpenIdAuthentication; -import cn.bootx.platform.starter.auth.code.AuthLoginTypeCode; -import cn.bootx.platform.starter.auth.entity.AuthInfoResult; -import cn.bootx.platform.starter.auth.entity.LoginAuthContext; -import cn.bootx.platform.starter.auth.exception.LoginFailureException; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.bootx.platform.starter.wechat.core.user.service.WeChatUserService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import me.zhyd.oauth.model.AuthUser; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class WeChatAppletLoginHandler implements OpenIdAuthentication { - - - private final UserTiredOperateService userTiredOperateService; - private final WxMaService wxMaService; - - private final UserThirdManager userThirdManager; - - private final UserInfoManager userInfoManager; - - - private final WeChatUserService weChatUserService; - - @Override - public String getLoginType() { - return AuthLoginTypeCode.WE_CHAT_APPLET; - } - - @Override - public AuthInfoResult attemptAuthentication(LoginAuthContext context) { - - String authCode = context.getRequest().getParameter(AuthLoginTypeCode.WE_CHAT_APPLET); - - AuthUser authUser = this.getAuthUser(authCode, null); - - // 获取企微关联的用户id - UserThird userThird = userThirdManager.findByField(UserThird::getWeChatId, authUser.getUuid()) - .orElseThrow(() -> new LoginFailureException("微信没有找到绑定的用户")); - - // 获取用户信息 - UserInfo userInfo = userInfoManager.findById(userThird.getUserId()) - .orElseThrow(() -> new LoginFailureException("用户不存在")); - - return new AuthInfoResult().setUserDetail(userInfo.toUserDetail()).setId(userInfo.getId()); - } - - @Override - public AuthUser getAuthUser(String authCode, String state) { - try { - WxMaJscode2SessionResult result = wxMaService.getUserService().getSessionInfo(authCode); - log.debug("微信服务器返回的用户信息:{}", JacksonUtil.toJson(result)); - return AuthUser.builder() - .avatar("") - .uuid(result.getOpenid()). - nickname("未知") - .username("未知") - .avatar("未知") - .build(); - } catch (WxErrorException e) { - log.error("请求微信服务器异常:{}", e.getError()); - throw new RuntimeException(e); - } - - } - - @Override - public void bindUser(String authCode, String state) { - Long userId = SecurityUtil.getUserId(); - AuthUser authUser = this.getAuthUser(authCode, state); - userTiredOperateService.checkOpenIdBind(authUser.getUuid(), UserThird::getWeChatId); - userTiredOperateService.bindOpenId(userId, authUser.getUuid(), UserThird::setWeChatId); - - UserThirdInfo userThirdInfo = new UserThirdInfo().setUserId(userId) - .setClientCode(AuthLoginTypeCode.WE_CHAT) - .setUsername(authUser.getUsername()) - .setNickname(authUser.getNickname()) - .setAvatar(authUser.getAvatar()) - .setThirdUserId(authUser.getUuid()); - userTiredOperateService.bindOpenInfo(userThirdInfo); - } -} diff --git a/bootx-platform/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/WeChatLoginHandler.java b/bootx-platform/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/WeChatLoginHandler.java deleted file mode 100644 index 9c3be64e..00000000 --- a/bootx-platform/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/WeChatLoginHandler.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.bootx.platform.iam.core.auth.login; - -import cn.bootx.platform.iam.core.third.dao.UserThirdManager; -import cn.bootx.platform.iam.core.third.entity.UserThird; -import cn.bootx.platform.iam.core.third.service.UserTiredOperateService; -import cn.bootx.platform.iam.core.user.dao.UserInfoManager; -import cn.bootx.platform.iam.core.user.entity.UserInfo; -import cn.bootx.platform.starter.auth.authentication.OpenIdAuthentication; -import cn.bootx.platform.starter.auth.code.AuthLoginTypeCode; -import cn.bootx.platform.starter.auth.entity.AuthInfoResult; -import cn.bootx.platform.starter.auth.entity.LoginAuthContext; -import cn.bootx.platform.starter.auth.exception.LoginFailureException; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.bootx.platform.starter.wechat.core.login.service.WeChatQrLoginService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthUser; -import org.springframework.stereotype.Component; - -/** - * 微信登录(公众号) - * - * @author xxm - * @since 2021/8/2 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class WeChatLoginHandler implements OpenIdAuthentication { - - private final UserTiredOperateService userTiredOperateService; - - private final WeChatQrLoginService weChatQrLoginService; - - private final UserThirdManager userThirdManager; - - private final UserInfoManager userInfoManager; - - @Override - public String getLoginType() { - return AuthLoginTypeCode.WE_CHAT; - } - - /** - * 认证 - */ - @Override - public AuthInfoResult attemptAuthentication(LoginAuthContext context) { - String authCode = context.getRequest().getParameter(AuthLoginTypeCode.AUTH_CODE); - AuthUser authUser = this.getAuthUser(authCode, null); - - // 获取微信公众号关联的用户id - UserThird userThird = userThirdManager.findByField(UserThird::getWeChatId, authUser.getUuid()) - .orElseThrow(() -> new LoginFailureException("没有找到绑定的微信公众号用户")); - - // 获取用户信息 - UserInfo userInfo = userInfoManager.findById(userThird.getUserId()) - .orElseThrow(() -> new LoginFailureException("用户不存在")); - - return new AuthInfoResult().setUserDetail(userInfo.toUserDetail()).setId(userInfo.getId()); - } - - /** - * 获取关联的的第三方平台用户信息 - * @param authCode key 值, 可以用来拿用户信息 - */ - @Override - public AuthUser getAuthUser(String authCode, String state) { - // 根据微信二维码的值获取关联扫码的微信信息 - String uuid = weChatQrLoginService.getOpenId(authCode); - AuthUser authUser = new AuthUser(); - authUser.setNickname("未知"); - authUser.setUsername("未知"); - authUser.setAvatar("未知"); - authUser.setUuid(uuid); - weChatQrLoginService.clear(authCode); - return authUser; - } - - /** - * 绑定用户 - */ - @Override - public void bindUser(String authCode, String state) { - Long userId = SecurityUtil.getUserId(); - AuthUser authUser = this.getAuthUser(authCode, state); - userTiredOperateService.checkOpenIdBind(authUser.getUuid(), UserThird::getWeChatId); - userTiredOperateService.bindOpenId(userId, authUser.getUuid(), UserThird::setWeChatId); - userTiredOperateService.bindOpenInfo(userId, authUser, AuthLoginTypeCode.WE_CHAT); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/pom.xml b/bootx-platform/bootx-services/service-notice/pom.xml deleted file mode 100644 index 9b9c194a..00000000 --- a/bootx-platform/bootx-services/service-notice/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - bootx-services - cn.bootx.platform - 1.3.6.2 - - 4.0.0 - - service-notice - - - - - com.mysql - mysql-connector-j - runtime - - - - - com.baomidou - mybatis-plus-boot-starter - - - - - org.springframework.boot - spring-boot-starter-mail - - - - - org.apache.velocity - velocity-engine-core - - - - - cn.bootx.platform - common-starter-auth - - - - - cn.bootx.platform - service-baseapi - ${bootx-platform.version} - - - - - cn.bootx.platform - common-websocket - - - - - cn.bootx.platform - common-starter-dingtalk - - - - - cn.bootx.platform - common-starter-wechat - - - - - cn.bootx.platform - common-starter-wecom - - - - - org.dromara.sms4j - sms4j-spring-boot-starter - - - diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/NoticeApplication.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/NoticeApplication.java deleted file mode 100644 index 89ee0ab1..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/NoticeApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.bootx.platform.notice; - -import org.apache.ibatis.annotations.Mapper; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.context.annotation.ComponentScan; - -/** - * 通知中心 - * - * @author xxm - * @since 2021/8/5 - */ -@ComponentScan -@MapperScan(annotationClass = Mapper.class) -public class NoticeApplication { - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/MailCode.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/MailCode.java deleted file mode 100644 index 36546714..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/MailCode.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.notice.code; - -/** - * 邮箱常量 - * - * @author xxm - * @since 2021/8/5 - */ -public interface MailCode { - - /** - * 普通方式 - */ - Integer SECURITY_TYPE_PLAIN = 1; - - /** - * TLS方式 - */ - Integer SECURITY_TYPE_TLS = 2; - - /** - * SSL方式 - */ - Integer SECURITY_TYPE_SSL = 3; - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/MessageTemplateCode.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/MessageTemplateCode.java deleted file mode 100644 index a8e24118..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/MessageTemplateCode.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.bootx.platform.notice.code; - -/** - * 消息模板类型 - * - * @author xxm - * @since 2021/8/10 - */ -public interface MessageTemplateCode { - - /** 站内信 */ - String SITE = "site"; - - /** 钉钉 */ - String DING_TALK = "ding_talk"; - - /** 钉钉机器人 */ - String DING_TALK_ROBOT = "ding_talk_robot"; - - /** Email */ - String EMAIL = "email"; - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/NoticeCenterErrorCode.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/NoticeCenterErrorCode.java deleted file mode 100644 index 7cabadf0..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/NoticeCenterErrorCode.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.bootx.platform.notice.code; - -/** - * 通知中心错误码 - * - * @author xxm - * @since 2021/8/5 - */ -public interface NoticeCenterErrorCode { - - /** - * 邮箱配置编号已存在 - */ - int MAIL_CONFIG_CODE_ALREADY_EXISTED = 24010; - - /** - * 邮箱配置不存在 - */ - int MAIL_CONFIG_NOT_EXIST = 24011; - - /** - * 默认邮箱配置已存在 - */ - int DEFAULT_MAIL_CONFIG_ALREADY_EXISTED = 24012; - - /** - * 短信配置编号已存在 - */ - int SMS_CONFIG_CODE_ALREADY_EXISTED = 24020; - - /** - * 短信配置不存在 - */ - int SMS_CONFIG_NOT_EXIST = 24021; - - /** - * 默认短信配置已存在 - */ - int DEFAULT_SMS_CONFIG_ALREADY_EXISTED = 24022; - - /** - * Bandwidth 短信发送失败 - */ - int BANDWIDTH_SMS_SEND_ERROR = 24023; - - /** - * WeChat配置编号已存在 - */ - int WECHAT_CONFIG_CODE_ALREADY_EXISTED = 24030; - - /** - * WeChat配置不存在 - */ - int WECHAT_CONFIG_NOT_EXIST = 24031; - - /** - * 邮箱配置不存在 - */ - int MAIL_TEMPLATE_NOT_EXIST = 24041; - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/SiteMessageCode.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/SiteMessageCode.java deleted file mode 100644 index 44887d55..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/SiteMessageCode.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.bootx.platform.notice.code; - -/** - * 站内信编码 - * - * @author xxm - * @since 2022/8/14 - */ -public interface SiteMessageCode { - - /* 接收类型 */ - /** 指定用户 */ - String RECEIVE_USER = "user"; - - /** 全部用户 */ - String RECEIVE_ALL = "all"; - - /* 发布状态 */ - /** 草稿 */ - String STATE_DRAFT = "draft"; - - /** 已发送 */ - String STATE_SENT = "sent"; - - /** 撤销 */ - String STATE_CANCEL = "cancel"; - - /* 事件 */ - /** 消息更新 */ - String EVENT_MESSAGE_UPDATE = "notice_message_update"; - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/SmsChannelStatusCode.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/SmsChannelStatusCode.java deleted file mode 100644 index ae6a7b9d..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/code/SmsChannelStatusCode.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.notice.code; - -/** - * 短信渠道商配置状态 - * @author xxm - * @since 2023/8/3 - */ -public interface SmsChannelStatusCode { - /** 正常 */ - String NORMAL = "normal"; - - /** 停用 */ - String FORBIDDEN = "forbidden"; -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/MailConfigController.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/MailConfigController.java deleted file mode 100644 index 8160bd4a..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/MailConfigController.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.bootx.platform.notice.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.ValidationUtil; -import cn.bootx.platform.notice.core.mail.service.MailConfigService; -import cn.bootx.platform.notice.dto.mail.MailConfigDto; -import cn.bootx.platform.notice.param.mail.MailConfigParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - * @author xxm - * @since 2020/5/2 14:38 - */ -@Tag(name = "邮箱配置") -@RestController -@RequestMapping("/mail/config") -@AllArgsConstructor -public class MailConfigController { - - private final MailConfigService mailConfigService; - - @Operation(summary = "通过 id 获取指定邮箱配置") - @GetMapping("/findById") - public ResResult findById(Long id) { - MailConfigDto mailConfig = mailConfigService.findById(id); - return Res.ok(mailConfig); - } - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, MailConfigParam param) { - return Res.ok(mailConfigService.page(pageParam, param)); - } - - @Operation(summary = "增加新邮箱配置") - @PostMapping("/add") - public ResResult add(@RequestBody MailConfigParam param) { - ValidationUtil.validateParam(param); - MailConfigDto mailConfig = mailConfigService.add(param); - return Res.ok(mailConfig); - } - - @Operation(summary = "更新邮箱配置") - @PostMapping("/update") - public ResResult updateMailConfig(@RequestBody MailConfigParam param) { - ValidationUtil.validateParam(param); - MailConfigDto update = mailConfigService.update(param); - return Res.ok(update); - } - - @Operation(summary = "删除") - @DeleteMapping("/delete") - public ResResult delete(Long id) { - mailConfigService.delete(id); - return Res.ok(); - } - - @Operation(summary = "设置启用的邮箱配置") - @PostMapping("/setUpActivity") - public ResResult setUpActivity(Long id) { - mailConfigService.setUpActivity(id); - return Res.ok(); - } - - @Operation(summary = "编码是否被使用") - @GetMapping("/existsByCode") - public ResResult existsByCode(String code) { - return Res.ok(mailConfigService.existsByCode(code)); - } - - @Operation(summary = "编码是否被使用(不包含自己)") - @GetMapping("/existsByCodeNotId") - public ResResult existsByCode(String code, Long id) { - return Res.ok(mailConfigService.existsByCode(code, id)); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/MessageTemplateController.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/MessageTemplateController.java deleted file mode 100644 index 91351250..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/MessageTemplateController.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.bootx.platform.notice.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.notice.core.template.service.MessageTemplateService; -import cn.bootx.platform.notice.dto.template.MessageTemplateDto; -import cn.bootx.platform.notice.param.template.MessageTemplateParam; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Operation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - * 消息模板 - * - * @author xxm - * @since 2021/8/10 - */ -@Tag(name = "消息模板") -@RestController -@RequestMapping("/message/template") -@RequiredArgsConstructor -public class MessageTemplateController { - - private final MessageTemplateService messageTemplateService; - - @Operation(summary = "添加") - @PostMapping("/add") - public ResResult add(@RequestBody MessageTemplateParam param) { - return Res.ok(messageTemplateService.add(param)); - } - - @Operation(summary = "更新") - @PostMapping("/update") - public ResResult update(@RequestBody MessageTemplateParam param) { - return Res.ok(messageTemplateService.update(param)); - } - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, MessageTemplateParam query) { - return Res.ok(messageTemplateService.page(pageParam, query)); - } - - @Operation(summary = "获取详情") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(messageTemplateService.findById(id)); - } - - @Operation(summary = "删除") - @DeleteMapping("/delete") - public ResResult delete(Long id) { - messageTemplateService.delete(id); - return Res.ok(); - } - - @Operation(summary = "编码是否被使用") - @GetMapping("/existsByCode") - public ResResult existsByCode(String code) { - return Res.ok(messageTemplateService.existsByCode(code)); - } - - @Operation(summary = "编码是否被使用(不包含自己)") - @GetMapping("/existsByCodeNotId") - public ResResult existsByCode(String code, Long id) { - return Res.ok(messageTemplateService.existsByCode(code, id)); - } - - @Operation(summary = "渲染模板") - @PostMapping("/rendering") - public ResResult rendering(@RequestParam String code, @RequestBody Map paramMap) { - return Res.ok(messageTemplateService.rendering(code, paramMap)); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SiteMessageController.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SiteMessageController.java deleted file mode 100644 index 0c173b26..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SiteMessageController.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.bootx.platform.notice.controller; - -import cn.bootx.platform.common.core.annotation.IgnoreAuth; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.notice.core.site.domain.SiteMessageInfo; -import cn.bootx.platform.notice.core.site.service.SiteMessageService; -import cn.bootx.platform.notice.dto.site.SiteMessageDto; -import cn.bootx.platform.notice.param.site.SendSiteMessageParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * @author xxm - * @since 2021/8/8 - */ -@Tag(name = "站内信") -@RestController -@RequestMapping("/site/message") -@RequiredArgsConstructor -public class SiteMessageController { - - private final SiteMessageService siteMessageService; - - @Operation(summary = "保存站内信草稿") - @PostMapping("/saveOrUpdate") - public ResResult saveOrUpdate(@RequestBody SendSiteMessageParam param) { - siteMessageService.saveOrUpdate(param); - return Res.ok(); - } - - @Operation(summary = "发送站内信") - @PostMapping("/send") - public ResResult send(Long id) { - siteMessageService.send(id); - return Res.ok(); - } - - @Operation(summary = "消息详情") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(siteMessageService.findById(id)); - } - - @IgnoreAuth - @Operation(summary = "获取未读的接收消息条数") - @GetMapping("/countByReceiveNotRead") - public ResResult countByReceiveNotRead(SiteMessageInfo query) { - return Res.ok(siteMessageService.countByReceiveNotRead(query)); - } - - @IgnoreAuth - @Operation(summary = "接收消息分页") - @GetMapping("/pageByReceive") - public ResResult> pageByReceive(PageParam pageParam, SiteMessageInfo query) { - return Res.ok(siteMessageService.pageByReceive(pageParam, query)); - } - - @Operation(summary = "发送消息分页") - @GetMapping("/pageBySender") - public ResResult> pageBySender(PageParam pageParam, SiteMessageInfo query) { - return Res.ok(siteMessageService.pageBySender(pageParam, query)); - } - - @Operation(summary = "撤回消息") - @PostMapping("/cancel") - public ResResult cancel(Long id) { - siteMessageService.cancel(id); - return Res.ok(); - } - - @Operation(summary = "删除消息") - @DeleteMapping("/delete") - public ResResult delete(Long id) { - siteMessageService.delete(id); - return Res.ok(); - } - - @IgnoreAuth - @Operation(summary = "标为已读") - @PostMapping("/read") - public ResResult read(Long id) { - siteMessageService.read(id); - return Res.ok(); - } - - @IgnoreAuth - @Operation(summary = "小程序获取未读的接收消息标题列表") - @GetMapping("/listByReceiveNotRead") - public ResResult> listByReceiveNotRead(SiteMessageInfo query) { - return Res.ok(siteMessageService.listByReceiveNotRead(query)); - } -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SmsChannelConfigController.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SmsChannelConfigController.java deleted file mode 100644 index 5ed30259..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SmsChannelConfigController.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.bootx.platform.notice.controller; - -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.notice.core.sms.service.SmsChannelConfigService; -import cn.bootx.platform.notice.dto.sms.SmsChannelConfigDto; -import cn.bootx.platform.notice.param.sms.SmsChannelConfigParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -/** - * - * @author xxm - * @since 2023/8/5 - */ -@Tag(name = "短信渠道配置") -@RestController -@RequestMapping("/sms/config") -@RequiredArgsConstructor -public class SmsChannelConfigController { - private final SmsChannelConfigService configService; - - @Operation(summary = "添加") - @PostMapping(value = "/add") - public ResResult add(@RequestBody Map map) { - configService.add(map); - return Res.ok(); - } - - @Operation(summary = "修改") - @PostMapping(value = "/update") - public ResResult update(@RequestBody Map map) { - configService.update(map); - return Res.ok(); - } - - @Operation(summary = "通过ID查询") - @GetMapping(value = "/findById") - public ResResult findById(Long id) { - return Res.ok(configService.findById(id)); - } - - @Operation(summary = "通过Code查询") - @GetMapping(value = "/findByCode") - public ResResult findByCode(String code) { - return Res.ok(configService.findByCode(code)); - } - - @Operation(summary = "查询所有") - @GetMapping(value = "/findAll") - public ResResult> findAll() { - return Res.ok(configService.findAll()); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SmsTemplateController.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SmsTemplateController.java deleted file mode 100644 index 3f607530..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SmsTemplateController.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.bootx.platform.notice.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.notice.core.sms.service.SmsTemplateService; -import cn.bootx.platform.notice.dto.sms.SmsTemplateDto; -import cn.bootx.platform.notice.param.sms.SmsTemplateParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 短信模板配置 - * @author xxm - * @since 2023-08-03 - */ -@Tag(name ="短信模板配置") -@RestController -@RequestMapping("/sms/template") -@RequiredArgsConstructor -public class SmsTemplateController { - private final SmsTemplateService smsTemplateService; - - @Operation( summary = "添加") - @PostMapping(value = "/add") - public ResResult add(@RequestBody SmsTemplateParam param){ - smsTemplateService.add(param); - return Res.ok(); - } - - @Operation( summary = "修改") - @PostMapping(value = "/update") - public ResResult update(@RequestBody SmsTemplateParam param){ - smsTemplateService.update(param); - return Res.ok(); - } - - @Operation( summary = "删除") - @DeleteMapping(value = "/delete") - public ResResult delete(Long id){ - smsTemplateService.delete(id); - return Res.ok(); - } - - @Operation( summary = "通过ID查询") - @GetMapping(value = "/findById") - public ResResult findById(Long id){ - return Res.ok(smsTemplateService.findById(id)); - } - - @Operation( summary = "查询所有") - @GetMapping(value = "/findAll") - public ResResult> findAll(){ - return Res.ok(smsTemplateService.findAll()); - } - - @Operation( summary = "分页查询") - @GetMapping(value = "/page") - public ResResult> page(PageParam pageParam, SmsTemplateParam smsTemplateParam){ - return Res.ok(smsTemplateService.page(pageParam,smsTemplateParam)); - } -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/chat/DingChatNoticeParam.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/chat/DingChatNoticeParam.java deleted file mode 100644 index e900fc2e..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/chat/DingChatNoticeParam.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.chat; - -import cn.bootx.platform.starter.dingtalk.param.notice.ChatNotice; -import cn.bootx.platform.notice.core.dingtalk.entity.msg.DingMsg; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 企业群消息参数 - * - * @author xxm - * @since 2022/7/20 - */ -@Data -@Accessors(chain = true) -@Schema(title = "企业群消息参数") -public class DingChatNoticeParam { - - @Schema(description = "群Id") - private String chatId; - - @Schema(description = "钉钉消息内容") - private DingMsg dingMsg; - - public ChatNotice toDingChatNotice() { - return new ChatNotice().setChatId(chatId).setMsg(dingMsg.toDingMsg()); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/corp/DingCorpNoticeParam.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/corp/DingCorpNoticeParam.java deleted file mode 100644 index ad83dc65..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/corp/DingCorpNoticeParam.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.corp; - -import cn.bootx.platform.starter.dingtalk.param.notice.CorpNotice; -import cn.bootx.platform.notice.core.dingtalk.entity.msg.DingMsg; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 钉钉企业通知消息父类 - * - * @author xxm - * @since 2022/7/19 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉企业通知消息父类") -@AllArgsConstructor -@NoArgsConstructor -public class DingCorpNoticeParam { - - @Schema(description = "接收人配置") - private DingCorpNoticeReceive receive; - - @Schema(description = "钉钉消息内容") - private DingMsg dingMsg; - - /** - * 转换成钉钉消息发送参数 - */ - public CorpNotice toDingCorpNotice() { - return new CorpNotice().setToAllUser(receive.isToAllUser()) - .setDeptIdList(receive.getDeptIdList()) - .setUseridList(receive.getUseridList()) - .setMsg(dingMsg.toDingMsg()); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/corp/DingCorpNoticeReceive.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/corp/DingCorpNoticeReceive.java deleted file mode 100644 index b2f5b33a..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/corp/DingCorpNoticeReceive.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.corp; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * 企业通知接收人配置 - * - * @author xxm - * @since 2022/7/20 - */ -@Data -@Accessors(chain = true) -@Schema(title = "企业通知接收人配置") -public class DingCorpNoticeReceive { - - @Schema(description = "接收者的userid列表,最大用户列表长度100") - private List useridList; - - @Schema(description = "接收者的部门id列表,最大列表长度20") - private List deptIdList; - - @Schema(description = "是否发送给企业全部用户") - private boolean toAllUser; - - /** - * 发送给全部用户 - */ - public static DingCorpNoticeReceive toAll() { - return new DingCorpNoticeReceive().setToAllUser(true); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/corp/DingCorpNoticeUpdate.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/corp/DingCorpNoticeUpdate.java deleted file mode 100644 index 78e51a4b..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/corp/DingCorpNoticeUpdate.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.corp; - -import cn.bootx.platform.starter.dingtalk.param.notice.UpdateCorpNotice; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 企业通知(OA消息)更新 - * - * @author xxm - * @since 2022/7/20 - */ -@Data -@Accessors(chain = true) -@Schema(title = "企业通知(OA消息)更新") -public class DingCorpNoticeUpdate { - - @Schema(description = "发送消息时使用的微应用的AgentID") - private Long taskId; - - @Schema(description = "状态栏值") - private String statusValue; - - @Schema(description = "状态栏背景色,推荐0xFF加六位颜色值") - private String statusBg; - - /** - * 转换为钉钉参数对象 - */ - public UpdateCorpNotice toDingUpdateCorpNotice() { - return new UpdateCorpNotice().setTaskId(taskId).setStatusValue(statusValue).setStatusBg(statusBg); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingActionCardMsg.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingActionCardMsg.java deleted file mode 100644 index c5638a13..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingActionCardMsg.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.msg; - -import cn.bootx.platform.common.core.util.CollUtil; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.ActionCardMsg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 钉钉卡片工作通知消息 - * - * @author xxm - * @since 2022/7/20 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉卡片工作通知消息") -public class DingActionCardMsg implements DingMsg { - - @Schema(description = "透出到会话列表和通知的文案") - private String title; - - @Schema(description = "消息内容") - private String markdown; - - @Schema(description = "标题") - private String singleTitle; - - @Schema(description = "消息点击链接地址") - private String singleUrl; - - @Schema(description = "使用独立跳转ActionCard样式时的按钮排列方式(1竖直排列/2横向排列)") - private String btnOrientation; - - @Schema(description = "独立跳转ActionCard样式时的按钮列表") - private List orientationBtnList; - - @Data - @Accessors(chain = true) - @Schema(title = "独立跳转ActionCard样式时的按钮列表") - public static class OrientationBtn { - - @Schema(description = "按钮的标题") - private String title; - - @JsonProperty("action_url") - @Schema(description = "跳转链接") - private String actionUrl; - - } - - /** - * 转换成钉钉消息 - */ - public Msg toDingMsg() { - ActionCardMsg.ActionCard actionCard = new ActionCardMsg.ActionCard().setTitle(title) - .setMarkdown(markdown) - .setSingleTitle(singleTitle) - .setSingleUrl(singleUrl) - .setBtnOrientation(btnOrientation); - if (CollUtil.isNotEmpty(orientationBtnList)) { - List btnJsons = orientationBtnList.stream() - .map(o -> new ActionCardMsg.ActionCard.BtnJson().setTitle(o.title).setActionUrl(o.actionUrl)) - .collect(Collectors.toList()); - actionCard.setBtnJsonList(btnJsons); - } - - return new ActionCardMsg().setActionCard(actionCard); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingFileMsg.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingFileMsg.java deleted file mode 100644 index 50dca7a7..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingFileMsg.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.msg; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.FileMsg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 钉钉文件工作通知消息 - * - * @author xxm - * @since 2022/7/19 - */ -@Data -@Accessors(chain = true) -@AllArgsConstructor -@NoArgsConstructor -@Schema(title = "钉钉图片工作通知消息") -public class DingFileMsg implements DingMsg { - - @Schema(description = "媒体文件id") - private String mediaId; - - /** - * 转换成钉钉消息 - */ - @Override - public Msg toDingMsg() { - return new FileMsg(mediaId); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingImageMsg.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingImageMsg.java deleted file mode 100644 index 9d88fcdc..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingImageMsg.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.msg; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.ImageMsg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.RequiredArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 钉钉图片工作通知消息 - * - * @author xxm - * @since 2022/7/19 - */ -@Data -@Accessors(chain = true) -@AllArgsConstructor -@RequiredArgsConstructor -@Schema(title = "钉钉图片工作通知消息") -public class DingImageMsg implements DingMsg { - - @Schema(description = "媒体文件id") - private String mediaId; - - /** - * 转换成钉钉消息 - */ - @Override - public Msg toDingMsg() { - return new ImageMsg(mediaId); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingLinkMsg.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingLinkMsg.java deleted file mode 100644 index 3bcb6bac..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingLinkMsg.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.msg; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.LinkMsg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 钉钉链接信息 - * - * @author xxm - * @since 2022/7/19 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉链接信息") -public class DingLinkMsg implements DingMsg { - - @Schema(description = "标题") - private String title; - - @Schema(description = "内容") - private String text; - - @Schema(description = "点击消息跳转的URL") - private String messageUrl; - - @Schema(description = "图片URL") - private String picUrl; - - /** - * 转换成钉钉消息 - */ - @Override - public Msg toDingMsg() { - return new LinkMsg(title, text, messageUrl, picUrl); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingMarkDownMsg.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingMarkDownMsg.java deleted file mode 100644 index 36bc79ec..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingMarkDownMsg.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.msg; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.MarkdownMsg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2022/7/20 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉MarkDown工作通知消息") -public class DingMarkDownMsg implements DingMsg { - - @Schema(description = "标题") - private String title; - - @Schema(description = "内容") - private String text; - - @Override - public Msg toDingMsg() { - return new MarkdownMsg(title, text); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingMsg.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingMsg.java deleted file mode 100644 index 2c85da39..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingMsg.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.msg; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; - -/** - * 钉钉消息接口 - * - * @author xxm - * @since 2022/7/20 - */ -public interface DingMsg { - - /** - * 转换成钉钉消息 - */ - Msg toDingMsg(); - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingOaMsg.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingOaMsg.java deleted file mode 100644 index 24e582f1..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingOaMsg.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.msg; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.OaMsg; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2022/7/19 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钉钉OA消息") -public class DingOaMsg implements DingMsg { - - @JsonProperty("message_url") - @Schema(description = "消息点击链接地址") - private String messageUrl; - - @JsonProperty("pc_message_url") - @Schema(description = "PC端点击消息时跳转到的地址") - private String pcMessageUrl; - - @Schema(description = "消息头部内容") - private OaMsg.Oa.Head head; - - @Schema(description = "消息体") - private OaMsg.Oa.Body body; - - @JsonProperty("status_bar") - @Schema(description = "消息状态栏") - private OaMsg.Oa.StatusBar statusBar; - - /** - * 转换成钉钉消息 - */ - @Override - public Msg toDingMsg() { - OaMsg.Oa oa = new OaMsg.Oa().setMessageUrl(messageUrl) - .setPcMessageUrl(pcMessageUrl) - .setHead(head) - .setBody(body) - .setStatusBar(statusBar); - - return new OaMsg(oa); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingTextMsg.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingTextMsg.java deleted file mode 100644 index c0956a14..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingTextMsg.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.msg; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.TextMsg; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 钉钉工作通知消息 - * - * @author xxm - * @since 2022/7/19 - */ -@Data -@Accessors(chain = true) -@NoArgsConstructor -@AllArgsConstructor -@Schema(title = "钉钉文本工作通知消息") -public class DingTextMsg implements DingMsg { - - @Schema(description = "文本内容") - private String content; - - /** - * 转换成钉钉消息 - */ - public Msg toDingMsg() { - return new TextMsg(content); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingVoiceMsg.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingVoiceMsg.java deleted file mode 100644 index 879b95cb..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/entity/msg/DingVoiceMsg.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.entity.msg; - -import cn.bootx.platform.starter.dingtalk.param.notice.msg.Msg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.VoiceMsg; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 声音消息 - * - * @author xxm - * @since 2022/7/19 - */ -@Data -@Accessors(chain = true) -@AllArgsConstructor -@NoArgsConstructor -@Schema(title = "声音工作通知消息") -public class DingVoiceMsg implements DingMsg { - - @Schema(description = "媒体文件id") - private String mediaId; - - @Schema(description = "音频时长") - private String duration; - - /** - * 转换成钉钉消息 - */ - @Override - public Msg toDingMsg() { - return new VoiceMsg(mediaId, duration); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/service/DingRobotNoticeSenderImpl.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/service/DingRobotNoticeSenderImpl.java deleted file mode 100644 index f5adfe92..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/service/DingRobotNoticeSenderImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.service; - -import cn.bootx.platform.notice.service.DingRobotNoticeSender; -import cn.bootx.platform.starter.dingtalk.core.robot.service.DingRobotSendService; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.LinkMsg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.MarkdownMsg; -import cn.bootx.platform.starter.dingtalk.param.notice.msg.TextMsg; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 钉钉机器人消息 - * - * @author xxm - * @since 2022/7/19 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class DingRobotNoticeSenderImpl implements DingRobotNoticeSender { - - private final DingRobotSendService dingRobotSendService; - - @Override - public void sendSimpleText(String code, String msg) { - TextMsg dingTalkTextNotice = new TextMsg(msg); - dingRobotSendService.sendNotice(code, dingTalkTextNotice); - } - - @Override - public void sendText(String code, TextMsg dingTalkTextNotice) { - dingRobotSendService.sendNotice(code, dingTalkTextNotice); - } - - @Override - public void sendLink(String code, LinkMsg notice) { - dingRobotSendService.sendNotice(code, notice); - } - - @Override - public void sendMarkdown(String code, MarkdownMsg notice) { - dingRobotSendService.sendNotice(code, notice); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/service/DingTalkNoticeSenderImpl.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/service/DingTalkNoticeSenderImpl.java deleted file mode 100644 index 692a4246..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/dingtalk/service/DingTalkNoticeSenderImpl.java +++ /dev/null @@ -1,315 +0,0 @@ -package cn.bootx.platform.notice.core.dingtalk.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.notice.core.dingtalk.entity.msg.*; -import cn.bootx.platform.notice.service.DingTalkNoticeSender; -import cn.bootx.platform.starter.dingtalk.code.DingTalkCode; -import cn.bootx.platform.starter.dingtalk.configuration.DingTalkProperties; -import cn.bootx.platform.starter.dingtalk.core.base.result.DingTalkResult; -import cn.bootx.platform.starter.dingtalk.core.media.service.DingMediaService; -import cn.bootx.platform.starter.dingtalk.core.notice.result.ChatNoticeResult; -import cn.bootx.platform.starter.dingtalk.core.notice.result.CorpNoticeResult; -import cn.bootx.platform.starter.dingtalk.core.notice.service.DingNoticeService; -import cn.bootx.platform.starter.dingtalk.param.notice.ChatNotice; -import cn.bootx.platform.starter.dingtalk.param.notice.CorpNotice; -import cn.bootx.platform.starter.dingtalk.param.notice.RecallCorpNotice; -import cn.bootx.platform.starter.dingtalk.param.notice.UpdateCorpNotice; -import cn.bootx.platform.notice.core.dingtalk.entity.corp.DingCorpNoticeParam; -import cn.bootx.platform.notice.core.dingtalk.entity.corp.DingCorpNoticeReceive; -import cn.bootx.platform.notice.core.dingtalk.entity.corp.DingCorpNoticeUpdate; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.io.InputStream; -import java.util.Objects; - -/** - * 钉钉消息通知 - * - * @author xxm - * @since 2022/7/16 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class DingTalkNoticeSenderImpl implements DingTalkNoticeSender { - - private final DingNoticeService dingNoticeService; - - private final DingMediaService dingMediaService; - - private final DingTalkProperties dingTalkProperties; - - /** - * 发送文本消息 - * @return 发布消息任务ID - */ - @Override - public Long sendTextCorpNotice(DingTextMsg dingTextMsg, DingCorpNoticeReceive receive) { - return this.sendCorpNotice(dingTextMsg, receive); - } - - /** - * 发送图片消息 - * @return 发布消息任务ID - */ - @Override - public Long sendImageCorpNotice(DingImageMsg dingImageMsg, DingCorpNoticeReceive receive) { - return this.sendCorpNotice(dingImageMsg, receive); - } - - /** - * 发送图片消息 (文件方式) - * @return 发布消息任务ID - */ - @Override - public Long sendImageCorpNotice(InputStream inputStream, DingCorpNoticeReceive receive) { - String mediaId = dingMediaService.uploadMedia(inputStream, DingTalkCode.MEDIA_IMAGE); - DingImageMsg dingImageMsg = new DingImageMsg(mediaId); - return this.sendCorpNotice(dingImageMsg, receive); - } - - /** - * 发送图片消息 (文件方式) - * @return 发布消息任务ID - */ - @Override - public Long sendImageCorpNotice(InputStream inputStream, String filename, DingCorpNoticeReceive receive) { - String mediaId = dingMediaService.uploadMedia(inputStream, filename, DingTalkCode.MEDIA_IMAGE); - DingImageMsg dingImageMsg = new DingImageMsg(mediaId); - return this.sendCorpNotice(dingImageMsg, receive); - } - - /** - * 发送语音消息 - * @return 发布消息任务ID - */ - @Override - public Long sendVoiceCorpNotice(DingVoiceMsg dingVoiceMsg, DingCorpNoticeReceive receive) { - return this.sendCorpNotice(dingVoiceMsg, receive); - } - - /** - * 发送语音消息 (文件) - * @return 发布消息任务ID - */ - @Override - public Long sendVoiceCorpNotice(InputStream inputStream, DingCorpNoticeReceive receive) { - String mediaId = dingMediaService.uploadMedia(inputStream, DingTalkCode.MEDIA_VOICE); - DingVoiceMsg dingVoiceMsg = new DingVoiceMsg(mediaId, "10"); - return this.sendCorpNotice(dingVoiceMsg, receive); - } - - /** - * 发送语音消息 (文件) - * @return 发布消息任务ID - */ - @Override - public Long sendVoiceCorpNotice(InputStream inputStream, String filename, DingCorpNoticeReceive receive) { - String mediaId = dingMediaService.uploadMedia(inputStream, filename, DingTalkCode.MEDIA_VOICE); - DingVoiceMsg dingVoiceMsg = new DingVoiceMsg(mediaId, "10"); - return this.sendCorpNotice(dingVoiceMsg, receive); - } - - /** - * 发送文件消息 - * @return 发布消息任务ID - */ - @Override - public Long sendFileCorpNotice(DingFileMsg dingFileMsg, DingCorpNoticeReceive receive) { - return this.sendCorpNotice(dingFileMsg, receive); - } - - /** - * 发送文件消息(文件) - * @return 发布消息任务ID - */ - @Override - public Long sendFileCorpNotice(InputStream inputStream, DingCorpNoticeReceive receive) { - String mediaId = dingMediaService.uploadMedia(inputStream, DingTalkCode.MEDIA_FILE); - DingFileMsg dingFileMsg = new DingFileMsg(mediaId); - return this.sendCorpNotice(dingFileMsg, receive); - } - - /** - * 发送文件消息(文件) - * @return 发布消息任务ID - */ - @Override - public Long sendFileCorpNotice(InputStream inputStream, String filename, DingCorpNoticeReceive receive) { - String mediaId = dingMediaService.uploadMedia(inputStream, filename, DingTalkCode.MEDIA_FILE); - DingFileMsg dingFileMsg = new DingFileMsg(mediaId); - return this.sendCorpNotice(dingFileMsg, receive); - } - - /** - * 发送链接消息 - * @return 发布消息任务ID - */ - @Override - public Long sendLinkCorpNotice(DingLinkMsg dingLinkMsg, DingCorpNoticeReceive receive) { - return this.sendCorpNotice(dingLinkMsg, receive); - } - - /** - * 发送OA消息 - * @return 发布消息任务ID - */ - @Override - public Long sendOaCorpNotice(DingOaMsg dingOaMsg, DingCorpNoticeReceive receive) { - return this.sendCorpNotice(dingOaMsg, receive); - } - - /** - * 发送markdown消息 - */ - @Override - public Long sendMarkDownCorpNotice(DingMarkDownMsg dingMarkDownMsg, DingCorpNoticeReceive receive) { - return this.sendCorpNotice(dingMarkDownMsg, receive); - } - - /** - * 发送卡片消息 - */ - @Override - public Long sendActionCardCorpNotice(DingActionCardMsg dingActionCardMsg, DingCorpNoticeReceive receive) { - return this.sendCorpNotice(dingActionCardMsg, receive); - } - - /** - * 返回任务id(OA消息更新状态使用) - */ - private Long sendCorpNotice(DingMsg dingMsg, DingCorpNoticeReceive receive) { - DingCorpNoticeParam dingCorpNoticeParam = new DingCorpNoticeParam(receive, dingMsg); - CorpNotice corpNotice = dingCorpNoticeParam.toDingCorpNotice(); - corpNotice.setAgentId(dingTalkProperties.getAgentId()); - CorpNoticeResult result = dingNoticeService.sendCorpNotice(corpNotice); - - if (!Objects.equals(result.getCode(), DingTalkCode.SUCCESS_CODE)) { - throw new BizException(result.getMsg()); - } - return result.getTaskId(); - } - - /** - * 更新OA工作通知消息 - */ - @Override - public void updateOaCorpNotice(DingCorpNoticeUpdate updateCorpNotice) { - UpdateCorpNotice dingUpdateCorpNotice = updateCorpNotice.toDingUpdateCorpNotice(); - dingUpdateCorpNotice.setAgentId(dingTalkProperties.getAgentId()); - CorpNoticeResult result = dingNoticeService.updateCorpNotice(dingUpdateCorpNotice); - if (!Objects.equals(result.getCode(), DingTalkCode.SUCCESS_CODE)) { - throw new BizException(result.getMsg()); - } - } - - /** - * 撤回工作通知消息 - */ - @Override - public void recallCorpNotice(Long msgTaskId) { - RecallCorpNotice recallCorpNotice = new RecallCorpNotice(dingTalkProperties.getAgentId(), msgTaskId); - DingTalkResult> result = dingNoticeService.recallCorpNotice(recallCorpNotice); - if (!Objects.equals(result.getCode(), DingTalkCode.SUCCESS_CODE)) { - throw new BizException(result.getMsg()); - } - } - - /** - * 发送文本企业群消息 - * @param chatId 群Id - * @return 发布企业群消息ID - */ - @Override - public String sendTextChatNotice(DingTextMsg dingTextMsg, String chatId) { - return this.sendChatNotice(dingTextMsg, chatId); - } - - /** - * 发送图片企业群消息 - * @param chatId 群Id - * @return 发布企业群消息ID - */ - @Override - public String sendImageChatNotice(DingImageMsg dingImageMsg, String chatId) { - return this.sendChatNotice(dingImageMsg, chatId); - } - - /** - * 发送语音企业群消息 - * @param chatId 群Id - * @return 发布企业群消息ID - */ - @Override - public String sendVoiceChatNotice(DingVoiceMsg dingVoiceMsg, String chatId) { - return this.sendChatNotice(dingVoiceMsg, chatId); - } - - /** - * 发送文件企业群消息 - * @param chatId 群Id - * @return 发布企业群消息ID - */ - @Override - public String sendFileChatNotice(DingFileMsg dingFileMsg, String chatId) { - return this.sendChatNotice(dingFileMsg, chatId); - } - - /** - * 发送链接企业群消息 - * @param chatId 群Id - * @return 发布企业群消息ID - */ - @Override - public String sendLinkChatNotice(DingLinkMsg dingLinkMsg, String chatId) { - return this.sendChatNotice(dingLinkMsg, chatId); - } - - /** - * 发送OA企业群消息 - * @param chatId 群Id - * @return 发布企业群消息ID - */ - @Override - public String sendOaChatNotice(DingOaMsg dingOaMsg, String chatId) { - return this.sendChatNotice(dingOaMsg, chatId); - } - - /** - * 发送markdown企业群消息 - * @param chatId 群Id - * @return 发布企业群消息ID - */ - @Override - public String sendMarkDownChatNotice(DingMarkDownMsg dingMarkDownMsg, String chatId) { - return this.sendChatNotice(dingMarkDownMsg, chatId); - } - - /** - * 发送卡片企业群消息 - * @param chatId 群Id - * @return 发布企业群消息ID - */ - @Override - public String sendActionCardChatNotice(DingActionCardMsg dingActionCardMsg, String chatId) { - return this.sendChatNotice(dingActionCardMsg, chatId); - } - - /** - * 发送企业群消息 - * @param chatId 群Id - * @return 发布企业群消息ID - */ - private String sendChatNotice(DingMsg dingMsg, String chatId) { - - ChatNotice chatNotice = new ChatNotice(chatId, dingMsg.toDingMsg()); - ChatNoticeResult result = dingNoticeService.sendChatNotice(chatNotice); - if (!Objects.equals(result.getCode(), DingTalkCode.SUCCESS_CODE)) { - throw new BizException(result.getMsg()); - } - return result.getMessageId(); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/convert/MailConvert.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/convert/MailConvert.java deleted file mode 100644 index 6cb7e1e0..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/convert/MailConvert.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.notice.core.mail.convert; - -import cn.bootx.platform.notice.param.mail.MailConfigParam; -import cn.bootx.platform.notice.core.mail.entity.MailConfig; -import cn.bootx.platform.notice.dto.mail.MailConfigDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 钉钉相关类转换 - * - * @author xxm - * @since 2021/8/5 - */ -@Mapper -public interface MailConvert { - - MailConvert CONVERT = Mappers.getMapper(MailConvert.class); - - MailConfig convert(MailConfigDto in); - - MailConfig convert(MailConfigParam in); - - MailConfigDto convert(MailConfig in); - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/dao/MailConfigManager.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/dao/MailConfigManager.java deleted file mode 100644 index 8fa42966..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/dao/MailConfigManager.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bootx.platform.notice.core.mail.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.notice.core.mail.entity.MailConfig; -import cn.bootx.platform.notice.param.mail.MailConfigParam; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * @author xxm - * @since 2020/4/8 13:27 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class MailConfigManager extends BaseManager { - - public Optional findByActivity() { - return findByField(MailConfig::getActivity, Boolean.TRUE); - } - - public Optional findByCode(String code) { - return findByField(MailConfig::getCode, code); - } - - public Page page(PageParam pageParam, MailConfigParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, MailConfig.class); - return this.lambdaQuery() - .orderByDesc(MpIdEntity::getId) - .like(StrUtil.isNotBlank(param.getCode()), MailConfig::getCode, param.getCode()) - .like(StrUtil.isNotBlank(param.getName()), MailConfig::getName, param.getName()) - .page(mpPage); - } - - public boolean existsByCode(String code) { - return existedByField(MailConfig::getCode, code); - } - - public boolean existsByCode(String code, Long id) { - return existedByField(MailConfig::getCode, code, id); - } - - public void removeAllActivity() { - lambdaUpdate().eq(MailConfig::getActivity, Boolean.TRUE).set(MailConfig::getActivity, Boolean.FALSE).update(); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/dao/MailConfigMapper.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/dao/MailConfigMapper.java deleted file mode 100644 index 614327ef..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/dao/MailConfigMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.notice.core.mail.dao; - -import cn.bootx.platform.notice.core.mail.entity.MailConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 邮件[配置 - * - * @author xxm - * @since 2020/4/8 13:22 - */ -@Mapper -public interface MailConfigMapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/entity/MailConfig.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/entity/MailConfig.java deleted file mode 100644 index 8f71bc3e..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/entity/MailConfig.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.bootx.platform.notice.core.mail.entity; - -import cn.bootx.platform.common.core.annotation.EncryptionField; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.notice.core.mail.convert.MailConvert; -import cn.bootx.platform.notice.param.mail.MailConfigParam; -import cn.bootx.platform.notice.dto.mail.MailConfigDto; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 邮件配置 - * - * @author xxm - * @since 2020/4/8 11:14 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) -@TableName("notice_mail_config") -public class MailConfig extends MpBaseEntity implements EntityBaseFunction { - - /** 编号 */ - private String code; - - /** 名称 */ - private String name; - - /** 邮箱服务器 host */ - private String host; - - /** 邮箱服务器 端口 */ - private Integer port; - - /** 邮箱服务器 账号 */ - @EncryptionField - private String username; - - /** 邮箱服务器 密码 */ - @EncryptionField - private String password; - - /** 邮箱服务器 发送人名称 */ - private String sender; - - /** 邮箱服务器 发送人邮箱账号 */ - @TableField("from_") - private String from; - - /** 是否默认配置 */ - private Boolean activity; - - /** 安全方式 */ - private Integer securityType; - - public static MailConfig init(MailConfigParam in) { - return MailConvert.CONVERT.convert(in); - } - - @Override - public MailConfigDto toDto() { - return MailConvert.CONVERT.convert(this); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/service/EmailNoticeSenderImpl.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/service/EmailNoticeSenderImpl.java deleted file mode 100644 index 9d49534a..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/service/EmailNoticeSenderImpl.java +++ /dev/null @@ -1,242 +0,0 @@ -package cn.bootx.platform.notice.core.mail.service; - -import cn.bootx.platform.notice.exception.MailConfigNotExistException; -import cn.bootx.platform.notice.service.EmailNoticeSender; -import cn.bootx.platform.notice.code.MailCode; -import cn.bootx.platform.notice.dto.mail.MailConfigDto; -import cn.bootx.platform.notice.dto.mail.MailFileParam; -import cn.bootx.platform.notice.dto.mail.SendMailParam; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.google.common.collect.Sets; -import lombok.AllArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.mail.javamail.JavaMailSenderImpl; -import org.springframework.mail.javamail.MimeMessageHelper; -import org.springframework.stereotype.Service; - -import javax.activation.DataHandler; -import javax.activation.DataSource; -import javax.mail.BodyPart; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import javax.mail.util.ByteArrayDataSource; -import java.io.UnsupportedEncodingException; -import java.util.*; - -/** - * 邮件发送服务 - * - * @author xxm - * @since 2020/5/2 16:06 - */ -@Slf4j -@Service -@AllArgsConstructor -public class EmailNoticeSenderImpl implements EmailNoticeSender { - - /** - * 默认 MIME Type - */ - private static final String MIME_TYPE_DEFAULT = "text/html; charset=utf-8"; - - private final MailConfigService mailConfigService; - - /** - * 简单邮件发送 - * @param email 邮件地址 - * @param subject 邮件标题 - * @param msg 邮件消息 - */ - @Override - public void sentSimpleMail(String email, String subject, String msg) { - SendMailParam mailParam = new SendMailParam(); - mailParam.setTo(Collections.singletonList(email)); - mailParam.setSubject(subject); - mailParam.setMessage(msg); - SpringUtil.getBean(getClass()).sendMail(mailParam); - } - - /** - * 标准邮件发送 - */ - @SneakyThrows - @Override - public void sendMail(SendMailParam mailParam) { - log.info("开始发送邮件"); - MailConfigDto mailConfig = this.getMailConfig(mailParam.getConfigCode()); - JavaMailSenderImpl mailSender = this.getMailSender(mailConfig); - List mimeMessageList = new ArrayList<>(); - - if (CollUtil.isEmpty(mailParam.getTo())) { - return; - } - // 获取to cc bcc 中所有允许发送的receiver - HashSet allReceivers = Sets.newHashSet(mailParam.getTo()); - // 密送 - if (CollUtil.isNotEmpty(mailParam.getBccList())) { - allReceivers.addAll(mailParam.getBccList()); - } - // 抄送 - if (CollUtil.isNotEmpty(mailParam.getCcList())) { - allReceivers.addAll(mailParam.getCcList()); - } - // 设置接收人 - Set receivers = Sets.intersection(allReceivers, new HashSet<>(mailParam.getTo())); - if (CollUtil.isEmpty(receivers)) { - return; - } - // 是否单条发送(拆分收件人) - if (mailParam.getSingleSend()) { - for (String to : receivers) { - this.buildMailParam(mailParam, mailConfig, mailSender, mimeMessageList, allReceivers, to); - } - } - else { - this.buildMailParam(mailParam, mailConfig, mailSender, mimeMessageList, allReceivers, - ArrayUtil.toArray(receivers, String.class)); - } - - // 调用发送 - mailSender.send(ArrayUtil.toArray(mimeMessageList, MimeMessage.class)); - log.info("SendMail结束"); - } - - /** - * 构建邮件参数 - * @param mailParam 发邮件的参数 - * @param mailConfig 邮箱配置 - * @param mailSender 邮件发送器 - * @param mimeMessageList 多媒体信息 - * @param allReceivers 接收人 - * @param to 发送人 - * @throws MessagingException 消息异常 - * @throws UnsupportedEncodingException 不支持的编码异常 - */ - private void buildMailParam(SendMailParam mailParam, MailConfigDto mailConfig, JavaMailSenderImpl mailSender, - List mimeMessageList, Set allReceivers, String... to) - throws MessagingException, UnsupportedEncodingException { - MimeMessage mimeMessage = mailSender.createMimeMessage(); - MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true); - mimeMessageHelper.setFrom(new InternetAddress(mailConfig.getFrom(), mailConfig.getSender())); - mimeMessageHelper.setTo(to); - mimeMessageHelper.setSubject(mailParam.getSubject()); - - // 处理抄送 - List ccList = mailParam.getCcList(); - if (CollUtil.isNotEmpty(ccList)) { - Set ccReceivers = Sets.intersection(allReceivers, Sets.newHashSet(ccList)); - if (!CollectionUtil.isEmpty(ccReceivers)) { - String[] ccReceiverArray = new String[ccReceivers.size()]; - ccReceivers.toArray(ccReceiverArray); - mimeMessageHelper.setCc(ccReceiverArray); - } - } - - // 处理密送 - List bccList = mailParam.getBccList(); - if (CollUtil.isNotEmpty(bccList)) { - Set bccReceivers = Sets.intersection(allReceivers, Sets.newHashSet(mailParam.getBccList())); - if (!CollectionUtil.isEmpty(bccReceivers)) { - String[] bccReceiverArray = new String[bccReceivers.size()]; - bccReceivers.toArray(bccReceiverArray); - mimeMessageHelper.setBcc(ArrayUtil.toArray(bccList, String.class)); - } - } - - // 创建一个消息部分来代表正文 - BodyPart messageBodyPart = new MimeBodyPart(); - messageBodyPart.setContent(mailParam.getMessage(), MIME_TYPE_DEFAULT); - // 使用MimeMultipart,因为我们需要处理文件附件 - Multipart multipart = new MimeMultipart(); - - // 判断是否包含附件 - if (mailParam.isSendAttachment()) { - this.buildAttachmentParam(mailParam, multipart); - } - - // 添加正文 - multipart.addBodyPart(messageBodyPart); - // 将所有消息部分放入消息中 - mimeMessage.setContent(multipart); - mimeMessageList.add(mimeMessage); - - } - - /** - * 构建附件参数 - */ - private void buildAttachmentParam(SendMailParam mailParam, Multipart multipart) throws MessagingException { - // 获得附件集合 进行发送附件 - List files = mailParam.getFileList(); - if (!CollectionUtil.isEmpty(files)) { - for (MailFileParam f : files) { - - MimeBodyPart mimeBodyPart = new MimeBodyPart(); - // 附件数据源:根据文件字节放入数据源 - DataSource dss = new ByteArrayDataSource(f.getFileInputStream(), "application/png"); - // 数据处理器 - DataHandler dh = new DataHandler(dss); - mimeBodyPart.setFileName(f.getFileName()); - mimeBodyPart.setDataHandler(dh); - multipart.addBodyPart(mimeBodyPart); - } - } - } - - /** - * 获取邮件配置 - */ - private MailConfigDto getMailConfig(String configCode) { - MailConfigDto mailConfig; - - // 无code获取默认 - if (StrUtil.isEmpty(configCode)) { - mailConfig = mailConfigService.getDefaultConfig(); - } - else { - mailConfig = mailConfigService.getByCode(configCode); - } - if (mailConfig == null) { - throw new MailConfigNotExistException(); - } - return mailConfig; - } - - /** - * 获取邮件发件器 - */ - private JavaMailSenderImpl getMailSender(MailConfigDto mailConfig) { - JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); - mailSender.setHost(mailConfig.getHost()); - mailSender.setPort(mailConfig.getPort()); - mailSender.setUsername(mailConfig.getUsername()); - mailSender.setPassword(mailConfig.getPassword()); - - Properties props = new Properties(); - // 判断是否是TLS - if (Objects.equals(Optional.ofNullable(mailConfig.getSecurityType()).orElse(0), MailCode.SECURITY_TYPE_TLS)) { - props.setProperty("mail.smtp.starttls.enable", "true"); - } - else if (Objects.equals(Optional.ofNullable(mailConfig.getSecurityType()).orElse(0), - MailCode.SECURITY_TYPE_SSL)) { - props.setProperty("mail.smtp.starttls.enable", "true"); - props.setProperty("mail.smtp.auth", "true"); - props.setProperty("mail.smtp.socketFactory.port", mailConfig.getPort() + ""); - props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); - props.setProperty("mail.smtp.socketFactory.fallback", "false"); - } - mailSender.setJavaMailProperties(props); - - return mailSender; - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/service/MailConfigService.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/service/MailConfigService.java deleted file mode 100644 index ca7bf74d..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/mail/service/MailConfigService.java +++ /dev/null @@ -1,119 +0,0 @@ -package cn.bootx.platform.notice.core.mail.service; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.ResultConvertUtil; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.notice.exception.MailConfigCodeAlreadyExistedException; -import cn.bootx.platform.notice.exception.MailConfigNotExistException; -import cn.bootx.platform.notice.param.mail.MailConfigParam; -import cn.bootx.platform.notice.core.mail.dao.MailConfigManager; -import cn.bootx.platform.notice.core.mail.entity.MailConfig; -import cn.bootx.platform.notice.dto.mail.MailConfigDto; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -/** - * 邮件配置 - * - * @author xxm - * @since 2020/4/8 13:29 - */ -@Service -@AllArgsConstructor -public class MailConfigService { - - private final MailConfigManager mailConfigManager; - - /** - * 添加新邮箱配置 - */ - @Transactional(rollbackFor = Exception.class) - public MailConfigDto add(MailConfigParam param) { - if (mailConfigManager.existsByCode(param.getCode())) { - throw new MailConfigCodeAlreadyExistedException(); - } - - MailConfig mailConfig = MailConfig.init(param); - return mailConfigManager.save(mailConfig).toDto(); - } - - /** - * 更新邮箱配置 - */ - @Transactional(rollbackFor = Exception.class) - public MailConfigDto update(MailConfigParam param) { - MailConfig mailConfig = mailConfigManager.findById(param.getId()).orElseThrow(MailConfigNotExistException::new); - - if (mailConfigManager.existsByCode(param.getCode(), param.getId())) { - throw new MailConfigCodeAlreadyExistedException(); - } - - BeanUtil.copyProperties(param, mailConfig, CopyOptions.create().ignoreNullValue()); - return mailConfigManager.updateById(mailConfig).toDto(); - } - - /** - * 根据 id 获取相应的邮箱配置 - */ - public MailConfigDto findById(Long id) { - return ResultConvertUtil.dtoConvert(mailConfigManager.findById(id)); - } - - /** - * 获取 默认邮箱配置 - */ - public MailConfigDto getDefaultConfig() { - return ResultConvertUtil.dtoConvert(mailConfigManager.findByActivity()); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, MailConfigParam param) { - return MpUtil.convert2DtoPageResult(mailConfigManager.page(pageParam, param)); - } - - /** - * 根据 code 获取相应的邮箱配置 - */ - public MailConfigDto getByCode(String code) { - return ResultConvertUtil.dtoConvert(mailConfigManager.findByCode(code)); - } - - /** - * 编码是否已经存在 - */ - public boolean existsByCode(String code) { - return mailConfigManager.existsByCode(code); - } - - /** - * 编码是否已经存在(不包含自身) - */ - public boolean existsByCode(String code, Long id) { - return mailConfigManager.existsByCode(code, id); - } - - /** - * 设置活动邮箱 - */ - @Transactional(rollbackFor = Exception.class) - public void setUpActivity(Long id) { - MailConfig mailConfig = mailConfigManager.findById(id).orElseThrow(MailConfigNotExistException::new); - mailConfig.setActivity(true); - mailConfigManager.removeAllActivity(); - mailConfigManager.updateById(mailConfig); - } - - /** - * 根据 id 删除相应的邮箱配置 - */ - public void delete(Long id) { - mailConfigManager.deleteById(id); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/convert/SiteMessageConvert.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/convert/SiteMessageConvert.java deleted file mode 100644 index 6b27d1cf..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/convert/SiteMessageConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bootx.platform.notice.core.site.convert; - -import cn.bootx.platform.notice.core.site.entity.SiteMessage; -import cn.bootx.platform.notice.dto.site.SiteMessageDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 站内信转换 - * - * @author xxm - * @since 2021/8/7 - */ -@Mapper -public interface SiteMessageConvert { - - SiteMessageConvert CONVERT = Mappers.getMapper(SiteMessageConvert.class); - - SiteMessageDto convert(SiteMessage in); - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageManager.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageManager.java deleted file mode 100644 index 7df9a5dd..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageManager.java +++ /dev/null @@ -1,112 +0,0 @@ -package cn.bootx.platform.notice.core.site.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.notice.core.site.domain.SiteMessageInfo; -import cn.bootx.platform.notice.core.site.entity.SiteMessage; -import cn.bootx.platform.notice.code.SiteMessageCode; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.stereotype.Repository; - -import java.time.LocalDate; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -import static cn.bootx.platform.notice.code.SiteMessageCode.STATE_SENT; - -/** - * 站内信 - * - * @author xxm - * @since 2021/8/7 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class SiteMessageManager extends BaseManager { - - /** - * 接收用户消息分页 - */ - public Page pageByReceive(PageParam pageParam, SiteMessageInfo query, Long userId) { - val mpPage = MpUtil.getMpPage(pageParam, SiteMessageInfo.class); - - val wrapper = new LambdaQueryWrapper() - .and(o -> o - .and(p -> p.eq(SiteMessageInfo::getReceiveType, SiteMessageCode.RECEIVE_ALL) - .gt(SiteMessageInfo::getEfficientTime, LocalDate.now())) - .or() - .eq(SiteMessageInfo::getReceiveId, userId)) - .eq(SiteMessageInfo::getSendState, STATE_SENT) - .eq(StrUtil.isNotBlank(query.getTitle()), SiteMessageInfo::getTitle, query.getTitle()) - .orderByAsc(SiteMessageInfo::getHaveRead) - .orderByDesc(SiteMessageInfo::getReadTime); - if (Objects.equals(query.getHaveRead(), true)) { - wrapper.eq(SiteMessageInfo::getHaveRead, query.getHaveRead()); - } - // 已读为空也视为未读 - if (Objects.equals(query.getHaveRead(), false)) { - wrapper.and(o -> o.eq(SiteMessageInfo::getHaveRead, false).or().isNull(SiteMessageInfo::getHaveRead)); - - } - - return baseMapper.pageMassage(mpPage, wrapper); - } - - /** - * 查询未读的消息数量 - */ - public Integer countByReceiveNotRead(Long userId) { - val wrapper = new LambdaQueryWrapper() - .and(o -> o - .and(p -> p.eq(SiteMessageInfo::getReceiveType, SiteMessageCode.RECEIVE_ALL) - .gt(SiteMessageInfo::getEfficientTime, LocalDate.now())) - .or() - .eq(SiteMessageInfo::getReceiveId, userId)) - .and(o -> o.eq(SiteMessageInfo::getHaveRead, false).or().isNull(SiteMessageInfo::getHaveRead)) - .eq(SiteMessageInfo::getSendState, STATE_SENT) - .orderByAsc(SiteMessageInfo::getHaveRead) - .orderByDesc(SiteMessageInfo::getReadTime); - return baseMapper.countMassage(wrapper); - } - - public List listByReceiveNotRead(Long userId) { - Page page = new Page<>(); - page.setSize(5); - page.setSize(1); - val wrapper = new LambdaQueryWrapper() - .and(o -> o - .and(p -> p.eq(SiteMessageInfo::getReceiveType, SiteMessageCode.RECEIVE_ALL) - .gt(SiteMessageInfo::getEfficientTime, LocalDate.now())) - .or() - .eq(SiteMessageInfo::getReceiveId, userId)) - .and(o -> o.eq(SiteMessageInfo::getHaveRead, false).or().isNull(SiteMessageInfo::getHaveRead)) - .eq(SiteMessageInfo::getSendState, STATE_SENT) - .orderByAsc(SiteMessageInfo::getHaveRead) - .orderByDesc(SiteMessageInfo::getReadTime); - return baseMapper.pageMassage(page, wrapper).getRecords().stream() - .map(SiteMessageInfo::getTitle).collect(Collectors.toList()); - } - - /** - * 发送人消息分页 - */ - public Page pageBySender(PageParam pageParam, SiteMessageInfo query, Long userId) { - Page mpPage = MpUtil.getMpPage(pageParam, SiteMessage.class); - return lambdaQuery().select(SiteMessage.class, MpUtil::excludeBigField) - .eq(SiteMessage::getSenderId, userId) - .like(StrUtil.isNotBlank(query.getTitle()), SiteMessage::getSenderId, query.getTitle()) - .eq(StrUtil.isNotBlank(query.getSendState()), SiteMessage::getSendState, query.getSendState()) - .eq(StrUtil.isNotBlank(query.getReceiveType()), SiteMessage::getReceiveType, query.getReceiveType()) - .orderByDesc(SiteMessage::getId) - .page(mpPage); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageMapper.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageMapper.java deleted file mode 100644 index 2ce415b4..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.notice.core.site.dao; - -import cn.bootx.platform.notice.core.site.domain.SiteMessageInfo; -import cn.bootx.platform.notice.core.site.entity.SiteMessage; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -/** - * 站内信 - * - * @author xxm - * @since 2021/8/7 - */ -@Mapper -public interface SiteMessageMapper extends BaseMapper { - - Page pageMassage(Page page, - @Param(Constants.WRAPPER) Wrapper wrapper); - - Integer countMassage(@Param(Constants.WRAPPER) Wrapper wrapper); - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageUserManager.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageUserManager.java deleted file mode 100644 index 3620ed89..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageUserManager.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.bootx.platform.notice.core.site.dao; - -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.notice.core.site.entity.SiteMessageUser; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.time.LocalDateTime; -import java.util.Optional; - -/** - * @author xxm - * @since 2022/8/14 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class SiteMessageUserManager extends BaseManager { - - /** - * 根据消息ID查询 - */ - public Optional findByMessageId(Long messageId) { - return findByField(SiteMessageUser::getMessageId, messageId); - } - - /** - * 阅读 - */ - public void readById(Long id) { - lambdaUpdate().eq(MpIdEntity::getId, id) - .set(SiteMessageUser::isHaveRead, Boolean.TRUE) - .set(SiteMessageUser::getReadTime, LocalDateTime.now()) - .update(); - } - - /** - * 根据消息ID删除 - */ - public void deleteByMessageId(Long messageId) { - deleteByField(SiteMessageUser::getMessageId, messageId); - - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageUserMapper.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageUserMapper.java deleted file mode 100644 index b8917594..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/dao/SiteMessageUserMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.notice.core.site.dao; - -import cn.bootx.platform.notice.core.site.entity.SiteMessageUser; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2022/8/14 - */ -@Mapper -public interface SiteMessageUserMapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/domain/SiteMessageInfo.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/domain/SiteMessageInfo.java deleted file mode 100644 index 5e41cdf1..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/domain/SiteMessageInfo.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.bootx.platform.notice.core.site.domain; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; -import lombok.experimental.FieldNameConstants; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -/** - * 站内信信息详情 - * - * @author xxm - * @since 2022/8/14 - */ -@Data -@Accessors(chain = true) -@FieldNameConstants -@Schema(title = "站内信信息详情") -public class SiteMessageInfo { - - @Schema(description = "消息id") - private Long id; - - @Schema(description = "标题") - private String title; - - @Schema(description = "发送人id") - private Long senderId; - - @Schema(description = "发送人姓名") - private String senderName; - - @Schema(description = "接收类型") - private String receiveType; - - @Schema(description = "发送时间") - private LocalDateTime senderTime; - - @Schema(description = "发送状态") - private String sendState; - - @Schema(description = "撤回时间") - private LocalDateTime cancelTime; - - @Schema(description = "接收人id") - private Long receiveId; - - @Schema(description = "是否已读") - private Boolean haveRead; - - @Schema(description = "读取时间") - private LocalDateTime readTime; - - @Schema(description = "截至有效期") - private LocalDate efficientTime; - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/domain/SiteMessageInfoMapper.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/domain/SiteMessageInfoMapper.java deleted file mode 100644 index 26e909a1..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/domain/SiteMessageInfoMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.bootx.platform.notice.core.site.domain; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 只用来生成字段缓存 - * - * @author xxm - * @since 2022/8/14 - */ -@Mapper -public interface SiteMessageInfoMapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/entity/SiteMessage.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/entity/SiteMessage.java deleted file mode 100644 index 7102e541..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/entity/SiteMessage.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.bootx.platform.notice.core.site.entity; - -import cn.bootx.platform.common.core.annotation.BigField; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.notice.core.site.convert.SiteMessageConvert; -import cn.bootx.platform.notice.code.SiteMessageCode; -import cn.bootx.platform.notice.dto.site.SiteMessageDto; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -/** - * 站内信 - * - * @author xxm - * @since 2021/8/7 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("notice_site_message") -public class SiteMessage extends MpBaseEntity implements EntityBaseFunction { - - /** 消息标题 */ - private String title; - - /** 消息内容 */ - @BigField - private String content; - - /** - * 接收对象类型 全体/指定用户 - * @see SiteMessageCode#RECEIVE_ALL - */ - private String receiveType; - - /** - * 发布状态 - * @see SiteMessageCode#STATE_SENT - */ - private String sendState; - - /** 发送者id */ - private Long senderId; - - /** 发送者姓名 */ - private String senderName; - - /** 发送时间 */ - private LocalDateTime senderTime; - - /** 撤销时间 */ - private LocalDateTime cancelTime; - - /** 截至有效期 有效超过有效期后全体通知将无法看到 */ - private LocalDate efficientTime; - - @Override - public SiteMessageDto toDto() { - return SiteMessageConvert.CONVERT.convert(this); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/entity/SiteMessageUser.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/entity/SiteMessageUser.java deleted file mode 100644 index 7539feb0..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/entity/SiteMessageUser.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.notice.core.site.entity; - -import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 消息用户关联信息 - * - * @author xxm - * @since 2022/8/13 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("notice_site_message_user") -public class SiteMessageUser extends MpCreateEntity { - - /** 消息id */ - private Long messageId; - - /** 接收者id */ - private Long receiveId; - - /** 已读/未读 */ - private boolean haveRead; - - /** 已读时间 */ - private LocalDateTime readTime; - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/service/SiteMessageService.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/service/SiteMessageService.java deleted file mode 100644 index d8312a70..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/service/SiteMessageService.java +++ /dev/null @@ -1,235 +0,0 @@ -package cn.bootx.platform.notice.core.site.service; - -import cn.bootx.platform.common.core.code.CommonCode; -import cn.bootx.platform.common.core.entity.UserDetail; -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.CollUtil; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.websocket.entity.WsRes; -import cn.bootx.platform.common.websocket.service.UserWsNoticeService; -import cn.bootx.platform.notice.param.site.SendSiteMessageParam; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.bootx.platform.notice.core.site.dao.SiteMessageManager; -import cn.bootx.platform.notice.core.site.dao.SiteMessageUserManager; -import cn.bootx.platform.notice.core.site.domain.SiteMessageInfo; -import cn.bootx.platform.notice.core.site.entity.SiteMessage; -import cn.bootx.platform.notice.core.site.entity.SiteMessageUser; -import cn.bootx.platform.notice.dto.site.SiteMessageDto; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.util.DesensitizedUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -import static cn.bootx.platform.notice.code.SiteMessageCode.*; - -/** - * 站内信 - * - * @author xxm - * @since 2021/8/7 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class SiteMessageService { - - private final SiteMessageManager siteMessageManager; - - private final SiteMessageUserManager siteMessageUserManager; - - private final UserWsNoticeService userWsNoticeService; - - /** - * 保存或更新草稿 - */ - @Transactional(rollbackFor = Exception.class) - public void saveOrUpdate(SendSiteMessageParam param) { - SiteMessage siteMessage; - if (Objects.nonNull(param.getId())) { - siteMessage = siteMessageManager.findById(param.getId()) - .orElseThrow(() -> new DataNotExistException("站内信信息不存在")); - BeanUtil.copyProperties(param, siteMessage, CopyOptions.create().ignoreNullValue()); - } else { - siteMessage = new SiteMessage().setTitle(param.getTitle()) - .setSendState(STATE_DRAFT) - .setContent(param.getContent()) - .setReceiveType(param.getReceiveType()) - .setEfficientTime(param.getEfficientTime()) - .setSenderTime(LocalDateTime.now()); - // 添加消息关联人信息 暂时这段逻辑用不到, 现在发布的都是全体用户信心 - if (Objects.equals(RECEIVE_USER, param.getReceiveType())) { - List siteMessageUsers = param.getReceiveIds() - .stream() - .map(userId -> new SiteMessageUser().setMessageId(param.getId()).setReceiveId(userId)) - .collect(Collectors.toList()); - siteMessageUserManager.saveAll(siteMessageUsers); - } - } - // 新增或更新站内信内容 - val userDetail = SecurityUtil.getCurrentUser(); - siteMessage.setTitle(param.getTitle()) - .setSenderId(userDetail.map(UserDetail::getId).orElse(DesensitizedUtil.userId())) - .setSenderName(userDetail.map(UserDetail::getName).orElse("未知")); - siteMessageManager.saveOrUpdate(siteMessage); - - } - - /** - * 站内信发送消息 - */ - @Transactional(rollbackFor = Exception.class) - public void send(Long id) { - SiteMessage siteMessage = siteMessageManager.findById(id) - .orElseThrow(() -> new DataNotExistException("站内信信息不存在")); - val userDetail = SecurityUtil.getCurrentUser(); - - // 新增站内信内容 - siteMessage.setSenderId(userDetail.map(UserDetail::getId).orElse(DesensitizedUtil.userId())) - .setSendState(STATE_SENT) - .setSenderName(userDetail.map(UserDetail::getName).orElse("未知")) - .setSenderTime(LocalDateTime.now()); - siteMessageManager.updateById(siteMessage); - userWsNoticeService.sendMessageByAll(WsRes.eventNotice(EVENT_MESSAGE_UPDATE)); - } - - /** - * 发送站内信 - */ - @Transactional(rollbackFor = Exception.class) - public void send(SendSiteMessageParam param) { - - // 新增站内信内容 - SiteMessage siteMessage = new SiteMessage().setTitle(param.getTitle()) - .setContent(param.getContent()) - .setSendState(STATE_SENT) - .setReceiveType(param.getReceiveType()) - .setEfficientTime(param.getEfficientTime()) - .setSenderId(param.getSenderId()) - .setSenderName(param.getSenderName()) - .setSenderTime(LocalDateTime.now()); - siteMessageManager.save(siteMessage); - // 添加消息关联人信息 - if (Objects.equals(RECEIVE_USER, param.getReceiveType())) { - - List siteMessageUsers = param.getReceiveIds() - .stream() - .map(userId -> new SiteMessageUser().setMessageId(siteMessage.getId()).setReceiveId(userId)) - .collect(Collectors.toList()); - siteMessageUserManager.saveAll(siteMessageUsers); - userWsNoticeService.sendMessageByUsers(WsRes.eventNotice(EVENT_MESSAGE_UPDATE), param.getReceiveIds()); - } - } - - /** - * 发送给单个用户信息, 发送人为系统 - */ - public void sendSingleUserBySystem(String title, String content, Long userId) { - val param = new SendSiteMessageParam().setTitle(title) - .setContent(content) - .setSenderId(CommonCode.SYSTEM_DEFAULT_USERID) - .setSenderName(CommonCode.SYSTEM_DEFAULT_USERNAME) - .setReceiveType(RECEIVE_USER) - .setReceiveIds(Collections.singletonList(userId)); - this.send(param); - } - - /** - * 发送给多个用户信息, 发送人为系统 - */ - public void sendMultiUserBySystem(String title, String content, List userIds) { - val param = new SendSiteMessageParam().setTitle(title) - .setContent(content) - .setSenderId(CommonCode.SYSTEM_DEFAULT_USERID) - .setSenderName(CommonCode.SYSTEM_DEFAULT_USERNAME) - .setReceiveType(RECEIVE_USER) - .setReceiveIds(userIds); - this.send(param); - } - - /** - * 撤回消息 - */ - @Transactional(rollbackFor = Exception.class) - public void cancel(Long messageId) { - SiteMessage siteMessage = siteMessageManager.findById(messageId) - .orElseThrow(() -> new DataNotExistException("站内信不存在")); - siteMessage.setCancelTime(LocalDateTime.now()).setSendState(STATE_CANCEL); - siteMessageManager.updateById(siteMessage); - userWsNoticeService.sendMessageByAll(WsRes.eventNotice(EVENT_MESSAGE_UPDATE)); - } - - /** - * 删除消息 - */ - @Transactional(rollbackFor = Exception.class) - public void delete(Long messageId) { - SiteMessage siteMessage = siteMessageManager.findById(messageId) - .orElseThrow(() -> new DataNotExistException("站内信不存在")); - if (!CollUtil.toList(STATE_CANCEL, STATE_DRAFT).contains(siteMessage.getSendState())) { - throw new BizException("站内信不是撤回或草稿状态,无法被删除"); - } - siteMessageManager.deleteById(messageId); - siteMessageUserManager.deleteByMessageId(messageId); - } - - /** - * 未读消息数量 - */ - public Integer countByReceiveNotRead(SiteMessageInfo query) { - Long userId = SecurityUtil.getUserId(); - // Long userId = 0L; - return siteMessageManager.countByReceiveNotRead(userId); - } - - /** - * 接收消息分页 - */ - public PageResult pageByReceive(PageParam pageParam, SiteMessageInfo query) { - Long userId = SecurityUtil.getUserId(); - return MpUtil.convert2PageResult(siteMessageManager.pageByReceive(pageParam, query, userId)); - } - - /** - * 发送消息分页 - */ - public PageResult pageBySender(PageParam pageParam, SiteMessageInfo query) { - Long userId = SecurityUtil.getUserId(); - return MpUtil.convert2DtoPageResult(siteMessageManager.pageBySender(pageParam, query, userId)); - } - - /** - * 查询详情 - */ - public SiteMessageDto findById(Long id) { - return siteMessageManager.findById(id).map(SiteMessage::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 阅读 - */ - public void read(Long messageId) { - Long userId = SecurityUtil.getUserId(); - SiteMessageUser siteMessageUser = siteMessageUserManager.findByMessageId(messageId) - .orElse(new SiteMessageUser().setReceiveId(userId).setMessageId(messageId)); - siteMessageUser.setHaveRead(true).setReadTime(LocalDateTime.now()); - siteMessageUserManager.saveOrUpdate(siteMessageUser); - } - - public List listByReceiveNotRead(SiteMessageInfo query) { - Long userId = SecurityUtil.getUserId(); - return siteMessageManager.listByReceiveNotRead(userId); - } -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/convert/SmsChannelConfigConvert.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/convert/SmsChannelConfigConvert.java deleted file mode 100644 index ccfdf66d..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/convert/SmsChannelConfigConvert.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.bootx.platform.notice.core.sms.convert; - -import cn.bootx.platform.notice.core.sms.entity.SmsChannelConfig; -import cn.bootx.platform.notice.dto.sms.SmsChannelConfigDto; -import cn.bootx.platform.notice.param.sms.SmsChannelConfigParam; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 短信渠道配置 - * @author xxm - * @since 2023-08-03 - */ -@Mapper -public interface SmsChannelConfigConvert { - SmsChannelConfigConvert CONVERT = Mappers.getMapper(SmsChannelConfigConvert.class); - - SmsChannelConfig convert(SmsChannelConfigParam in); - - SmsChannelConfigDto convert(SmsChannelConfig in); - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/convert/SmsTemplateConvert.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/convert/SmsTemplateConvert.java deleted file mode 100644 index e65f82fd..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/convert/SmsTemplateConvert.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.bootx.platform.notice.core.sms.convert; - -import cn.bootx.platform.notice.core.sms.entity.SmsTemplate; -import cn.bootx.platform.notice.dto.sms.SmsTemplateDto; -import cn.bootx.platform.notice.param.sms.SmsTemplateParam; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 短信模板配置 - * @author xxm - * @since 2023-08-03 - */ -@Mapper -public interface SmsTemplateConvert { - SmsTemplateConvert CONVERT = Mappers.getMapper(SmsTemplateConvert.class); - - SmsTemplate convert(SmsTemplateParam in); - - SmsTemplateDto convert(SmsTemplate in); - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsChannelConfigManager.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsChannelConfigManager.java deleted file mode 100644 index 918a328d..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsChannelConfigManager.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.notice.core.sms.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.notice.core.sms.entity.SmsChannelConfig; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Slf4j -@Service -@RequiredArgsConstructor -public class SmsChannelConfigManager extends BaseManager { - - - public boolean existsByCode(String code){ - return existedByField(SmsChannelConfig::getCode,code); - } - public boolean existsByCode(String code,Long id){ - return existedByField(SmsChannelConfig::getCode,code,id); - } - - public Optional findByCode(String code){ - return findByField(SmsChannelConfig::getCode,code); - } -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsChannelConfigMapper.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsChannelConfigMapper.java deleted file mode 100644 index 63cde288..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsChannelConfigMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.bootx.platform.notice.core.sms.dao; - -import cn.bootx.platform.notice.core.sms.entity.SmsChannelConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2023/3/28 - */ -@Mapper -public interface SmsChannelConfigMapper extends BaseMapper { -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsTemplateManager.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsTemplateManager.java deleted file mode 100644 index 81212869..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsTemplateManager.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.notice.core.sms.dao; - -import cn.bootx.platform.notice.param.sms.SmsTemplateParam; -import cn.bootx.platform.notice.core.sms.entity.SmsTemplate; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.query.generator.QueryGenerator; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -/** - * 短信模板配置 - * @author xxm - * @since 2023-08-03 - */ -@Repository -@RequiredArgsConstructor -public class SmsTemplateManager extends BaseManager { - - /** - * 分页 - */ - public Page page(PageParam pageParam, SmsTemplateParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, SmsTemplate.class); - QueryWrapper wrapper = QueryGenerator.generator(param, this.getEntityClass()); - wrapper.select(this.getEntityClass(),MpUtil::excludeBigField) - .orderByDesc(MpUtil.getColumnName(SmsTemplate::getId)); - return this.page(mpPage,wrapper); - } -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsTemplateMapper.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsTemplateMapper.java deleted file mode 100644 index 09ee2fbe..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/dao/SmsTemplateMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.notice.core.sms.dao; - -import cn.bootx.platform.notice.core.sms.entity.SmsTemplate; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 短信模板配置 - * @author xxm - * @since 2023-08-03 - */ -@Mapper -public interface SmsTemplateMapper extends BaseMapper { -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java deleted file mode 100644 index bea4b695..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.bootx.platform.notice.core.sms.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.notice.core.sms.convert.SmsChannelConfigConvert; -import cn.bootx.platform.notice.dto.sms.SmsChannelConfigDto; -import cn.bootx.platform.notice.param.sms.SmsChannelConfigParam; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; -import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import org.dromara.sms4j.provider.enumerate.SupplierType; - -import static com.baomidou.mybatisplus.annotation.FieldStrategy.ALWAYS; -import static com.baomidou.mybatisplus.annotation.FieldStrategy.NEVER; - -/** - * 短信渠道配置 - * @author xxm - * @since 2023/3/28 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("notice_sms_channel_config") -public class SmsChannelConfig extends MpBaseEntity implements EntityBaseFunction { - - /** - * 渠道类型编码 - * @see SupplierType#name() - */ - @DbColumn(comment = "渠道类型编码") - @TableField(updateStrategy = NEVER) - private String code; - - /** - * 渠道类型名称 - * @see SupplierType#getName() - */ - @DbColumn(comment = "渠道类型名称") - private String name; - - /** - * 状态 - * @see cn.bootx.platform.notice.code.SmsChannelStatusCode - */ - @DbColumn(comment = "状态") - private String state; - - /** AccessKey */ - @DbColumn(comment = "AccessKey") - private String accessKey; - - /** AccessSecret */ - @DbColumn(comment = "AccessSecret") - private String accessSecret; - - /** 配置字符串 */ - @DbMySqlFieldType(MySqlFieldTypeEnum.TEXT) - @DbColumn(comment = "配置字符串") - @TableField(updateStrategy = ALWAYS) - private String config; - - /** 图片 */ - @TableField(updateStrategy = ALWAYS) - @DbColumn(comment = "图片") - private Long image; - - /** 排序 */ - @DbColumn(comment = "排序") - private Double sortNo; - - /** 备注 */ - @DbColumn(comment = "备注") - private String remark; - - /** 创建对象 */ - public static SmsChannelConfig init(SmsChannelConfigParam in) { - return SmsChannelConfigConvert.CONVERT.convert(in); - } - - /** 转换成dto */ - @Override - public SmsChannelConfigDto toDto() { - return SmsChannelConfigConvert.CONVERT.convert(this); - } -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsTemplate.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsTemplate.java deleted file mode 100644 index 38b6fcfc..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsTemplate.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bootx.platform.notice.core.sms.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.notice.core.sms.convert.SmsTemplateConvert; -import cn.bootx.platform.notice.dto.sms.SmsTemplateDto; -import cn.bootx.platform.notice.param.sms.SmsTemplateParam; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** -* 短信模板配置 -* @author xxm -* @since 2023-08-03 -*/ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("notice_sms_template") -public class SmsTemplate extends MpBaseEntity implements EntityBaseFunction{ - - /** 短信渠道商类型 */ - private String supplierType; - /** 短信模板id */ - private String templateId; - /** 短信模板名称 */ - private String name; - /** 短信模板内容 */ - private String content; - - /** 创建对象 */ - public static SmsTemplate init(SmsTemplateParam in) { - return SmsTemplateConvert.CONVERT.convert(in); - } - - /** 转换成dto */ - @Override - public SmsTemplateDto toDto() { - return SmsTemplateConvert.CONVERT.convert(this); - } -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/service/SmsChannelConfigService.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/service/SmsChannelConfigService.java deleted file mode 100644 index 8720228d..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/service/SmsChannelConfigService.java +++ /dev/null @@ -1,246 +0,0 @@ -package cn.bootx.platform.notice.core.sms.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.function.CollectorsFunction; -import cn.bootx.platform.common.core.util.CollUtil; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.bootx.platform.notice.core.sms.dao.SmsChannelConfigManager; -import cn.bootx.platform.notice.core.sms.entity.SmsChannelConfig; -import cn.bootx.platform.notice.dto.sms.SmsChannelConfigDto; -import cn.bootx.platform.notice.event.sms.SmsChannelAddEvent; -import cn.bootx.platform.notice.event.sms.SmsChannelUpdateEvent; -import cn.bootx.platform.notice.param.sms.SmsChannelConfigParam; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.dromara.sms4j.aliyun.config.AlibabaConfig; -import org.dromara.sms4j.api.universal.SupplierConfig; -import org.dromara.sms4j.cloopen.config.CloopenConfig; -import org.dromara.sms4j.comm.exception.SmsBlendException; -import org.dromara.sms4j.core.config.SupplierFactory; -import org.dromara.sms4j.ctyun.config.CtyunConfig; -import org.dromara.sms4j.emay.config.EmayConfig; -import org.dromara.sms4j.huawei.config.HuaweiConfig; -import org.dromara.sms4j.jdcloud.config.JdCloudConfig; -import org.dromara.sms4j.netease.config.NeteaseConfig; -import org.dromara.sms4j.provider.enumerate.SupplierType; -import org.dromara.sms4j.tencent.config.TencentConfig; -import org.dromara.sms4j.unisms.config.UniConfig; -import org.dromara.sms4j.yunpian.config.YunpianConfig; -import org.springframework.boot.web.context.WebServerInitializedEvent; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -@Slf4j -@Service -@RequiredArgsConstructor -public class SmsChannelConfigService { - - private final SmsChannelConfigManager configManager; - - private final ApplicationEventPublisher eventPublisher; - - /** - * 添加 - */ - @Transactional(rollbackFor = Exception.class) - public void add(Map map){ - SmsChannelConfigParam param = BeanUtil.toBean(map, SmsChannelConfigParam.class); - SmsChannelConfig channelConfig = SmsChannelConfig.init(param); - // 编码不能重复 - if (configManager.existsByCode(param.getCode())) { - throw new BizException("编码已存在"); - } - String supplierConfig = getSupplierConfig(channelConfig, map); - channelConfig.setConfig(supplierConfig); - configManager.save(channelConfig); - this.initChannelConfig(channelConfig); - eventPublisher.publishEvent(new SmsChannelAddEvent(this,channelConfig.toDto())); - } - - /** - * 更新 - */ - @Transactional(rollbackFor = Exception.class) - public void update(Map map){ - SmsChannelConfigParam param = BeanUtil.toBean(map, SmsChannelConfigParam.class); - SmsChannelConfig channelConfig = configManager.findById(param.getId()) - .orElseThrow(DataNotExistException::new); - // 编码不能重复 - if (configManager.existsByCode(param.getCode(), param.getId())) { - throw new BizException("编码已存在"); - } - BeanUtil.copyProperties(param, channelConfig, CopyOptions.create().ignoreNullValue()); - String supplierConfig = getSupplierConfig(channelConfig, map); - channelConfig.setConfig(supplierConfig); - configManager.updateById(channelConfig); - this.initChannelConfig(channelConfig); - eventPublisher.publishEvent(new SmsChannelUpdateEvent(this,channelConfig.toDto())); - } - - - /** - * 查询全部配置 - */ - public List findAll(){ - // 遍历数据库 - Map map = configManager.findAll() - .stream() - .collect(Collectors.toMap(SmsChannelConfig::getCode, Function.identity(), CollectorsFunction::retainLatest)); - return Arrays.stream(SupplierType.values()) - .map(type-> Optional.ofNullable(map.get(type.name().toLowerCase())) - .orElse(new SmsChannelConfig() - .setCode(type.name().toLowerCase()) - .setSortNo(0.0) - .setName(type.getName()))) - .sorted(Comparator.comparing(SmsChannelConfig::getSortNo)) - .map(SmsChannelConfig::toDto) - .collect(Collectors.toList()); - } - - /** - * 根据ID查询 - */ - public SmsChannelConfigDto findById(Long id) { - return configManager.findById(id).map(SmsChannelConfig::toDto) - .orElseThrow(DataNotExistException::new); - } - - /** - * 根据code查询 - */ - public SmsChannelConfigDto findByCode(String code) { - return configManager.findByCode(code).map(SmsChannelConfig::toDto) - .orElseThrow(DataNotExistException::new); - } - - /** - * 启动成功后初始化所有的短信通道配置 - */ - @EventListener(WebServerInitializedEvent.class) - public void initChannelConfig(){ - List smsChannelConfigs = configManager.findAll(); - smsChannelConfigs.forEach(this::initChannelConfig); - } - - /** - * 启动成功后初始化所有的短信通道配置 - */ - public void initChannelConfig(SmsChannelConfig channelConfig){ - SupplierType supplierType = getSupplierType(channelConfig.getCode()); - String config = channelConfig.getConfig(); - if (StrUtil.isBlank(config)){ - return; - } - SupplierConfig bean; - if (supplierType == SupplierType.ALIBABA) { - bean = JacksonUtil.toBean(config, AlibabaConfig.class); - } else if (supplierType == SupplierType.HUAWEI) { - bean = JacksonUtil.toBean(config, HuaweiConfig.class); - } else if (supplierType == SupplierType.UNI_SMS) { - bean = JacksonUtil.toBean(config, UniConfig.class); - } else if (supplierType == SupplierType.TENCENT) { - bean = JacksonUtil.toBean(config, TencentConfig.class); - } else if (supplierType == SupplierType.YUNPIAN) { - bean = JacksonUtil.toBean(config, YunpianConfig.class); - } else if (supplierType == SupplierType.JD_CLOUD) { - bean = JacksonUtil.toBean(config, JdCloudConfig.class); - } else if (supplierType == SupplierType.CLOOPEN) { - bean = JacksonUtil.toBean(config, CloopenConfig.class); - } else if (supplierType == SupplierType.EMAY) { - bean = JacksonUtil.toBean(config, EmayConfig.class); - } else if (supplierType == SupplierType.CTYUN) { - bean = JacksonUtil.toBean(config, CtyunConfig.class); - } else if (supplierType == SupplierType.NETEASE) { - bean = JacksonUtil.toBean(config, NeteaseConfig.class); - } else { - throw new SmsBlendException("短信加载失败!请检查配置类型."); - } - SupplierFactory.setSupplierConfig(bean); - } - - /** - * 获取供应商配置的序列化 - */ - private String getSupplierConfig(SmsChannelConfig channelConfig, Map map){ - SupplierType supplierType = getSupplierType(channelConfig.getCode()); - if (CollUtil.isEmpty(map)){ - return null; - } - if (supplierType == SupplierType.ALIBABA) { - val bean = BeanUtil.toBean(map, AlibabaConfig.class); - bean.setAccessKeyId(channelConfig.getAccessKey()); - bean.setAccessKeySecret(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else if (supplierType == SupplierType.HUAWEI) { - val bean = BeanUtil.toBean(map, HuaweiConfig.class); - bean.setAppKey(channelConfig.getAccessKey()); - bean.setAppSecret(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else if (supplierType == SupplierType.UNI_SMS) { - val bean = BeanUtil.toBean(map, UniConfig.class); - bean.setAccessKeyId(channelConfig.getAccessKey()); - bean.setAccessKeySecret(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else if (supplierType == SupplierType.TENCENT) { - val bean = BeanUtil.toBean(map, TencentConfig.class); - bean.setAccessKeyId(channelConfig.getAccessKey()); - bean.setAccessKeySecret(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else if (supplierType == SupplierType.YUNPIAN) { - val bean = BeanUtil.toBean(map, YunpianConfig.class); - bean.setAccessKeyId(channelConfig.getAccessKey()); - bean.setAccessKeySecret(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else if (supplierType == SupplierType.JD_CLOUD) { - val bean = BeanUtil.toBean(map, JdCloudConfig.class); - bean.setAccessKeyId(channelConfig.getAccessKey()); - bean.setAccessKeySecret(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else if (supplierType == SupplierType.CLOOPEN) { - val bean = BeanUtil.toBean(map, CloopenConfig.class); - bean.setAccessKeyId(channelConfig.getAccessKey()); - bean.setAccessKeySecret(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else if (supplierType == SupplierType.EMAY) { - val bean = BeanUtil.toBean(map, EmayConfig.class); - bean.setAppId(channelConfig.getAccessKey()); - bean.setSecretKey(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else if (supplierType == SupplierType.CTYUN) { - val bean = BeanUtil.toBean(map, CtyunConfig.class); - bean.setAccessKeyId(channelConfig.getAccessKey()); - bean.setAccessKeySecret(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else if (supplierType == SupplierType.NETEASE) { - val bean = BeanUtil.toBean(map, NeteaseConfig.class); - bean.setAccessKeyId(channelConfig.getAccessKey()); - bean.setAccessKeySecret(channelConfig.getAccessSecret()); - return JacksonUtil.toJson(bean); - } else { - throw new SmsBlendException("短信加载失败!请检查配置类型."); - } - - } - - /** - * 获取 短信供应商 枚举 - */ - public SupplierType getSupplierType(String code){ - return Arrays.stream(SupplierType.values()) - .filter(supplierType -> supplierType.name().equalsIgnoreCase(code)) - .findFirst() - .orElseThrow(() -> new BizException("短信供应商未找到")); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/service/SmsTemplateService.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/service/SmsTemplateService.java deleted file mode 100644 index 22c1c354..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/service/SmsTemplateService.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.bootx.platform.notice.core.sms.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.ResultConvertUtil; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.notice.core.sms.dao.SmsTemplateManager; -import cn.bootx.platform.notice.core.sms.entity.SmsTemplate; -import cn.bootx.platform.notice.dto.sms.SmsTemplateDto; -import cn.bootx.platform.notice.param.sms.SmsTemplateParam; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 短信模板配置 - * @author xxm - * @since 2023-08-03 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class SmsTemplateService { - private final SmsTemplateManager smsTemplateManager; - - /** - * 添加 - */ - public void add(SmsTemplateParam param){ - SmsTemplate smsTemplate = SmsTemplate.init(param); - smsTemplateManager.save(smsTemplate); - } - - /** - * 修改 - */ - public void update(SmsTemplateParam param){ - SmsTemplate smsTemplate = smsTemplateManager.findById(param.getId()).orElseThrow(DataNotExistException::new); - BeanUtil.copyProperties(param,smsTemplate, CopyOptions.create().ignoreNullValue()); - smsTemplateManager.updateById(smsTemplate); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam,SmsTemplateParam smsTemplateParam){ - return MpUtil.convert2DtoPageResult(smsTemplateManager.page(pageParam,smsTemplateParam)); - } - - /** - * 获取单条 - */ - public SmsTemplateDto findById(Long id){ - return smsTemplateManager.findById(id).map(SmsTemplate::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 获取全部 - */ - public List findAll(){ - return ResultConvertUtil.dtoListConvert(smsTemplateManager.findAll()); - } - - /** - * 删除 - */ - public void delete(Long id){ - smsTemplateManager.deleteById(id); - } -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/convert/MessageTemplateConvert.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/convert/MessageTemplateConvert.java deleted file mode 100644 index cdaf3044..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/convert/MessageTemplateConvert.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.notice.core.template.convert; - -import cn.bootx.platform.notice.param.template.MessageTemplateParam; -import cn.bootx.platform.notice.core.template.entity.MessageTemplate; -import cn.bootx.platform.notice.dto.template.MessageTemplateDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 消息模板转换 - * - * @author xxm - * @since 2021/8/10 - */ -@Mapper -public interface MessageTemplateConvert { - - MessageTemplateConvert CONVERT = Mappers.getMapper(MessageTemplateConvert.class); - - MessageTemplateDto convert(MessageTemplate in); - - MessageTemplate convert(MessageTemplateDto in); - - MessageTemplate convert(MessageTemplateParam in); - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/dao/MessageTemplateManager.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/dao/MessageTemplateManager.java deleted file mode 100644 index 0fb1fb91..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/dao/MessageTemplateManager.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bootx.platform.notice.core.template.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.notice.core.template.entity.MessageTemplate; -import cn.bootx.platform.notice.param.template.MessageTemplateParam; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 消息模板 - * - * @author xxm - * @since 2021/8/9 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class MessageTemplateManager extends BaseManager { - - public Optional findByCode(String code) { - return findByField(MessageTemplate::getCode, code); - } - - public boolean existsByCode(String code) { - return existedByField(MessageTemplate::getCode, code); - } - - public boolean existsByCode(String code, Long id) { - return existedByField(MessageTemplate::getCode, code, id); - } - - public Page page(PageParam pageParam, MessageTemplateParam query) { - Page mpPage = MpUtil.getMpPage(pageParam, MessageTemplate.class); - return lambdaQuery().like(StrUtil.isNotBlank(query.getCode()), MessageTemplate::getCode, query.getCode()) - .like(StrUtil.isNotBlank(query.getName()), MessageTemplate::getName, query.getName()) - .orderByDesc(MpIdEntity::getId) - .page(mpPage); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/dao/MessageTemplateMapper.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/dao/MessageTemplateMapper.java deleted file mode 100644 index 038c07be..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/dao/MessageTemplateMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.notice.core.template.dao; - -import cn.bootx.platform.notice.core.template.entity.MessageTemplate; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2021/8/9 - */ -@Mapper -public interface MessageTemplateMapper extends BaseMapper { - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/entity/MessageTemplate.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/entity/MessageTemplate.java deleted file mode 100644 index 931748f4..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/entity/MessageTemplate.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.bootx.platform.notice.core.template.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.notice.core.template.convert.MessageTemplateConvert; -import cn.bootx.platform.notice.param.template.MessageTemplateParam; -import cn.bootx.platform.notice.code.MessageTemplateCode; -import cn.bootx.platform.notice.dto.template.MessageTemplateDto; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -@EqualsAndHashCode(callSuper = true) -@Data -@TableName("notice_message_template") -@Accessors(chain = true) -public class MessageTemplate extends MpBaseEntity implements EntityBaseFunction { - - /** 编码 */ - private String code; - - /** 名称 */ - private String name; - - /** 内容 */ - private String data; - - /** 备注 */ - private String remark; - - /** - * 模板类型 - * @see MessageTemplateCode - */ - private String type; - - public static MessageTemplate init(MessageTemplateParam in) { - return MessageTemplateConvert.CONVERT.convert(in); - } - - @Override - public MessageTemplateDto toDto() { - return MessageTemplateConvert.CONVERT.convert(this); - } - -} diff --git a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/service/MessageTemplateService.java b/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/service/MessageTemplateService.java deleted file mode 100644 index 609f040c..00000000 --- a/bootx-platform/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/template/service/MessageTemplateService.java +++ /dev/null @@ -1,110 +0,0 @@ -package cn.bootx.platform.notice.core.template.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.notice.param.template.MessageTemplateParam; -import cn.bootx.platform.notice.core.template.dao.MessageTemplateManager; -import cn.bootx.platform.notice.core.template.entity.MessageTemplate; -import cn.bootx.platform.notice.dto.template.MessageTemplateDto; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.extra.template.Template; -import cn.hutool.extra.template.TemplateEngine; -import cn.hutool.extra.template.TemplateUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Map; - -/** - * 消息模板 - * - * @author xxm - * @since 2021/8/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class MessageTemplateService { - - private final MessageTemplateManager messageTemplateManager; - - /** - * 添加 - */ - public MessageTemplateDto add(MessageTemplateParam param) { - MessageTemplate messageTemplate = MessageTemplate.init(param); - // code 不重复 - if (messageTemplateManager.existsByCode(messageTemplate.getCode())) { - throw new BizException("模板编码不可重复"); - } - return messageTemplateManager.save(messageTemplate).toDto(); - - } - - /** - * 更新 - */ - public MessageTemplateDto update(MessageTemplateParam param) { - // code 不重复 - if (messageTemplateManager.existsByCode(param.getCode(), param.getId())) { - throw new BizException("模板编码不可重复"); - } - MessageTemplate messageTemplate = messageTemplateManager.findById(param.getId()) - .orElseThrow(() -> new BizException("消息模板不存在")); - BeanUtil.copyProperties(param, messageTemplate, CopyOptions.create().ignoreNullValue()); - return messageTemplateManager.updateById(messageTemplate).toDto(); - } - - /** - * 分页 - */ - public PageResult
- * 菜单的响应动作类型. - * view表示网页类型, - * click表示点击类型, - * miniprogram表示小程序类型 - *
- * 菜单KEY值,用于消息接口推送,不超过128字节. - * click等点击类型必须 - *
- * 网页链接. - * 用户点击菜单可打开链接,不超过1024字节。type为miniprogram时,不支持小程序的老版本客户端将打开本url。 - * view、miniprogram类型必须 - *
- * 调用新增永久素材接口返回的合法media_id. - * media_id类型和view_limited类型必须 - *
- * 调用发布图文接口获得的article_id. - * article_id类型和article_view_limited类型必须 - *
- * 小程序的appid. - * miniprogram类型必须 - *
- * 小程序的页面路径. - * miniprogram类型必须 - *