REQ-2333: 企业内部应用机器人推送

This commit is contained in:
yangchen 2024-04-17 11:02:44 +08:00
parent 5f8bc0bef0
commit 60f60c14df
8 changed files with 89 additions and 156 deletions

View File

@ -1,7 +1,7 @@
package cn.axzo.riven.client.feign;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.riven.client.req.SendCorpMsgReq;
import cn.axzo.riven.client.req.DingDingSendRebootMsgReq;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -17,6 +17,6 @@ public interface DingDingMsgApi {
* @param req
* @return
*/
@PostMapping("/api/dingDing/msg/send")
ApiResult<Long> send(@RequestBody SendCorpMsgReq req);
@PostMapping("/api/dingDing/reboot/msg/send")
ApiResult<Void> sendRebootMsg(@RequestBody DingDingSendRebootMsgReq req);
}

View File

@ -1,18 +0,0 @@
package cn.axzo.riven.client.req;
import lombok.Data;
/**
* @author yangchen@axzo.cn
*/
@Data
public class DingDingMsgReq {
/**
* 消息类型
*/
private String msgType;
/**
* 消息类型action_card
*/
private DingDingActionCardDto actionCard;
}

View File

@ -0,0 +1,26 @@
package cn.axzo.riven.client.req;
import lombok.Data;
/**
* @author yangchen@axzo.cn
*/
@Data
public class DingDingSampleActionCardReq {
/**
* 消息接收状态栏标题
*/
private String title;
/**
* markdown文本
*/
private String text;
/**
* 按钮标题
*/
private String singleTitle;
/**
* 按钮跳转地址 URL编码
*/
private String singleURL;
}

View File

@ -0,0 +1,24 @@
package cn.axzo.riven.client.req;
import lombok.Data;
import java.util.List;
/**
* @author yangchen@axzo.cn
*/
@Data
public class DingDingSendRebootMsgReq {
/**
* 人员id
*/
private List<Long> personIds;
/**
* 消息类型 sampleActionCard
*/
private String msgType;
/**
* 消息内容 sampleActionCard
*/
private DingDingSampleActionCardReq sampleActionCard;
}

View File

@ -1,20 +0,0 @@
package cn.axzo.riven.client.req;
import lombok.Data;
import java.util.List;
/**
* @author yangchen@axzo.cn
*/
@Data
public class SendCorpMsgReq {
/**
* 人员id
*/
private List<Long> personIds;
/**
* 消息内容
*/
private DingDingMsgReq msg;
}

View File

@ -2,8 +2,7 @@ package cn.axzo.riven.controller;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.riven.client.feign.DingDingMsgApi;
import cn.axzo.riven.client.req.SendCorpMsgReq;
import cn.axzo.riven.service.DingDingCorpMsgService;
import cn.axzo.riven.client.req.DingDingSendRebootMsgReq;
import cn.axzo.riven.service.DingDingRebootService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RestController;
@ -14,12 +13,11 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class DingDingMsgController implements DingDingMsgApi {
private final DingDingCorpMsgService dingDingCorpMsgService;
private final DingDingRebootService dingDingRebootService;
@Override
public ApiResult<Long> send(SendCorpMsgReq req) {
String res = dingDingRebootService.sendCorpMsg(req);
public ApiResult<Void> sendRebootMsg(DingDingSendRebootMsgReq req) {
dingDingRebootService.sendCorpRebbootMsg(req);
return ApiResult.ok();
}
}

View File

@ -1,68 +0,0 @@
package cn.axzo.riven.service;
import cn.axzo.framework.data.mybatisplus.model.BaseEntity;
import cn.axzo.framework.domain.web.code.BaseCode;
import cn.axzo.riven.client.req.SendCorpMsgReq;
import cn.axzo.riven.common.constants.DingDingJumpConstant;
import cn.axzo.riven.common.util.Throws;
import cn.axzo.riven.config.DeliverConfig;
import cn.axzo.riven.gateway.OrganizationalNodeUserApiGateway;
import cn.axzo.riven.manger.DingDingNewSdkManger;
import cn.axzo.riven.manger.DingDingOldSdkManger;
import cn.axzo.riven.repository.entity.ThirdPartyUser;
import cn.axzo.riven.repository.service.ThirdPartyUserDao;
import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponseBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author yangchen@axzo.cn
*/
@Service
public class DingDingCorpMsgService {
@Autowired
private DingDingOldSdkManger dingDingOldSdkManger;
@Autowired
private DingDingNewSdkManger dingDingNewSdkManger;
@Autowired
private ThirdPartyUserDao thirdPartyUserDao;
@Autowired
private DeliverConfig deliverConfig;
@Autowired
private OrganizationalNodeUserApiGateway organizationalNodeUserApiGateway;
public Long sendCorpMsg(SendCorpMsgReq req) {
GetAccessTokenResponseBody accessToken = dingDingNewSdkManger.getAccessToken(deliverConfig.getAppKey(), deliverConfig.getAppSecret());
// 通过personIds查询钉钉ids
String dingDingUserIdsStr = "AX0022,17002075952263429";
// if (!CollectionUtils.isEmpty(req.getPersonIds())) {
// List<Long> syncIds = organizationalNodeUserApiGateway.listSyncIds(deliverConfig.getOuId(), req.getPersonIds());
// if (!CollectionUtils.isEmpty(syncIds)) {
// List<ThirdPartyUser> partyUsers = thirdPartyUserDao.lambdaQuery().in(BaseEntity::getId, syncIds).list();
// if (!CollectionUtils.isEmpty(partyUsers)) {
// List<String> dingDingIds = partyUsers.stream().map(ThirdPartyUser::getUserId).distinct().collect(Collectors.toList());
// dingDingUserIdsStr = String.join(",", dingDingIds);
// }
// }
// }
// if (!StringUtils.hasText(dingDingUserIdsStr)) {
// throw Throws.bizException(BaseCode.FORBIDDEN, "钉钉用户不存在");
// }
if (!CollectionUtils.isEmpty(req.getMsg().getActionCard().getBtnJsonList())) {
// dingtalk://dingtalkclient/action/openapp?corpid=免登企业corpId&container_type=work_platform&app_id=0_应用agentid&redirect_type=jump&redirect_url=跳转url
req.getMsg().getActionCard().getBtnJsonList().forEach(item -> {
String url = String.format(DingDingJumpConstant.BASE_URL, deliverConfig.getCorpId(), deliverConfig.getAgentId(), item.getActionUrl());
item.setActionUrl(url);
});
}
return dingDingOldSdkManger.sendCorpActionCard(accessToken.getAccessToken(), deliverConfig.getAgentId(), dingDingUserIdsStr, false, req.getMsg().getActionCard());
}
}

View File

@ -1,13 +1,15 @@
package cn.axzo.riven.service;
import cn.axzo.riven.client.req.SendCorpMsgReq;
import cn.axzo.framework.data.mybatisplus.model.BaseEntity;
import cn.axzo.framework.domain.web.code.BaseCode;
import cn.axzo.riven.client.req.DingDingSendRebootMsgReq;
import cn.axzo.riven.common.constants.DingDingJumpConstant;
import cn.axzo.riven.common.util.Throws;
import cn.axzo.riven.config.DeliverConfig;
import cn.axzo.riven.config.DingDingRebootConfig;
import cn.axzo.riven.gateway.OrganizationalNodeUserApiGateway;
import cn.axzo.riven.manger.DingDingNewSdkManger;
import cn.axzo.riven.manger.DingDingOldSdkManger;
import cn.axzo.riven.model.dto.request.DingSampleActionCardDto;
import cn.axzo.riven.repository.entity.ThirdPartyUser;
import cn.axzo.riven.repository.service.ThirdPartyUserDao;
import cn.hutool.json.JSONUtil;
import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponseBody;
@ -17,14 +19,14 @@ import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author yangchen@axzo.cn
*/
@Service
public class DingDingRebootService {
@Autowired
private DingDingOldSdkManger dingDingOldSdkManger;
public static final int LIMIT_SEND = 20;
@Autowired
private DingDingNewSdkManger dingDingNewSdkManger;
@Autowired
@ -36,49 +38,38 @@ public class DingDingRebootService {
@Autowired
private OrganizationalNodeUserApiGateway organizationalNodeUserApiGateway;
public String sendCorpMsg(SendCorpMsgReq req) {
public void sendCorpRebbootMsg(DingDingSendRebootMsgReq req) {
GetAccessTokenResponseBody accessToken = dingDingNewSdkManger.getAccessToken(dingRebootConfig.getAppKey(), dingRebootConfig.getAppSecret());
// 通过personIds查询钉钉ids
String dingDingUserIdsStr = "AX0022,17002075952263429";
// if (!CollectionUtils.isEmpty(req.getPersonIds())) {
// List<Long> syncIds = organizationalNodeUserApiGateway.listSyncIds(deliverConfig.getOuId(), req.getPersonIds());
// if (!CollectionUtils.isEmpty(syncIds)) {
// List<ThirdPartyUser> partyUsers = thirdPartyUserDao.lambdaQuery().in(BaseEntity::getId, syncIds).list();
// if (!CollectionUtils.isEmpty(partyUsers)) {
// List<String> dingDingIds = partyUsers.stream().map(ThirdPartyUser::getUserId).distinct().collect(Collectors.toList());
// dingDingUserIdsStr = String.join(",", dingDingIds);
// }
// }
// }
// if (!StringUtils.hasText(dingDingUserIdsStr)) {
// throw Throws.bizException(BaseCode.FORBIDDEN, "钉钉用户不存在");
// }
List<String> dingUserIds = new ArrayList<>();
dingUserIds.add("AX0022");
dingUserIds.add("17002075952263429");
if (!CollectionUtils.isEmpty(req.getMsg().getActionCard().getBtnJsonList())) {
// dingtalk://dingtalkclient/action/openapp?corpid=免登企业corpId&container_type=work_platform&app_id=0_应用agentid&redirect_type=jump&redirect_url=跳转url
req.getMsg().getActionCard().getBtnJsonList().forEach(item -> {
String url = String.format(DingDingJumpConstant.BASE_URL, deliverConfig.getCorpId(), deliverConfig.getAgentId(), item.getActionUrl());
item.setActionUrl(url);
});
if (!CollectionUtils.isEmpty(req.getPersonIds())) {
List<Long> syncIds = organizationalNodeUserApiGateway.listSyncIds(deliverConfig.getOuId(), req.getPersonIds());
if (!CollectionUtils.isEmpty(syncIds)) {
List<ThirdPartyUser> partyUsers = thirdPartyUserDao.lambdaQuery().in(BaseEntity::getId, syncIds).list();
if (!CollectionUtils.isEmpty(partyUsers)) {
dingUserIds = partyUsers.stream().map(ThirdPartyUser::getUserId).distinct().collect(Collectors.toList());
}
}
}
if (CollectionUtils.isEmpty(dingUserIds)) {
throw Throws.bizException(BaseCode.FORBIDDEN, "钉钉用户不存在");
}
DingSampleActionCardDto dingSampleActionCardDto = new DingSampleActionCardDto();
dingSampleActionCardDto.setTitle("今日实时简报数据更新至2024.04.14 19:00");
dingSampleActionCardDto.setText(req.getMsg().getActionCard().getMarkdown());
dingSampleActionCardDto.setSingleTitle("查看详情");
String url = String.format(DingDingJumpConstant.BASE_URL, deliverConfig.getCorpId(), deliverConfig.getAgentId(), "https://test-data-h5.axzo.cn");
dingSampleActionCardDto.setSingleURL(url);
// 链接处理
String url = String.format(DingDingJumpConstant.BASE_URL, deliverConfig.getCorpId(), deliverConfig.getAgentId(), req.getSampleActionCard().getSingleURL());
req.getSampleActionCard().setSingleURL(url);
dingDingNewSdkManger.robotoToMessagesBatchSend(accessToken.getAccessToken(), dingRebootConfig.getRebootCode(), dingUserIds, "sampleActionCard", JSONUtil.toJsonStr(dingSampleActionCardDto));
return null;
// 分批发送钉钉机器人消息
int sendLength = dingUserIds.size();
int i = 0;
while (sendLength > LIMIT_SEND) {
dingDingNewSdkManger.robotoToMessagesBatchSend(accessToken.getAccessToken(), dingRebootConfig.getRebootCode(), dingUserIds.subList(i, i + LIMIT_SEND), req.getMsgType(), JSONUtil.toJsonStr(req.getSampleActionCard()));
i = i + LIMIT_SEND;
sendLength = sendLength - LIMIT_SEND;
}
if (sendLength > 0) {
dingDingNewSdkManger.robotoToMessagesBatchSend(accessToken.getAccessToken(), dingRebootConfig.getRebootCode(), dingUserIds.subList(i, i + sendLength), req.getMsgType(), JSONUtil.toJsonStr(req.getSampleActionCard()));
}
}
}