Jelajahi Sumber

'将mce消息公告整体迁移到system系统模块中'

james 11 bulan lalu
induk
melakukan
472cb856ac
27 mengubah file dengan 1445 tambahan dan 9 penghapusan
  1. 0 6
      base-modules/service-system/service-system-biz/pom.xml
  2. 33 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/constant/constant.java
  3. 21 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceContentController.java
  4. 117 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceReceiveController.java
  5. 64 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceSettingController.java
  6. 80 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/MceContent.java
  7. 95 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/MceReceive.java
  8. 80 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/MceSetting.java
  9. 16 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/MceContentMapper.java
  10. 16 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/MceReceiveMapper.java
  11. 16 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/MceSettingMapper.java
  12. 18 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceContentService.java
  13. 8 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceMbuserService.java
  14. 31 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceReceiveService.java
  15. 24 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceSettingService.java
  16. 137 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/config/websocket/HttpClientUtils.java
  17. 52 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceContentServiceImpl.java
  18. 116 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceMbuserServiceImpl.java
  19. 271 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceReceiveServiceImpl.java
  20. 97 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceSettingServiceImpl.java
  21. 3 3
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysNoticeServiceImpl.java
  22. 31 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SendWeChatMessageRequestVO.java
  23. 11 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/TemplateData.java
  24. 48 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/TemplateMsgEntityVO.java
  25. 19 0
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/MceContentMapper.xml
  26. 22 0
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/MceReceiveMapper.xml
  27. 19 0
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/MceSettingMapper.xml

+ 0 - 6
base-modules/service-system/service-system-biz/pom.xml

@@ -48,12 +48,6 @@
             <artifactId>ruoyi-common-swagger</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>com.usky</groupId>
-            <artifactId>service-iot-api</artifactId>
-            <version>0.0.1</version>
-        </dependency>
-
     </dependencies>
 
     <build>

+ 33 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/constant/constant.java

@@ -0,0 +1,33 @@
+package com.usky.system.constant;
+
+public class constant {
+    // 微信公众号的 app_id
+    public static final String WE_CHAT_APP_ID = "wx24286e0c45f8da1c";
+    // 微信公众号的 secret
+    public static final String WE_CHAT_SECRET = "d605d3efaaad559a8e6a327870b48ce8";
+    // 微信公众号的 access_token
+    public static final String WE_CHAT_ACCESS_TOKEN = "**********";
+    // 微信公众号code获取地址
+    public static final String WE_CHAT_CODE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STATE#wechat_redirect";
+    // 回调地址,获取open_id
+    public static final String WE_CHAT_CALL_BACK_DOMAIN_URL = "http://localhost:9887/weChat/getWeChatOpenId";
+    // 回调域名
+    public static final String call_back_domain = "manager.usky.cn";
+    // 微信公众号的token获取地址
+    public static final String WE_CHAT_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
+    // 微信公众号消息推送地址
+    public static final String WE_CHAT_REQUEST_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s";
+    // 微信公众号推送消息模板id
+    public static final String WE_CHAT_TEMPLATE_ID = "FmrNuMzgh0E8bWg1j8a2R3zTmRarHYtZ72TSzPrF9Iw";
+    // 微信公众号的消息回调地址(这儿可根据业务需求自定义动作,可选)
+    public static final String WE_CHAT_CUSTOMER_CALL_URL = "http://manager.usky.cn/mobile/#/pages/common/textview/index?id=%s";
+    // 微信公众号的主题颜色
+    public static final String WE_CHAT_TOP_COLOR = "#A349A4";
+    // 微信公众号微信用户授权地址
+    public static final String WE_CHAT_AUTHORIZATION_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
+    // 微信公众号登录前端部署相对路径
+    public static final String WE_CHAT_LOGIN = "/mobile/#/pages/login";
+    // 微信公众号首页前端部署相对路径
+    public static final String WE_CHAT_INDEX = "/mobile/#/pages/index";
+
+}

+ 21 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceContentController.java

@@ -0,0 +1,21 @@
+package com.usky.system.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 消息内容表 前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+@Controller
+@RequestMapping("/mceContent")
+public class MceContentController {
+
+}
+

+ 117 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceReceiveController.java

@@ -0,0 +1,117 @@
+package com.usky.system.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.system.domain.MceReceive;
+import com.usky.system.service.MceReceiveService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 消息接收表 前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2024-04-19
+ */
+@RestController
+@RequestMapping("/mceReceive")
+public class MceReceiveController {
+
+    @Autowired
+    private MceReceiveService mceReceiveService;
+
+    /**
+     * 消息列表分页
+     * @param infoTitle  消息标题
+     * @param infoType  消息标题
+     * @param startTime  开始时间
+     * @param endTime  开始时间
+     * @param current      当前页
+     * @param size     每页条数
+     * @return
+     */
+    @GetMapping("/mceList")
+    public ApiResult<CommonPage<Object>> mceList(@RequestParam(value = "infoTitle", required = false) String infoTitle,
+                                                 @RequestParam(value = "infoType", required = false) String infoType,
+                                                 @RequestParam(value = "startTime", required = false) String startTime,
+                                                 @RequestParam(value = "endTime", required = false) String endTime,
+                                                 @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                                                 @RequestParam(value = "size", required = false, defaultValue = "10") Integer size)
+    {
+        return ApiResult.success(mceReceiveService.mceList(infoTitle, infoType,startTime, endTime, current, size));
+    }
+
+    /**
+     * 消息管理
+     * @param infoTitle  消息标题
+     * @param infoType  消息标题
+     * @param startTime  开始时间
+     * @param endTime  开始时间
+     * @param current      当前页
+     * @param size     每页条数
+     * @return
+     */
+    @GetMapping("/mceManageList")
+    public ApiResult<CommonPage<Object>> mceManageList(@RequestParam(value = "infoTitle", required = false) String infoTitle,
+                                                       @RequestParam(value = "infoType", required = false) String infoType,
+                                                       @RequestParam(value = "startTime", required = false) String startTime,
+                                                       @RequestParam(value = "endTime", required = false) String endTime,
+                                                       @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                                                       @RequestParam(value = "size", required = false, defaultValue = "10") Integer size)
+    {
+        return ApiResult.success(mceReceiveService.mceManageList(infoTitle, infoType,startTime, endTime, current, size));
+    }
+
+    /**
+     * 消息管理通过ID查询接口
+     * @param id  消息内容主键ID
+     * @param current      当前页
+     * @param size     每页条数
+     * @return
+     */
+    @GetMapping("/mceManageById")
+    public ApiResult<CommonPage<MceReceive>> mceManageById(@RequestParam(value = "id") Integer id,
+                                                           @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                                                           @RequestParam(value = "size", required = false, defaultValue = "10") Integer size)
+    {
+        return ApiResult.success(mceReceiveService.mceManageById(id,current,size));
+    }
+
+    /**
+     * 消息接收分类统计接口
+     * @return
+     */
+    @GetMapping("/mceReceiveStatic")
+    public ApiResult<Map<String, Object>> mceReceiveStatic()
+    {
+        return ApiResult.success(mceReceiveService.mceReceiveStatic());
+    }
+
+    /**
+     * 已读
+     * @return
+     */
+    @PutMapping
+    ApiResult<Void> updateMceReceive(@RequestBody MceReceive mceReceive){
+        mceReceiveService.updateMceReceive(mceReceive);
+        return ApiResult.success();
+    }
+
+    /**
+     * 消息接收接口
+     * @return
+     */
+    @PostMapping("/mceAdd")
+    ApiResult<Void> add(@RequestBody String mceReceive){
+        mceReceiveService.add(mceReceive);
+        return ApiResult.success();
+    }
+}
+

+ 64 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceSettingController.java

@@ -0,0 +1,64 @@
+package com.usky.system.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.system.domain.MceSetting;
+import com.usky.system.service.MceSettingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 消息设置表 前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2024-04-19
+ */
+@RestController
+@RequestMapping("/mceSetting")
+public class MceSettingController {
+
+    @Autowired
+    private MceSettingService mceSettingService;
+
+    /**
+     * 消息设置回显
+     * @return
+     */
+    @GetMapping("/mceSettingInfo")
+    public ApiResult<Map<String, Object>> mceSettingInfo(){
+        return ApiResult.success(mceSettingService.mceSettingInfo());
+    }
+
+    /**
+     * 消息设置列表
+     * @param createBy     创建人
+     * @param current      当前页
+     * @param size     每页条数
+     * @return
+     */
+    @GetMapping("/mceSettingList")
+    public ApiResult<CommonPage<Map<String, Object>>> mceSettingList(@RequestParam(value = "createBy", required = false) String createBy,
+                                                                     @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                                                                     @RequestParam(value = "size", required = false, defaultValue = "10") Integer size){
+        return ApiResult.success(mceSettingService.mceSettingList(createBy,current,size));
+    }
+
+    /**
+     * 新增、修改
+     * @param mceSetting
+     * @return
+     */
+    @PostMapping("/addMceSetting")
+    public ApiResult<Void> add(@RequestBody MceSetting mceSetting){
+        mceSettingService.add(mceSetting);
+        return ApiResult.success();
+    }
+}
+

+ 80 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/MceContent.java

@@ -0,0 +1,80 @@
+package com.usky.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 消息内容表
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MceContent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 消息标题
+     */
+    private String infoTitle;
+
+    /**
+     * 消息内容
+     */
+    private String infoContent;
+
+    /**
+     * 消息类型
+     */
+    private String infoType;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+
+}

+ 95 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/MceReceive.java

@@ -0,0 +1,95 @@
+package com.usky.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 消息接收表
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MceReceive implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 接收人ID
+     */
+    private Integer receiverId;
+
+    /**
+     * 接收人
+     */
+    private String receiverName;
+
+    /**
+     * 消息类型
+     */
+    private String infoType;
+
+    /**
+     * 是否已读;0、未读,1、已读
+     */
+    private Integer readFlag;
+
+    /**
+     * 消息内容ID
+     */
+    private Integer contentId;
+
+    /**
+     * 子模块记录ID
+     */
+    private Integer moduleId;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+
+}

+ 80 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/MceSetting.java

@@ -0,0 +1,80 @@
+package com.usky.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 消息设置表
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MceSetting implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * APP通知方式
+     */
+    private String appMode;
+
+    /**
+     * PC端通知方式
+     */
+    private String pcMode;
+
+    /**
+     * 微信端通知方式
+     */
+    private String wcMode;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+
+}

+ 16 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/MceContentMapper.java

@@ -0,0 +1,16 @@
+package com.usky.system.mapper;
+
+import com.usky.system.domain.MceContent;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 消息内容表 Mapper 接口
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+public interface MceContentMapper extends CrudMapper<MceContent> {
+
+}

+ 16 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/MceReceiveMapper.java

@@ -0,0 +1,16 @@
+package com.usky.system.mapper;
+
+import com.usky.system.domain.MceReceive;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 消息接收表 Mapper 接口
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+public interface MceReceiveMapper extends CrudMapper<MceReceive> {
+
+}

+ 16 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/MceSettingMapper.java

@@ -0,0 +1,16 @@
+package com.usky.system.mapper;
+
+import com.usky.system.domain.MceSetting;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 消息设置表 Mapper 接口
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+public interface MceSettingMapper extends CrudMapper<MceSetting> {
+
+}

+ 18 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceContentService.java

@@ -0,0 +1,18 @@
+package com.usky.system.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.usky.system.domain.MceContent;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 消息内容表 服务类
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+public interface MceContentService extends CrudService<MceContent> {
+    void sendApp(JSONObject mceReceiveVO, String cids, Integer mceReceiveId, Integer sendType);
+
+}

+ 8 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceMbuserService.java

@@ -1,7 +1,9 @@
 package com.usky.system.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.usky.system.domain.MceMbuser;
 import com.usky.common.mybatis.core.CrudService;
+import com.usky.system.service.vo.SendWeChatMessageRequestVO;
 
 /**
  * <p>
@@ -13,4 +15,10 @@ import com.usky.common.mybatis.core.CrudService;
  */
 public interface MceMbuserService extends CrudService<MceMbuser> {
 
+    /**
+     * 微信消息提醒
+     * @return
+     */
+    JSONObject sendWeChatMessage(SendWeChatMessageRequestVO requestVO);
+
 }

+ 31 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceReceiveService.java

@@ -0,0 +1,31 @@
+package com.usky.system.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.system.domain.MceReceive;
+import com.usky.common.mybatis.core.CrudService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 消息接收表 服务类
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+public interface MceReceiveService extends CrudService<MceReceive> {
+
+    CommonPage<Object> mceList(String infoTitle, String infoType, String startTime, String endTime, Integer current, Integer size);
+
+    CommonPage<Object> mceManageList(String infoTitle, String infoType, String startTime, String endTime, Integer current, Integer size);
+
+    CommonPage<MceReceive> mceManageById(Integer id, Integer current, Integer size);
+
+    Map<String, Object> mceReceiveStatic();
+
+    void updateMceReceive(MceReceive mceReceive);
+
+    void add(String mceReceive);
+
+}

+ 24 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceSettingService.java

@@ -0,0 +1,24 @@
+package com.usky.system.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.system.domain.MceSetting;
+import com.usky.common.mybatis.core.CrudService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 消息设置表 服务类
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+public interface MceSettingService extends CrudService<MceSetting> {
+    void add(MceSetting mceSetting);
+
+    Map<String, Object> mceSettingInfo();
+
+    CommonPage<Map<String, Object>> mceSettingList(String createBy, Integer current, Integer size);
+
+}

+ 137 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/config/websocket/HttpClientUtils.java

@@ -0,0 +1,137 @@
+package com.usky.system.service.config.websocket;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ 1. 跨域请求工具类
+ */
+public class HttpClientUtils {
+
+    public static String doGet(String url, Map<String, String> param) {
+
+        // 创建Httpclient对象
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+
+        String resultString = "";
+        CloseableHttpResponse response = null;
+        try {
+            // 创建uri
+            URIBuilder builder = new URIBuilder(url);
+            if (param != null) {
+                for (String key : param.keySet()) {
+                    builder.addParameter(key, param.get(key));
+                }
+            }
+            URI uri = builder.build();
+
+            // 创建http GET请求
+            HttpGet httpGet = new HttpGet(uri);
+
+            // 执行请求
+            response = httpclient.execute(httpGet);
+            // 判断返回状态是否为200
+            if (response.getStatusLine().getStatusCode() == 200) {
+                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                httpclient.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return resultString;
+    }
+
+    public static String doGet(String url) {
+        return doGet(url, null);
+    }
+
+    public static String doPost(String url, Map<String, String> param) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setHeader("Content-Type", "application/json");
+            // 创建参数列表
+            if (param != null) {
+                List<NameValuePair> paramList = new ArrayList<>();
+                for (String key : param.keySet()) {
+                    paramList.add(new BasicNameValuePair(key, param.get(key)));
+                }
+                // 模拟表单
+                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+                httpPost.setEntity(entity);
+            }
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+
+    public static String doPost(String url) {
+        return doPost(url, null);
+    }
+
+    public static String doPostJson(String url, String json) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 创建请求内容
+            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
+            httpPost.setEntity(entity);
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+}

+ 52 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceContentServiceImpl.java

@@ -0,0 +1,52 @@
+package com.usky.system.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonObject;
+import com.usky.system.domain.MceContent;
+import com.usky.system.mapper.MceContentMapper;
+import com.usky.system.service.MceContentService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.system.service.MceMbuserService;
+import com.usky.system.service.config.websocket.HttpClientUtils;
+import com.usky.system.service.vo.SendWeChatMessageRequestVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 消息内容表 服务实现类
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+@Slf4j
+@Service
+public class MceContentServiceImpl extends AbstractCrudService<MceContentMapper, MceContent> implements MceContentService {
+
+    @Autowired
+    private MceMbuserService mceMbuserService;
+
+    //异步多线程调用
+    @Async("asyncServiceExecutor")
+    public void sendApp(JSONObject mceReceiveVO, String cids, Integer mceReceiveId, Integer sendType){
+        if (sendType.equals(0)){
+            String appUrl = "https://fc-mp-85a26092-1305-4bf1-998f-b609512c8f7b.next.bspapp.com/uniPushMessage";
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("cids", cids);
+            jsonObject.addProperty("title", mceReceiveVO.get("infoTitle").toString());
+            jsonObject.addProperty("content", mceReceiveVO.get("infoContent").toString());
+            String resultString = HttpClientUtils.doPostJson(appUrl,jsonObject.toString());
+        }else if (sendType.equals(1)){
+            SendWeChatMessageRequestVO sendWeChatMessageRequestVO = new SendWeChatMessageRequestVO();
+            sendWeChatMessageRequestVO.setInfoContent(mceReceiveVO.get("infoContent").toString());
+            sendWeChatMessageRequestVO.setInfoTitle(mceReceiveVO.get("infoTitle").toString());
+            sendWeChatMessageRequestVO.setInfoId(mceReceiveId);
+            sendWeChatMessageRequestVO.setOpenId(cids);
+            sendWeChatMessageRequestVO.setInfoType(mceReceiveVO.get("infoType").toString());
+            mceMbuserService.sendWeChatMessage(sendWeChatMessageRequestVO);
+        }
+    }
+}

+ 116 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceMbuserServiceImpl.java

@@ -1,10 +1,31 @@
 package com.usky.system.service.impl;
 
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.redis.core.RedisHelper;
 import com.usky.system.domain.MceMbuser;
 import com.usky.system.mapper.MceMbuserMapper;
 import com.usky.system.service.MceMbuserService;
+import com.usky.system.constant.constant;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.system.service.vo.SendWeChatMessageRequestVO;
+import com.usky.system.service.vo.TemplateData;
+import com.usky.system.service.vo.TemplateMsgEntityVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.client.RestTemplate;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * <p>
@@ -15,6 +36,101 @@ import org.springframework.stereotype.Service;
  * @since 2024-05-06
  */
 @Service
+@Slf4j
 public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, MceMbuser> implements MceMbuserService {
 
+    @Autowired
+    private RedisHelper redisHelper;
+
+    public String getWeChatAccessToken() {
+        try {
+            // 微信公众号官方获取AccessToken
+            RestTemplate restTemplate = new RestTemplate();
+            String requestParams = String.format(constant.WE_CHAT_ACCESS_TOKEN_URL, constant.WE_CHAT_APP_ID, constant.WE_CHAT_SECRET);
+            ResponseEntity<String> responseEntity = restTemplate.getForEntity(requestParams, String.class);
+
+            String accessToken = JSONObject.parseObject(responseEntity.getBody()).getString("access_token");
+            log.info("we_chat_access_token: " + accessToken);
+
+            return accessToken;
+        } catch (Exception e) {
+            log.info("异常信息:{}", e);
+        }
+        return null;
+    }
+
+    public static long getTimeDifference(String oldTime,String newTime) throws ParseException {
+
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        long NTime =df.parse(newTime).getTime();
+        //从对象中拿到时间
+        long OTime = df.parse(oldTime).getTime();
+        long diff=(NTime-OTime)/1000/60;
+        return diff;
+    }
+
+    @Override
+    public JSONObject sendWeChatMessage(@RequestBody SendWeChatMessageRequestVO requestVO) {
+
+        String infoType = requestVO.getInfoType();
+        String infoTitle = requestVO.getInfoTitle();
+        String infoContent = requestVO.getInfoContent();
+        Integer infoId = requestVO.getInfoId();
+        String openId = requestVO.getOpenId();
+
+        //access_token时效校验,判断获取access_token获取时间是否超过有效时间,超过就调用更新,保证一直有效
+        if(!redisHelper.hasKey("access_key")){
+            redisHelper.set("access_time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            redisHelper.set("access_key",this.getWeChatAccessToken());
+        }else{
+            try{
+                String access_time = redisHelper.get("access_time").toString();
+                String now_time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                long i = getTimeDifference(access_time,now_time);
+                if(i > 115){ //大于115分钟
+                    redisHelper.set("access_time",LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                    redisHelper.set("access_key",this.getWeChatAccessToken());
+                }
+            }catch (Exception e){
+                throw new BusinessException(e.getMessage());
+            }
+
+        }
+
+        Object obj = redisHelper.get("access_key");
+        if(obj == null){
+            throw new BusinessException("token不能为空");
+        }
+
+        String token = obj.toString();
+
+        TemplateMsgEntityVO messageVo=new TemplateMsgEntityVO();
+        messageVo.setTTitle(infoTitle);
+        messageVo.setTKeyword1(infoContent);
+//        messageVo.setTKeyword2("测试2");
+//        messageVo.setTKeyword3("测试3");
+        messageVo.setTRemark(infoContent);
+        messageVo.setTUrl(String.format(constant.WE_CHAT_CUSTOMER_CALL_URL,infoId));
+        messageVo.setTemplateId(constant.WE_CHAT_TEMPLATE_ID);
+
+        String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="  + token;
+        Map<String,Object> content=new HashMap<>();
+        Map<String, TemplateData> data = new HashMap<>();
+        data.put("first",new TemplateData(messageVo.getTTitle(),"#44b549"));
+        data.put("keyword1",new TemplateData(messageVo.getTKeyword1(),"#173177"));
+//        data.put("keyword2",new TemplateData(messageVo.getTKeyword2(),"#173177"));
+//        data.put("keyword3",new TemplateData(messageVo.getTKeyword3(),"#173177"));
+        data.put("remark",new TemplateData(messageVo.getTRemark(),"#173177"));
+
+        content.put("touser",openId);
+        content.put("url",messageVo.getTUrl());
+        content.put("template_id",messageVo.getTemplateId());
+        content.put("data",data);
+        String resp = HttpUtil.post(requestUrl, JSONUtil.parseObj(content).toString());
+        System.out.println(content.toString());
+        System.out.println(JSONUtil.parseObj(content));
+        JSONObject result = JSONObject.parseObject(resp);
+        System.out.println("发送消息:" + resp);
+        return result;
+    }
 }

+ 271 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceReceiveServiceImpl.java

@@ -0,0 +1,271 @@
+package com.usky.system.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.system.RemoteUserService;
+import com.usky.system.domain.*;
+import com.usky.system.mapper.MceReceiveMapper;
+import com.usky.system.service.*;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * <p>
+ * 消息接收表 服务实现类
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+@Service
+public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper, MceReceive> implements MceReceiveService {
+    @Autowired
+    private MceContentService mceContentService;
+
+    @Autowired
+    private MceMbuserService mceMbuserService;
+
+    @Autowired
+    private MceSettingService mceSettingService;
+
+    @Autowired
+    private ISysUserService iSysUserService;
+
+    @Override
+    public CommonPage<Object> mceList(String infoTitle, String infoType, String startTime, String endTime, Integer current, Integer size) {
+        List<Object> list = new ArrayList<>();
+        LambdaQueryWrapper<MceContent> lambdaQuery1 = Wrappers.lambdaQuery();
+        lambdaQuery1.select(MceContent::getId, MceContent::getInfoTitle, MceContent::getInfoContent)
+                .like(StringUtils.isNotBlank(infoTitle),MceContent::getInfoTitle,infoTitle);
+        List<MceContent> list1 = mceContentService.list(lambdaQuery1);
+        IPage<MceReceive> page = new Page<>(current, size);
+        List<Integer> contentIds = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(list1)){
+            for(int i=0;i<list1.size();i++){
+                contentIds.add(list1.get(i).getId());
+            }
+            LambdaQueryWrapper<MceReceive> lambdaQuery = Wrappers.lambdaQuery();
+            lambdaQuery.select(MceReceive::getId, MceReceive::getInfoType,
+                    MceReceive::getContentId, MceReceive::getReadFlag, MceReceive::getCreateTime,
+                    MceReceive::getReceiverId,MceReceive::getModuleId)
+                    .between(StringUtils.isNotBlank(startTime)&&StringUtils.isNotBlank(endTime),MceReceive::getCreateTime,
+                            startTime,endTime)
+                    .eq(StringUtils.isNotBlank(infoType),MceReceive::getInfoType, infoType)
+                    .eq(MceReceive::getReceiverId, SecurityUtils.getUserId())
+                    .in(CollectionUtils.isNotEmpty(contentIds),MceReceive::getContentId,contentIds)
+                    .orderByDesc(MceReceive::getId);
+//                .inSql(StringUtils.isNotBlank(infoTitle),MceReceive::getContentId,"SELECT id FROM mce_content WHERE " +
+//                        "info_title like '%" + infoTitle + "%' AND tenant_id = "+SecurityUtils.getTenantId()+"");
+            page = this.page(page,lambdaQuery);
+            if (CollectionUtils.isNotEmpty(page.getRecords())) {
+                for (int i = 0; i < page.getRecords().size(); i++) {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("id", page.getRecords().get(i).getId());
+                    map.put("infoType", page.getRecords().get(i).getInfoType());
+                    map.put("readFlag", page.getRecords().get(i).getReadFlag());
+                    map.put("moduleId", page.getRecords().get(i).getModuleId());
+                    map.put("createTime", page.getRecords().get(i).getCreateTime());
+                    if (CollectionUtils.isNotEmpty(list1)) {
+                        for (int j = 0; j < list1.size(); j++) {
+                            if (page.getRecords().get(i).getContentId().equals(list1.get(j).getId())) {
+                                map.put("infoTitle", list1.get(j).getInfoTitle());
+                                map.put("infoContent", list1.get(j).getInfoContent());
+                            }
+                        }
+                    }
+                    list.add(map);
+                }
+            }
+        }
+        return new CommonPage<>(list,page.getTotal(),page.getCurrent(),page.getSize());
+    }
+
+    @Override
+    public CommonPage<Object> mceManageList(String infoTitle, String infoType, String startTime, String endTime, Integer current, Integer size) {
+        List<Object> list = new ArrayList<>();
+        IPage<MceContent> page = new Page<>(current, size);
+        LambdaQueryWrapper<MceContent> lambdaQuery1 = Wrappers.lambdaQuery();
+        lambdaQuery1.select(MceContent::getId, MceContent::getInfoTitle, MceContent::getInfoContent,
+                MceContent::getCreateTime,MceContent::getInfoType)
+                .like(StringUtils.isNotBlank(infoTitle),MceContent::getInfoTitle,infoTitle)
+                .between(StringUtils.isNotBlank(startTime)&&StringUtils.isNotBlank(endTime),MceContent::getCreateTime,
+                        startTime,endTime)
+                .eq(StringUtils.isNotBlank(infoType),MceContent::getInfoType, infoType)
+                .eq(MceContent::getCreateBy,SecurityUtils.getUsername())
+                .eq(MceContent::getTenantId,SecurityUtils.getTenantId());
+        page = mceContentService.page(page,lambdaQuery1);
+        if (CollectionUtils.isNotEmpty(page.getRecords())) {
+            List<Integer> contentIds = new ArrayList<>();
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                contentIds.add(page.getRecords().get(i).getId());
+            }
+            QueryWrapper<MceReceive> queryWrapper = Wrappers.query();
+            queryWrapper.select("content_id AS contentId","COUNT(read_flag=0 or null) as notReadCount","COUNT(read_flag=1 or null) as readCount")
+                    .in("content_id",contentIds)
+                    .groupBy("content_id");
+            List<Map<String,Object>> readStatisticList = this.listMaps(queryWrapper);
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("id", page.getRecords().get(i).getId());
+                map.put("infoTitle", page.getRecords().get(i).getInfoTitle());
+                map.put("infoContent", page.getRecords().get(i).getInfoContent());
+                map.put("infoType", page.getRecords().get(i).getInfoType());
+                map.put("createTime", page.getRecords().get(i).getCreateTime());
+                for (int j = 0; j < readStatisticList.size(); j++) {
+                    if (page.getRecords().get(i).getId().equals(readStatisticList.get(j).get("contentId"))){
+                        map.put("notReadCount", readStatisticList.get(j).get("notReadCount"));
+                        map.put("readCount", readStatisticList.get(j).get("readCount"));
+                    }
+                }
+                list.add(map);
+            }
+        }
+        return new CommonPage<>(list,page.getTotal(),page.getCurrent(),page.getSize());
+    }
+
+    @Override
+    public CommonPage<MceReceive> mceManageById(Integer id, Integer current, Integer size) {
+        IPage<MceReceive> page = new Page<>(current, size);
+        LambdaQueryWrapper<MceReceive> lambdaQuery = Wrappers.lambdaQuery();
+        lambdaQuery.eq(MceReceive::getContentId,id);
+        page = this.page(page,lambdaQuery);
+//        if (CollectionUtils.isNotEmpty(page.getRecords())) {
+//            List<Integer> userIds = new ArrayList<>();
+//            for (int i = 0; i < page.getRecords().size(); i++) {
+//                userIds.add(page.getRecords().get(i).getReceiverId());
+//            }
+//            List<Integer> distinctUserIds = userIds.stream()
+//                    .distinct()
+//                    .collect(Collectors.toList());
+//            ApiResult<List<SysUser>> userApi = remoteUserService.userByIdList(distinctUserIds);
+//            List<SysUser> list1 = userApi.getData();
+//            for (int j = 0; j < page.getRecords().size(); j++) {
+//                if (CollectionUtils.isNotEmpty(list1)){
+//                    for (int k = 0; k < list1.size(); k++) {
+//                        long longValue = list1.get(k).getUserId();
+//                        Integer intValue = (int) longValue;
+//                        if (page.getRecords().get(j).getReceiverId().equals(intValue)){
+//                            page.getRecords().get(j).setUpdateBy(list1.get(k).getUserName());
+//                        }
+//                    }
+//                }
+//            }
+//        }
+        return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
+    }
+
+    @Override
+    public Map<String, Object> mceReceiveStatic() {
+        LocalDateTime currentDate = LocalDateTime.now();
+        LocalDateTime oneYearAgo = currentDate.minusYears(1);
+        LocalDateTime zeroTime = oneYearAgo.withHour(0).withMinute(0).withSecond(0);
+        QueryWrapper<MceReceive> queryWrapper = Wrappers.query();
+        queryWrapper.select("COUNT(read_flag=0 or null) as notReadCount","COUNT(read_flag=1 or null) as readCount"
+                ,"info_type AS infoType")
+                .eq("receiver_id",SecurityUtils.getUserId())
+                .between("create_time",zeroTime,currentDate)
+                .groupBy("info_type");
+        List<Map<String,Object>> readStatisticList = this.listMaps(queryWrapper);
+        LambdaQueryWrapper<MceReceive> lambdaQuery = Wrappers.lambdaQuery();
+        lambdaQuery.eq(MceReceive::getReceiverId,SecurityUtils.getUserId())
+                .eq(MceReceive::getReadFlag,0);
+        Integer notReadCount = this.count(lambdaQuery);
+        Map<String, Object> map = new HashMap<>();
+        map.put("notReadCount", notReadCount);
+        map.put("infoTypeStatic", readStatisticList);
+        return map;
+    }
+
+    @Override
+    public void updateMceReceive(MceReceive mceReceive){
+        LambdaUpdateWrapper<MceReceive> updateWrapper = new UpdateWrapper<MceReceive>().lambda();
+        if (Objects.nonNull(mceReceive.getId())&&!mceReceive.getId().equals(0)){
+            updateWrapper.eq(MceReceive::getId,mceReceive.getId())
+                    .set(MceReceive::getReadFlag,1)
+                    .set(MceReceive::getUpdateBy,SecurityUtils.getUsername())
+                    .set(MceReceive::getUpdateTime,LocalDateTime.now());
+        }else {
+            updateWrapper.eq(MceReceive::getReceiverId,SecurityUtils.getUserId())
+                    .eq(MceReceive::getReadFlag,0)
+                    .set(MceReceive::getReadFlag,1)
+                    .set(MceReceive::getUpdateBy,SecurityUtils.getUsername())
+                    .set(MceReceive::getUpdateTime,LocalDateTime.now());
+        }
+        this.update(updateWrapper);
+    }
+
+    @Override
+    public void add(String mceReceive){
+        JSONObject mceReceiveVO = JSONObject.parseObject(mceReceive);
+        MceContent mceContent = new MceContent();
+        mceContent.setInfoTitle(mceReceiveVO.get("infoTitle").toString());
+        mceContent.setInfoContent(mceReceiveVO.get("infoContent").toString());
+        mceContent.setInfoType(mceReceiveVO.get("infoType").toString());
+        mceContent.setCreateBy(SecurityUtils.getUsername());
+        mceContent.setCreateTime(LocalDateTime.now());
+//        mceContent.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId().intValue());
+
+        mceContent.setTenantId(SecurityUtils.getTenantId());
+        mceContentService.save(mceContent);
+        Integer contentId = mceContent.getId();
+        List<SysUser> list = iSysUserService.userAllList();
+        if (CollectionUtils.isNotEmpty(list)) {
+            List<Integer> userIds = new ArrayList<>();
+            for (int g = 0; g < list.size(); g++) {
+                userIds.add(list.get(g).getUserId().intValue());
+            }
+            LambdaQueryWrapper<MceMbuser> lambdaQuery3 = Wrappers.lambdaQuery();
+            lambdaQuery3.in(MceMbuser::getUserId,userIds);
+            List<MceMbuser> list3 = mceMbuserService.list(lambdaQuery3);
+            for (int i = 0; i < list.size(); i++) {
+                MceReceive mceReceive1 = new MceReceive();
+                mceReceive1.setReceiverId(list.get(i).getUserId().intValue());
+                mceReceive1.setContentId(contentId);
+                mceReceive1.setReadFlag(0);
+                mceReceive1.setInfoType(mceReceiveVO.get("infoType").toString());
+                mceReceive1.setModuleId((int)mceReceiveVO.get("id"));
+                mceReceive1.setReceiverName(list.get(i).getUserName());
+                mceReceive1.setCreateBy(SecurityUtils.getUsername());
+                mceReceive1.setCreateTime(LocalDateTime.now());
+                mceReceive1.setTenantId(list.get(i).getTenantId());
+//                mceReceive1.setDeptId(list.get(i).getDeptId().intValue());
+                this.save(mceReceive1);
+                Integer mceReceiveId = mceReceive1.getId();
+                LambdaQueryWrapper<MceSetting> lambdaQuery = Wrappers.lambdaQuery();
+                lambdaQuery.eq(MceSetting::getCreateBy,list.get(i).getUserName());
+                List<MceSetting> list1 = mceSettingService.list(lambdaQuery);
+                if (CollectionUtils.isNotEmpty(list1)){
+                    JSONObject appMode = JSONObject.parseObject(list1.get(0).getAppMode());
+                    JSONObject wcMode = JSONObject.parseObject(list1.get(0).getWcMode());
+                    for (int j = 0; j < list3.size(); j++){
+                        if (appMode.get(mceReceiveVO.get("infoType").toString()).equals(true)){
+                            if (list.get(i).getUserId().equals(list3.get(j).getUserId()) && StringUtils.isNotBlank(list3.get(j).getCids())){
+                                mceContentService.sendApp(mceReceiveVO,list3.get(j).getCids(),0,0);
+                            }
+                        }
+                        if (wcMode.get(mceReceiveVO.get("infoType").toString()).equals(true)){
+                            if (list.get(i).getUserId().equals(list3.get(j).getUserId()) && StringUtils.isNotBlank(list3.get(j).getOpenid())){
+                                mceContentService.sendApp(mceReceiveVO,list3.get(j).getOpenid(),mceReceiveId,1);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 97 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceSettingServiceImpl.java

@@ -0,0 +1,97 @@
+package com.usky.system.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.system.domain.MceSetting;
+import com.usky.system.mapper.MceSettingMapper;
+import com.usky.system.service.MceSettingService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 消息设置表 服务实现类
+ * </p>
+ *
+ * @author han
+ * @since 2024-05-09
+ */
+@Service
+public class MceSettingServiceImpl extends AbstractCrudService<MceSettingMapper, MceSetting> implements MceSettingService {
+    @Override
+    public void add(MceSetting mceSetting){
+        if (mceSetting.getId().equals(0)){
+            mceSetting.setCreateBy(SecurityUtils.getUsername());
+            mceSetting.setCreateTime(LocalDateTime.now());
+            mceSetting.setTenantId(SecurityUtils.getTenantId());
+            long longValue = SecurityUtils.getLoginUser().getSysUser().getDeptId();
+            Integer intValue = (int) longValue;
+            mceSetting.setDeptId(intValue);
+            this.save(mceSetting);
+        }else {
+            mceSetting.setUpdateBy(SecurityUtils.getUsername());
+            mceSetting.setUpdateTime(LocalDateTime.now());
+            this.updateById(mceSetting);
+        }
+    }
+    @Override
+    public Map<String, Object> mceSettingInfo() {
+        LambdaQueryWrapper<MceSetting> lambdaQuery = Wrappers.lambdaQuery();
+        lambdaQuery.eq(MceSetting::getCreateBy, SecurityUtils.getUsername())
+                .eq(MceSetting::getTenantId,SecurityUtils.getTenantId());
+        List<MceSetting> list1 = this.list(lambdaQuery);
+        Map<String, Object> map = new HashMap<>();
+        if (CollectionUtils.isEmpty(list1)) {
+            Map<String, Object> map1 = new HashMap<>();
+            map1.put("1", true);
+            map1.put("2", true);
+            map1.put("3", true);
+            map1.put("4", true);
+            map.put("appMode",map1);
+            map.put("pcMode",map1);
+            map.put("wcMode",map1);
+            map.put("id",0);
+        }else {
+            map.put("appMode", JSONObject.parseObject(list1.get(0).getAppMode()));
+            map.put("pcMode",JSONObject.parseObject(list1.get(0).getPcMode()));
+            map.put("wcMode",JSONObject.parseObject(list1.get(0).getWcMode()));
+            map.put("id",list1.get(0).getId());
+        }
+        return map;
+    }
+
+    @Override
+    public CommonPage<Map<String, Object>> mceSettingList(String createBy, Integer current, Integer size) {
+        IPage<MceSetting> page = new Page<>(current, size);
+        List<Map<String, Object>> list = new ArrayList<>();
+        LambdaQueryWrapper<MceSetting> lambdaQuery = Wrappers.lambdaQuery();
+        lambdaQuery.eq(MceSetting::getTenantId,SecurityUtils.getTenantId())
+                .like(StringUtils.isNotBlank(createBy),MceSetting::getCreateBy,createBy);
+        page = this.page(page,lambdaQuery);
+        if (CollectionUtils.isNotEmpty(page.getRecords())) {
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("id",page.getRecords().get(i).getId());
+                map.put("createBy",page.getRecords().get(i).getCreateBy());
+                map.put("appMode",JSONObject.parseObject(page.getRecords().get(i).getAppMode()));
+                map.put("pcMode",JSONObject.parseObject(page.getRecords().get(i).getPcMode()));
+                map.put("wcMode",JSONObject.parseObject(page.getRecords().get(i).getWcMode()));
+                list.add(map);
+            }
+        }
+        return new CommonPage<>(list,page.getTotal(),page.getCurrent(),page.getSize());
+    }
+}

+ 3 - 3
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysNoticeServiceImpl.java

@@ -4,10 +4,10 @@ package com.usky.system.service.impl;
 import com.google.gson.JsonObject;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.mybatis.core.AbstractCrudService;
-import com.usky.iot.RemoteMceService;
 import com.usky.system.domain.SysNotice;
 import com.usky.system.mapper.SysNoticeMapper;
 import com.usky.system.service.ISysNoticeService;
+import com.usky.system.service.MceReceiveService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -27,7 +27,7 @@ public class SysNoticeServiceImpl extends AbstractCrudService<SysNoticeMapper, S
     private SysNoticeMapper noticeMapper;
 
     @Autowired
-    private RemoteMceService remoteMceService;
+    private MceReceiveService mceReceiveService;
 
     /**
      * 查询公告信息
@@ -68,7 +68,7 @@ public class SysNoticeServiceImpl extends AbstractCrudService<SysNoticeMapper, S
         jsonObject.addProperty("infoContent",notice.getNoticeContent());
         jsonObject.addProperty("infoType",1);
         jsonObject.addProperty("id",insertId);
-        ApiResult<Void> resultMce = remoteMceService.addMce(jsonObject.toString());
+        mceReceiveService.add(jsonObject.toString());
         return insertId;
     }
 

+ 31 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SendWeChatMessageRequestVO.java

@@ -0,0 +1,31 @@
+package com.usky.system.service.vo;
+
+import lombok.Data;
+
+@Data
+public class SendWeChatMessageRequestVO {
+    /**
+     * 消息类型
+     */
+    String infoType;
+
+    /**
+     * 消息标题
+     */
+    String infoTitle;
+
+    /**
+     * 消息内容
+     */
+    String infoContent;
+
+    /**
+     * 消息Id
+     */
+    Integer infoId;
+
+    /**
+     * openId
+     */
+    String openId;
+}

+ 11 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/TemplateData.java

@@ -0,0 +1,11 @@
+package com.usky.system.service.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@AllArgsConstructor
+@Data
+public class TemplateData {
+    private String value;
+    private String color;
+}

+ 48 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/TemplateMsgEntityVO.java

@@ -0,0 +1,48 @@
+package com.usky.system.service.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TemplateMsgEntityVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 标题
+     */
+    private String tTitle;
+    /**
+     * 第一行
+     */
+    private String tKeyword1;
+    /**
+     * 第二行
+     */
+    private String tKeyword2;
+    /**
+     * 第三行
+     */
+    private String tKeyword3;
+    /**
+     * 第四行
+     */
+    private String tKeyword4;
+    /**
+     * 备注
+     */
+    private String tRemark;
+    /**
+     * 跳转连接
+     */
+    private String tUrl;
+    /**
+     * 模板Id
+     */
+    private String templateId;
+    /**
+     * 状态
+     */
+    private int tStatus;
+
+}

+ 19 - 0
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/MceContentMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.system.mapper.MceContentMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.system.domain.MceContent">
+        <id column="id" property="id" />
+        <result column="info_title" property="infoTitle" />
+        <result column="info_content" property="infoContent" />
+        <result column="info_type" property="infoType" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="dept_id" property="deptId" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>

+ 22 - 0
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/MceReceiveMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.system.mapper.MceReceiveMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.system.domain.MceReceive">
+        <id column="id" property="id" />
+        <result column="receiver_id" property="receiverId" />
+        <result column="receiver_name" property="receiverName" />
+        <result column="info_type" property="infoType" />
+        <result column="read_flag" property="readFlag" />
+        <result column="content_id" property="contentId" />
+        <result column="module_id" property="moduleId" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="dept_id" property="deptId" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>

+ 19 - 0
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/MceSettingMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.system.mapper.MceSettingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.system.domain.MceSetting">
+        <id column="id" property="id" />
+        <result column="app_mode" property="appMode" />
+        <result column="pc_mode" property="pcMode" />
+        <result column="wc_mode" property="wcMode" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="dept_id" property="deptId" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>