From c8e35a7c19df3412d3e68c320761e1d03000011d Mon Sep 17 00:00:00 2001 From: sunzheng Date: Fri, 2 Aug 2024 13:43:36 +0800 Subject: [PATCH] =?UTF-8?q?add:=E9=A3=9E=E4=B9=A6=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=E6=8E=A8=E9=80=81=E5=AE=A1=E6=A0=B8=E6=B6=88?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jero/config/RestTemplateConfig.java | 4 +- .../controller/FeiShuDockingController.java | 20 +++ .../feishu/dto/BotApprovalMessageDto.java | 56 ++++++++ .../feishu/service/IFeiShuDockingService.java | 17 +++ .../impl/FeiShuDockingServiceImpl.java | 117 ++++++++++++++++ .../vo/message/ApprovalsSendMessageVo.java | 126 ++++++++++++++++++ .../vo/message/ApprovalsUpdateMessageVo.java | 49 +++++++ .../feishu/vo/message/MessageAction.java | 55 ++++++++ .../vo/message/MessageActionCallback.java | 41 ++++++ .../vo/message/MessageActionConfigs.java | 117 ++++++++++++++++ .../feishu/vo/message/MessageContent.java | 56 ++++++++ .../vo/message/MessageI18nResources.java | 61 +++++++++ .../feishu/vo/message/MessageSummary.java | 24 ++++ .../entity/ProcessApprovalRecord.java | 7 + .../src/main/resources/application-dev.yml | 4 + 15 files changed, 752 insertions(+), 2 deletions(-) create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/dto/BotApprovalMessageDto.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/ApprovalsSendMessageVo.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/ApprovalsUpdateMessageVo.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageAction.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageActionCallback.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageActionConfigs.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageContent.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageI18nResources.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageSummary.java diff --git a/laws-base/laws-base-core/src/main/java/com/jero/config/RestTemplateConfig.java b/laws-base/laws-base-core/src/main/java/com/jero/config/RestTemplateConfig.java index 732af54e..e9ba3aa0 100644 --- a/laws-base/laws-base-core/src/main/java/com/jero/config/RestTemplateConfig.java +++ b/laws-base/laws-base-core/src/main/java/com/jero/config/RestTemplateConfig.java @@ -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; } } diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/controller/FeiShuDockingController.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/controller/FeiShuDockingController.java index 51a76fa4..d562f17a 100644 --- a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/controller/FeiShuDockingController.java +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/controller/FeiShuDockingController.java @@ -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 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); + } } diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/dto/BotApprovalMessageDto.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/dto/BotApprovalMessageDto.java new file mode 100644 index 00000000..e0769391 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/dto/BotApprovalMessageDto.java @@ -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; + + +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/service/IFeiShuDockingService.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/service/IFeiShuDockingService.java index c36ad299..b74e9d74 100644 --- a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/service/IFeiShuDockingService.java +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/service/IFeiShuDockingService.java @@ -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 getUserInfoByCode(JSONObject codeObject); + + /** + * 使用bot发送审批消息 + * @return + */ + String sendApprovalMessageByBot(BotApprovalMessageDto botApprovalMessageDto); + + /** + * 更新审批 Bot 消息 + * 例如,给用户推送了审批待办消息,当用户处理该消息后,可以将之前推送的Bot消息更新为已审批。 + * 注意:该接口只能更新模板为 1008「收到审批待办」的卡片。 + * @param approvalsUpdateMessageVo + * @return + */ + void updateBotMessage(ApprovalsUpdateMessageVo approvalsUpdateMessageVo); } diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/service/impl/FeiShuDockingServiceImpl.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/service/impl/FeiShuDockingServiceImpl.java index 46a28f9a..a8f76e99 100644 --- a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/service/impl/FeiShuDockingServiceImpl.java +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/service/impl/FeiShuDockingServiceImpl.java @@ -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 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 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 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 entity = new HttpEntity<>(approvalsSendMessageVo, headers); + ResponseEntity 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 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 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 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 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 entity = new HttpEntity<>(approvalsUpdateMessageVo, headers); + restTemplate.exchange(url, HttpMethod.POST, entity, String.class); + } } diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/ApprovalsSendMessageVo.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/ApprovalsSendMessageVo.java new file mode 100644 index 00000000..b150897c --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/ApprovalsSendMessageVo.java @@ -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 actions; + + /** + * 快捷审批 + * 橘黄色的卡片支持快捷审批 + * 其他卡片的不支持 + */ + @ApiModelProperty("快捷审批") + private MessageActionCallback action_callback; + + /** + * 快捷审批操作配置 + */ + @ApiModelProperty("快捷审批操作配置") + private List action_configs; + + /** + * 国际化文案 + */ + @ApiModelProperty("国际化文案") + private List i18n_resources; +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/ApprovalsUpdateMessageVo.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/ApprovalsUpdateMessageVo.java new file mode 100644 index 00000000..c84ee7c7 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/ApprovalsUpdateMessageVo.java @@ -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 i18n_resources; +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageAction.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageAction.java new file mode 100644 index 00000000..f6d14437 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageAction.java @@ -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; + +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageActionCallback.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageActionCallback.java new file mode 100644 index 00000000..931c2ff6 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageActionCallback.java @@ -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; +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageActionConfigs.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageActionConfigs.java new file mode 100644 index 00000000..409321d7 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageActionConfigs.java @@ -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; + } +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageContent.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageContent.java new file mode 100644 index 00000000..8ef79ca5 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageContent.java @@ -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 summaries; + +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageI18nResources.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageI18nResources.java new file mode 100644 index 00000000..a667b475 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageI18nResources.java @@ -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; + } +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageSummary.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageSummary.java new file mode 100644 index 00000000..61066381 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/feishu/vo/message/MessageSummary.java @@ -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; +} diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/entity/ProcessApprovalRecord.java b/laws-modules/src/main/java/com/jero/modules/activiti/entity/ProcessApprovalRecord.java index 5e63ef75..3558f977 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/entity/ProcessApprovalRecord.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/entity/ProcessApprovalRecord.java @@ -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; } diff --git a/laws-single-startup/src/main/resources/application-dev.yml b/laws-single-startup/src/main/resources/application-dev.yml index 6e9c2d8f..c71f4a49 100644 --- a/laws-single-startup/src/main/resources/application-dev.yml +++ b/laws-single-startup/src/main/resources/application-dev.yml @@ -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端待办地址