add:飞书同步待办推送审核消息

This commit is contained in:
sunzheng
2024-08-02 13:43:36 +08:00
parent 1ef7f7e09c
commit c8e35a7c19
15 changed files with 752 additions and 2 deletions
@@ -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;
}
}
@@ -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);
}
}
@@ -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;
}
@@ -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);
}
@@ -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);
}
}
@@ -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_iduser_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;
/**
* 卡片内容区域,支持消息卡片-markdowni18n 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;
/**
* 评论区内容,支持消息卡片-markdowni18n 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;
}
@@ -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;
}
@@ -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;
}
@@ -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;
}
@@ -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;
}
}
@@ -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;
}
@@ -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;
}
}
@@ -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端待办地址