瀏覽代碼

企微员工自定义链接投诉功能

zyp 16 小時之前
父節點
當前提交
4bd815dcec

+ 103 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwUserComplainRecordController.java

@@ -0,0 +1,103 @@
+package com.fs.qw.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.qw.domain.QwUserComplainRecord;
+import com.fs.qw.service.IQwUserComplainRecordService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 企微员工投诉记录Controller
+ *
+ * @author fs
+ * @date 2025-10-22
+ */
+@RestController
+@RequestMapping("/qw/record")
+public class QwUserComplainRecordController extends BaseController
+{
+    @Autowired
+    private IQwUserComplainRecordService qwUserComplainRecordService;
+
+    /**
+     * 查询企微员工投诉记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(QwUserComplainRecord qwUserComplainRecord)
+    {
+        startPage();
+        List<QwUserComplainRecord> list = qwUserComplainRecordService.selectQwUserComplainRecordList(qwUserComplainRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出企微员工投诉记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:export')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(QwUserComplainRecord qwUserComplainRecord)
+    {
+        List<QwUserComplainRecord> list = qwUserComplainRecordService.selectQwUserComplainRecordList(qwUserComplainRecord);
+        ExcelUtil<QwUserComplainRecord> util = new ExcelUtil<QwUserComplainRecord>(QwUserComplainRecord.class);
+        return util.exportExcel(list, "企微员工投诉记录数据");
+    }
+
+    /**
+     * 获取企微员工投诉记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:query')")
+    @GetMapping(value = "/{recordId}")
+    public AjaxResult getInfo(@PathVariable("recordId") Long recordId)
+    {
+        return AjaxResult.success(qwUserComplainRecordService.selectQwUserComplainRecordByRecordId(recordId));
+    }
+
+    /**
+     * 新增企微员工投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:add')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody QwUserComplainRecord qwUserComplainRecord)
+    {
+        return toAjax(qwUserComplainRecordService.insertQwUserComplainRecord(qwUserComplainRecord));
+    }
+
+    /**
+     * 修改企微员工投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:edit')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody QwUserComplainRecord qwUserComplainRecord)
+    {
+        return toAjax(qwUserComplainRecordService.updateQwUserComplainRecord(qwUserComplainRecord));
+    }
+
+    /**
+     * 删除企微员工投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:remove')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{recordIds}")
+    public AjaxResult remove(@PathVariable Long[] recordIds)
+    {
+        return toAjax(qwUserComplainRecordService.deleteQwUserComplainRecordByRecordIds(recordIds));
+    }
+}

+ 35 - 2
fs-qw-api/src/main/java/com/fs/app/controller/CommonController.java

@@ -1,8 +1,21 @@
 package com.fs.app.controller;
 
+import com.fs.common.core.domain.R;
+import com.fs.common.exception.file.OssException;
+import com.fs.course.param.UserCourseComplaintRecordParam;
+import com.fs.course.service.IFsUserCourseComplaintTypeService;
+import com.fs.course.vo.FsUserCourseComplaintTypeListVO;
+import com.fs.qw.param.QwUserComplaintRecordParam;
+import com.fs.qw.service.IQwUserComplainRecordService;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 
 @Api("公共接口")
@@ -10,6 +23,26 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(value="/app/common")
 public class CommonController {
 
+    @Autowired
+    private IQwUserComplainRecordService qwUserComplainRecordService;
+
+    @Autowired
+    private IFsUserCourseComplaintTypeService fsUserCourseComplaintTypeService;
+
+    @PostMapping("uploadOSS")
+    public R uploadOSS(@RequestParam("file") MultipartFile file) throws Exception
+    {
 
+        if (file.isEmpty())
+        {
+            throw new OssException("上传文件不能为空");
+        }
+        // 上传文件
+        String fileName = file.getOriginalFilename();
+        String suffix = fileName.substring(fileName.lastIndexOf("."));
+        CloudStorageService storage = OSSFactory.build();
+        String url = storage.uploadSuffix(file.getBytes(), suffix);
+        return R.ok().put("url",url);
+    }
 
 }

+ 46 - 0
fs-qw-api/src/main/java/com/fs/app/controller/QwUserComplainRecordController.java

@@ -0,0 +1,46 @@
+package com.fs.app.controller;
+
+import com.fs.common.core.domain.R;
+import com.fs.course.service.IFsUserCourseComplaintTypeService;
+import com.fs.course.vo.FsUserCourseComplaintTypeListVO;
+import com.fs.qw.param.QwUserComplaintRecordParam;
+import com.fs.qw.service.IQwUserComplainRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api("企微员工投诉接口")
+@RestController
+@RequestMapping(value="/app/record")
+public class QwUserComplainRecordController {
+
+
+    @Autowired
+    private IQwUserComplainRecordService qwUserComplainRecordService;
+
+    @Autowired
+    private IFsUserCourseComplaintTypeService fsUserCourseComplaintTypeService;
+
+
+    @ApiOperation("获取投诉类型")
+    @GetMapping("/getTypeTree")
+    public R getTypeTree() {
+        List<FsUserCourseComplaintTypeListVO> allComplaintTypeTree = fsUserCourseComplaintTypeService.getAllComplaintTypeTree();
+        return R.ok().put("data", allComplaintTypeTree);
+    }
+
+
+    @ApiOperation("提交企微员工反馈记录")
+    @PostMapping("/recordByQwUser")
+    public R submitByQwUser(@RequestBody QwUserComplaintRecordParam param) {
+        int i = qwUserComplainRecordService.submitRecordByQwUser(param);
+        if (i > 0) {
+            return R.ok("提交成功");
+        } else {
+            return R.error("提交失败");
+        }
+    }
+}

+ 0 - 1
fs-service/src/main/java/com/fs/course/service/IFsUserCourseComplaintRecordService.java

@@ -70,5 +70,4 @@ public interface IFsUserCourseComplaintRecordService extends IService<FsUserCour
      * @return int
      */
     int submitRecord(UserCourseComplaintRecordParam userCourseComplaintRecordParam);
-
 }

+ 1 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseComplaintRecordServiceImpl.java

@@ -135,4 +135,5 @@ public class FsUserCourseComplaintRecordServiceImpl extends ServiceImpl<FsUserCo
         fsUserCourseComplaintRecord.setCreateTime(DateUtils.getNowDate());
         return baseMapper.insertFsUserCourseComplaintRecord(fsUserCourseComplaintRecord);
     }
+
 }

+ 3 - 5
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -1446,15 +1446,13 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         }
         byte[] file;
         try {
-            file = wxMaService.getQrcodeService().createWxaCodeUnlimitBytes(
-                    scene,
-                    "pages_user/user/pay",
-                    true,
+            file = wxMaService.getQrcodeService().createWxaCodeBytes(
+                    "pages_user/user/pay?companyId="+param.getCompanyId(),
                     "release",
                     430,
                     true,
                     null,
-                    false);
+                    true);
 
             // 上传图片到存储桶
             String suffix = ".png";

+ 56 - 0
fs-service/src/main/java/com/fs/qw/domain/QwUserComplainRecord.java

@@ -0,0 +1,56 @@
+package com.fs.qw.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 企微员工投诉记录对象 qw_user_complain_record
+ *
+ * @author fs
+ * @date 2025-10-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class QwUserComplainRecord extends BaseEntity{
+
+    /** 投诉记录id */
+    @TableId(type = IdType.AUTO)
+    private Long recordId;
+
+    /** 用户手机号 */
+    @Excel(name = "用户手机号")
+    private String phone;
+
+    /** 投诉类型id */
+    @Excel(name = "投诉类型id")
+    private Long complaintTypeId;
+
+    /** 投诉内容 */
+    @Excel(name = "投诉内容")
+    private String complaintContent;
+
+    /** 投诉上传图片 */
+    @Excel(name = "投诉上传图片")
+    private String complaintUrl;
+
+    /** 企微员工id */
+    @Excel(name = "企微员工id")
+    private Long qwUserId;
+
+    /** 外部联系人id */
+    @Excel(name = "外部联系人id")
+    private Long extId;
+
+    /** fs_user_id */
+    @Excel(name = "fs_user_id")
+    private Long userId;
+
+    //位置
+    private String position;
+
+
+}

+ 61 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwUserComplainRecordMapper.java

@@ -0,0 +1,61 @@
+package com.fs.qw.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.qw.domain.QwUserComplainRecord;
+
+/**
+ * 企微员工投诉记录Mapper接口
+ *
+ * @author fs
+ * @date 2025-10-22
+ */
+public interface QwUserComplainRecordMapper extends BaseMapper<QwUserComplainRecord>{
+    /**
+     * 查询企微员工投诉记录
+     *
+     * @param recordId 企微员工投诉记录主键
+     * @return 企微员工投诉记录
+     */
+    QwUserComplainRecord selectQwUserComplainRecordByRecordId(Long recordId);
+
+    /**
+     * 查询企微员工投诉记录列表
+     *
+     * @param qwUserComplainRecord 企微员工投诉记录
+     * @return 企微员工投诉记录集合
+     */
+    List<QwUserComplainRecord> selectQwUserComplainRecordList(QwUserComplainRecord qwUserComplainRecord);
+
+    /**
+     * 新增企微员工投诉记录
+     *
+     * @param qwUserComplainRecord 企微员工投诉记录
+     * @return 结果
+     */
+    int insertQwUserComplainRecord(QwUserComplainRecord qwUserComplainRecord);
+
+    /**
+     * 修改企微员工投诉记录
+     *
+     * @param qwUserComplainRecord 企微员工投诉记录
+     * @return 结果
+     */
+    int updateQwUserComplainRecord(QwUserComplainRecord qwUserComplainRecord);
+
+    /**
+     * 删除企微员工投诉记录
+     *
+     * @param recordId 企微员工投诉记录主键
+     * @return 结果
+     */
+    int deleteQwUserComplainRecordByRecordId(Long recordId);
+
+    /**
+     * 批量删除企微员工投诉记录
+     *
+     * @param recordIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteQwUserComplainRecordByRecordIds(Long[] recordIds);
+}

+ 33 - 0
fs-service/src/main/java/com/fs/qw/param/QwUserComplaintRecordParam.java

@@ -0,0 +1,33 @@
+package com.fs.qw.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class QwUserComplaintRecordParam {
+
+    @ApiModelProperty(value = "fsUserId")
+    private Long userId;
+
+    @ApiModelProperty(value = "投诉类型id")
+    private Long complaintTypeId;
+
+    @ApiModelProperty(value = "投诉内容")
+    private String complaintContent;
+
+    @ApiModelProperty(value = "投诉上传图片")
+    private String complaintUrl;
+
+    //企微员工主键ID
+    private Long qwUserId;
+
+    //外部联系人ID
+    private Long extId;
+
+    //用户手机号
+    private String phone;
+
+    //位置
+    private String position;
+
+}

+ 64 - 0
fs-service/src/main/java/com/fs/qw/service/IQwUserComplainRecordService.java

@@ -0,0 +1,64 @@
+package com.fs.qw.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.qw.domain.QwUserComplainRecord;
+import com.fs.qw.param.QwUserComplaintRecordParam;
+
+/**
+ * 企微员工投诉记录Service接口
+ *
+ * @author fs
+ * @date 2025-10-22
+ */
+public interface IQwUserComplainRecordService extends IService<QwUserComplainRecord>{
+    /**
+     * 查询企微员工投诉记录
+     *
+     * @param recordId 企微员工投诉记录主键
+     * @return 企微员工投诉记录
+     */
+    QwUserComplainRecord selectQwUserComplainRecordByRecordId(Long recordId);
+
+    /**
+     * 查询企微员工投诉记录列表
+     *
+     * @param qwUserComplainRecord 企微员工投诉记录
+     * @return 企微员工投诉记录集合
+     */
+    List<QwUserComplainRecord> selectQwUserComplainRecordList(QwUserComplainRecord qwUserComplainRecord);
+
+    /**
+     * 新增企微员工投诉记录
+     *
+     * @param qwUserComplainRecord 企微员工投诉记录
+     * @return 结果
+     */
+    int insertQwUserComplainRecord(QwUserComplainRecord qwUserComplainRecord);
+
+    /**
+     * 修改企微员工投诉记录
+     *
+     * @param qwUserComplainRecord 企微员工投诉记录
+     * @return 结果
+     */
+    int updateQwUserComplainRecord(QwUserComplainRecord qwUserComplainRecord);
+
+    /**
+     * 批量删除企微员工投诉记录
+     *
+     * @param recordIds 需要删除的企微员工投诉记录主键集合
+     * @return 结果
+     */
+    int deleteQwUserComplainRecordByRecordIds(Long[] recordIds);
+
+    /**
+     * 删除企微员工投诉记录信息
+     *
+     * @param recordId 企微员工投诉记录主键
+     * @return 结果
+     */
+    int deleteQwUserComplainRecordByRecordId(Long recordId);
+
+    int submitRecordByQwUser(QwUserComplaintRecordParam param);
+}

+ 187 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwUserComplainRecordServiceImpl.java

@@ -0,0 +1,187 @@
+package com.fs.qw.service.impl;
+
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.course.domain.FsUserCourseComplaintRecord;
+import com.fs.qw.domain.QwCompany;
+import com.fs.qw.domain.QwUser;
+import com.fs.qw.mapper.QwCompanyMapper;
+import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.param.QwUserComplaintRecordParam;
+import com.fs.qwApi.Result.QwSendMsgResult;
+import com.fs.qwApi.param.QwSendMsgParam;
+import com.fs.qwApi.service.QwApiService;
+import org.checkerframework.checker.units.qual.A;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.qw.mapper.QwUserComplainRecordMapper;
+import com.fs.qw.domain.QwUserComplainRecord;
+import com.fs.qw.service.IQwUserComplainRecordService;
+
+/**
+ * 企微员工投诉记录Service业务层处理
+ *
+ * @author fs
+ * @date 2025-10-22
+ */
+@Service
+public class QwUserComplainRecordServiceImpl extends ServiceImpl<QwUserComplainRecordMapper, QwUserComplainRecord> implements IQwUserComplainRecordService {
+
+
+    private static final Logger log = LoggerFactory.getLogger(QwUserComplainRecordServiceImpl.class);
+    @Autowired
+    private QwUserMapper qwUserMapper;
+
+    @Autowired
+    private QwApiService qwApiService;
+
+    @Autowired
+    private QwCompanyMapper qwCompanyMapper;
+
+    /**
+     * 查询企微员工投诉记录
+     *
+     * @param recordId 企微员工投诉记录主键
+     * @return 企微员工投诉记录
+     */
+    @Override
+    public QwUserComplainRecord selectQwUserComplainRecordByRecordId(Long recordId)
+    {
+        return baseMapper.selectQwUserComplainRecordByRecordId(recordId);
+    }
+
+    /**
+     * 查询企微员工投诉记录列表
+     *
+     * @param qwUserComplainRecord 企微员工投诉记录
+     * @return 企微员工投诉记录
+     */
+    @Override
+    public List<QwUserComplainRecord> selectQwUserComplainRecordList(QwUserComplainRecord qwUserComplainRecord)
+    {
+        return baseMapper.selectQwUserComplainRecordList(qwUserComplainRecord);
+    }
+
+    /**
+     * 新增企微员工投诉记录
+     *
+     * @param qwUserComplainRecord 企微员工投诉记录
+     * @return 结果
+     */
+    @Override
+    public int insertQwUserComplainRecord(QwUserComplainRecord qwUserComplainRecord)
+    {
+        qwUserComplainRecord.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertQwUserComplainRecord(qwUserComplainRecord);
+    }
+
+    /**
+     * 修改企微员工投诉记录
+     *
+     * @param qwUserComplainRecord 企微员工投诉记录
+     * @return 结果
+     */
+    @Override
+    public int updateQwUserComplainRecord(QwUserComplainRecord qwUserComplainRecord)
+    {
+        return baseMapper.updateQwUserComplainRecord(qwUserComplainRecord);
+    }
+
+    /**
+     * 批量删除企微员工投诉记录
+     *
+     * @param recordIds 需要删除的企微员工投诉记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteQwUserComplainRecordByRecordIds(Long[] recordIds)
+    {
+        return baseMapper.deleteQwUserComplainRecordByRecordIds(recordIds);
+    }
+
+    /**
+     * 删除企微员工投诉记录信息
+     *
+     * @param recordId 企微员工投诉记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteQwUserComplainRecordByRecordId(Long recordId)
+    {
+        return baseMapper.deleteQwUserComplainRecordByRecordId(recordId);
+    }
+
+    @Override
+    public int submitRecordByQwUser(QwUserComplaintRecordParam param) {
+        QwUserComplainRecord qwUserComplainRecord = new QwUserComplainRecord();
+        BeanUtils.copyProperties(param, qwUserComplainRecord);
+        qwUserComplainRecord.setCreateTime(DateUtils.getNowDate());
+        String description = createDescription(qwUserComplainRecord);
+        //抛出发送消息出现的异常
+        try {
+            log.info("发送应用提醒:{},{}", param.getQwUserId(),description);
+            sendQwMsg(param.getQwUserId(), description);
+        }catch (Exception e){
+
+        }
+        return baseMapper.insertQwUserComplainRecord(qwUserComplainRecord);
+
+    }
+
+
+
+
+    /**
+     * 给企业微信的应用发送消息
+     */
+    private void sendQwMsg(Long qwUserId ,String msg){
+        //查询企微用户
+        QwUser qwUser = qwUserMapper.selectQwUserById(qwUserId);
+        //查询主体信息
+        QwCompany qwCompany = qwCompanyMapper.selectQwCompanyByCorpId(qwUser.getCorpId());
+        //应用消息组装
+        QwSendMsgParam sendMsgParam = new QwSendMsgParam();
+        sendMsgParam.setAgentid(Integer.parseInt(qwCompany.getServerAgentId().trim()));
+        sendMsgParam.setTouser(qwUser.getQwUserId());
+        sendMsgParam.setMsgtype("textcard");
+        //组合文本卡片消息
+        QwSendMsgParam.TextCard textCard = new QwSendMsgParam.TextCard();
+        textCard.setTitle("工单提醒");
+        textCard.setDescription(msg);
+        textCard.setUrl("https://www.baidu.com/");
+        textCard.setBtntxt("详情");
+        sendMsgParam.setTextcard(textCard);
+        log.info("发送投诉信息请求体:{}",sendMsgParam);
+        //发送消息
+        QwSendMsgResult result = qwApiService.sendMsg(sendMsgParam, qwCompany.getCorpId());
+        log.info("发送投诉应用消息返回:{}",result);
+        if (result.getErrcode()!=0 && !result.getErrmsg().equals("ok")) {
+            log.error("发送投诉应用消息返回失败:{}",result);
+        }
+    }
+
+    /**
+     * 创建描述信息
+     * @param record
+     * @return
+     */
+    private String createDescription(QwUserComplainRecord record){
+        String content = "点击下方'详情'查看投诉内容";
+        int picCount = 0;
+        String complaintUrl = record.getComplaintUrl();
+        if (complaintUrl != null && !complaintUrl.trim().isEmpty()) {
+            picCount = complaintUrl.split(",").length;
+        }
+//        String position = record.getPosition();
+        String position = "中国境内";
+
+//        String recordDescription = "<div class=\\\"gray\\\">内容</div><div class=\\\"normal\\\">"+content+"</div><br><div class=\\\"gray\\\">图片</div><div class=\\\"normal\\\">"+picCount+"张</div><br><div class=\\\"gray\\\">位置</div><div class=\\\"normal\\\">"+position+"</div><br><div class=\\\"gray\\\">分类</div><div class=\\\"normal\\\">"+record.getComplaintContent()+"</div><br>";
+
+        String recordDescription = "<div class=\\\"gray\\\">2016年9月26日</div> <div class=\\\"normal\\\">恭喜你抽中iPhone 7一台,领奖码:xxxx</div><div class=\\\"highlight\\\">请于2016年10月10日前联系行政同事领取</div>";
+        return recordDescription;
+    }
+}

+ 16 - 0
fs-service/src/main/java/com/fs/qwApi/param/QwSendMsgParam.java

@@ -11,6 +11,7 @@ public class QwSendMsgParam {
     private int agentid; // 企业应用的id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口获取企业授权信息获取该参数值。
     private Text text; // 消息内容,最长不超过2048个字节,超过将截断(支持id转译)。
     private Markdown markdown;
+    private TextCard textcard;
     private int safe; // 表示是否是保密消息,0表示可对外分享,1表示不能分享且内容显示水印,默认为0。
     private int enable_id_trans; // 表示是否开启id转译,0表示否,1表示是,默认0。
     private int enable_duplicate_check; // 表示是否开启重复消息检查,0表示否,1表示是,默认0。
@@ -26,4 +27,19 @@ public class QwSendMsgParam {
         private String content;
     }
 
+    /**
+     * 文本卡片消息类型
+     */
+    @Data
+    public static class TextCard {
+        //标题,不超过128个字符,超过会自动截断(支持id转译)
+        private String title;
+        //描述,不超过512个字符,超过会自动截断(支持id转译)
+        private String description;
+        //点击后跳转的链接。最长2048字节,请确保包含了协议头(http/https)
+        private String url;
+        //按钮文字。 默认为“详情”, 不超过4个文字,超过自动截断。
+        private String btntxt;
+    }
+
 }

+ 94 - 0
fs-service/src/main/resources/mapper/qw/QwUserComplainRecordMapper.xml

@@ -0,0 +1,94 @@
+<?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.fs.qw.mapper.QwUserComplainRecordMapper">
+
+    <resultMap type="QwUserComplainRecord" id="QwUserComplainRecordResult">
+        <result property="recordId"    column="record_id"    />
+        <result property="phone"    column="phone"    />
+        <result property="complaintTypeId"    column="complaint_type_id"    />
+        <result property="complaintContent"    column="complaint_content"    />
+        <result property="complaintUrl"    column="complaint_url"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="qwUserId"    column="qw_user_id"    />
+        <result property="extId"    column="ext_id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="position"    column="position"    />
+    </resultMap>
+
+    <sql id="selectQwUserComplainRecordVo">
+        select record_id,position, phone, complaint_type_id, complaint_content, complaint_url, create_time, qw_user_id, ext_id, user_id from qw_user_complain_record
+    </sql>
+
+    <select id="selectQwUserComplainRecordList" parameterType="QwUserComplainRecord" resultMap="QwUserComplainRecordResult">
+        <include refid="selectQwUserComplainRecordVo"/>
+        <where>
+            <if test="phone != null  and phone != ''"> and phone = #{phone}</if>
+            <if test="complaintTypeId != null "> and complaint_type_id = #{complaintTypeId}</if>
+            <if test="complaintContent != null  and complaintContent != ''"> and complaint_content = #{complaintContent}</if>
+            <if test="complaintUrl != null  and complaintUrl != ''"> and complaint_url = #{complaintUrl}</if>
+            <if test="qwUserId != null "> and qw_user_id = #{qwUserId}</if>
+            <if test="extId != null "> and ext_id = #{extId}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+        </where>
+    </select>
+
+    <select id="selectQwUserComplainRecordByRecordId" parameterType="Long" resultMap="QwUserComplainRecordResult">
+        <include refid="selectQwUserComplainRecordVo"/>
+        where record_id = #{recordId}
+    </select>
+
+    <insert id="insertQwUserComplainRecord" parameterType="QwUserComplainRecord" useGeneratedKeys="true" keyProperty="recordId">
+        insert into qw_user_complain_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="phone != null">phone,</if>
+            <if test="complaintTypeId != null">complaint_type_id,</if>
+            <if test="complaintContent != null">complaint_content,</if>
+            <if test="complaintUrl != null">complaint_url,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="qwUserId != null">qw_user_id,</if>
+            <if test="extId != null">ext_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="position != null">position,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="phone != null">#{phone},</if>
+            <if test="complaintTypeId != null">#{complaintTypeId},</if>
+            <if test="complaintContent != null">#{complaintContent},</if>
+            <if test="complaintUrl != null">#{complaintUrl},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="qwUserId != null">#{qwUserId},</if>
+            <if test="extId != null">#{extId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="position != null">#{position},</if>
+        </trim>
+    </insert>
+
+    <update id="updateQwUserComplainRecord" parameterType="QwUserComplainRecord">
+        update qw_user_complain_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="phone != null">phone = #{phone},</if>
+            <if test="complaintTypeId != null">complaint_type_id = #{complaintTypeId},</if>
+            <if test="complaintContent != null">complaint_content = #{complaintContent},</if>
+            <if test="complaintUrl != null">complaint_url = #{complaintUrl},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="qwUserId != null">qw_user_id = #{qwUserId},</if>
+            <if test="extId != null">ext_id = #{extId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="position != null">user_id = #{position},</if>
+        </trim>
+        where record_id = #{recordId}
+    </update>
+
+    <delete id="deleteQwUserComplainRecordByRecordId" parameterType="Long">
+        delete from qw_user_complain_record where record_id = #{recordId}
+    </delete>
+
+    <delete id="deleteQwUserComplainRecordByRecordIds" parameterType="String">
+        delete from qw_user_complain_record where record_id in
+        <foreach item="recordId" collection="array" open="(" separator="," close=")">
+            #{recordId}
+        </foreach>
+    </delete>
+</mapper>