skyline 1 год назад
Родитель
Сommit
e14b85d2b9

+ 53 - 0
entity/src/main/java/com/kym/entity/miniapp/MpMsgTemplate.java

@@ -0,0 +1,53 @@
+package com.kym.entity.miniapp;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.kym.entity.BaseEntity;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 微信公众号消息模版表
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-08-07
+ */
+@Getter
+@Setter
+@TableName("t_mp_msg_template")
+public class MpMsgTemplate extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 模板id
+     */
+    private String templateId;
+
+    /**
+     * 模板标题
+     */
+    private String title;
+
+    /**
+     * 模板所属行业的一级行业
+     */
+    private String primaryIndustry;
+
+    /**
+     * 模板所属行业的二级行业
+     */
+    private String deputyIndustry;
+
+    /**
+     * 模板内容
+     */
+    private String content;
+
+    /**
+     * 模板示例
+     */
+    private String example;
+}

+ 16 - 0
mapper/src/main/java/com/kym/mapper/miniapp/MpMsgTemplateMapper.java

@@ -0,0 +1,16 @@
+package com.kym.mapper.miniapp;
+
+import com.kym.entity.miniapp.MpMsgTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 微信公众号消息模版表 Mapper 接口
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-08-07
+ */
+public interface MpMsgTemplateMapper extends BaseMapper<MpMsgTemplate> {
+
+}

+ 23 - 0
mapper/src/main/resources/mappers/miniapp/MpMsgTemplateMapper.xml

@@ -0,0 +1,23 @@
+<?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.kym.mapper.miniapp.MpMsgTemplateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.kym.entity.miniapp.MpMsgTemplate">
+        <result column="id" property="id" />
+        <result column="template_id" property="templateId" />
+        <result column="title" property="title" />
+        <result column="primary_industry" property="primaryIndustry" />
+        <result column="deputy_industry" property="deputyIndustry" />
+        <result column="content" property="content" />
+        <result column="example" property="example" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,template_id, title, primary_industry, deputy_industry, content, example,create_time,update_time
+    </sql>
+
+</mapper>

+ 18 - 0
miniapp/src/main/java/com/kym/miniapp/controller/MpMsgTemplateController.java

@@ -0,0 +1,18 @@
+package com.kym.miniapp.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 微信公众号消息模版表 前端控制器
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-08-07
+ */
+@RestController
+@RequestMapping("/mp-msg-template")
+public class MpMsgTemplateController {
+
+}

+ 2 - 2
service/src/main/java/com/kym/service/cache/KymCache.java

@@ -200,8 +200,8 @@ public enum KymCache {
             var connectorId2ParkingNo = equipmentRelations.stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getParkingNo));
             KymCache.INSTANCE.putConnectorId2ParkingNo(connectorId2ParkingNo);
 
-            var ConnectorId2Status = connectorInfoService.list().stream().collect(Collectors.toMap(ConnectorInfo::getConnectorId, ConnectorInfo::getStatus));
-            KymCache.INSTANCE.putConnectorId2Status(ConnectorId2Status);
+            var connectorId2Status = connectorInfoService.list().stream().collect(Collectors.toMap(ConnectorInfo::getConnectorId, ConnectorInfo::getStatus));
+            KymCache.INSTANCE.putConnectorId2Status(connectorId2Status);
         }
     }
 }

+ 16 - 0
service/src/main/java/com/kym/service/miniapp/MpMsgTemplateService.java

@@ -0,0 +1,16 @@
+package com.kym.service.miniapp;
+
+import com.kym.entity.miniapp.MpMsgTemplate;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 微信公众号消息模版表 服务类
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-08-07
+ */
+public interface MpMsgTemplateService extends IService<MpMsgTemplate> {
+
+}

+ 20 - 0
service/src/main/java/com/kym/service/miniapp/impl/MpMsgTemplateServiceImpl.java

@@ -0,0 +1,20 @@
+package com.kym.service.miniapp.impl;
+
+import com.kym.entity.miniapp.MpMsgTemplate;
+import com.kym.mapper.miniapp.MpMsgTemplateMapper;
+import com.kym.service.miniapp.MpMsgTemplateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 微信公众号消息模版表 服务实现类
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-08-07
+ */
+@Service
+public class MpMsgTemplateServiceImpl extends ServiceImpl<MpMsgTemplateMapper, MpMsgTemplate> implements MpMsgTemplateService {
+
+}

+ 10 - 0
service/src/main/java/com/kym/service/wechat/WeixinMPService.java

@@ -2,7 +2,17 @@ package com.kym.service.wechat;
 
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import me.chanjar.weixin.common.error.WxErrorException;
 
+import java.util.List;
+
+/**
+ * 微信公众号服务
+ *
+ * @author skyline
+ */
 public interface WeixinMPService {
     void handleWxMPNotify(HttpServletRequest request, HttpServletResponse response);
+
+    void sendMPTemplateMessage(String mpOpenid, String templateTitle, List<String> dataList) throws WxErrorException;
 }

+ 54 - 1
service/src/main/java/com/kym/service/wechat/impl/WeixinMPServiceImpl.java

@@ -2,18 +2,26 @@ package com.kym.service.wechat.impl;
 
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.XmlUtil;
 import com.kym.common.utils.CommUtil;
+import com.kym.entity.miniapp.MpMsgTemplate;
 import com.kym.entity.miniapp.MpRelation;
+import com.kym.service.miniapp.MpMsgTemplateService;
 import com.kym.service.miniapp.impl.MpRelationServiceImpl;
 import com.kym.service.wechat.WeixinMPService;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -25,10 +33,16 @@ import java.util.Map;
 @Slf4j
 public class WeixinMPServiceImpl implements WeixinMPService {
 
+    private final MpMsgTemplateService mpMsgTemplateService;
+
     private final MpRelationServiceImpl mpRelationService;
 
-    public WeixinMPServiceImpl(MpRelationServiceImpl mpRelationService) {
+    private final WxMpService wxMpService;
+
+    public WeixinMPServiceImpl(MpMsgTemplateService mpMsgTemplateService, MpRelationServiceImpl mpRelationService, WxMpService wxMpService) {
+        this.mpMsgTemplateService = mpMsgTemplateService;
         this.mpRelationService = mpRelationService;
+        this.wxMpService = wxMpService;
     }
 
     /**
@@ -104,4 +118,43 @@ public class WeixinMPServiceImpl implements WeixinMPService {
 
     }
 
+    @Override
+    public void sendMPTemplateMessage(String mpOpenid, String templateTitle, List<String> dataList) throws WxErrorException {
+        var template = getMPMsgTemplate(templateTitle);
+        CommUtil.asserts(template != null, "模板消息不存在");
+        var templateKeys = getMPMsgTemplateKeys(template);
+        if (dataList.size() == templateKeys.length) {
+            WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                    .toUser(mpOpenid)
+                    .templateId(template.getTemplateId())
+                    .url("")
+                    .build();
+            for (int i = 0; i < templateKeys.length; i++) {
+                templateMessage.addData(new WxMpTemplateData(templateKeys[i], dataList.get(i)));
+            }
+            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+        }
+    }
+
+    /**
+     * 获取模板消息的key
+     *
+     * @param template
+     * @return
+     */
+    private String[] getMPMsgTemplateKeys(MpMsgTemplate template) {
+        return StrUtil.removeAll(template.getContent().replace(".DATA", ""), '{', '}').split(",");
+    }
+
+    /**
+     * 获取模板消息
+     *
+     * @param title
+     * @return
+     */
+    private MpMsgTemplate getMPMsgTemplate(String title) {
+        return mpMsgTemplateService.lambdaQuery().eq(MpMsgTemplate::getTitle, title).oneOpt()
+                .isPresent() ? mpMsgTemplateService.lambdaQuery().eq(MpMsgTemplate::getTitle, title).one() : null;
+    }
+
 }