ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/tools/DingTalkController.java
@@ -48,5 +48,19 @@ return aBoolean; } /** * åéééæ¶æ¯ * * @param dingTalkReqVo åéå 容 * @throws ApiException */ @ApiOperation("åéééæ¶æ¯") @PostMapping("/sendDingTalkText") public void sendDingTalkText(@RequestBody DingTalkReqVo dingTalkReqVo) throws Exception { // String userid = dingTalkService.getDingTalkUserByMobile(dingTalkReqVo.getNumber()); String userid = "214563391024684607"; dingTalkService.sendDingTalkText("æ¯å®åéééæ¶æ¯æµè¯", userid); } } ruoyi-common/src/main/java/com/ruoyi/common/core/domain/DingAsyncSendMsgReq.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.common.core.domain; import lombok.Data; import java.util.Map; @Data public class DingAsyncSendMsgReq { /** åºç¨agentId */ private Long agent_id; /** æ¥æ¶äººuseridå表ï¼å¤ä¸ªéå·åéï¼ä¸dept_id_listäºéä¸ */ private String userid_list; /** æ¥æ¶é¨é¨idå表ï¼å¤ä¸ªéå·åé */ private String dept_id_list; /** æ¯å¦åéç»ææåå·¥ï¼trueåuserid_listãdept_id_list失æ */ private Boolean to_all_user; /** æ¶æ¯ä½ */ private Map<String, Object> msg; } ruoyi-common/src/main/java/com/ruoyi/common/core/domain/DingAsyncSendMsgResp.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ package com.ruoyi.common.core.domain; import lombok.Data; @Data public class DingAsyncSendMsgResp { private Integer errcode; private String errmsg; /** ä»»å¡idï¼åç»åè°ä¼å¸¦åè¿ä¸ªtask_id */ private Long task_id; } ruoyi-common/src/main/java/com/ruoyi/common/core/domain/DingTokenResp.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ package com.ruoyi.common.core.domain; import lombok.Data; @Data public class DingTokenResp { private Integer errcode; private String errmsg; private String access_token; private Long expires_in; } ruoyi-common/src/main/java/com/ruoyi/common/core/service/IDingTalkService.java
@@ -13,4 +13,19 @@ * @return æ¯å¦æå */ Boolean sendNotification(DingTalkReqVo dingTalkReqVo); /** * åéééæ¶æ¯-æ¯å® * @param sMessageContent * @throws Exception */ void sendDingTalkText(String sMessageContent, String userId) throws Exception; /** * æ ¹æ®çµè¯è·åç¨æ· * @param mobile * @return * @throws Exception */ String getDingTalkUserByMobile(String mobile) throws Exception; } ruoyi-common/src/main/java/com/ruoyi/common/dx/MessageSend.java
@@ -1,5 +1,9 @@ package com.ruoyi.common.dx; import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request; import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response; import com.ruoyi.common.utils.uuid.UUID; import lombok.extern.slf4j.Slf4j; @@ -31,7 +35,8 @@ result = soap.i5GSend("202508291634227086", "T202508291635259440", UUID.randomUUID().toString(), sMessageContent, sMessageType, sUserNumber, sScheduleTime); log.info("----çä¿¡è¿åçæ°æ®ä¸ºï¼{}, ----sMessageContent çå¼ä¸º:{}", result,UUID.randomUUID().toString()); } else if ("7".equals(sMessageType)) { result = soap.i5GSend("202508291634227086", "T202607211306131891", UUID.randomUUID().toString(), sMessageContent, sMessageType, sUserNumber, sScheduleTime); result = soap.i5GSend("202508291634227086", "T202607211306131891", UUID.randomUUID().toString(), sMessageContent, sMessageType, sUserNumber, sScheduleTime); log.info("----ééè¿åçåå§æ°æ®ä¸ºï¼{}", result); } else { ruoyi-common/src/main/java/com/ruoyi/common/utils/DingTalkUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,79 @@ package com.ruoyi.common.utils; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.core.domain.DingAsyncSendMsgReq; import com.ruoyi.common.core.domain.DingAsyncSendMsgResp; import com.ruoyi.common.core.domain.DingTokenResp; import okhttp3.*; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; public class DingTalkUtils { private static final OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .build(); /** * è·åä¼ä¸access_token * @param corpid ä¼ä¸ID * @param corpsecret åºç¨çåè¯å¯é¥ * @return DingTokenResp */ public static DingTokenResp getAccessToken(String corpid, String corpsecret) throws IOException { String url = "https://oapi.dingtalk.com/gettoken?corpid=" + corpid + "&corpsecret=" + corpsecret; Request request = new Request.Builder() .url(url) .get() .build(); try (Response response = HTTP_CLIENT.newCall(request).execute()) { String body = response.body().string(); return JSON.parseObject(body, DingTokenResp.class); } } /** * 弿¥åéä¼ä¸ä¼è¯æ¶æ¯ asyncsend_v2 */ public static DingAsyncSendMsgResp asyncSendCorpMsg(String accessToken, DingAsyncSendMsgReq req) throws IOException { String url = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=" + accessToken; String jsonBody = JSON.toJSONString(req); RequestBody body = RequestBody.create(jsonBody, MediaType.get("application/json; charset=utf-8")); Request request = new Request.Builder() .url(url) .post(body) .build(); try (Response response = HTTP_CLIENT.newCall(request).execute()) { String respBody = response.body().string(); return JSON.parseObject(respBody, DingAsyncSendMsgResp.class); } } // ========== æå»ºæ¶æ¯ç¤ºä¾ï¼ææ¬æ¶æ¯ ========== public static Map<String, Object> buildTextMsg(String content) { Map<String, Object> msgMap = new HashMap<>(); msgMap.put("msgtype", "text"); Map<String, Object> text = new HashMap<>(); text.put("content", content); msgMap.put("text", text); return msgMap; } // ========== æå»ºæ¶æ¯ç¤ºä¾ï¼markdownæ¶æ¯ ========== public static Map<String, Object> buildMarkdownMsg(String title, String text) { Map<String, Object> msgMap = new HashMap<>(); msgMap.put("msgtype", "markdown"); Map<String, Object> markdown = new HashMap<>(); markdown.put("title", title); markdown.put("text", text); msgMap.put("markdown", markdown); return msgMap; } } ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -9,6 +9,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.service.IDingTalkService; import com.ruoyi.common.dx.MessageSend; import com.ruoyi.common.enums.MsgLSEnum; import com.ruoyi.common.enums.ServiceFromEnum; @@ -104,6 +105,9 @@ @Autowired private ISysConfigService configService; @Autowired private IDingTalkService dingTalkService; @Value("${localIP}") @@ -270,6 +274,44 @@ } } /** * 宿¶åéå¼å¸¸ä¿¡æ¯-æ¯å® */ public void sendExceptInfo() throws Exception { //1.è·ååéäººå·¥å· ServiceSubtaskDetailTraceVO subtaskDetailTraceVO = new ServiceSubtaskDetailTraceVO(); subtaskDetailTraceVO.setHandleFlag("0"); List<ServiceSubtaskDetailTrace> serviceSubtaskDetailTraces = serviceSubtaskDetailTraceService.selectServiceSubtaskDetailTtraceList(subtaskDetailTraceVO); // æ dutyDeptPersonCode æ´çå° list ä¸ï¼å¦æå¤ä¸ªäººç¨éå·åå²ï¼åå±å¼å¹¶å»éï¼ List<String> dutyDeptPersonCodeList = serviceSubtaskDetailTraces.stream() .map(ServiceSubtaskDetailTrace::getDutyDeptPersonCode) .filter(StringUtils::isNotBlank) .flatMap(code -> Arrays.stream(code.split(","))) .map(String::trim) .filter(StringUtils::isNotBlank).distinct() // å»é .collect(Collectors.toList()); // è·åâå¼å¸¸å 容æé" SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("send.except.content"); String exceptContent = sysConfig.getConfigValue(); // è·åâå 容æéæµè¯äººå·¥å·â String testPerson = sysConfigMapper.checkConfigKeyUnique("send.test.person").getConfigValue(); if (StringUtils.isNotBlank(testPerson)) { String[] split = testPerson.split(","); if (CollectionUtils.isEmpty(dutyDeptPersonCodeList)) dutyDeptPersonCodeList = Arrays.asList(split); else dutyDeptPersonCodeList.addAll(Arrays.asList(split)); } if (CollectionUtils.isNotEmpty(dutyDeptPersonCodeList)) { for (String dutyDeptPersonCode : dutyDeptPersonCodeList) { log.info("ãsendExceptInfoãåé人工å·ï¼{}", dutyDeptPersonCode); String dutyDeptPerson = dingTalkService.getDingTalkUserByMobile(dutyDeptPersonCode); dingTalkService.sendDingTalkText(exceptContent, dutyDeptPerson); } } } /** * 宿¶å¤çå¤é¾çæ°æ® smartor/src/main/java/com/smartor/service/DingTalkService.java
@@ -21,4 +21,19 @@ * @param dingTalkReqVo */ public Boolean sendNotification(DingTalkReqVo dingTalkReqVo); /** * åéééæ¶æ¯-æ¯å® * @param sMessageContent * @throws Exception */ public void sendDingTalkText(String sMessageContent, String userId) throws Exception; /** * æ ¹æ®çµè¯è·åç¨æ· * @param mobile * @return * @throws Exception */ public String getDingTalkUserByMobile(String mobile) throws Exception; } smartor/src/main/java/com/smartor/service/impl/DingTalkServiceImpl.java
@@ -12,7 +12,11 @@ import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response; import com.dingtalk.api.response.OapiUserListidResponse; import com.dingtalk.api.response.OapiV2UserGetbymobileResponse; import com.ruoyi.common.core.domain.DingAsyncSendMsgReq; import com.ruoyi.common.core.domain.DingAsyncSendMsgResp; import com.ruoyi.common.core.domain.DingTalkReqVo; import com.ruoyi.common.core.domain.DingTokenResp; import com.ruoyi.common.utils.DingTalkUtils; import com.ruoyi.common.utils.StringUtils; import com.smartor.service.DingTalkService; import com.taobao.api.ApiException; @@ -40,6 +44,9 @@ @Value("${dingAppSecret}") private String dingAppSecret; @Value("${dingAppAgentId}") private Long dingAppAgentId; @Override public Boolean sendNotification(DingTalkReqVo dingTalkReqVo) { @@ -158,4 +165,105 @@ OapiGettokenResponse response = client.execute(request); return response.getAccessToken(); } /** * è·åpost access_token */ private String getAccessTokenPost() throws ApiException { DefaultDingTalkClient client = new DefaultDingTalkClient("https://api.dingtalk.com/v1.0/oauth2/{corpId}/token"); OapiGettokenRequest request = new OapiGettokenRequest(); //Appkey request.setAppkey(dingAppid); //Appsecret request.setAppsecret(dingAppSecret); /*è¯·æ±æ¹å¼*/ request.setHttpMethod("Post"); OapiGettokenResponse response = client.execute(request); return response.getAccessToken(); } // /** // * åéééæ¶æ¯-æ¯å® // * @param sMessageContent // * @throws Exception // */ // public void sendDingTalkText(String sMessageContent) throws Exception { // String CORP_ID = "ä½ çä¼ä¸corpid"; // String CORP_SECRET = "ä¼ä¸åºç¨çcorpsecret"; // Long AGENT_ID = 4992829038L; // ä½ çåºç¨agentId // // try { // // 1. è·åaccess_token // DingTokenResp tokenResp = DingTalkUtils.getAccessToken(CORP_ID, CORP_SECRET); // if (tokenResp.getErrcode() != 0) { // System.err.println("è·åtoken失败ï¼" + tokenResp.getErrmsg()); // return; // } // String accessToken = tokenResp.getAccess_token(); // System.out.println("access_token=" + accessToken); // // // 2. ç»è£ åéè¯·æ± // DingAsyncSendMsgReq sendReq = new DingAsyncSendMsgReq(); // sendReq.setAgent_id(AGENT_ID); // sendReq.setUserid_list("user01,user02"); // æ¥æ¶äººééuserIdï¼å¤ä¸ªéå· // sendReq.setTo_all_user(false); // // è®¾ç½®æ¶æ¯å 容ï¼è¿éç¨ææ¬æ¶æ¯ // sendReq.setMsg(DingTalkUtils.buildTextMsg("ä½ å¥½ï¼è¿æ¯å¼æ¥åéééæ¶æ¯æµè¯")); // // // 3. è°ç¨å¼æ¥åéæ¥å£ // DingAsyncSendMsgResp sendResp = DingTalkUtils.asyncSendCorpMsg(accessToken, sendReq); // if (sendResp.getErrcode() == 0) { // System.out.println("æäº¤æ¶æ¯ä»»å¡æåï¼task_id=" + sendResp.getTask_id()); // System.out.println("æ¶æ¯å®é åéç»æï¼éè¦å¨ééåå°é ç½®åè°æ¥æ¶"); // } else { // System.err.println("æäº¤æ¶æ¯ä»»å¡å¤±è´¥ï¼code=" + sendResp.getErrcode() + ",msg=" + sendResp.getErrmsg()); // } // // } catch (Exception e) { // e.printStackTrace(); // } // } /** * åéééæ¶æ¯-æ¯å® * @param sMessageContent * @throws Exception */ @Override public void sendDingTalkText(String sMessageContent, String userId) throws Exception { Long agentId = dingAppAgentId; String accessToken = getAccessToken(); DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2"); OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request(); request.setAgentId(agentId); request.setUseridList(userId); request.setToAllUser(false); OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg(); msg.setMsgtype("text"); OapiMessageCorpconversationAsyncsendV2Request.Text text = new OapiMessageCorpconversationAsyncsendV2Request.Text(); text.setContent(sMessageContent); msg.setText(text); request.setMsg(msg); OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, accessToken); System.out.println(rsp.getBody()); } /** * æ ¹æ®çµè¯è·åç¨æ· * @param mobile * @return * @throws Exception */ @Override public String getDingTalkUserByMobile(String mobile) throws Exception { String accessToken = getAccessToken(); DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile"); OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest(); req.setMobile(mobile); OapiV2UserGetbymobileResponse rsp = client.execute(req, accessToken); return rsp.getBody(); } } smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -1066,8 +1066,19 @@ } } String orgid = selectServiceSubtaskList.get(0).getOrgid(); //æ¯å®-é访å¼å¸¸æç¤º å ¶ä»-å¼å¸¸æ»¡æåº¦æç¤º boolean addTrace = false; if(StringUtils.isNotEmpty(orgid) && orgid.equals("47255004333112711A1001")){ if (stt != null) { addTrace = Long.valueOf(1L).equals(stt.getIsabnormal()); } }else { addTrace = StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getIsMydException()); } //夿ä¸ä¸å½åçé®é¢æ¯ä¸æ¯æ»¡æåº¦é®é¢ï¼å¹¶ä¸ dutyDeptCode æ¯å¦æå¼ï¼å¹¶ä¸é项æ¯ä¸æ¯å¼å¸¸é项ï¼å¦æå ¨ç¬¦åï¼å徿»¡æåº¦é®é¢å¼å¸¸è¡¨æ°å¢ if (StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getDutyDeptCode()) && stt != null && Long.valueOf(1L).equals(stt.getIsabnormal()) || StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getDutyDeptCode()) && StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getIsMydException())) { if (StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getDutyDeptCode()) && stt != null && Long.valueOf(1L).equals(stt.getIsabnormal()) || StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getDutyDeptCode()) && addTrace) { isabnormalFlag = 1L; ServiceSubtaskDetailTrace subtaskDetailTrace = new ServiceSubtaskDetailTrace(); subtaskDetailTrace.setDetailId(serviceSubtaskDetail.getId()); @@ -1083,17 +1094,19 @@ //è·åææé项 subtaskDetailTrace.setTargetid(stt != null ? stt.getId() : null); subtaskDetailTrace.setTargetvalue(serviceSubtaskDetailVO.getTargetvalue()); subtaskDetailTrace.setMatchedtext(stt != null ? stt.getOptioncontent() : svyTaskTemplateScriptVO.getIsMydException()); subtaskDetailTrace.setGuid(svyTaskTemplateScriptVO.getGuid()); subtaskDetailTrace.setValueType(serviceSubtaskDetail.getValueType()); subtaskDetailTrace.setIsMydException(svyTaskTemplateScriptVO.getIsMydException()); subtaskDetailTrace.setTemplateType(2); SvyLibScriptCategory svyLibScriptCategory = svyLibScriptCategoryMapper.selectSvyLibScriptCategoryById(svyTaskTemplateScriptVO.getCategoryid()); subtaskDetailTrace.setType(svyLibScriptCategory != null ? svyLibScriptCategory.getType() : null); subtaskDetailTrace.setScriptid(svyTaskTemplateScriptVO.getId()); //éæ»¡æåº¦æè§å¼å¸¸èªå¨å¡«å ¥ç©º subtaskDetailTrace.setMatchedtext(stt != null ? stt.getOptioncontent() : svyTaskTemplateScriptVO.getIsMydException()); subtaskDetailTrace.setAsrtext(stt != null ? stt.getOptioncontent() : svyTaskTemplateScriptVO.getIsMydException()); subtaskDetailTrace.setIsMydException(svyTaskTemplateScriptVO.getIsMydException()); subtaskDetailTrace.setRecordpath(null); subtaskDetailTrace.setPatid(selectServiceSubtaskList.get(0).getPatid()); JSONObject patdescJson1 = new JSONObject(); @@ -1341,9 +1354,19 @@ stt = ivrTaskTemplateTargetoption; } String orgid = selectServiceSubtaskList.get(0).getOrgid(); //æ¯å®-é访å¼å¸¸æç¤º å ¶ä»-å¼å¸¸æ»¡æåº¦æç¤º boolean addTrace = false; if(StringUtils.isNotEmpty(orgid) && orgid.equals("47255004333112711A1001")){ if (stt != null) { addTrace = Long.valueOf(1L).equals(stt.getIsabnormal()); } }else { addTrace = StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIsMydException()); } //夿ä¸ä¸å½åçé®é¢æ¯ä¸æ¯æ»¡æåº¦é®é¢ï¼å¹¶ä¸dutyDeptCodeæ¯å¦æå¼ï¼å¹¶ä¸é项æ¯ä¸æ¯å¼å¸¸é项ï¼å¦æå ¨ç¬¦åï¼å徿»¡æåº¦é®é¢å¼å¸¸è¡¨æ°å¢ if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getDutyDeptCode()) && 1 == stt.getIsabnormal() || StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getDutyDeptCode()) && StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIsMydException())) { if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getDutyDeptCode()) && 1 == stt.getIsabnormal() || StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getDutyDeptCode()) && addTrace) { isabnormalFlag = "1"; ServiceSubtaskDetailTrace subtaskDetailTrace = new ServiceSubtaskDetailTrace(); subtaskDetailTrace.setDetailId(serviceSubtaskDetail.getId());