add:飞书同步待办推送审核消息
This commit is contained in:
@@ -24,8 +24,8 @@ public class RestTemplateConfig {
|
||||
*/
|
||||
// 解决https请求证书问题
|
||||
SSL factory = new SSL();
|
||||
factory.setReadTimeout(20000);//ms
|
||||
factory.setConnectTimeout(15000);//ms
|
||||
factory.setReadTimeout(60000);//ms
|
||||
factory.setConnectTimeout(60000);//ms
|
||||
return factory;
|
||||
}
|
||||
}
|
||||
|
||||
+20
@@ -2,10 +2,12 @@ package com.jero.modules.docking.feishu.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.jero.common.api.vo.Result;
|
||||
import com.jero.modules.docking.feishu.dto.BotApprovalMessageDto;
|
||||
import com.jero.modules.docking.feishu.dto.BotMessageDto;
|
||||
import com.jero.modules.docking.feishu.dto.InstanceDto;
|
||||
import com.jero.modules.docking.feishu.service.IFeiShuDockingService;
|
||||
import com.jero.modules.docking.feishu.vo.definition.ApprovalsDefinitionVo;
|
||||
import com.jero.modules.docking.feishu.vo.message.ApprovalsUpdateMessageVo;
|
||||
import io.swagger.annotations.Api;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
@@ -89,4 +91,22 @@ public class FeiShuDockingController {
|
||||
public Result<JSONObject> getUserInfoByCode(@RequestBody JSONObject codeObject) {
|
||||
return feiShuDockingService.getUserInfoByCode(codeObject);
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用bot发送审批消息
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/sendApprovalMessageByBot")
|
||||
public String sendApprovalMessageByBot(@RequestBody BotApprovalMessageDto botApprovalMessageDto) {
|
||||
return feiShuDockingService.sendApprovalMessageByBot(botApprovalMessageDto);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新Bot审批消息状态
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/updateBotMessage")
|
||||
public void updateBotMessage(@RequestBody ApprovalsUpdateMessageVo approvalsUpdateMessageVo) {
|
||||
feiShuDockingService.updateBotMessage(approvalsUpdateMessageVo);
|
||||
}
|
||||
}
|
||||
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
package com.jero.modules.docking.feishu.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class BotApprovalMessageDto {
|
||||
|
||||
/**
|
||||
* 模板的id
|
||||
* 待办 1008
|
||||
*/
|
||||
private String templateId;
|
||||
|
||||
/**
|
||||
* 接受bot提醒用户的user_id
|
||||
*/
|
||||
private String receivedUserId;
|
||||
|
||||
/**
|
||||
* 卡片标题中的{审批定义名称}
|
||||
*/
|
||||
private String approvalName;
|
||||
|
||||
/**
|
||||
* 卡片标题中的{申请人}、{审批人}、{评论人}、{抄送人}等,user id
|
||||
*/
|
||||
private String titleUserId;
|
||||
|
||||
/**
|
||||
* 申请人 user id
|
||||
* user_id为空时,申请人不显示
|
||||
*/
|
||||
private String applicantUserId;
|
||||
|
||||
/**
|
||||
* 审批事由1
|
||||
*/
|
||||
private String content1;
|
||||
|
||||
/**
|
||||
* 审批事由2
|
||||
*/
|
||||
private String content2;
|
||||
|
||||
/**
|
||||
* PC跳转地址
|
||||
*/
|
||||
private String pcUrl;
|
||||
|
||||
/**
|
||||
* 移动端跳转地址
|
||||
*/
|
||||
private String mobileUrl;
|
||||
|
||||
|
||||
}
|
||||
+17
@@ -2,9 +2,11 @@ package com.jero.modules.docking.feishu.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.jero.common.api.vo.Result;
|
||||
import com.jero.modules.docking.feishu.dto.BotApprovalMessageDto;
|
||||
import com.jero.modules.docking.feishu.dto.BotMessageDto;
|
||||
import com.jero.modules.docking.feishu.dto.InstanceDto;
|
||||
import com.jero.modules.docking.feishu.vo.definition.ApprovalsDefinitionVo;
|
||||
import com.jero.modules.docking.feishu.vo.message.ApprovalsUpdateMessageVo;
|
||||
|
||||
public interface IFeiShuDockingService {
|
||||
|
||||
@@ -51,4 +53,19 @@ public interface IFeiShuDockingService {
|
||||
* @return
|
||||
*/
|
||||
Result<JSONObject> getUserInfoByCode(JSONObject codeObject);
|
||||
|
||||
/**
|
||||
* 使用bot发送审批消息
|
||||
* @return
|
||||
*/
|
||||
String sendApprovalMessageByBot(BotApprovalMessageDto botApprovalMessageDto);
|
||||
|
||||
/**
|
||||
* 更新审批 Bot 消息
|
||||
* 例如,给用户推送了审批待办消息,当用户处理该消息后,可以将之前推送的Bot消息更新为已审批。
|
||||
* 注意:该接口只能更新模板为 1008「收到审批待办」的卡片。
|
||||
* @param approvalsUpdateMessageVo
|
||||
* @return
|
||||
*/
|
||||
void updateBotMessage(ApprovalsUpdateMessageVo approvalsUpdateMessageVo);
|
||||
}
|
||||
|
||||
+117
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.jero.common.api.CommonAPI;
|
||||
import com.jero.common.api.vo.Result;
|
||||
import com.jero.common.constant.CommonConstant;
|
||||
@@ -13,7 +14,10 @@ import com.jero.common.system.vo.DictModel;
|
||||
import com.jero.common.system.vo.SysDictItemCore;
|
||||
import com.jero.common.util.RedisUtil;
|
||||
import com.jero.common.util.oConvertUtils;
|
||||
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
|
||||
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
|
||||
import com.jero.modules.docking.feishu.common.Constant;
|
||||
import com.jero.modules.docking.feishu.dto.BotApprovalMessageDto;
|
||||
import com.jero.modules.docking.feishu.dto.BotMessageDto;
|
||||
import com.jero.modules.docking.feishu.dto.InstanceDto;
|
||||
import com.jero.modules.docking.feishu.service.IFeiShuDockingService;
|
||||
@@ -22,6 +26,7 @@ import com.jero.modules.docking.feishu.vo.definition.*;
|
||||
import com.jero.modules.docking.feishu.vo.instance.ApprovalsInstanceVo;
|
||||
import com.jero.modules.docking.feishu.vo.instance.InstanceLink;
|
||||
import com.jero.modules.docking.feishu.vo.instance.InstanceTask;
|
||||
import com.jero.modules.docking.feishu.vo.message.*;
|
||||
import com.jero.modules.docking.hiwork.entity.LawsUnifiedTodoLog;
|
||||
import com.jero.modules.docking.hiwork.service.LawsUnifiedTodoLogService;
|
||||
import com.jero.modules.system.entity.*;
|
||||
@@ -71,6 +76,8 @@ public class FeiShuDockingServiceImpl implements IFeiShuDockingService {
|
||||
@Resource
|
||||
private LawsUnifiedTodoLogService lawsUnifiedTodoLogService;
|
||||
@Resource
|
||||
private ProcessApprovalRecordService processApprovalRecordService;
|
||||
@Resource
|
||||
private CommonAPI commonAPI;
|
||||
@Value("${feishu.app_id}")
|
||||
private String appId;
|
||||
@@ -247,6 +254,37 @@ public class FeiShuDockingServiceImpl implements IFeiShuDockingService {
|
||||
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
|
||||
JSONObject jsonResponse = JSON.parseObject(response.getBody());
|
||||
logMessage(JSON.toJSONString(instanceDto), instanceDto.getTitle(), jsonResponse, "/feishu/synchronizeApprovalInstance", Constant.FEISHU_PENDING);
|
||||
// 使用审批机器人推送消息
|
||||
String taskStatus = instanceDto.getTaskStatus();
|
||||
String taskIds = instanceDto.getTaskIds();
|
||||
LambdaQueryWrapper<ProcessApprovalRecord> lambdaQueryWrapper = new LambdaQueryWrapper();
|
||||
lambdaQueryWrapper.eq(ProcessApprovalRecord::getTaskId,taskIds);
|
||||
ProcessApprovalRecord processApprovalRecord = processApprovalRecordService.getOne(lambdaQueryWrapper, false);
|
||||
String feishuMsgId = processApprovalRecord.getFeishuMsgId();
|
||||
if (StringUtils.isBlank(feishuMsgId)) {
|
||||
// 如果该条审核记录没有飞书消息id,证明是同步待办
|
||||
BotApprovalMessageDto botApprovalMessageDto = new BotApprovalMessageDto();
|
||||
botApprovalMessageDto.setTemplateId("1008");
|
||||
botApprovalMessageDto.setApprovalName(instanceDto.getTitle());
|
||||
botApprovalMessageDto.setReceivedUserId(approvalsInstanceVo.getTask_list().get(0).getUser_id());
|
||||
botApprovalMessageDto.setApplicantUserId(approvalsInstanceVo.getUser_id());
|
||||
botApprovalMessageDto.setTitleUserId(approvalsInstanceVo.getUser_id());
|
||||
botApprovalMessageDto.setContent1(instanceDto.getTitle());
|
||||
botApprovalMessageDto.setPcUrl(approvalsInstanceVo.getTask_list().get(0).getLinks().getPc_link());
|
||||
botApprovalMessageDto.setMobileUrl(approvalsInstanceVo.getTask_list().get(0).getLinks().getMobile_link());
|
||||
String msgId = sendApprovalMessageByBot(botApprovalMessageDto);
|
||||
// 将msgId存入审核记录表
|
||||
LambdaUpdateWrapper<ProcessApprovalRecord> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
|
||||
lambdaUpdateWrapper.eq(ProcessApprovalRecord::getTaskId,instanceDto.getTaskIds());
|
||||
lambdaUpdateWrapper.set(ProcessApprovalRecord::getFeishuMsgId,msgId);
|
||||
processApprovalRecordService.update(lambdaUpdateWrapper);
|
||||
}else {
|
||||
// 如果该条审核记录有飞书id ,说明是同步已办
|
||||
ApprovalsUpdateMessageVo approvalsUpdateMessageVo = new ApprovalsUpdateMessageVo();
|
||||
approvalsUpdateMessageVo.setMessage_id(feishuMsgId);
|
||||
approvalsUpdateMessageVo.setStatus(taskStatus);
|
||||
updateBotMessage(approvalsUpdateMessageVo);
|
||||
}
|
||||
}catch (Exception e) {
|
||||
logError(JSON.toJSONString(instanceDto), instanceDto.getTitle(), e.getMessage(), "/feishu/synchronizeApprovalInstance", Constant.FEISHU_PENDING);
|
||||
log.error("同步三方审批实例异常" + e.getMessage());
|
||||
@@ -652,4 +690,83 @@ public class FeiShuDockingServiceImpl implements IFeiShuDockingService {
|
||||
}
|
||||
return textValue.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sendApprovalMessageByBot(BotApprovalMessageDto botApprovalMessageDto) {
|
||||
String url = env.getProperty("feishu.bot_send_approval_message");
|
||||
assert url != null;
|
||||
// 获取token
|
||||
String accessToken = getAccessToken();
|
||||
// 构建对象
|
||||
ApprovalsSendMessageVo approvalsSendMessageVo = buildApprovalsMessageVo(botApprovalMessageDto);
|
||||
// 设置请求头
|
||||
HttpHeaders headers = createHeaders(accessToken);
|
||||
// 创建 HttpEntity
|
||||
HttpEntity<ApprovalsSendMessageVo> entity = new HttpEntity<>(approvalsSendMessageVo, headers);
|
||||
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
|
||||
// 处理响应
|
||||
JSONObject jsonResponse = JSON.parseObject(response.getBody());
|
||||
if ("0".equals((String.valueOf(jsonResponse.get("code"))))) {
|
||||
JSONObject data = (JSONObject) jsonResponse.get("data");
|
||||
return data.getString("message_id");
|
||||
} else {
|
||||
log.error(jsonResponse.get("msg").toString());
|
||||
throw new JeroBootException("Bot发送审批消息失败");
|
||||
}
|
||||
}
|
||||
|
||||
private static ApprovalsSendMessageVo buildApprovalsMessageVo(BotApprovalMessageDto botApprovalMessageDto) {
|
||||
ApprovalsSendMessageVo approvalsSendMessageVo = new ApprovalsSendMessageVo();
|
||||
approvalsSendMessageVo.setTemplate_id(botApprovalMessageDto.getTemplateId());
|
||||
approvalsSendMessageVo.setUser_id(botApprovalMessageDto.getReceivedUserId()); // 接收Bot提醒的user_id
|
||||
approvalsSendMessageVo.setUuid(UUID.randomUUID().toString().replace("-",""));
|
||||
approvalsSendMessageVo.setApproval_name("@i18n@1");
|
||||
approvalsSendMessageVo.setTitle_user_id(botApprovalMessageDto.getApplicantUserId()); // 标题中xx人的user_id
|
||||
approvalsSendMessageVo.setTitle_user_id_type("user_id");
|
||||
// 卡片内容
|
||||
MessageContent messageContent = new MessageContent();
|
||||
messageContent.setUser_id(botApprovalMessageDto.getApplicantUserId()); //申请人的user_id
|
||||
messageContent.setUser_id_type("user_id");
|
||||
// 审批事由
|
||||
List<MessageSummary> messageSummaries = new ArrayList<>();
|
||||
messageSummaries.add(new MessageSummary("@i18n@2"));
|
||||
// messageSummaries.add(new MessageSummary("@i18n@3"));
|
||||
messageContent.setSummaries(messageSummaries);
|
||||
approvalsSendMessageVo.setContent(messageContent);
|
||||
// approvalsSendMessageVo.setNote("@i18n@4");
|
||||
// 行动区
|
||||
List<MessageAction> actions = new ArrayList<>();
|
||||
actions.add(new MessageAction("DETAIL",botApprovalMessageDto.getPcUrl(),botApprovalMessageDto.getMobileUrl(),
|
||||
botApprovalMessageDto.getMobileUrl(),botApprovalMessageDto.getPcUrl()));
|
||||
approvalsSendMessageVo.setActions(actions);
|
||||
// 国际化文案
|
||||
MessageI18nResources messageI18nResources = new MessageI18nResources();
|
||||
messageI18nResources.setLocale("zh-CN");
|
||||
messageI18nResources.setIs_default(true);
|
||||
HashMap<String, String> map = new HashMap<>();
|
||||
map.put("@i18n@1", botApprovalMessageDto.getApprovalName());
|
||||
map.put("@i18n@2", botApprovalMessageDto.getContent1());
|
||||
// map.put("@i18n@3", "当前节点:" + botApprovalMessageDto.getContent2());
|
||||
// map.put("@i18n@4", "来自oa");
|
||||
messageI18nResources.setTexts(map);
|
||||
List<MessageI18nResources> i18n_resources = new ArrayList<>();
|
||||
i18n_resources.add(messageI18nResources);
|
||||
approvalsSendMessageVo.setI18n_resources(i18n_resources);
|
||||
return approvalsSendMessageVo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBotMessage(ApprovalsUpdateMessageVo approvalsUpdateMessageVo) {
|
||||
String url = env.getProperty("feishu.update_send_approval_message");
|
||||
assert url != null;
|
||||
// 获取token
|
||||
String accessToken = getAccessToken();
|
||||
// 设置请求头
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Authorization", "Bearer " + accessToken);
|
||||
headers.set("Content-Type", "application/json");
|
||||
// 创建 HttpEntity
|
||||
HttpEntity<ApprovalsUpdateMessageVo> entity = new HttpEntity<>(approvalsUpdateMessageVo, headers);
|
||||
restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
|
||||
}
|
||||
}
|
||||
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
package com.jero.modules.docking.feishu.vo.message;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class ApprovalsSendMessageVo {
|
||||
|
||||
/**
|
||||
* 模板 id,标识使用哪个卡片模板,
|
||||
* 枚举值参见本文档末尾的模板编号
|
||||
*/
|
||||
@ApiModelProperty("模板 id")
|
||||
private String template_id;
|
||||
|
||||
/**
|
||||
* 接受bot提醒用户的user_id,user_id和open_id至少传一个
|
||||
*/
|
||||
@ApiModelProperty("接受bot提醒用户的user_id")
|
||||
private String user_id;
|
||||
|
||||
/**
|
||||
* 某个应用下用户的唯一标识
|
||||
*/
|
||||
@ApiModelProperty("某个应用下用户的唯一标识")
|
||||
private String open_id;
|
||||
|
||||
/**
|
||||
* 幂等 id,最大长度为 64。]
|
||||
* 你可以传入唯一的 UUID 以保证卡片只发送一次。
|
||||
* 如果 UUID 相同,则卡片 1 小时内只会发送一次
|
||||
*/
|
||||
@ApiModelProperty("幂等 id")
|
||||
private String uuid;
|
||||
|
||||
/**
|
||||
* 卡片标题中的{审批定义名称}, i18n key
|
||||
*/
|
||||
@ApiModelProperty("卡片标题中的{审批定义名称}")
|
||||
private String approval_name;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@ApiModelProperty("标题")
|
||||
private String custom_title;
|
||||
|
||||
/**
|
||||
* 卡片内容区域,支持消息卡片-markdown,i18n key
|
||||
*/
|
||||
@ApiModelProperty("卡片内容区域")
|
||||
private String custom_content ;
|
||||
|
||||
/**
|
||||
* 卡片标题中的{申请人}、{审批人}、{评论人}、{抄送人}等,user id
|
||||
*/
|
||||
@ApiModelProperty("卡片标题中的{申请人}、{审批人}、{评论人}、{抄送人}等,user id")
|
||||
private String title_user_id;
|
||||
|
||||
/**
|
||||
* 可选"open_id"或者"user_id",
|
||||
* 值为"open_id"则title_user_id传open_id(ou_xxxx),
|
||||
* 不传或者值为"user_id"则title_user_id传employee id
|
||||
*/
|
||||
@ApiModelProperty("可选open_id或者user_id")
|
||||
private String title_user_id_type;
|
||||
|
||||
/**
|
||||
* 评论区内容,支持消息卡片-markdown,i18n key
|
||||
*/
|
||||
@ApiModelProperty("评论区内容")
|
||||
private String comment;
|
||||
|
||||
/**
|
||||
* 卡片内容
|
||||
*/
|
||||
@ApiModelProperty("卡片内容")
|
||||
private MessageContent content;
|
||||
|
||||
/**
|
||||
* 备注区,内容为审批来源,是否需要从内网访问
|
||||
*/
|
||||
@ApiModelProperty("备注区")
|
||||
private String note;
|
||||
|
||||
/**
|
||||
* 发送人的employee id,用于发送IM卡片
|
||||
*/
|
||||
@ApiModelProperty("发送人的employee id")
|
||||
private String sender_user_id;
|
||||
|
||||
/**
|
||||
* 转发留言,用于发送IM卡片发送一条留言
|
||||
*/
|
||||
@ApiModelProperty("转发留言")
|
||||
private String text;
|
||||
|
||||
/**
|
||||
* 行动区,最多2个,第一个为查看详情,必传,
|
||||
* 第二个可自定义,可选传
|
||||
*/
|
||||
@ApiModelProperty("行动区")
|
||||
private List<MessageAction> actions;
|
||||
|
||||
/**
|
||||
* 快捷审批
|
||||
* 橘黄色的卡片支持快捷审批
|
||||
* 其他卡片的不支持
|
||||
*/
|
||||
@ApiModelProperty("快捷审批")
|
||||
private MessageActionCallback action_callback;
|
||||
|
||||
/**
|
||||
* 快捷审批操作配置
|
||||
*/
|
||||
@ApiModelProperty("快捷审批操作配置")
|
||||
private List<MessageActionConfigs> action_configs;
|
||||
|
||||
/**
|
||||
* 国际化文案
|
||||
*/
|
||||
@ApiModelProperty("国际化文案")
|
||||
private List<MessageI18nResources> i18n_resources;
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
package com.jero.modules.docking.feishu.vo.message;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class ApprovalsUpdateMessageVo {
|
||||
|
||||
/**
|
||||
* 卡片 id,发送卡片时会拿到
|
||||
*/
|
||||
@ApiModelProperty("卡片 id,发送卡片时会拿到")
|
||||
private String message_id;
|
||||
|
||||
/**
|
||||
* 状态类型,用于更新第一个action文字内容,枚举:
|
||||
* APPROVED:已同意
|
||||
* REJECTED:已拒绝
|
||||
* CANCELLED:已撤回
|
||||
* FORWARDED:已转交
|
||||
* ROLLBACK:已回退
|
||||
* ADD:已加签
|
||||
* DELETED:已删除
|
||||
* PROCESSED:已处理
|
||||
* CUSTOM:自定义按钮状态
|
||||
*/
|
||||
@ApiModelProperty("用于更新第一个action文字内容")
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* status=CUSTOM时可以自定义审批同意/拒绝后title状态
|
||||
*/
|
||||
@ApiModelProperty("status=CUSTOM时可以自定义审批同意/拒绝后title状态")
|
||||
private String status_name;
|
||||
|
||||
/**
|
||||
* status=CUSTOM时可以自定义审批同意/拒绝后“查看详情按钮名称
|
||||
*/
|
||||
@ApiModelProperty("status=CUSTOM时可以自定义审批同意/拒绝后“查看详情按钮名称")
|
||||
private String detail_action_name;
|
||||
|
||||
/**
|
||||
* 国际化文案
|
||||
*/
|
||||
@ApiModelProperty("国际化文案")
|
||||
private List<MessageI18nResources> i18n_resources;
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
package com.jero.modules.docking.feishu.vo.message;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 行动区
|
||||
*/
|
||||
@Data
|
||||
public class MessageAction {
|
||||
|
||||
public MessageAction() {
|
||||
}
|
||||
|
||||
public MessageAction(String action_name, String url, String android_url, String ios_url, String pc_url) {
|
||||
this.action_name = action_name;
|
||||
this.url = url;
|
||||
this.android_url = android_url;
|
||||
this.ios_url = ios_url;
|
||||
this.pc_url = pc_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作类型,第一个action的action_name必须为DETAIL,
|
||||
* 自定义action的action_name为i18n key
|
||||
*/
|
||||
@ApiModelProperty("操作类型")
|
||||
private String action_name;
|
||||
|
||||
/**
|
||||
* 默认链接,不同的端配置不同的操作跳转 url,
|
||||
* 链接必须包含schema才能生效。例如:https、http
|
||||
*/
|
||||
@ApiModelProperty("默认链接")
|
||||
private String url;
|
||||
|
||||
/**
|
||||
* Android链接
|
||||
*/
|
||||
@ApiModelProperty("Android链接")
|
||||
private String android_url;
|
||||
|
||||
/**
|
||||
* iOS链接
|
||||
*/
|
||||
@ApiModelProperty("iOS链接")
|
||||
private String ios_url;
|
||||
|
||||
/**
|
||||
* PC链接
|
||||
*/
|
||||
@ApiModelProperty("PC链接")
|
||||
private String pc_url;
|
||||
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
package com.jero.modules.docking.feishu.vo.message;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 快捷审批
|
||||
* 橘黄色的卡片支持快捷审批
|
||||
* 其他卡片的不支持
|
||||
*/
|
||||
@Data
|
||||
public class MessageActionCallback {
|
||||
|
||||
/**
|
||||
* 三方系统的操作回调 url,
|
||||
* 【待审批】列表的任务审批人点同意或拒绝操作后,
|
||||
* 审批中心调用该地址通知三方系统。回调失败时(http code != 200),
|
||||
* 尝试从response body中获取 message 字段并展示给用户。
|
||||
*/
|
||||
@ApiModelProperty("三方系统的操作回调 ur")
|
||||
private String action_callback_url;
|
||||
|
||||
/**
|
||||
* 回调时带的 token,
|
||||
* 用于业务系统验证请求来自审批
|
||||
*/
|
||||
@ApiModelProperty("回调时带的 token")
|
||||
private String action_callback_token;
|
||||
|
||||
/**
|
||||
* 请求参数加密密钥
|
||||
*/
|
||||
@ApiModelProperty("请求参数加密密钥")
|
||||
private String action_callback_key;
|
||||
|
||||
/**
|
||||
* 操作上下文,回调的时候会把该参数回传
|
||||
*/
|
||||
@ApiModelProperty("操作上下文")
|
||||
private String action_context;
|
||||
}
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
package com.jero.modules.docking.feishu.vo.message;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 快捷审批操作配置 ,
|
||||
* 橘黄色的卡片支持快捷审批,其他卡片的不支持
|
||||
*/
|
||||
@Data
|
||||
public class MessageActionConfigs {
|
||||
|
||||
/**
|
||||
* 操作类型:
|
||||
* APPROVE - 同意
|
||||
* REJECT - 拒绝
|
||||
* KEY - 任意英文字符串,如果使用任意字符串,则需要提供 action_name
|
||||
*/
|
||||
@ApiModelProperty("操作类型")
|
||||
private String action_type;
|
||||
|
||||
/**
|
||||
* 操作名称,i18n key 用于前台展示,
|
||||
* 如果 action_type 不是 APPROVE和REJECT,
|
||||
* 则必须提供该字段,i18n key,
|
||||
* 文案内容在 i18n_resource 提供
|
||||
*/
|
||||
@ApiModelProperty("操作名称")
|
||||
private String action_name;
|
||||
|
||||
/**
|
||||
* 是否需要意见,
|
||||
* 如果是,则用户点操作后会跳转到意见填写页面
|
||||
*/
|
||||
@ApiModelProperty("是否需要意见")
|
||||
private boolean is_need_reason;
|
||||
|
||||
/**
|
||||
* 意见是否必填
|
||||
*/
|
||||
@ApiModelProperty("意见是否必填")
|
||||
private boolean is_reason_required;
|
||||
|
||||
/**
|
||||
* 意见支持附件
|
||||
*/
|
||||
@ApiModelProperty("意见支持附件")
|
||||
private boolean is_need_attachment;
|
||||
|
||||
/**
|
||||
* 如果回调成功后,卡片的更新成什么状态。
|
||||
* 如果指定,则飞书审批会在用户操作后,把卡片状态更新成 {next_status},
|
||||
* 如果不指定,则飞书侧不主动更新卡片,由业务自己更新卡片
|
||||
*/
|
||||
@ApiModelProperty("如果回调成功后,卡片的更新成什么状态")
|
||||
private String next_status;
|
||||
|
||||
public MessageActionConfigs(String action_type, String action_name, boolean is_need_reason, boolean is_reason_required, boolean is_need_attachment, String next_status) {
|
||||
this.action_type = action_type;
|
||||
this.action_name = action_name;
|
||||
this.is_need_reason = is_need_reason;
|
||||
this.is_reason_required = is_reason_required;
|
||||
this.is_need_attachment = is_need_attachment;
|
||||
this.next_status = next_status;
|
||||
}
|
||||
|
||||
public MessageActionConfigs() {
|
||||
}
|
||||
|
||||
public String getAction_type() {
|
||||
return action_type;
|
||||
}
|
||||
|
||||
public void setAction_type(String action_type) {
|
||||
this.action_type = action_type;
|
||||
}
|
||||
|
||||
public String getAction_name() {
|
||||
return action_name;
|
||||
}
|
||||
|
||||
public void setAction_name(String action_name) {
|
||||
this.action_name = action_name;
|
||||
}
|
||||
|
||||
public boolean isIs_need_reason() {
|
||||
return is_need_reason;
|
||||
}
|
||||
|
||||
public void setIs_need_reason(boolean is_need_reason) {
|
||||
this.is_need_reason = is_need_reason;
|
||||
}
|
||||
|
||||
public boolean isIs_reason_required() {
|
||||
return is_reason_required;
|
||||
}
|
||||
|
||||
public void setIs_reason_required(boolean is_reason_required) {
|
||||
this.is_reason_required = is_reason_required;
|
||||
}
|
||||
|
||||
public boolean isIs_need_attachment() {
|
||||
return is_need_attachment;
|
||||
}
|
||||
|
||||
public void setIs_need_attachment(boolean is_need_attachment) {
|
||||
this.is_need_attachment = is_need_attachment;
|
||||
}
|
||||
|
||||
public String getNext_status() {
|
||||
return next_status;
|
||||
}
|
||||
|
||||
public void setNext_status(String next_status) {
|
||||
this.next_status = next_status;
|
||||
}
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
package com.jero.modules.docking.feishu.vo.message;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 卡片内容
|
||||
*/
|
||||
@Data
|
||||
public class MessageContent {
|
||||
|
||||
|
||||
/**
|
||||
* 申请人 user id
|
||||
* user_id为空时,申请人不显示
|
||||
*/
|
||||
@ApiModelProperty("申请人 user id")
|
||||
private String user_id;
|
||||
|
||||
/**
|
||||
* 申请人user id类型。
|
||||
*/
|
||||
@ApiModelProperty("申请人user id类型")
|
||||
private String user_id_type;
|
||||
|
||||
/**
|
||||
* 申请人部门 department_id
|
||||
* 如果传入user_id,则department_id要必填,
|
||||
* 该字段不支持传open_department_id
|
||||
*/
|
||||
@ApiModelProperty("申请人部门 department_id")
|
||||
private String department_id;
|
||||
|
||||
/**
|
||||
* 申请人名,如果传了 user_id 则优先使用 user_id
|
||||
* 用于申请人不是真实用户的场景
|
||||
*/
|
||||
@ApiModelProperty("申请人名")
|
||||
private String user_name;
|
||||
|
||||
/**
|
||||
* 申请人部门名,
|
||||
* 如果传了 department_id,则优先使用 department_id
|
||||
*/
|
||||
@ApiModelProperty("申请人部门名")
|
||||
private String department_name;
|
||||
|
||||
/**
|
||||
* 审批事由,最多5个
|
||||
*/
|
||||
@ApiModelProperty("审批事由")
|
||||
private List<MessageSummary> summaries;
|
||||
|
||||
}
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
package com.jero.modules.docking.feishu.vo.message;
|
||||
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* 国际化文案
|
||||
*/
|
||||
@Data
|
||||
public class MessageI18nResources {
|
||||
|
||||
/**
|
||||
* 语言可选值有: zh-CN:中文 en-US:英文 ja-JP:日文
|
||||
* 示例值:"zh-CN"
|
||||
* zh-CN:中文
|
||||
* en-US:英文
|
||||
* ja-JP:日文
|
||||
*/
|
||||
@ApiModelProperty("语言可选值有: zh-CN:中文 en-US:英文 ja-JP:日文")
|
||||
private String locale;
|
||||
|
||||
/**
|
||||
* 是否默认语言,默认语言需要包含所有key,非默认语言如果key不存在会使用默认语言代替
|
||||
*/
|
||||
@ApiModelProperty("是否默认语言,默认语言需要包含所有key,非默认语言如果key不存在会使用默认语言代替")
|
||||
@JSONField(name = "is_default")
|
||||
private boolean is_default;
|
||||
|
||||
/**
|
||||
* 示例值: "{ @i18n@1: 权限申请 }"
|
||||
*/
|
||||
@ApiModelProperty("{ @i18n@1: 权限申请 }")
|
||||
private HashMap texts;
|
||||
|
||||
public String getLocale() {
|
||||
return locale;
|
||||
}
|
||||
|
||||
public void setLocale(String locale) {
|
||||
this.locale = locale;
|
||||
}
|
||||
|
||||
public boolean isIs_default() {
|
||||
return is_default;
|
||||
}
|
||||
|
||||
public void setIs_default(boolean is_default) {
|
||||
this.is_default = is_default;
|
||||
}
|
||||
|
||||
public HashMap getTexts() {
|
||||
return texts;
|
||||
}
|
||||
|
||||
public void setTexts(HashMap texts) {
|
||||
this.texts = texts;
|
||||
}
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package com.jero.modules.docking.feishu.vo.message;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 审批事由
|
||||
*/
|
||||
@Data
|
||||
public class MessageSummary {
|
||||
|
||||
public MessageSummary() {
|
||||
}
|
||||
|
||||
public MessageSummary(String summary) {
|
||||
this.summary = summary;
|
||||
}
|
||||
|
||||
/**
|
||||
* 审批事由,支持在i18中设置
|
||||
*/
|
||||
@ApiModelProperty("审批事由")
|
||||
private String summary;
|
||||
}
|
||||
@@ -221,4 +221,11 @@ public class ProcessApprovalRecord {
|
||||
@TableField(value = "transfer_task_id")
|
||||
@ApiModelProperty(value = "转办任务id")
|
||||
private String transferTaskId;
|
||||
|
||||
/**
|
||||
* 飞书消息的id
|
||||
*/
|
||||
@TableField(value = "feishu_msg_id")
|
||||
@ApiModelProperty(value = "飞书消息的id")
|
||||
private String feishuMsgId;
|
||||
}
|
||||
|
||||
@@ -585,6 +585,10 @@ feishu:
|
||||
bot_send_message: ${feishu.base_url}/im/v1/messages
|
||||
# 飞书根据预登录code获取用户信息
|
||||
get_userinfo_by_code: ${feishu.base_url}/authen/v1/access_token
|
||||
# 飞书发送审批 Bot消息
|
||||
bot_send_approval_message: ${feishu.base_url}/approval/v1/message/send
|
||||
# 飞书更新审批 Bot消息
|
||||
update_send_approval_message: ${feishu.base_url}/approval/v1/message/update
|
||||
# 飞书单点登录地址
|
||||
sign_login_in: ${feishu.base_url}/authen/v1/index?redirect_uri={REDIRECT_URI}&app_id=${feishu.app_id}&state=feishu
|
||||
# 飞书PC端待办地址
|
||||
|
||||
Reference in New Issue
Block a user