Преглед на файлове

企微聊天小程序消息处理

Long преди 1 седмица
родител
ревизия
787c02cab4

+ 25 - 4
fs-qw-api-msg/src/main/java/com/fs/app/controller/QwMsgController.java

@@ -1,6 +1,7 @@
 package com.fs.app.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.fs.app.socket.QwImSocket;
 import com.fs.app.util.AudioUtils;
 import com.fs.common.core.redis.RedisCache;
@@ -9,13 +10,13 @@ import com.fs.common.utils.uuid.IdUtils;
 import com.fs.fastGpt.service.AiHookService;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.service.IQwUserVoiceLogService;
 import com.fs.qw.vo.QwMessageListVO;
 import com.fs.wxwork.dto.*;
 import com.fs.wxwork.service.WxWorkService;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
-import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -41,6 +42,8 @@ public class QwMsgController {
     WxWorkService wxWorkService;
     @Autowired
     IQwUserVoiceLogService qwUserVoiceLogService;
+    @Autowired
+    private IQwCompanyService qwCompanyService;
 
     @PostMapping("/callback/{serverId}")
     @ResponseBody
@@ -70,7 +73,7 @@ public class QwMsgController {
             case 104001:
                 System.out.println("登录成功");
 
-                JSONObject jsonObject = new JSONObject(wxWorkMsgResp.getJson());
+                JSONObject jsonObject = JSON.parseObject(wxWorkMsgResp.getJson());
                 QwUser qu = qwUserMapper.selectQwUserById(id);
                 Long corpId = jsonObject.getLong("Corpid");
                 System.out.println("回调中的"+corpId);
@@ -261,10 +264,9 @@ public class QwMsgController {
      * @param sendType          发送者类型 1客户 2销售
      */
     private void processMiniAppMessage(Long serverId, WxWorkMessageDTO wxWorkMessageDTO, WxWorkMsgResp wxWorkMsgResp, Long id, Long userId, int sendType) {
-        System.out.println(wxWorkMsgResp.getJson());
         String thumbName = IdUtils.fastSimpleUUID() + ".jpg";
         WxWorkResponseDTO<String> fileUrlResp =
-                aiHookService.getFileUrl(wxWorkMsgResp.getUuid(), wxWorkMessageDTO.getThumbFileId(), wxWorkMessageDTO.getThumbAESKey(), 3, thumbName, wxWorkMessageDTO.getSize(), serverId);
+                aiHookService.getFileUrl(wxWorkMsgResp.getUuid(), wxWorkMessageDTO.getThumbFileId(), wxWorkMessageDTO.getThumbAESKey(), 1, thumbName, wxWorkMessageDTO.getSize(), serverId);
         if (fileUrlResp.getErrcode() != 0) {
             log.warn("获取图片地址失败: {}", fileUrlResp.getErrmsg());
             return;
@@ -272,10 +274,29 @@ public class QwMsgController {
 
         JSONObject json = new JSONObject();
         json.put("appid", wxWorkMessageDTO.getAppid());
+        json.put("appName", wxWorkMessageDTO.getAppName());
+        json.put("weappIconUrl", wxWorkMessageDTO.getAppid());
+        json.put("desc", wxWorkMessageDTO.getDesc());
         json.put("pagepath", wxWorkMessageDTO.getPagepath());
         json.put("title", wxWorkMessageDTO.getTitle());
         json.put("thumbnail", fileUrlResp.getData());
 
+        // 储存发送参数
+        JSONObject params = new JSONObject();
+        params.put("desc", wxWorkMessageDTO.getDesc());
+        params.put("appName", wxWorkMessageDTO.getAppName());
+        params.put("title", wxWorkMessageDTO.getTitle());
+        params.put("weappIconUrl", wxWorkMessageDTO.getWeappIconUrl());
+        params.put("pagepath", wxWorkMessageDTO.getPagepath());
+        params.put("username", wxWorkMessageDTO.getUsername());
+        params.put("appid", wxWorkMessageDTO.getAppid());
+        params.put("cdnkey", wxWorkMessageDTO.getThumbFileId());
+        params.put("md5", wxWorkMessageDTO.getThumbMD5());
+        params.put("aeskey", wxWorkMessageDTO.getThumbAESKey());
+        params.put("fileSize", wxWorkMessageDTO.getSize());
+        params.put("thumbnail", fileUrlResp.getData());
+        qwCompanyService.saveSendParams(params);
+
         // 保存聊天消息
         QwMessageListVO message = aiHookService.saveQwMsg(id, userId, json.toString(), wxWorkMsgResp.getUuid(), sendType, wxWorkMsgResp.getJson(), 5);
         QwImSocket.broadcast(message);

+ 1 - 9
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -3,7 +3,6 @@ package com.fs.course.service.impl;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.domain.R;
@@ -1237,14 +1236,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
         //生成小程序链接
         String linkByMiniApp = createLinkByMiniApp(new Date(), param.getCourseId(), param.getVideoId(), qwUser, qwExternalContact.getId(),2,null);
-
-        JSONObject news = new JSONObject(true);
-        news.put("miniprogramAppid", qwCompany.getMiniAppId());
-        news.put("miniprogramTitle", param.getTitle());
-        news.put("miniprogramPicUrl", "https://cos.his.cdwjyyh.com/fs/20250523/9c8af5735d784847818cada7fa776a7b.jpg");
-        news.put("miniprogramPage", linkByMiniApp);
-
-        return R.ok().put("data",news);
+        return R.ok().put("data", linkByMiniApp);
     }
 
     private String createLinkByMiniApp(Date sendTime, Long courseId, Long videoId,

+ 5 - 8
fs-service-system/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java

@@ -26,6 +26,7 @@ import com.fs.fastgptApi.service.ChatService;
 import com.fs.fastgptApi.service.Impl.AudioServiceImpl;
 import com.fs.fastgptApi.vo.AudioVO;
 import com.fs.qw.domain.*;
+import com.fs.qw.enums.MsgType;
 import com.fs.qw.mapper.*;
 import com.fs.qw.service.*;
 import com.fs.qw.vo.QwMessageListVO;
@@ -1345,15 +1346,11 @@ public class AiHookServiceImpl implements AiHookService {
 
         listVO.setCompanyId(qwUser.getCompanyId());
         String type = "text";
-        if (msgType == 2) {
-            type = "image";
-        } else if (msgType == 3) {
-            type = "emotionDynamic";
-        } else if (msgType == 4) {
-            type = "voice";
-        } else if (msgType == 5) {
-            type = "miniprogram";
+        MsgType messageType = MsgType.getMsgType(msgType);
+        if (Objects.nonNull(messageType)){
+            type = messageType.getValue();
         }
+
         listVO.setType(type);
         listVO.setStatus("succeed");
         listVO.setExtId(qwMsg.getQwExtId());

+ 3 - 0
fs-service-system/src/main/java/com/fs/qw/domain/QwCompany.java

@@ -80,4 +80,7 @@ public class QwCompany extends BaseEntity
 
     /** 小程序ID */
     private String miniAppId;
+
+    /** 小程序消息发送参数 */
+    private String miniAppParam;
 }

+ 27 - 0
fs-service-system/src/main/java/com/fs/qw/enums/MsgType.java

@@ -0,0 +1,27 @@
+package com.fs.qw.enums;
+
+import lombok.Getter;
+
+import java.util.stream.Stream;
+
+@Getter
+public enum MsgType {
+    TEXT(1, "text"),
+    IMAGE(2, "image"),
+    EMOTION_DYNAMIC(3, "emotionDynamic"),
+    VOICE(4, "voice"),
+    MINI_PROGRAM(5, "miniprogram"),
+    ;
+
+    private final Integer code;
+    private final String value;
+
+    MsgType(Integer code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    public static MsgType getMsgType(Integer code) {
+        return Stream.of(values()).filter(t -> t.getCode().equals(code)).findFirst().orElse(null);
+    }
+}

+ 7 - 0
fs-service-system/src/main/java/com/fs/qw/mapper/QwCompanyMapper.java

@@ -2,7 +2,9 @@ package com.fs.qw.mapper;
 
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.vo.QwOptionsVO;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
 
@@ -69,4 +71,9 @@ public interface QwCompanyMapper
     @Select("SELECT * from qw_company ")
     List<QwOptionsVO> selectQwCompanyListOptionsVO();
 
+    @Select("select count(1) from qw_company where mini_app_id = #{appid} and mini_app_param is null")
+    int countNotParamByMiniAppId(@Param("appid") String appid);
+
+    @Update("update qw_company set mini_app_param = #{json} where mini_app_id = #{appid}")
+    void updateParamByMiniAppId(@Param("appid") String appid, @Param("json") String json);
 }

+ 6 - 1
fs-service-system/src/main/java/com/fs/qw/service/IQwCompanyService.java

@@ -1,5 +1,6 @@
 package com.fs.qw.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.vo.QwOptionsVO;
 
@@ -64,5 +65,9 @@ public interface IQwCompanyService
 
     List<QwOptionsVO> selectQwCompanyListOptionsVO();
 
-
+    /**
+     * 保存小程序消息发送参数
+     * @param params    参数
+     */
+    void saveSendParams(JSONObject params);
 }

+ 28 - 0
fs-service-system/src/main/java/com/fs/qw/service/impl/QwCompanyServiceImpl.java

@@ -1,14 +1,18 @@
 package com.fs.qw.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.mapper.QwCompanyMapper;
 import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.vo.QwOptionsVO;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 企微主体Service业务层处理
@@ -16,6 +20,7 @@ import java.util.List;
  * @author fs
  * @date 2024-10-09
  */
+@Slf4j
 @Service
 public class QwCompanyServiceImpl implements IQwCompanyService
 {
@@ -105,4 +110,27 @@ public class QwCompanyServiceImpl implements IQwCompanyService
     public List<QwOptionsVO> selectQwCompanyListOptionsVO() {
         return qwCompanyMapper.selectQwCompanyListOptionsVO();
     }
+
+    /**
+     * 保存小程序消息发送参数
+     * @param params    参数
+     */
+    @Override
+    public void saveSendParams(JSONObject params) {
+        if (Objects.isNull(params)) {
+            log.warn("保存小程序消息发送参数 参数为空");
+            return;
+        }
+
+        String appid = params.getString("appid");
+        if (StringUtils.isBlank(appid)) {
+            log.warn("保存小程序消息发送参数 appid为空");
+            return;
+        }
+
+        int count = qwCompanyMapper.countNotParamByMiniAppId(appid);
+        if (count > 0) {
+            qwCompanyMapper.updateParamByMiniAppId(appid, params.toString());
+        }
+    }
 }

+ 46 - 49
fs-service-system/src/main/java/com/fs/qw/service/impl/QwMsgServiceImpl.java

@@ -2,7 +2,6 @@ package com.fs.qw.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.http.HttpRequest;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -13,10 +12,8 @@ import com.fs.his.config.FsSysConfig;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.qw.Bean.MsgBean;
 import com.fs.qw.domain.*;
-import com.fs.qw.mapper.QwExternalContactMapper;
-import com.fs.qw.mapper.QwMsgMapper;
-import com.fs.qw.mapper.QwSessionMapper;
-import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.enums.MsgType;
+import com.fs.qw.mapper.*;
 import com.fs.qw.param.QwMsgSendParam;
 import com.fs.qw.param.QwSessionParam;
 import com.fs.qw.service.IQwMsgService;
@@ -50,6 +47,8 @@ public class QwMsgServiceImpl extends ServiceImpl<QwMsgMapper, QwMsg> implements
     private QwExternalContactMapper qwExternalContactMapper;
     @Autowired
     private QwUserMapper qwUserMapper;
+    @Autowired
+    private QwCompanyMapper qwCompanyMapper;
 
     @Autowired
     private ConfigUtil configUtil;
@@ -296,8 +295,9 @@ public class QwMsgServiceImpl extends ServiceImpl<QwMsgMapper, QwMsg> implements
         long sendUserId = listWxWorkResponseDTO.getData().get(0).getUser_id();
         String msgJson;
 
+        MsgType msgType = MsgType.getMsgType(param.getMsgType());
         // 发送消息  文本
-        if (param.getMsgType() == 1) {
+        if (MsgType.TEXT == msgType) {
             WxWorkSendTextMsgDTO textMsgDTO = new WxWorkSendTextMsgDTO();
             textMsgDTO.setUuid(uuid);
             textMsgDTO.setSend_userid(sendUserId);
@@ -312,7 +312,7 @@ public class QwMsgServiceImpl extends ServiceImpl<QwMsgMapper, QwMsg> implements
         }
 
         // 图片
-        else if (param.getMsgType() == 2) {
+        else if (MsgType.IMAGE == msgType) {
             WxCdnUploadImgLinkDTO linkDTO = new WxCdnUploadImgLinkDTO();
             linkDTO.setUuid(uuid);
             linkDTO.setUrl(param.getContent());
@@ -338,41 +338,51 @@ public class QwMsgServiceImpl extends ServiceImpl<QwMsgMapper, QwMsg> implements
             msgJson = JSONObject.toJSONString(imgMsgDTO);
         }
         // 小程序
-        else if (param.getMsgType() == 5) {
-            JSONObject json = JSON.parseObject(param.getContent());
-            String appid = json.getString("appid");
-            String page = json.getString("pagepath");
-            String title = json.getString("title");
-            String thumbnail = json.getString("thumbnail");
-
-            // 上传cdn
-            WxCdnUploadImgLinkDTO linkDTO = new WxCdnUploadImgLinkDTO();
-            linkDTO.setUuid(uuid);
-            linkDTO.setUrl(thumbnail);
-            WxWorkResponseDTO<WxCdnUploadImgLinkResp> imgLinkResp = wxWorkService.cdnUploadImgLink(linkDTO, serverId);
-            if (imgLinkResp.getErrcode() != 0) {
-                return R.error(imgLinkResp.getErrmsg());
+        else if (MsgType.MINI_PROGRAM == msgType) {
+            QwCompany qwCompany = qwCompanyMapper.selectQwCompanyByCorpId(qwUser.getCorpId());
+            if (Objects.isNull(qwCompany)) {
+                return R.error("企微主体不存在");
+            }
+
+            String miniAppParam = qwCompany.getMiniAppParam();
+            if (StringUtils.isBlank(miniAppParam)) {
+                return R.error("配置信息不存在");
             }
-            WxCdnUploadImgLinkResp data = imgLinkResp.getData();
+
+            String pagepath = param.getContent();
+            JSONObject paramJson = JSONObject.parseObject(miniAppParam);
 
             // 发送小程序消息
             WxWorkSendAppMsgDTO appMsgDTO = new WxWorkSendAppMsgDTO();
             appMsgDTO.setUuid(uuid);
-            appMsgDTO.setSendUserid(sendUserId);
-            appMsgDTO.setTitle(title);
-            appMsgDTO.setPagepath(page);
-            appMsgDTO.setAppid(appid);
-            appMsgDTO.setCdnkey(data.getCdn_key());
-            appMsgDTO.setMd5(data.getThumb_file_md5());
-            appMsgDTO.setAeskey(data.getAes_key());
-            appMsgDTO.setFileSize(data.getThumb_file_size());
+            appMsgDTO.setSend_userid(sendUserId);
+            appMsgDTO.setDesc(paramJson.getString("title"));
+            appMsgDTO.setTitle(paramJson.getString("appName"));
+            appMsgDTO.setWeappIconUrl(paramJson.getString("weappIconUrl"));
+            appMsgDTO.setPagepath(pagepath);
+            appMsgDTO.setUsername(paramJson.getString("username"));
+            appMsgDTO.setAppid(paramJson.getString("appid"));
+            appMsgDTO.setCdnkey(paramJson.getString("cdnkey"));
+            appMsgDTO.setMd5(paramJson.getString("md5"));
+            appMsgDTO.setAeskey(paramJson.getString("aeskey"));
+            appMsgDTO.setFileSize(paramJson.getInteger("fileSize"));
             appMsgDTO.setIsRoom(false);
             WxWorkResponseDTO<WxWorkSendAppMsgRespDTO> appMsgResp = wxWorkService.SendAppMsg(appMsgDTO, serverId);
             if (appMsgResp.getErrcode() != 0) {
                 return R.error(appMsgResp.getErrmsg());
             }
 
-            msgJson = param.getContent();
+            JSONObject json = new JSONObject();
+            json.put("appid", paramJson.getString("appid"));
+            json.put("appName", paramJson.getString("appName"));
+            json.put("weappIconUrl", paramJson.getString("weappIconUrl"));
+            json.put("desc", paramJson.getString("desc"));
+            json.put("pagepath", pagepath);
+            json.put("title", paramJson.getString("title"));
+            json.put("thumbnail", paramJson.getString("thumbnail"));
+
+            msgJson = json.toJSONString();
+            param.setContent(msgJson);
         } else {
             return R.error("暂不支持的消息类型");
         }
@@ -400,16 +410,7 @@ public class QwMsgServiceImpl extends ServiceImpl<QwMsgMapper, QwMsg> implements
         qwFromUser.setId(Long.parseLong(qwMsg.getQwUserId()));
         qwFromUser.setDisplayName(qwUser.getQwUserName());
         qwFromUser.setAvatar("https://cos.his.cdwjyyh.com/fs/20241231/22a765a96da247d1b83ea94fef438a41.png");
-
-        String type = "text";
-        if (param.getMsgType() == 2) {
-            type = "image";
-        } else if (param.getMsgType() == 3) {
-            type = "emotionDynamic";
-        } else if (param.getMsgType() == 5) {
-            type = "miniprogram";
-        }
-        listVO.setType(type);
+        listVO.setType(msgType.getValue());
         listVO.setStatus("succeed");
         listVO.setFromUser(qwFromUser);
         listVO.setSendTime(qwMsg.getCreateTime().getTime());
@@ -465,6 +466,7 @@ public class QwMsgServiceImpl extends ServiceImpl<QwMsgMapper, QwMsg> implements
         for (QwSession qwSession : qwSessions) {
             QwContactListVO listVO = new QwContactListVO();
             listVO.setId(userId);
+            listVO.setExtId(qwSession.getQwExtId());
             listVO.setAvatar(qwSession.getAvatar());
             listVO.setConversationId(qwSession.getSessionId().toString());
             listVO.setDisplayName(qwSession.getNickName());
@@ -522,14 +524,9 @@ public class QwMsgServiceImpl extends ServiceImpl<QwMsgMapper, QwMsg> implements
         for (QwMsg record : list) {
             QwMessageListVO listVO = new QwMessageListVO();
             String type = "text";
-            if (record.getMsgType() == 2) {
-                type = "image";
-            } else if (record.getMsgType() == 3) {
-                type = "emotionDynamic";
-            } else if (record.getMsgType() == 4) {
-                type = "voice";
-            } else if (record.getMsgType() == 5) {
-                type = "miniprogram";
+            MsgType msgType = MsgType.getMsgType(record.getMsgType());
+            if (Objects.nonNull(record.getMsgType())) {
+                type = msgType.getValue();
             }
             listVO.setType(type);
             listVO.setStatus("succeed");

+ 2 - 0
fs-service-system/src/main/java/com/fs/qw/vo/QwContactListVO.java

@@ -18,4 +18,6 @@ public class QwContactListVO {
     private Long msgId;
     // 消息类型
     private String type;
+    // 外部联系人ID
+    private String extId;
 }

+ 4 - 0
fs-service-system/src/main/java/com/fs/wxwork/dto/WxWorkMessageDTO.java

@@ -36,6 +36,10 @@ public class WxWorkMessageDTO {
 
     // 小程序
     private String appid;
+    private String appName;
+    private String username;
+    private String desc;
+    private String weappIconUrl;
     private String thumbFileId;
     private String thumbMD5;
     private String thumbAESKey;

+ 1 - 1
fs-service-system/src/main/java/com/fs/wxwork/dto/WxWorkSendAppMsgDTO.java

@@ -11,7 +11,7 @@ public class WxWorkSendAppMsgDTO {
     /**
      * 发送者用户 ID
      */
-    private Long sendUserid;
+    private Long send_userid;
     /**
      * 消息描述
      */

+ 6 - 1
fs-service-system/src/main/resources/mapper/qw/QwCompanyMapper.xml

@@ -27,10 +27,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="createBy"    column="create_by"    />
         <result property="isBuy"    column="is_buy"    />
         <result property="miniAppId"    column="mini_app_id"    />
+        <result property="miniAppParam"    column="mini_app_param"    />
     </resultMap>
 
     <sql id="selectQwCompanyVo">
-        select id, corp_id, corp_name, open_secret, open_corp_id, server_agent_id, server_book_corp_id, server_book_secret, token, encoding_aes_key, provider_secret, realm_name_url, notify_url, chat_toolbar, chat_toolbar_oauth, company_ids, status, create_time, update_time, create_by,is_buy, mini_app_id from qw_company
+        select id, corp_id, corp_name, open_secret, open_corp_id, server_agent_id, server_book_corp_id, server_book_secret, token, encoding_aes_key, provider_secret, realm_name_url, notify_url, chat_toolbar, chat_toolbar_oauth, company_ids, status, create_time, update_time, create_by,is_buy, mini_app_id, mini_app_param from qw_company
     </sql>
 
     <select id="selectQwCompanyList" parameterType="QwCompany" resultMap="QwCompanyResult">
@@ -54,6 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="status != null "> and status = #{status}</if>
             <if test="isBuy != null "> and isBuy = #{isBuy}</if>
             <if test="miniAppId != null "> and mini_app_id = #{miniAppId}</if>
+            <if test="miniAppParam != null "> and mini_app_param = #{miniAppParam}</if>
         </where>
     </select>
     
@@ -92,6 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createBy != null">create_by,</if>
             <if test="isBuy != null">is_buy,</if>
             <if test="miniAppId != null">mini_app_id,</if>
+            <if test="miniAppParam != null">mini_app_param,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="corpId != null">#{corpId},</if>
@@ -115,6 +118,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createBy != null">#{createBy},</if>
             <if test="isBuy != null">#{isBuy},</if>
             <if test="miniAppId != null">#{miniAppId},</if>
+            <if test="miniAppParam != null">#{miniAppParam},</if>
          </trim>
     </insert>
 
@@ -142,6 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="isBuy != null">is_buy = #{isBuy},</if>
             <if test="miniAppId != null">mini_app_id = #{miniAppId},</if>
+            <if test="miniAppParam != null">mini_app_param = #{miniAppParam},</if>
         </trim>
         where id = #{id}
     </update>