liusheng
2023-07-07 429615c304035bf573297d69ce6a17e086e4f6fa
文件管理,在线聊天,短信代码提交,
已添加6个文件
已修改24个文件
1116 ■■■■ 文件已修改
ruoyi-admin/pom.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/ChatWebSocketHandler.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/BaseSmsaccountController.java 157 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MinioFileController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/SvyLibTitleController.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/WebSocketConfig.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/MinioClientUtils.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/pom.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/BaseSmsRequest.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/BatchBaseSmsRequest.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/DingTalkReqVo.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SocketMessage.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibTitle.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibTopic.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/TemplateSmsRequest.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/WeChatSendVo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/BaseSmsaccountMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/SvyLibTitleMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IBaseSmsaccountService.java 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IMinioFileService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/BaseSmsaccountServiceImpl.java 239 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/DingTalkServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/MinioFileServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/SvyLibTitleServiceImpl.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SvyLibTopicMapper.xml 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml
@@ -80,6 +80,11 @@
            <artifactId>core</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20210307</version>
        </dependency>
    </dependencies>
    <build>
@@ -99,15 +104,15 @@
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.1.0</version>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warName>${project.artifactId}</warName>
                </configuration>
           </plugin>
                </configuration>
           </plugin>
        </plugins>
        <finalName>${project.artifactId}</finalName>
    </build>
ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/ChatWebSocketHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.web.controller.hanler;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.smartor.domain.SocketMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.BinaryMessage;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
public class ChatWebSocketHandler extends AbstractWebSocketHandler {
    // ç”¨äºŽå­˜å‚¨ç”¨æˆ·ID和WebSocketSession的映射关系
    private static Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // èŽ·å–ç”¨æˆ·ID,可以从session中获取或者通过其他方式获取
        String userId = extractUserId(session);
        // å°†ç”¨æˆ·ID和WebSocketSession存储到映射表中
        sessions.put(userId, session);
    }
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // å¤„理收到的消息
        String userId = extractUserId(session);
        String payload = message.getPayload().toString();
        log.info("-----------------:{}", payload);
        // è§£æžæ¶ˆæ¯ç±»åž‹
        ObjectMapper mapper = new ObjectMapper();
        SocketMessage parsedMessage = mapper.readValue(payload, SocketMessage.class);
        if (parsedMessage != null) {
            sendMessageToUser(parsedMessage.getUserId(), parsedMessage.getContent());
        }
    }
    @Override
    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
        log.info("发送二进制");
    }
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        // å…³é—­è¿žæŽ¥æ—¶ï¼Œä»Žæ˜ å°„表中移除对应的用户ID和WebSocketSession
        String userId = extractUserId(session);
        sessions.remove(userId);
    }
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        // å¤„理传输错误,例如连接断开或发生异常
        String userId = extractUserId(session);
        sessions.remove(userId);
    }
    @Override
    public boolean supportsPartialMessages() {
        // æ”¯æŒéƒ¨åˆ†æ¶ˆæ¯å¤„理
        return false;
    }
    private String extractUserId(WebSocketSession session) {
        // åœ¨å®žé™…情况下,你可以根据需要从session中提取用户ID,可以直接拿当前登际人的userId
        String userId = session.getUri().getQuery().split("=")[1];
//        return session.getAttributes().get("userId").toString();
        return userId;
    }
    private void sendMessageToUser(String userId, String message) throws IOException {
        WebSocketSession session = sessions.get(userId);
        if (session != null && session.isOpen()) {
            session.sendMessage(new TextMessage(message));
        }
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/BaseSmsaccountController.java
@@ -1,36 +1,36 @@
package com.smartor.controller;
package com.ruoyi.web.controller.smartor;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.smartor.domain.BaseSmsaccount;
import com.smartor.service.IBaseSmsaccountService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.BaseSmsRequest;
import com.smartor.domain.BaseSmsaccount;
import com.smartor.domain.BatchBaseSmsRequest;
import com.smartor.domain.TemplateSmsRequest;
import com.smartor.service.IBaseSmsaccountService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * çŸ­ä¿¡è´¦å·Controller
 *
 *
 * @author smartor
 * @date 2023-03-06
 */
@Api(description = "短信")
@RestController
@RequestMapping("/smartor/smsaccount")
public class BaseSmsaccountController extends BaseController
{
public class BaseSmsaccountController extends BaseController {
    @Autowired
    private IBaseSmsaccountService baseSmsaccountService;
@@ -39,8 +39,7 @@
     */
    @PreAuthorize("@ss.hasPermi('smartor:smsaccount:list')")
    @GetMapping("/list")
    public TableDataInfo list(BaseSmsaccount baseSmsaccount)
    {
    public TableDataInfo list(BaseSmsaccount baseSmsaccount) {
        startPage();
        List<BaseSmsaccount> list = baseSmsaccountService.selectBaseSmsaccountList(baseSmsaccount);
        return getDataTable(list);
@@ -52,8 +51,7 @@
    @PreAuthorize("@ss.hasPermi('smartor:smsaccount:export')")
    @Log(title = "短信账号", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, BaseSmsaccount baseSmsaccount)
    {
    public void export(HttpServletResponse response, BaseSmsaccount baseSmsaccount) {
        List<BaseSmsaccount> list = baseSmsaccountService.selectBaseSmsaccountList(baseSmsaccount);
        ExcelUtil<BaseSmsaccount> util = new ExcelUtil<BaseSmsaccount>(BaseSmsaccount.class);
        util.exportExcel(response, list, "短信账号数据");
@@ -64,8 +62,7 @@
     */
    @PreAuthorize("@ss.hasPermi('smartor:smsaccount:query')")
    @GetMapping(value = "/{smsacountid}")
    public AjaxResult getInfo(@PathVariable("smsacountid") Long smsacountid)
    {
    public AjaxResult getInfo(@PathVariable("smsacountid") Long smsacountid) {
        return success(baseSmsaccountService.selectBaseSmsaccountBySmsacountid(smsacountid));
    }
@@ -75,8 +72,7 @@
    @PreAuthorize("@ss.hasPermi('smartor:smsaccount:add')")
    @Log(title = "短信账号", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody BaseSmsaccount baseSmsaccount)
    {
    public AjaxResult add(@RequestBody BaseSmsaccount baseSmsaccount) {
        return toAjax(baseSmsaccountService.insertBaseSmsaccount(baseSmsaccount));
    }
@@ -86,8 +82,7 @@
    @PreAuthorize("@ss.hasPermi('smartor:smsaccount:edit')")
    @Log(title = "短信账号", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody BaseSmsaccount baseSmsaccount)
    {
    public AjaxResult edit(@RequestBody BaseSmsaccount baseSmsaccount) {
        return toAjax(baseSmsaccountService.updateBaseSmsaccount(baseSmsaccount));
    }
@@ -96,9 +91,105 @@
     */
    @PreAuthorize("@ss.hasPermi('smartor:smsaccount:remove')")
    @Log(title = "短信账号", businessType = BusinessType.DELETE)
    @DeleteMapping("/{smsacountids}")
    public AjaxResult remove(@PathVariable Long[] smsacountids)
    {
    @DeleteMapping("/{smsacountids}")
    public AjaxResult remove(@PathVariable Long[] smsacountids) {
        return toAjax(baseSmsaccountService.deleteBaseSmsaccountBySmsacountids(smsacountids));
    }
    /**
     * çŸ­ä¿¡å‘送
     */
    @ApiOperation("短信发送")
    @PostMapping("/sendMsg")
    public AjaxResult sendMsg(@RequestBody BaseSmsRequest baseSmsRequest) {
        if (baseSmsaccountService.sendMsg(baseSmsRequest) == null) {
            return error();
        }
        return success(baseSmsaccountService.sendMsg(baseSmsRequest));
    }
    /**
     * æ‰¹é‡çŸ­ä¿¡å‘送
     */
    @ApiOperation("批量短信发送")
    @PostMapping("/batchSendMsg")
    public AjaxResult batchSendMsg(@RequestBody BatchBaseSmsRequest batchBaseSmsRequest) {
        if (baseSmsaccountService.batchSendMsg(batchBaseSmsRequest) == null) {
            return error();
        }
        return success(baseSmsaccountService.batchSendMsg(batchBaseSmsRequest));
    }
    /**
     * æ–°å¢žçŸ­ä¿¡æ¨¡æ¿
     *
     * @param templateSmsRequest
     * @return
     */
    @PostMapping("/addSmsTemplate")
    public AjaxResult addSmsTemplate(@RequestBody TemplateSmsRequest templateSmsRequest) {
        if (baseSmsaccountService.addSmsTemplate(templateSmsRequest) == null) {
            return error();
        }
        return success(baseSmsaccountService.addSmsTemplate(templateSmsRequest));
    }
    /**
     * åˆ é™¤çŸ­ä¿¡æ¨¡æ¿
     *
     * @param templateCode
     * @return
     */
    @GetMapping("/delSmsTemplate")
    public AjaxResult delSmsTemplate(@ApiParam("templateCode") String templateCode) {
        if (baseSmsaccountService.delSmsTemplate(templateCode) == null) {
            return error();
        }
        return success(baseSmsaccountService.delSmsTemplate(templateCode));
    }
    /**
     * ä¿®æ”¹å®¡æ ¸æœªé€šè¿‡çš„æ¨¡æ¿
     *
     * @param templateSmsRequest
     * @return
     */
    @PostMapping("/updateSmsTemplate")
    public AjaxResult updateSmsTemplate(@RequestBody TemplateSmsRequest templateSmsRequest) {
        if (baseSmsaccountService.updateSmsTemplate(templateSmsRequest) == null) {
            return error();
        }
        return success(baseSmsaccountService.updateSmsTemplate(templateSmsRequest));
    }
    /**
     * æŸ¥è¯¢çŸ­ä¿¡æ¨¡æ¿åˆ—表
     *
     * @param pageIndex pageSize
     * @return
     */
    @ApiOperation("查询短信模板")
    @GetMapping("/querySmsTemplate")
    public AjaxResult querySmsTemplateList(@ApiParam("pageIndex") Integer pageIndex, @ApiParam("pageSize") Integer pageSize) {
        if (baseSmsaccountService.querySmsTemplate(pageIndex, pageSize) == null) {
            return error();
        }
        return success(baseSmsaccountService.querySmsTemplate(pageIndex, pageSize));
    }
    /**
     * æŸ¥è¯¢çŸ­ä¿¡æ¨¡æ¿å®¡æ ¸çŠ¶æ€
     *
     * @param templateCode
     * @return
     */
    @GetMapping("/querySmsTemplateStatus")
    public AjaxResult querySmsTemplateStatus(@ApiParam("templateCode") String templateCode) {
        if (baseSmsaccountService.querySmsTemplateStatus(templateCode) == null) {
            return error();
        }
        return success(baseSmsaccountService.querySmsTemplateStatus(templateCode));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkController.java
@@ -1,34 +1,26 @@
package com.ruoyi.web.controller.smartor;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiUserListidRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiUserListidResponse;
import com.ruoyi.common.core.controller.BaseController;
import com.smartor.domain.DingTalkReqVo;
import com.smartor.service.DingTalkService;
import com.taobao.api.ApiException;
import org.apache.commons.lang3.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * å¾®ä¿¡æŽ¥å£
 * é’‰é’‰æŽ¥å£
 *
 * @author liusheng
 * @date 2023-05-15
 */
@Api(description = "钉钉接口")
@RestController
@RequestMapping("/smartor/dingtalk")
@PropertySource(value = {"classpath:application-druid.yml"})
@@ -49,6 +41,7 @@
     * @param dingTalkReqVo å‘送内容
     * @throws ApiException
     */
    @ApiOperation("发送钉钉消息")
    @PostMapping("/sendNotification")
    public void sendNotification(@RequestBody DingTalkReqVo dingTalkReqVo) throws ApiException {
        dingTalkService.sendNotification(dingTalkReqVo);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MinioFileController.java
@@ -106,7 +106,7 @@
    @ResponseBody
    @ApiOperation(value = "上传文件到文件管理,支持批量上传")
    @ApiImplicitParam(name = "files", value = "文件对象", dataType = "File")
    public AjaxResult commonUploadFile(@RequestParam("path") String path, @RequestParam("files") List<MultipartFile> files) {
    public AjaxResult commonUploadFile(@RequestParam(value = "path",required = false) String path, @RequestParam("files") List<MultipartFile> files) {
        if (CollectionUtils.isEmpty(files)) {
            return error("未选择文件!");
        }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/SvyLibTitleController.java
@@ -1,5 +1,8 @@
package com.ruoyi.web.controller.smartor;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.teaopenapi.models.Config;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
@@ -33,26 +36,13 @@
     * æŸ¥è¯¢é—®å·åˆ—表
     */
    @ApiOperation("查询问卷列表")
    @PreAuthorize("@ss.hasPermi('smartor:svytitle:list')")
    @GetMapping("/selectSvyLibTitlelist")
    public TableDataInfo selectSvyLibTitlelist(SvyLibTitleReq svyLibTitleReq) {
    @PostMapping("/selectSvyLibTitlelist")
    public TableDataInfo selectSvyLibTitlelist(@RequestBody SvyLibTitleReq svyLibTitleReq) {
        startPage();
        List<SvyLibTitle> list = svyLibTitleService.selectSvyLibTitleList(svyLibTitleReq);
        return getDataTable(list);
    }
//    /**
//     * å¯¼å‡ºé—®å·åˆ—表
//     */
//    @PreAuthorize("@ss.hasPermi('smartor:svytitle:export')")
//    @Log(title = "问卷", businessType = BusinessType.EXPORT)
//    @PostMapping("/export")
//    public void export(HttpServletResponse response, SvyLibTitle svyLibTitle)
//    {
//        List<SvyLibTitle> list = svyLibTitleService.selectSvyLibTitleList(svyLibTitle);
//        ExcelUtil<SvyLibTitle> util = new ExcelUtil<SvyLibTitle>(SvyLibTitle.class);
//        util.exportExcel(response, list, "问卷数据");
//    }
    /**
     * èŽ·å–é—®å·è¯¦ç»†ä¿¡æ¯
@@ -67,7 +57,6 @@
     * æ–°å¢žé—®å·
     */
    @ApiOperation("新增问卷")
    @PreAuthorize("@ss.hasPermi('smartor:svytitle:add')")
    @PostMapping("/addSvyLibTitle")
    public AjaxResult addSvyLibTitle(@RequestBody SvyLibTitle svyLibTitle) {
        return toAjax(svyLibTitleService.insertSvyLibTitle(svyLibTitle));
@@ -93,6 +82,38 @@
        return toAjax(svyLibTitleService.deleteSvyLibTitleBySvyids(svyids));
    }
    /**
     * å‘送短信
     */
    @PreAuthorize("@ss.hasPermi('smartor:svytitle:remove')")
    @Log(title = "问卷", businessType = BusinessType.DELETE)
    @PostMapping("/sendMessage")
    public AjaxResult sendMessage(@PathVariable Long[] svyids) {
        String accessKeyId = "your_access_key_id";
        String accessKeySecret = "your_access_key_secret";
        // åˆ›å»ºConfig对象,配置阿里云SDK
        Config config = new Config()
                .setAccessKeyId(accessKeyId)
                .setAccessKeySecret(accessKeySecret);
        // åˆ›å»ºSendSmsRequest对象,设置短信相关参数
        SendSmsRequest request = new SendSmsRequest()
                .setPhoneNumbers("手机号码")
                .setSignName("短信签名")
                .setTemplateCode("短信模板Code")
                .setTemplateParam("{\"code\":\"123456\"}"); // è®¾ç½®çŸ­ä¿¡æ¨¡æ¿ä¸­çš„参数值
//        try {
//            // è°ƒç”¨é˜¿é‡Œäº‘SDK发送短信
//            SendSmsResponse response = SendSms.getResponse(config, request);
//            System.out.println("发送短信成功,RequestId: " + response.getRequestId());
//        } catch (Exception e) {
//            System.err.println("发送短信失败:" + e.getMessage());
//        }
        return toAjax(svyLibTitleService.deleteSvyLibTitleBySvyids(svyids));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatController.java
@@ -4,6 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.controller.BaseController;
import com.smartor.domain.WeChatSendVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
@@ -28,9 +30,10 @@
 * @author liusheng
 * @date 2023-05-15
 */
@Api(description = "微信接口")
@RestController
@RequestMapping("/smartor/wechat")
@PropertySource(value = { "classpath:application-druid.yml" })
@PropertySource(value = {"classpath:application-druid.yml"})
public class WeChatController extends BaseController {
    @Value("${appid}")
@@ -45,6 +48,7 @@
     *
     * @return
     */
    @ApiOperation("获取模板信息")
    @GetMapping("/getTemplateList")
    public JSONArray getTemplateList() {
        String url = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=" + getAccessToken();
@@ -67,6 +71,7 @@
     * @param weChatSendVo
     * @return
     */
    @ApiOperation("微信公众号信息发送")
    @PostMapping("/sendMessageToFollowers")
    public Boolean sendMessageToFollowers(@RequestBody WeChatSendVo weChatSendVo) {
        WxMpService wxMpService;
@@ -91,7 +96,6 @@
    }
    /**
     * èŽ·å– access_token
     */
@@ -108,7 +112,6 @@
            return null;
        }
    }
    //  }
}
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/WebSocketConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.web.core.config;
import com.ruoyi.web.controller.hanler.ChatWebSocketHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    private final ChatWebSocketHandler chatWebSocketHandler;
    public WebSocketConfig(ChatWebSocketHandler chatWebSocketHandler) {
        this.chatWebSocketHandler = chatWebSocketHandler;
    }
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatWebSocketHandler(), "/chat").setAllowedOrigins("*");
    }
}
ruoyi-admin/src/main/resources/application-druid.yml
@@ -63,4 +63,14 @@
#钉钉的密钥
dingAppid: dingn8iip5ubj7clrrsv
dingAppSecret: qlEK8D3oOVwGPOTiBQIBYTqQVlAfy9S_qQizEQFjJdSScwemWFryg4gbneu-NqWD
dingAppSecret: qlEK8D3oOVwGPOTiBQIBYTqQVlAfy9S_qQizEQFjJdSScwemWFryg4gbneu-NqWD
# websocket超时时间
server:
  websocket:
    timeout=60000:
accessKeyId: LTAI4G5zjJRkun2eRdzU8GhR
accessKeySecret: 6EIRr9uZeRobvHBRqskyGwjTLKpHYv
signName: æ­å·žåˆ©æ¹–科技
ruoyi-common/src/main/java/com/ruoyi/common/utils/MinioClientUtils.java
@@ -22,6 +22,7 @@
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
@@ -319,7 +320,7 @@
                throw new InvalidExpiresRangeException(expires, "expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME);
            }
            try {
                url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(objectName).expiry(expires)//动态参数
                url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(objectName).expiry(expires, TimeUnit.SECONDS)//动态参数
                        //                       .expiry(24 * 60 * 60)//用秒来计算一天时间有效期
//                        .expiry(1, TimeUnit.DAYS)//按天传参
//                        .expiry(1, TimeUnit.HOURS)//按小时传参数
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -111,7 +111,7 @@
                // è¿‡æ»¤è¯·æ±‚
                .authorizeRequests()
                // å¯¹äºŽç™»å½•login æ³¨å†Œregister éªŒè¯ç captchaImage å…è®¸åŒ¿åè®¿é—®
                .antMatchers("/login", "/register", "/captchaImage","/qrcode/generateStaticHtml","/qrcode/getQRcode","/qrcode/getFormDate").permitAll()
                .antMatchers("/login", "/register", "/captchaImage","/qrcode/generateStaticHtml","/qrcode/getQRcode","/qrcode/getFormDate","/chat","/system/file/admin/uploadFile").permitAll()
                // é™æ€èµ„源,可匿名访问
                .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java
@@ -2,12 +2,14 @@
import java.util.List;
import com.ruoyi.system.domain.SysConfig;
import org.apache.ibatis.annotations.Mapper;
/**
 * å‚数配置 æ•°æ®å±‚
 * 
 * @author ruoyi
 */
@Mapper
public interface SysConfigMapper
{
    /**
smartor/pom.xml
@@ -16,8 +16,28 @@
    </description>
    <dependencies>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>ecs20140526</artifactId>
            <version>3.1.12</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>2.0.24</version>
        </dependency>
        <!--  V1.0 SDK  -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.6.3</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-ecs</artifactId>
            <version>4.24.59</version>
        </dependency>
        <!-- é€šç”¨å·¥å…·-->
        <dependency>
            <groupId>com.ruoyi</groupId>
smartor/src/main/java/com/smartor/domain/BaseSmsRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.smartor.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
/**
 * çŸ­ä¿¡è´¦å·å¯¹è±¡ base_smsaccount
 *
 * @author smartor
 * @date 2023-03-06
 */
@Data
@ApiModel(value = "BaseSmsRequest", description = "短信请求信息")
public class BaseSmsRequest extends BaseEntity {
    /**
     * æ ‡ç­¾åç§°
     */
    @ApiModelProperty(value = "手机号(接收方)")
    private String phoneNumber;
    /**
     * çŸ­ä¿¡æ¨¡æ¿CODE
     */
    @ApiModelProperty(value = "模板ID")
    private String templateCode;
    /**
     * çŸ­ä¿¡æ¨¡æ¿å˜é‡å¯¹åº”的实际值
     * æ”¯æŒä¼ å…¥å¤šä¸ªå‚数,示例:{"name":"张三","number":"1390000****"}
     * å¦‚æžœJSON中需要带换行符,请参照标准的JSON协议处理。
     */
    @ApiModelProperty(value = "短信模板变量对应的实际值,示例:{\"name\":\"张三\",\"number\":\"1390000****\"}")
    private String templateParam;
}
smartor/src/main/java/com/smartor/domain/BatchBaseSmsRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.smartor.domain;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * çŸ­ä¿¡æ‰¹é‡è¯·æ±‚信息 base_smsaccount
 *
 * @author smartor
 * @date 2023-03-06
 */
@Data
@ApiModel(value = "BatchBaseSmsRequest", description = "短信批量请求信息")
public class BatchBaseSmsRequest extends BaseEntity {
    /**
     * æ ‡ç­¾åç§°
     */
    @ApiModelProperty(value = "手机号集合(接收方)")
    private List<String> phoneNumber;
    /**
     * çŸ­ä¿¡æ¨¡æ¿CODE
     */
    @ApiModelProperty(value = "模板ID")
    private String templateCode;
    /**
     * çŸ­ä¿¡æ¨¡æ¿å˜é‡å¯¹åº”的实际值
     * æ”¯æŒä¼ å…¥å¤šä¸ªå‚数,示例:{"name":"张三","number":"1390000****"}
     * å¦‚æžœJSON中需要带换行符,请参照标准的JSON协议处理。
     */
    @ApiModelProperty(value = "短信模板变量对应的实际值,示例:{\"name\":\"张三\",\"number\":\"1390000****\"}")
    private String templateParam;
}
smartor/src/main/java/com/smartor/domain/DingTalkReqVo.java
@@ -3,6 +3,8 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
@@ -17,20 +19,24 @@
 * @date 2023-05-25
 */
@Data
@ApiModel(value = "DingTalkReqVo", description = "钉钉消息发送")
public class DingTalkReqVo extends BaseEntity {
    /**
     * å‘送内容
     */
    @ApiModelProperty(value = "发送内容")
    private List<String> contents;
    /**
     * ç”¨æˆ·é’‰é’‰å·
     */
    @ApiModelProperty(value = "用户钉钉号")
    private String userId;
    /**
     * éƒ¨é—¨ID
     */
    @ApiModelProperty(value = "部门ID")
    private String deptId;
}
smartor/src/main/java/com/smartor/domain/SocketMessage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.smartor.domain;
import lombok.Data;
@Data
public class SocketMessage {
    //发送内空的类型(text,image)
    private String type;
    //内容(发送的文本内容)
    private String content;
    //用户ID(接收放)
    private String userId;
    //图片
    private String image;
    //图片,音、视频的字节大小
    private Integer fileSize;
    public SocketMessage(String type, String content) {
        this.type = type;
        this.content = content;
    }
    public SocketMessage() {
    }
}
smartor/src/main/java/com/smartor/domain/SvyLibTitle.java
@@ -20,9 +20,8 @@
 * @date 2023-03-02
 */
@Data
@ApiModel(value = "MinioResponseDTO", description = "标签分类对象")
@ApiModel(value = "SvyLibTitle", description = "问卷对象")
public class SvyLibTitle extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * è‡ªå¢žID
@@ -33,7 +32,7 @@
    /**
     * é—®å·åˆ†ç±»ID
     */
    @ApiModelProperty(value = "问卷分类ID")
    @ApiModelProperty(value = "问卷分类ID", required = true)
    @Excel(name = " é—®å·åˆ†ç±»ID ")
    private Long categoryid;
@@ -47,14 +46,14 @@
    /**
     * é—®å·åç§°
     */
    @ApiModelProperty(value = "问卷名称")
    @ApiModelProperty(value = "问卷名称", required = true)
    @Excel(name = " é—®å·åç§° ")
    private String svyname;
    /**
     * æè¿°
     */
    @ApiModelProperty(value = "描述")
    @ApiModelProperty(value = "描述", required = true)
    @Excel(name = " æè¿° ")
    private String description;
@@ -162,6 +161,8 @@
    private List<SvyLibTopic> svyLibTopics;
    public SvyLibTitle() {
    }
    public SvyLibTitle(Long svyid, String icdname) {
        this.svyid = svyid;
smartor/src/main/java/com/smartor/domain/SvyLibTopic.java
@@ -1,6 +1,7 @@
package com.smartor.domain;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
@@ -113,8 +114,13 @@
    private Date uploadTime;
    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("topicid", getTopicid()).append("oldid", getOldid()).append("svyid", getSvyid()).append("topictype", getTopictype()).append("topiccode", getTopiccode()).append("topic", getTopic()).append("sort", getSort()).append("ismandatory", getIsmandatory()).append("ishide", getIshide()).append("delFlag", getDelFlag()).append("orgid", getOrgid()).append("createBy", getCreateBy()).append("createTime", getCreateTime()).append("updateBy", getUpdateBy()).append("updateTime", getUpdateTime()).append("isupload", getIsupload()).append("uploadTime", getUploadTime()).toString();
    }
    /**
     * svy_topic题目表的主键ID
     */
    @ApiModelProperty("题目表的主键ID")
    private Long svyTopicId;
    @ApiModelProperty("问题选项")
    private List<SvyTopicoption> svyTopicoptions;
}
smartor/src/main/java/com/smartor/domain/TemplateSmsRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.smartor.domain;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * TemplateSmsRequest base_smsaccount
 *
 * @author smartor
 * @date 2023-03-06
 */
@Data
@ApiModel(value = "TemplateSmsRequest", description = "短信模板请求信息")
public class TemplateSmsRequest extends BaseEntity {
    /**
     *
     * æè¿°ï¼š çŸ­ä¿¡ç±»åž‹ã€‚取值:
     *
     * 0:验证码。
     * 1:短信通知。
     * 2:推广短信。
     * 3:国际/港澳台消息。
     */
    @ApiModelProperty(value = "模板类型 0:验证码 1:短信通知 2:推广短信 3:国际/港澳台消息")
    private Integer templateType;
    /**
     *
     * æè¿°: æ¨¡æ¿åç§°ï¼Œé•¿åº¦ä¸è¶…过30个字符。
     *
     * ç¤ºä¾‹å€¼: é˜¿é‡Œäº‘短信测试模板
     */
    @ApiModelProperty(value = "模板名称,长度不超过30个字符")
    private String templateName;
    /**
     *
     * æè¿°: æ¨¡æ¿å†…容,长度不超过500个字符。更多规范,请参见模板内容规范。
     *
     * ç¤ºä¾‹å€¼:您正在申请手机注册,验证码为:${code},5分钟内有效
     */
    @ApiModelProperty(value = "模板内容,长度不超过500个字符。更多规范,请参见模板内容规范")
    private String templateContent;
    /**
     * æè¿°: çŸ­ä¿¡æ¨¡æ¿ç”³è¯·è¯´æ˜Žï¼Œæ˜¯æ¨¡æ¿å®¡æ ¸çš„参考信息之一。长度不超过100个字符。
     *
     * ç¤ºä¾‹å€¼: æˆ¿äº§é”€å”®
     */
    @ApiModelProperty(value = "短信模板申请说明,是模板审核的参考信息之一。长度不超过100个字符")
    private String remark;
}
smartor/src/main/java/com/smartor/domain/WeChatSendVo.java
@@ -1,17 +1,20 @@
package com.smartor.domain;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
@Data
@ApiModel(value = "WeChatSendVo", description = "微信消息发送")
public class WeChatSendVo {
    /**
     * æ¨¡æ¿ID
     */
    @Excel(name = " æ¨¡æ¿ID ")
    @ApiModelProperty(value = "模板ID")
    String templateId;
    /**
@@ -21,13 +24,13 @@
     * â€œkeyword1”:“......”
     * }]
     */
    @Excel(name = " å‘送内容 ")
    @ApiModelProperty(value = "发送内容")
    Map<String, Object> content;
    /**
     * è·³è½¬URL
     */
    @Excel(name = " è·³è½¬URL ")
    @ApiModelProperty(value = "跳转URL")
    String url;
}
smartor/src/main/java/com/smartor/mapper/BaseSmsaccountMapper.java
@@ -1,19 +1,21 @@
package com.smartor.mapper;
import java.util.List;
import com.smartor.domain.BaseSmsaccount;
import org.apache.ibatis.annotations.Mapper;
/**
 * çŸ­ä¿¡è´¦å·Mapper接口
 *
 *
 * @author smartor
 * @date 2023-03-06
 */
public interface BaseSmsaccountMapper
{
@Mapper
public interface BaseSmsaccountMapper {
    /**
     * æŸ¥è¯¢çŸ­ä¿¡è´¦å·
     *
     *
     * @param smsacountid çŸ­ä¿¡è´¦å·ä¸»é”®
     * @return çŸ­ä¿¡è´¦å·
     */
@@ -21,7 +23,7 @@
    /**
     * æŸ¥è¯¢çŸ­ä¿¡è´¦å·åˆ—表
     *
     *
     * @param baseSmsaccount çŸ­ä¿¡è´¦å·
     * @return çŸ­ä¿¡è´¦å·é›†åˆ
     */
@@ -29,7 +31,7 @@
    /**
     * æ–°å¢žçŸ­ä¿¡è´¦å·
     *
     *
     * @param baseSmsaccount çŸ­ä¿¡è´¦å·
     * @return ç»“æžœ
     */
@@ -37,7 +39,7 @@
    /**
     * ä¿®æ”¹çŸ­ä¿¡è´¦å·
     *
     *
     * @param baseSmsaccount çŸ­ä¿¡è´¦å·
     * @return ç»“æžœ
     */
@@ -45,7 +47,7 @@
    /**
     * åˆ é™¤çŸ­ä¿¡è´¦å·
     *
     *
     * @param smsacountid çŸ­ä¿¡è´¦å·ä¸»é”®
     * @return ç»“æžœ
     */
@@ -53,7 +55,7 @@
    /**
     * æ‰¹é‡åˆ é™¤çŸ­ä¿¡è´¦å·
     *
     *
     * @param smsacountids éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
smartor/src/main/java/com/smartor/mapper/SvyLibTitleMapper.java
@@ -25,7 +25,7 @@
    /**
     * æŸ¥è¯¢é—®å·åˆ—表
     *
     * @param svyLibTitle é—®å·
     * @param svyLibTitleReq é—®å·
     * @return é—®å·é›†åˆ
     */
    public List<SvyLibTitle> selectSvyLibTitleList(SvyLibTitleReq svyLibTitleReq);
smartor/src/main/java/com/smartor/service/IBaseSmsaccountService.java
@@ -1,19 +1,26 @@
package com.smartor.service;
import java.util.List;
import java.util.Map;
import com.aliyun.dysmsapi20170525.models.*;
import com.ruoyi.common.core.domain.AjaxResult;
import com.smartor.domain.BaseSmsRequest;
import com.smartor.domain.BaseSmsaccount;
import com.smartor.domain.BatchBaseSmsRequest;
import com.smartor.domain.TemplateSmsRequest;
import org.springframework.web.bind.annotation.PathVariable;
/**
 * çŸ­ä¿¡è´¦å·Service接口
 *
 *
 * @author smartor
 * @date 2023-03-06
 */
public interface IBaseSmsaccountService
{
public interface IBaseSmsaccountService {
    /**
     * æŸ¥è¯¢çŸ­ä¿¡è´¦å·
     *
     *
     * @param smsacountid çŸ­ä¿¡è´¦å·ä¸»é”®
     * @return çŸ­ä¿¡è´¦å·
     */
@@ -21,7 +28,7 @@
    /**
     * æŸ¥è¯¢çŸ­ä¿¡è´¦å·åˆ—表
     *
     *
     * @param baseSmsaccount çŸ­ä¿¡è´¦å·
     * @return çŸ­ä¿¡è´¦å·é›†åˆ
     */
@@ -29,7 +36,7 @@
    /**
     * æ–°å¢žçŸ­ä¿¡è´¦å·
     *
     *
     * @param baseSmsaccount çŸ­ä¿¡è´¦å·
     * @return ç»“æžœ
     */
@@ -37,7 +44,7 @@
    /**
     * ä¿®æ”¹çŸ­ä¿¡è´¦å·
     *
     *
     * @param baseSmsaccount çŸ­ä¿¡è´¦å·
     * @return ç»“æžœ
     */
@@ -45,7 +52,7 @@
    /**
     * æ‰¹é‡åˆ é™¤çŸ­ä¿¡è´¦å·
     *
     *
     * @param smsacountids éœ€è¦åˆ é™¤çš„短信账号主键集合
     * @return ç»“æžœ
     */
@@ -53,9 +60,67 @@
    /**
     * åˆ é™¤çŸ­ä¿¡è´¦å·ä¿¡æ¯
     *
     *
     * @param smsacountid çŸ­ä¿¡è´¦å·ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteBaseSmsaccountBySmsacountid(Long smsacountid);
    /**
     * çŸ­ä¿¡å‘送
     *
     * @param baseSmsRequest
     * @return
     */
    public SendSmsResponseBody sendMsg(BaseSmsRequest baseSmsRequest);
    /**
     * æ‰¹é‡çŸ­ä¿¡å‘送
     *
     * @param batchBaseSmsRequest
     * @return
     */
    public SendBatchSmsResponseBody batchSendMsg(BatchBaseSmsRequest batchBaseSmsRequest);
    /**
     * æ–°å¢žçŸ­ä¿¡æ¨¡æ¿
     *
     * @param templateSmsRequest
     * @return
     */
    public AddSmsTemplateResponseBody addSmsTemplate(TemplateSmsRequest templateSmsRequest);
    /**
     * åˆ é™¤çŸ­ä¿¡æ¨¡æ¿
     *
     * @param templateCode
     * @return
     */
    public ModifySmsTemplateResponseBody delSmsTemplate(String templateCode);
    /**
     * ä¿®æ”¹å®¡æ ¸æœªé€šè¿‡çš„æ¨¡æ¿
     *
     * @param templateSmsRequest
     * @return
     */
    public ModifySmsTemplateResponseBody updateSmsTemplate(TemplateSmsRequest templateSmsRequest);
    /**
     * æŸ¥è¯¢æ¨¡æ¿åˆ—表
     *
     * @param pageIndex , pageSize
     * @return
     */
    public QuerySmsTemplateListResponseBody querySmsTemplate(Integer pageIndex, Integer pageSize);
    /**
     * æŸ¥è¯¢çŸ­ä¿¡æ¨¡æ¿å®¡æ ¸çŠ¶æ€
     *
     * @param templateCode
     * @return
     */
    public QuerySmsTemplateResponseBody querySmsTemplateStatus(String templateCode);
}
smartor/src/main/java/com/smartor/service/IMinioFileService.java
@@ -6,7 +6,6 @@
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
/**
smartor/src/main/java/com/smartor/service/impl/BaseSmsaccountServiceImpl.java
@@ -1,96 +1,285 @@
package com.smartor.service.impl;
import java.util.List;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.Common;
import com.aliyun.teautil.models.RuntimeOptions;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smartor.mapper.BaseSmsaccountMapper;
import com.smartor.domain.BaseSmsRequest;
import com.smartor.domain.BaseSmsaccount;
import com.smartor.domain.BatchBaseSmsRequest;
import com.smartor.domain.TemplateSmsRequest;
import com.smartor.mapper.BaseSmsaccountMapper;
import com.smartor.service.IBaseSmsaccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * çŸ­ä¿¡è´¦å·Service业务层处理
 *
 *
 * @author smartor
 * @date 2023-03-06
 */
@Service
public class BaseSmsaccountServiceImpl implements IBaseSmsaccountService
{
public class BaseSmsaccountServiceImpl implements IBaseSmsaccountService {
    @Autowired
    private BaseSmsaccountMapper baseSmsaccountMapper;
    @Value("${accessKeyId}")
    private String accessKeyId;
    @Value("${accessKeySecret}")
    private String accessKeySecret;
    @Value("${signName}")
    private String signName;
    /**
     * æŸ¥è¯¢çŸ­ä¿¡è´¦å·
     *
     *
     * @param smsacountid çŸ­ä¿¡è´¦å·ä¸»é”®
     * @return çŸ­ä¿¡è´¦å·
     */
    @Override
    public BaseSmsaccount selectBaseSmsaccountBySmsacountid(Long smsacountid)
    {
    public BaseSmsaccount selectBaseSmsaccountBySmsacountid(Long smsacountid) {
        return baseSmsaccountMapper.selectBaseSmsaccountBySmsacountid(smsacountid);
    }
    /**
     * æŸ¥è¯¢çŸ­ä¿¡è´¦å·åˆ—表
     *
     *
     * @param baseSmsaccount çŸ­ä¿¡è´¦å·
     * @return çŸ­ä¿¡è´¦å·
     */
    @Override
    public List<BaseSmsaccount> selectBaseSmsaccountList(BaseSmsaccount baseSmsaccount)
    {
    public List<BaseSmsaccount> selectBaseSmsaccountList(BaseSmsaccount baseSmsaccount) {
        return baseSmsaccountMapper.selectBaseSmsaccountList(baseSmsaccount);
    }
    /**
     * æ–°å¢žçŸ­ä¿¡è´¦å·
     *
     *
     * @param baseSmsaccount çŸ­ä¿¡è´¦å·
     * @return ç»“æžœ
     */
    @Override
    public int insertBaseSmsaccount(BaseSmsaccount baseSmsaccount)
    {
    public int insertBaseSmsaccount(BaseSmsaccount baseSmsaccount) {
        baseSmsaccount.setCreateTime(DateUtils.getNowDate());
        return baseSmsaccountMapper.insertBaseSmsaccount(baseSmsaccount);
    }
    /**
     * ä¿®æ”¹çŸ­ä¿¡è´¦å·
     *
     *
     * @param baseSmsaccount çŸ­ä¿¡è´¦å·
     * @return ç»“æžœ
     */
    @Override
    public int updateBaseSmsaccount(BaseSmsaccount baseSmsaccount)
    {
    public int updateBaseSmsaccount(BaseSmsaccount baseSmsaccount) {
        baseSmsaccount.setUpdateTime(DateUtils.getNowDate());
        return baseSmsaccountMapper.updateBaseSmsaccount(baseSmsaccount);
    }
    /**
     * æ‰¹é‡åˆ é™¤çŸ­ä¿¡è´¦å·
     *
     *
     * @param smsacountids éœ€è¦åˆ é™¤çš„短信账号主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteBaseSmsaccountBySmsacountids(Long[] smsacountids)
    {
    public int deleteBaseSmsaccountBySmsacountids(Long[] smsacountids) {
        return baseSmsaccountMapper.deleteBaseSmsaccountBySmsacountids(smsacountids);
    }
    /**
     * åˆ é™¤çŸ­ä¿¡è´¦å·ä¿¡æ¯
     *
     *
     * @param smsacountid çŸ­ä¿¡è´¦å·ä¸»é”®
     * @return ç»“æžœ
     */
    @Override
    public int deleteBaseSmsaccountBySmsacountid(Long smsacountid)
    {
    public int deleteBaseSmsaccountBySmsacountid(Long smsacountid) {
        return baseSmsaccountMapper.deleteBaseSmsaccountBySmsacountid(smsacountid);
    }
    /**
     * çŸ­ä¿¡å‘送
     *
     * @param baseSmsRequest
     * @return
     */
    @Override
    public SendSmsResponseBody sendMsg(BaseSmsRequest baseSmsRequest) {
        Client client = null;
        try {
            client = this.createClient();
            SendSmsRequest sendSmsRequest = new SendSmsRequest().setPhoneNumbers(baseSmsRequest.getPhoneNumber()).setSignName(this.signName).setTemplateCode(baseSmsRequest.getTemplateCode()).setTemplateParam(baseSmsRequest.getTemplateParam());
            // å¤åˆ¶ä»£ç è¿è¡Œè¯·è‡ªè¡Œæ‰“印 API çš„返回值
            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
            return sendSmsResponse.getBody();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * æ‰¹é‡å‘送短信
     *
     * @param batchBaseSmsRequest
     * @return
     */
    public SendBatchSmsResponseBody batchSendMsg(BatchBaseSmsRequest batchBaseSmsRequest) {
        Client client = null;
        try {
            client = this.createClient();
            List<String> signNameJson = new ArrayList<>();
            for (int i = 0; i < batchBaseSmsRequest.getPhoneNumber().size(); i++) {
                signNameJson.add("\"" + this.signName + "\"");
            }
            SendBatchSmsRequest sendBatchSmsRequest = new SendBatchSmsRequest().setSignNameJson(signNameJson.toString()).setPhoneNumberJson(batchBaseSmsRequest.getPhoneNumber().toString()).setTemplateCode(batchBaseSmsRequest.getTemplateCode());
            RuntimeOptions runtime = new RuntimeOptions();
            try {
                // å¤åˆ¶ä»£ç è¿è¡Œè¯·è‡ªè¡Œæ‰“印 API çš„返回值
                SendBatchSmsResponse sendBatchSmsResponse = client.sendBatchSmsWithOptions(sendBatchSmsRequest, runtime);
                return sendBatchSmsResponse.getBody();
            } catch (TeaException error) {
                // å¦‚有需要,请打印 error
                com.aliyun.teautil.Common.assertAsString(error.message);
            } catch (Exception _error) {
                TeaException error = new TeaException(_error.getMessage(), _error);
                // å¦‚有需要,请打印 error
                Common.assertAsString(error.message);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    public AddSmsTemplateResponseBody addSmsTemplate(TemplateSmsRequest templateSmsRequest) {
        Client client = null;
        try {
            client = this.createClient();
            AddSmsTemplateRequest addSmsTemplateRequest = new AddSmsTemplateRequest().setTemplateType(templateSmsRequest.getTemplateType()).setTemplateName(templateSmsRequest.getTemplateName()).setTemplateContent(templateSmsRequest.getTemplateContent()).setRemark(templateSmsRequest.getRemark());
            RuntimeOptions runtime = new RuntimeOptions();
            // å¤åˆ¶ä»£ç è¿è¡Œè¯·è‡ªè¡Œæ‰“印 API çš„返回值
            AddSmsTemplateResponse addSmsTemplateResponse = client.addSmsTemplateWithOptions(addSmsTemplateRequest, runtime);
            return addSmsTemplateResponse.getBody();
        } catch (TeaException error) {
            // å¦‚有需要,请打印 error
            Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // å¦‚有需要,请打印 error
            Common.assertAsString(error.message);
        }
        return null;
    }
    @Override
    public ModifySmsTemplateResponseBody delSmsTemplate(String templateCode) {
        Client client = null;
        try {
            client = this.createClient();
            ModifySmsTemplateRequest modifySmsTemplateRequest = new ModifySmsTemplateRequest();
            modifySmsTemplateRequest.setTemplateCode(templateCode);
            RuntimeOptions runtime = new RuntimeOptions();
            // å¤åˆ¶ä»£ç è¿è¡Œè¯·è‡ªè¡Œæ‰“印 API çš„返回值
            ModifySmsTemplateResponse modifySmsTemplateResponse = client.modifySmsTemplateWithOptions(modifySmsTemplateRequest, runtime);
            return modifySmsTemplateResponse.getBody();
        } catch (TeaException error) {
            // å¦‚有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // å¦‚有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
        return null;
    }
    @Override
    public ModifySmsTemplateResponseBody updateSmsTemplate(TemplateSmsRequest templateSmsRequest) {
        Client client = null;
        try {
            client = this.createClient();
            ModifySmsTemplateRequest modifySmsTemplateRequest = new ModifySmsTemplateRequest().setTemplateType(1).setTemplateName("AAA").setTemplateCode("SMS_279456451").setTemplateContent("ASD").setRemark("ASFD");
            RuntimeOptions runtime = new RuntimeOptions();
            // å¤åˆ¶ä»£ç è¿è¡Œè¯·è‡ªè¡Œæ‰“印 API çš„返回值
            ModifySmsTemplateResponse modifySmsTemplateResponse = client.modifySmsTemplateWithOptions(modifySmsTemplateRequest, runtime);
            return modifySmsTemplateResponse.getBody();
        } catch (TeaException error) {
            // å¦‚有需要,请打印 error
            Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // å¦‚有需要,请打印 error
            Common.assertAsString(error.message);
        }
        return null;
    }
    @Override
    public QuerySmsTemplateListResponseBody querySmsTemplate(Integer pageIndex, Integer pageSize) {
        Client client = null;
        try {
            client = this.createClient();
            QuerySmsTemplateListRequest querySmsTemplateListRequest = new QuerySmsTemplateListRequest().setPageIndex(pageIndex).setPageSize(pageSize);
            RuntimeOptions runtime = new RuntimeOptions();
            // å¤åˆ¶ä»£ç è¿è¡Œè¯·è‡ªè¡Œæ‰“印 API çš„返回值
            QuerySmsTemplateListResponse querySmsTemplateListResponse = client.querySmsTemplateListWithOptions(querySmsTemplateListRequest, runtime);
            return querySmsTemplateListResponse.getBody();
        } catch (TeaException error) {
            // å¦‚有需要,请打印 error
            Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // å¦‚有需要,请打印 error
            Common.assertAsString(error.message);
        }
        return null;
    }
    @Override
    public QuerySmsTemplateResponseBody querySmsTemplateStatus(String templateCode) {
        Client client = null;
        try {
            client = this.createClient();
            QuerySmsTemplateRequest querySmsTemplateRequest = new QuerySmsTemplateRequest().setTemplateCode(templateCode);
            RuntimeOptions runtime = new RuntimeOptions();
            // å¤åˆ¶ä»£ç è¿è¡Œè¯·è‡ªè¡Œæ‰“印 API çš„返回值
            QuerySmsTemplateResponse querySmsTemplateResponse = client.querySmsTemplateWithOptions(querySmsTemplateRequest, runtime);
            return querySmsTemplateResponse.getBody();
        } catch (TeaException error) {
            // å¦‚有需要,请打印 error
            Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // å¦‚有需要,请打印 error
            Common.assertAsString(error.message);
        }
        return null;
    }
    public Client createClient() throws Exception {
        Config config = new Config()
                // å¿…填,您的 AccessKey ID
                .setAccessKeyId(this.accessKeyId)
                // å¿…填,您的 AccessKey Secret
                .setAccessKeySecret(this.accessKeySecret);
        // è®¿é—®çš„域名
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }
}
smartor/src/main/java/com/smartor/service/impl/DingTalkServiceImpl.java
@@ -14,6 +14,7 @@
import com.smartor.service.DingTalkService;
import com.smartor.service.IntelligenceCenterService;
import com.taobao.api.ApiException;
import lombok.extern.log4j.Log4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -27,6 +28,7 @@
 * @date 2023-05-23
 */
@Service
@Log4j
public class DingTalkServiceImpl implements DingTalkService {
@@ -39,7 +41,7 @@
    @Override
    public Boolean sendNotification(DingTalkReqVo dingTalkReqVo) {
        Boolean result = false;
        // Log.info("发送钉钉通知");
        log.info("发送钉钉通知");
        String accessToken = null;
        try {
            accessToken = getAccessToken();
@@ -85,8 +87,8 @@
            OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
            msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
            msg.getOa().setMessageUrl("www.baidu.com");
            msg.getOa().setPcMessageUrl("www.baidu.com");
            msg.getOa().setMessageUrl("https://www.baidu.com");
            msg.getOa().setPcMessageUrl("https://www.baidu.com");
            msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
            msg.getOa().getHead().setText("待办事宜");
            msg.getOa().getHead().setBgcolor("00409eff");
smartor/src/main/java/com/smartor/service/impl/MinioFileServiceImpl.java
@@ -23,6 +23,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.time.Instant;
import java.time.Year;
import java.util.ArrayList;
import java.util.List;
@@ -116,6 +117,8 @@
        log.info(files.toString());
        if (StringUtils.isNotEmpty(path) && !path.endsWith("/")) {
            path = path + "/";
        } else {
            path = Year.now().getValue() + "其它/";
        }
        List<MinioResponseDTO> MinioResponseDTOList = new ArrayList<>();
@@ -136,7 +139,9 @@
                String bucketName = minioConfig.getBucketName();
                minioClientUtils.putObject(bucketName, file, path + originalFilename);
//                String fileUrl = minioClientUtils.getObjectUrl(bucketName, path + originalFilename);
                String fileUrl = path + originalFilename;
                // String fileUrl = path + originalFilename;
                //url可以使用一周
                String fileUrl = getFileUrl(path + originalFilename, 6);
                MinioFile minioFile = new MinioFile();
                minioFile.setOriginalFileName(originalFilename);
                minioFile.setFileExtName(extName);
smartor/src/main/java/com/smartor/service/impl/SvyLibTitleServiceImpl.java
@@ -5,17 +5,15 @@
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.smartor.domain.Icd10Association;
import com.smartor.domain.SvyLibTitleReq;
import com.smartor.domain.SvyLibTopic;
import com.smartor.domain.*;
import com.smartor.mapper.Icd10AssociationMapper;
import com.smartor.mapper.SvyLibTopicMapper;
import com.smartor.mapper.SvyTopicoptionMapper;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smartor.mapper.SvyLibTitleMapper;
import com.smartor.domain.SvyLibTitle;
import com.smartor.service.ISvyLibTitleService;
import org.springframework.transaction.annotation.Transactional;
@@ -33,6 +31,8 @@
    private Icd10AssociationMapper icd10AssociationMapper;
    @Autowired
    private SvyLibTopicMapper svyLibTopicMapper;
    @Autowired
    private SvyTopicoptionMapper svyTopicoptionMapper;
    /**
     * æŸ¥è¯¢é—®å·
@@ -54,6 +54,29 @@
    @Override
    public List<SvyLibTitle> selectSvyLibTitleList(SvyLibTitleReq svyLibTitleReq) {
        List<SvyLibTitle> svyLibTitles = svyLibTitleMapper.selectSvyLibTitleList(svyLibTitleReq);
        //添加题目
        for (int i = 0; i < svyLibTitles.size(); i++) {
            SvyLibTopic svyLibTopic = new SvyLibTopic();
            svyLibTopic.setSvyid(svyLibTitles.get(i).getSvyid());
            List<SvyLibTopic> svyLibTopics = svyLibTopicMapper.selectSvyLibTopicList(svyLibTopic);
            //获取题目选项
            a:
            for (int j = 0; j < svyLibTopics.size(); j++) {
                if (svyLibTopics.get(j).getTopictype() == 3) {
                    //作答题,不需要选项
                    continue a;
                } else {
                    SvyTopicoption svyTopicoption = new SvyTopicoption();
                    svyTopicoption.setTopicid(svyLibTopics.get(j).getSvyTopicId());
                    List<SvyTopicoption> svyTopicoptions = svyTopicoptionMapper.selectSvyTopicoptionList(svyTopicoption);
                    //将查询出的选项目放到题目中
                    svyLibTopics.get(j).setSvyTopicoptions(svyTopicoptions);
                }
            }
            //将题目放到问卷列表中
            svyLibTitles.get(i).setSvyLibTopics(svyLibTopics);
        }
        //先将相同的id的icdname,整理到一块
        List<SvyLibTitle> libTitles = svyLibTitles.stream().collect(Collectors.groupingBy(SvyLibTitle::getSvyid, Collectors.mapping(SvyLibTitle::getIcdname, Collectors.joining(", ")))).entrySet().stream().map(entry -> new SvyLibTitle(entry.getKey(), entry.getValue())).collect(Collectors.toList());
        //临时变量,用来保存疾病名称
@@ -93,6 +116,8 @@
        //新增问题题目
        for (int i = 0; i < svyLibTitle.getSvyLibTopics().size(); i++) {
            SvyLibTopic svyLibTopic = svyLibTitle.getSvyLibTopics().get(i);
            svyLibTopic.setSvyid(svyLibTitle.getSvyid());
            //题目的选项目,直接用svy_topicoption表,用svyTopicidf去关联
            svyLibTopicMapper.insertSvyLibTopic(svyLibTopic);
        }
        return 1;
smartor/src/main/resources/mapper/smartor/SvyLibTopicMapper.xml
@@ -1,51 +1,72 @@
<?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">
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smartor.mapper.SvyLibTopicMapper">
    <resultMap type="com.smartor.domain.SvyLibTopic" id="SvyLibTopicResult">
        <result property="topicid"    column="topicid"    />
        <result property="oldid"    column="oldid"    />
        <result property="svyid"    column="svyid"    />
        <result property="topictype"    column="topictype"    />
        <result property="topiccode"    column="topiccode"    />
        <result property="topic"    column="topic"    />
        <result property="sort"    column="sort"    />
        <result property="ismandatory"    column="ismandatory"    />
        <result property="ishide"    column="ishide"    />
        <result property="delFlag"    column="del_flag"    />
        <result property="orgid"    column="orgid"    />
        <result property="createBy"    column="create_by"    />
        <result property="createTime"    column="create_time"    />
        <result property="updateBy"    column="update_by"    />
        <result property="updateTime"    column="update_time"    />
        <result property="isupload"    column="isupload"    />
        <result property="uploadTime"    column="upload_time"    />
        <result property="tag"    column="tag"    />
        <result property="topicid" column="topicid"/>
        <result property="oldid" column="oldid"/>
        <result property="svyid" column="svyid"/>
        <result property="topictype" column="topictype"/>
        <result property="topiccode" column="topiccode"/>
        <result property="topic" column="topic"/>
        <result property="sort" column="sort"/>
        <result property="ismandatory" column="ismandatory"/>
        <result property="ishide" column="ishide"/>
        <result property="delFlag" column="del_flag"/>
        <result property="orgid" column="orgid"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
        <result property="isupload" column="isupload"/>
        <result property="uploadTime" column="upload_time"/>
        <result property="tag" column="tag"/>
    </resultMap>
    <sql id="selectSvyLibTopicVo">
        select topicid, oldid, svyid, topictype, topiccode, topic, sort, ismandatory, ishide, del_flag, orgid, create_by, create_time, update_by, update_time, isupload, upload_time,tag from svy_lib_topic
        select topicid,
               oldid,
               svyid,
               topictype,
               topiccode,
               topic,
               sort,
               ismandatory,
               ishide,
               del_flag,
               orgid,
               create_by,
               create_time,
               update_by,
               update_time,
               isupload,
               upload_time,
               tag,
               svy_topicid as svyTopicId
        from svy_lib_topic
    </sql>
    <select id="selectSvyLibTopicList" parameterType="com.smartor.domain.SvyLibTopic" resultMap="SvyLibTopicResult">
        <include refid="selectSvyLibTopicVo"/>
        <where>
            <if test="oldid != null "> and oldid = #{oldid}</if>
            <if test="topictype != null "> and topictype = #{topictype}</if>
            <if test="topic != null  and topic != ''"> and topic = #{topic}</if>
            <if test="ishide != null "> and ishide = #{ishide}</if>
            <if test="orgid != null  and orgid != ''"> and orgid = #{orgid}</if>
        <where>
            <if test="oldid != null ">and oldid = #{oldid}</if>
            <if test="topictype != null ">and topictype = #{topictype}</if>
            <if test="topic != null  and topic != ''">and topic = #{topic}</if>
            <if test="ishide != null ">and ishide = #{ishide}</if>
            <if test="orgid != null  and orgid != ''">and orgid = #{orgid}</if>
            <if test="svyid != null  and svyid != ''">and svyid = #{svyid}</if>
        </where>
    </select>
    <select id="selectSvyLibTopicByTopicid" parameterType="Long" resultMap="SvyLibTopicResult">
        <include refid="selectSvyLibTopicVo"/>
        where topicid = #{topicid}
    </select>
    <insert id="insertSvyLibTopic" parameterType="com.smartor.domain.SvyLibTopic" useGeneratedKeys="true" keyProperty="topicid">
    <insert id="insertSvyLibTopic" parameterType="com.smartor.domain.SvyLibTopic" useGeneratedKeys="true"
            keyProperty="topicid">
        insert into svy_lib_topic
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="oldid != null">oldid,</if>
@@ -65,7 +86,8 @@
            <if test="isupload != null">isupload,</if>
            <if test="uploadTime != null">upload_time,</if>
            <if test="tag != null">tag,</if>
         </trim>
            <if test="svyTopicId != null">svy_topicid,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="oldid != null">#{oldid},</if>
            <if test="svyid != null">#{svyid},</if>
@@ -84,7 +106,8 @@
            <if test="isupload != null">#{isupload},</if>
            <if test="uploadTime != null">#{uploadTime},</if>
            <if test="tag != null">#{tag},</if>
         </trim>
            <if test="svyTopicId != null">#{svyTopicId},</if>
        </trim>
    </insert>
    <update id="updateSvyLibTopic" parameterType="com.smartor.domain.SvyLibTopic">
@@ -111,11 +134,13 @@
    </update>
    <delete id="deleteSvyLibTopicByTopicid" parameterType="Long">
        delete from svy_lib_topic where topicid = #{topicid}
        delete
        from svy_lib_topic
        where topicid = #{topicid}
    </delete>
    <delete id="deleteSvyLibTopicByTopicids" parameterType="String">
        delete from svy_lib_topic where topicid in
        delete from svy_lib_topic where topicid in
        <foreach item="topicid" collection="array" open="(" separator="," close=")">
            #{topicid}
        </foreach>