From eab191d9af9e1f26f14389deb170c594e09e0de3 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Sun, 12 Mar 2023 17:10:14 +0800 Subject: [PATCH 01/37] init base info --- .../com/ruoyi/common/base/LarkRequest.java | 8 +++ .../common/service/LarkOperateAbstract.java | 48 +++++++++++++ .../system/domain/LarkCallbackRequest.java | 11 +++ .../lark/strategy/ApprovalCallback.java | 41 +++++++++++ .../lark/strategy/CallbackAbstract.java | 14 ++++ sql/lark.sql | 69 +++++++++++++++++++ 6 files changed, 191 insertions(+) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/LarkCallbackRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/ApprovalCallback.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/CallbackAbstract.java create mode 100644 sql/lark.sql diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java b/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java new file mode 100644 index 0000000..056e542 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java @@ -0,0 +1,8 @@ +package com.ruoyi.common.base; + +/** + * @author yuxiangyong + * @create 2023-03-12 16:00 + */ +public class LarkRequest { +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java b/ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java new file mode 100644 index 0000000..19cacc0 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java @@ -0,0 +1,48 @@ +package com.ruoyi.common.service; + +import com.ruoyi.common.base.LarkRequest; +import lombok.extern.slf4j.Slf4j; + +/** + * @author yuxiangyong + * @create 2023-03-12 15:58 + */ +@Slf4j +public abstract class LarkOperateAbstract{ + + public void execute(LarkRequest request){ + try { + if (!check(request)){ + return; + } + businessProcessing(request); + endHandle(request); + }catch (Exception e){ + log.error("{} execute error: {}",getName(),e); + } + } + + /** + * 由子类实现自己的校验逻辑,并输出对应的日志 + * 默认校验通过 + */ + protected Boolean check(LarkRequest request){ + return Boolean.TRUE; + } + + /** + * 实际业务处理阶段 + * @param request 请求参数 + */ + protected abstract void businessProcessing(LarkRequest request); + + /** + * 业务处理完成后的附加操作 + */ + protected void endHandle(LarkRequest request){ + + } + + protected abstract String getName(); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/LarkCallbackRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/LarkCallbackRequest.java new file mode 100644 index 0000000..5a11647 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/LarkCallbackRequest.java @@ -0,0 +1,11 @@ +package com.ruoyi.system.domain; + +import com.ruoyi.common.base.LarkRequest; + +/** + * @author yuxiangyong + * @create 2023-03-12 16:00 + */ +public class LarkCallbackRequest extends LarkRequest { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/ApprovalCallback.java b/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/ApprovalCallback.java new file mode 100644 index 0000000..a28a600 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/ApprovalCallback.java @@ -0,0 +1,41 @@ +package com.ruoyi.system.lark.strategy; + +import com.ruoyi.common.base.LarkRequest; +import com.ruoyi.common.service.LarkOperateAbstract; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author yuxiangyong + * @create 2023-03-12 15:58 + */ +@Slf4j +@Component("approvalCallback") +public class ApprovalCallback extends CallbackAbstract { + + @Override + protected Boolean check(LarkRequest request) { + Boolean result = Boolean.FALSE; + + return result; + } + + @Override + protected void businessProcessing(LarkRequest request) { + + } + + @Override + protected void endHandle(LarkRequest request) { + super.endHandle(request); + } + + + + @Override + protected String getName() { + return this.getClass().getSimpleName(); + } + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/CallbackAbstract.java b/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/CallbackAbstract.java new file mode 100644 index 0000000..f3e061e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/CallbackAbstract.java @@ -0,0 +1,14 @@ +package com.ruoyi.system.lark.strategy; + +import com.ruoyi.common.service.LarkOperateAbstract; +import lombok.extern.slf4j.Slf4j; + +/** + * @author yuxiangyong + * @create 2023-03-12 15:58 + */ +@Slf4j +public abstract class CallbackAbstract extends LarkOperateAbstract { + + +} diff --git a/sql/lark.sql b/sql/lark.sql new file mode 100644 index 0000000..3e5b745 --- /dev/null +++ b/sql/lark.sql @@ -0,0 +1,69 @@ +-- 飞书-公司关联表 +CREATE TABLE `lark_company_relation` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `company_id` bigint DEFAULT NULL COMMENT '公司id', + `company_name` varchar(255) DEFAULT NULL COMMENT '公司名称', + `app_id` varchar(255) NOT NULL COMMENT '飞书的appId', + `secret` varchar(255) NOT NULL COMMENT '公司+appId对应的唯一密钥', + `create_by` varchar(255) NOT NULL, + `create_time` datetime NOT NULL, + `update_by` varchar(255) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `flag` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE=InnoDB; +-- AppId-table关联表 +CREATE TABLE `lark_table_relation` +( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `lark_company_relation_id` BIGINT DEFAULT NULL COMMENT '公司与飞书关联表id', + `from_table_id` VARCHAR(255) DEFAULT NULL COMMENT '来源表', + `to_table_id` VARCHAR(255) DEFAULT NULL COMMENT '对应更新表', + `url` BIGINT DEFAULT NULL COMMENT 'url地址', + `create_by` VARCHAR(255) NOT NULL, + `create_time` datetime NOT NULL, + `update_by` VARCHAR(255) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `flag` TINYINT NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', + `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE = INNODB; + +-- 事务操作日志 +CREATE TABLE `event_log` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `table_id` VARCHAR (255) DEFAULT NULL COMMENT '多维表格id', + `record_id` VARCHAR (255) DEFAULT NULL COMMENT '实际行id', + `event_id` VARCHAR (255) DEFAULT NULL COMMENT '实际事务id', + `operate_type` VARCHAR (255) DEFAULT NULL COMMENT '操作类型', + `operate_status` VARCHAR (255) DEFAULT NULL COMMENT '操作编码', + `error_code` VARCHAR (255) DEFAULT NULL COMMENT '错误编码', + `error_message` VARCHAR (255) DEFAULT NULL COMMENT '错误信息', + `create_by` VARCHAR (255) NOT NULL, + `create_time` datetime NOT NULL, + `update_by` VARCHAR (255) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `flag` TINYINT NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', + `remark` VARCHAR (255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE = INNODB; + +-- 事务详情 +CREATE TABLE `event` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `message` text DEFAULT NULL COMMENT '回调信息', + `create_by` VARCHAR (255) NOT NULL, + `create_time` datetime NOT NULL, + `update_by` VARCHAR (255) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `flag` VARCHAR (20) NOT NULL COMMENT '状态标记(pending处理中、success成功、faild失败)', + `remark` VARCHAR (255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE = INNODB; + + + + + From dd4047cbab61765f1d624c786f22ba17ceb720c6 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Sun, 12 Mar 2023 22:03:33 +0800 Subject: [PATCH 02/37] init flybook project module --- pom.xml | 6 + ruoyi-admin/pom.xml | 10 +- .../main/java/com/ruoyi/RuoYiApplication.java | 7 + .../ruoyi/web/controller/EventController.java | 51 ++++++ .../web}/controller/EventControllers.java | 13 +- .../com/ruoyi/common/base/LarkRequest.java | 4 + .../ruoyi/common/constant/RedisConstants.java | 18 ++ .../common/enums/EventOperateStatus.java | 32 ++++ .../ruoyi/common/enums/EventOperateType.java | 32 ++++ .../com/ruoyi/common/enums/FlagStatus.java | 31 ++++ .../common/service/LarkOperateAbstract.java | 22 ++- .../com/ruoyi/common/utils/DecryptUtil.java | 61 +++++++ ruoyi-flyingbook/.gitignore | 33 ---- .../.mvn/wrapper/maven-wrapper.jar | Bin 59925 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 -- ruoyi-flyingbook/pom.xml | 35 ++-- .../LarkHelper/LarkTokenHelper.java | 82 ++++++++++ .../controller/EventController.java | 65 -------- .../java/com/flyingbook/domain/Event.java | 70 ++++++++ .../java/com/flyingbook/domain/EventLog.java | 154 ++++++++++++++++++ .../domain/LarkCompanyRelation.java | 112 +++++++++++++ .../flyingbook/domain/LarkTableRelation.java | 112 +++++++++++++ .../com/flyingbook/mapper/EventLogMapper.java | 63 +++++++ .../com/flyingbook/mapper/EventMapper.java | 63 +++++++ .../mapper/LarkCompanyRelationMapper.java | 63 +++++++ .../mapper/LarkTableRelationMapper.java | 63 +++++++ .../flyingbook/service/IEventLogService.java | 63 +++++++ .../com/flyingbook/service/IEventService.java | 63 +++++++ .../service/ILarkCompanyRelationService.java | 63 +++++++ .../service/ILarkTableRelationService.java | 63 +++++++ .../service/impl/EventLogServiceImpl.java | 97 +++++++++++ .../service/impl/EventServiceImpl.java | 98 +++++++++++ .../impl/LarkCompanyRelationServiceImpl.java | 97 +++++++++++ .../impl/LarkTableRelationServiceImpl.java | 97 +++++++++++ .../flyingbook/strategy/ApprovalCallback.java | 86 ++++++++++ .../strategy/CallbackAbstract.java | 2 +- .../main/resources/mapper/EventLogMapper.xml | 127 +++++++++++++++ .../src/main/resources/mapper/EventMapper.xml | 91 +++++++++++ .../mapper/LarkCompanyRelationMapper.xml | 112 +++++++++++++ .../mapper/LarkTableRelationMapper.xml | 109 +++++++++++++ .../framework/config/SecurityConfig.java | 1 + .../lark/strategy/ApprovalCallback.java | 41 ----- sql/lark.sql | 54 +++--- 43 files changed, 2265 insertions(+), 219 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventController.java rename {ruoyi-flyingbook/src/main/java/com/flyingbook => ruoyi-admin/src/main/java/com/ruoyi/web}/controller/EventControllers.java (95%) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateStatus.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/FlagStatus.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/DecryptUtil.java delete mode 100644 ruoyi-flyingbook/.gitignore delete mode 100644 ruoyi-flyingbook/.mvn/wrapper/maven-wrapper.jar delete mode 100644 ruoyi-flyingbook/.mvn/wrapper/maven-wrapper.properties create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/LarkHelper/LarkTokenHelper.java delete mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventController.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/domain/Event.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/domain/EventLog.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkCompanyRelation.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkTableRelation.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventLogMapper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventMapper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkCompanyRelationMapper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkTableRelationMapper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventLogService.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventService.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkCompanyRelationService.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkTableRelationService.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventLogServiceImpl.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventServiceImpl.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkTableRelationServiceImpl.java create mode 100644 ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/ApprovalCallback.java rename {ruoyi-system/src/main/java/com/ruoyi/system/lark => ruoyi-flyingbook/src/main/java/com/flyingbook}/strategy/CallbackAbstract.java (85%) create mode 100644 ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml create mode 100644 ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml create mode 100644 ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml create mode 100644 ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml delete mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/ApprovalCallback.java diff --git a/pom.xml b/pom.xml index 1d1091d..af91428 100644 --- a/pom.xml +++ b/pom.xml @@ -215,6 +215,11 @@ ruoyi-flowable ${ruoyi.version} + + com.ruoyi + ruoyi-flyingbook + ${ruoyi.version} + org.flowable @@ -274,6 +279,7 @@ ruoyi-generator ruoyi-common ruoyi-flowable + ruoyi-flyingbook pom diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 7574694..2627926 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -78,20 +78,14 @@ ruoyi-flowable - com.larksuite.oapi - oapi-sdk - 2.0.13 + com.ruoyi + ruoyi-flyingbook - - com.larksuite.oapi oapi-sdk 2.0.13 - - - diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java index aaa7b50..2cf8a50 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java @@ -1,8 +1,10 @@ package com.ruoyi; +import com.lark.oapi.sdk.servlet.ext.ServletAdapter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.context.annotation.Bean; /** * 启动程序 @@ -17,4 +19,9 @@ public class RuoYiApplication // System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(RuoYiApplication.class, args); } + + @Bean + public ServletAdapter getServletAdapter() { + return new ServletAdapter(); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventController.java new file mode 100644 index 0000000..c8c04f6 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventController.java @@ -0,0 +1,51 @@ +package com.ruoyi.web.controller; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.utils.DecryptUtil; +import com.sun.org.apache.bcel.internal.generic.IfInstruction; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.lark.oapi.core.utils.Jsons; +import com.lark.oapi.event.EventDispatcher; +import com.lark.oapi.service.contact.v3.ContactService; +import com.lark.oapi.service.contact.v3.model.P2UserCreatedV3; +import com.lark.oapi.service.im.v1.ImService; +import com.lark.oapi.service.im.v1.model.P1MessageReadV1; +import com.lark.oapi.service.im.v1.model.P2MessageReadV1; +import com.lark.oapi.service.im.v1.model.P2MessageReceiveV1; +import com.lark.oapi.sdk.servlet.ext.ServletAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; + + +@Slf4j +@RestController +@RequestMapping("/event/test1") +public class EventController { + + //3. 创建路由处理器 + @PostMapping("/approval") + public String event(@RequestBody JSONObject jsonObject) { + String result = ""; + if (jsonObject == null) { + log.error("没有值"); + return result; + } + if (jsonObject.containsKey("encrypt")) { + result = DecryptUtil.decrypt(jsonObject.getString("encrypt")); + log.info("/event/test1/approval request:{} encrypt:{}", jsonObject.toJSONString(), result); + } + if (jsonObject.containsKey("challenge")) { + result = jsonObject.getString("challenge"); + log.info("/event/test1/approval request:{} challenge:{}", jsonObject.toJSONString(), result); + } + return result; + } +} + diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventControllers.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventControllers.java similarity index 95% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventControllers.java rename to ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventControllers.java index 5fc9b87..4706bb7 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventControllers.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventControllers.java @@ -1,4 +1,8 @@ -package com.flyingbook.controller; +package com.ruoyi.web.controller; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.utils.DecryptUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import com.lark.oapi.core.utils.Jsons; import com.lark.oapi.event.EventDispatcher; @@ -23,8 +27,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.Map; +@Slf4j @RestController +@RequestMapping("/event/test2") public class EventControllers { @@ -167,11 +174,13 @@ public class EventControllers { private ServletAdapter servletAdapter; //3. 创建路由处理器 - @RequestMapping("/webhook/events") + @PostMapping("/approval") public void event(HttpServletRequest request, HttpServletResponse response) throws Throwable { //3.1 回调扩展包提供的事件回调处理器 servletAdapter.handleEvent(request, response, EVENT_DISPATCHER); + Map parameterMap = request.getParameterMap(); + log.info("/event/test2/approval request:{}", JSONObject.toJSONString(parameterMap)); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java b/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java index 056e542..4964483 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java @@ -1,8 +1,12 @@ package com.ruoyi.common.base; +import lombok.Data; + /** * @author yuxiangyong * @create 2023-03-12 16:00 */ +@Data public class LarkRequest { + private Long eventId; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java new file mode 100644 index 0000000..f5d3e58 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.constant; + +/** + * @author yuxiangyong + * @create 2023-03-12 19:30 + */ +public class RedisConstants { + + public static void main(String[] args) { + System.out.println("Multidimensional tabular feedback".replaceAll(" ","").toUpperCase()); + } + + /** + * 多维表格回调时间缓存key + */ + public static final String MULTIDIMENSIONALTABULARFEEDBACK = "MULTIDIMENSIONALTABULARFEEDBACK"; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateStatus.java new file mode 100644 index 0000000..3c2e52d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateStatus.java @@ -0,0 +1,32 @@ +package com.ruoyi.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum EventOperateStatus { + + /** + * + */ + PENDING("PENDING", "未处理"), + SUCCESS("SUCCESS", "成功"), + FAIL("FAIL", "失败"); + + private final String code; + private final String info; + + EventOperateStatus(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateType.java new file mode 100644 index 0000000..97054b3 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateType.java @@ -0,0 +1,32 @@ +package com.ruoyi.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum EventOperateType { + /** + * + */ + CALL_BACK("CALL_BACK", "反馈"), + CREATE("CREATE", "创建"), + UPDATE("UPDATE", "更新"), + DELETE("DELETE", "删除"); + + private final String code; + private final String info; + + EventOperateType(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/FlagStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/FlagStatus.java new file mode 100644 index 0000000..497d43d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/FlagStatus.java @@ -0,0 +1,31 @@ +package com.ruoyi.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum FlagStatus { + + /** + * + */ + OK(0L, "正常"), + DELETED(1L, "删除"); + + private final Long code; + private final String info; + + FlagStatus(Long code, String info) { + this.code = code; + this.info = info; + } + + public Long getCode() { + return code; + } + + public String getInfo() { + return info; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java b/ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java index 19cacc0..c4811dd 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java @@ -10,16 +10,24 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public abstract class LarkOperateAbstract{ - public void execute(LarkRequest request){ + public String execute(LarkRequest request){ try { + //参数校验逻辑 if (!check(request)){ - return; + //构建返回对象 + return buildResult(request); } + //对入参进行预处理,例如解密 + preOperate(request); + //真正的业务处理逻辑 businessProcessing(request); + //业务处理完成后的系列操作,例如日志 endHandle(request); }catch (Exception e){ log.error("{} execute error: {}",getName(),e); } + //构建返回对象并返回 + return buildResult(request); } /** @@ -30,6 +38,11 @@ public abstract class LarkOperateAbstract{ return Boolean.TRUE; } + /** + * 由子类实现自己的预处理逻辑 + */ + protected abstract void preOperate(LarkRequest request); + /** * 实际业务处理阶段 * @param request 请求参数 @@ -43,6 +56,11 @@ public abstract class LarkOperateAbstract{ } + /** + * 具体的返回内容 + */ + protected abstract String buildResult(LarkRequest request); + protected abstract String getName(); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DecryptUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DecryptUtil.java new file mode 100644 index 0000000..5b90eb6 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DecryptUtil.java @@ -0,0 +1,61 @@ +package com.ruoyi.common.utils; + +import lombok.extern.slf4j.Slf4j; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; + +/** + * @author yuxiangyong + * @create 2023-03-12 20:48 + */ +@Slf4j +public class DecryptUtil { + + public static void main(String[] args) throws Exception { + System.out.println(decrypt("P37w+VZImNgPEO1RBhJ6RtKl7n6zymIbEG1pReEzghk=")); //hello world + } + private static byte[] keyBs; + public DecryptUtil(String key) { + MessageDigest digest = null; + try { + digest = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + // won't happen + } + keyBs = digest.digest(key.getBytes(StandardCharsets.UTF_8)); + } + public static String decrypt(String base64) { + try { + DecryptUtil d = new DecryptUtil("ND2ANZB8F7NplUqcrmKD530lDRFssNWJ"); + byte[] decode = Base64.getDecoder().decode(base64); + Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING"); + byte[] iv = new byte[16]; + System.arraycopy(decode, 0, iv, 0, 16); + byte[] data = new byte[decode.length - 16]; + System.arraycopy(decode, 16, data, 0, data.length); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBs, "AES"), new IvParameterSpec(iv)); + byte[] r = cipher.doFinal(data); + if (r.length > 0) { + int p = r.length - 1; + for (; p >= 0 && r[p] <= 16; p--) { + } + if (p != r.length - 1) { + byte[] rr = new byte[p + 1]; + System.arraycopy(r, 0, rr, 0, p + 1); + r = rr; + } + } + return new String(r, StandardCharsets.UTF_8); + }catch (Exception e){ + log.error("DecryptUtil error",e); + } + return null; + } + +} diff --git a/ruoyi-flyingbook/.gitignore b/ruoyi-flyingbook/.gitignore deleted file mode 100644 index 549e00a..0000000 --- a/ruoyi-flyingbook/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/ruoyi-flyingbook/.mvn/wrapper/maven-wrapper.jar b/ruoyi-flyingbook/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index bf82ff01c6cdae4a1bb754a6e062954d77ac5c11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59925 zcmb5U1CS=sk~ZA7ZQHhc+Mc%Ywrx+_*0gQgw(Xv_ZBOg(y}RG;-uU;sUu;#Jh>EHw zGfrmZsXF;&D$0O@!2kh40RbILm8t;!w*&h7T24$wm|jX=oKf)`hV~7E`UmXw?e4Pt z`>_l#5YYGC|ANU0%S(xiDXTEZiATrw!Spl1gyQYxsqjrZO`%3Yq?k$Dr=tVr?HIeHlsmnE9=ZU6I2QoCjlLn85rrn7M!RO}+ z%|6^Q>sv`K3j6Ux>as6NoB}L8q#ghm_b)r{V+Pf3xj>b^+M8ZFY`k|FHgl zM!^0D!qDCjU~cj+fXM$0v@vuwvHcft?EeYw=4fbdZ{qkb#PI)>7{J=%Ux*@pi~i^9 z{(nu6>i-Y^_7lUudx7B}(hUFa*>e0ZwEROS{eRc_U*VV`F$C=Jtqb-$9MS)~&L3im zV)8%4)^9W3c4IT94|h)3k zdAT_~?$Z0{&MK=M0K)Y#_0R;gEjTs0uy4JHvr6q{RKur)D^%t>W+U;a*TZ;VL{kcnJJT z3mD=m7($$%?Y#>-Edcet`uWDH(@wIl+|_f#5l8odHg_|+)4AAYP9)~B^10nU306iE zaS4Y#5&gTL4eHH6&zd(VGyR0Qccx;>0R~Y5#29OkJpSAyr4&h1CYY|I}o)z ze}OiPf5V~(ABejc1pN%8rJQHwPn_`O*q7Dm)p}3K(mm1({hFmfY{yYbM)&Y`2R=h? zTtYwx?$W-*1LqsUrUY&~BwJjr)rO{qI$a`=(6Uplsti7Su#&_03es*Yp0{U{(nQCr z?5M{cLyHT_XALxWu5fU>DPVo99l3FAB<3mtIS<_+71o0jR1A8rd30@j;B75Z!uH;< z{shmnFK@pl080=?j0O8KnkE;zsuxzZx z4X2?!Dk7}SxCereOJK4-FkOq3i{GD#xtAE(tzLUiN~R2WN*RMuA3uYv-3vr9N8;p- z0ovH_gnvKnB5M{_^d`mUsVPvYv`38c2_qP$*@)N(ZmZosbxiRG=Cbm`0ZOx23Zzgs zLJPF;&V~ZV;Nb8ELEf73;P5ciI7|wZBtDl}on%WwtCh8Lf$Yfq`;Hb1D!-KYz&Kd< z+WE+o-gPb6S%ah2^mF80rK=H*+8mQdyrR+)Ar5krl4S!TAAG+sv8o+Teg)`9b22%4 zI7vnPTq&h=o=Z|$;>tEj(i@KN^8N@nk}}6SBhDIGCE4TrmVvM^PlBVZsbZcmR$P7v3{Pw88(jhhI?28MZ>uB%H z&+HAqu-MDFVk5|LYqUXBMR74n1nJ|qLNe#G7UaE>J{uX(rz6McAWj)Ui2R!4y&B01 z`}LOF7k|z0$I+psk+U^Z3YiAH-{>k*@z|0?L4MPNdtsPB+(F791LsRX$Dm(Gycm1k}n z#a2T#*)k-v{}p@^L5PC^@bH+-YO4v`l7Gq)9pgSns??ISG!M6>7&GySTZkVhykqk* zijh9sE`ky?DQPo+7}Vu@?}15_zTovL$r%h~*)=6*vTz?G#h|~>p(ukh%MKOCV^Jxa zi~lMP5+^-OW%Te@b#UoL6T1%9h-W}*hUtdu!>odxuT`kTg6U3+a@6QTiwM0I zqXcEI2x-gOS74?=&<18fYRv&Ms)R>e;Qz&0N20K9%CM_Iq#3V8%pwU>rAGbaXoGVS z-r5a$;fZ>75!`u@7=vV?y@7J;S;E#lvQ?Ar>%ao zOX)rc794W?X64tUEk>y|m_aCxU#N>o!Xw7##(7dIZDuYn0+9DoafcrK_(IUSl$m`A zZF1;0D&2KMWxq{!JlB#Yo*~RCRR~RBkfBb1)-;J`)fjK%LQgUfj-6(iNb3|)(r4fB z-3-I@OH8NV#Rr1`+c=9-0s3A3&EDUg1gC3 zVVb)^B@WE;ePBj#Rg2m!twC+Fe#io0Tzv)b#xh64;e}usgfxu(SfDvcONCs$<@#J@ zQrOhaWLG+)32UCO&4%us+o5#=hq*l-RUMAc6kp~sY%|01#<|RDV=-c0(~U2iF;^~Z zEGyIGa;#2iBbNLww#a{)mO^_H26>4DzS zW3Ln9#3bY?&5y|}CNM1c33!u1X@E`O+UCM*7`0CQ9bK1=r%PTO%S(Xhn0jV&cY5!; zknWK#W@!pMK$6<7w)+&nQZwlnxpxV_loGvL47cDabBUjf{BtT=5h1f2O&`n<$C%+3 zm$_pHm|BCm`G@w&Db)?4fM_YHa%}k|QMMl^&R}^}qj!z-hSy7npCB+A1jrr|1}lLs zw#c+UwVNwxP{=c;rL2BGdx*7zEe1Bcd{@%1-n8y7D4tiWqfpUVh-lHmLXM^KZShOH z*xFp)8|Y+bM`|>mg}p~MOHeh4Ev0_oE?T1n|HMCuuhyf*JDmFP(@8+hi#f-8(!7>g zH}lOHg#Nw(x(LkB`Q;g)oVAM{fXLqlew~t2GU);6V}=6Hx<4O5T!!-c93s;NqxUDm zofsXe!Q%wAD~BBUQ3dIiCtR4WMh-t>ISH?ZMus*wja+&<^&&Gm-nBlDvNS4vFnsl^ ztNpIbyMcWMPfKMe=YnWeIVj|?e>nZbwm$=sV@Qj@A@PE#Gnjlk{CGPDsqFS_)9LEa zuKx7=Sa>|^MiSKB?)pG()OoM}_%lx|mMlX&!?+`^^4bT=yz=ZoxWH_ngA*jX*IZcHOjb62dT(qTvBPn`2AFuL0q` zG+T@693;<++Z2>R2bD`qi0y2-Zf>Ao)K0f&d2P zfP78gpA6dVzjNaH?(M_mDL)R0U=lEaBZvDI4%DXB?8uw7yMJ~gE#%4F`v`Nr+^}vY zNk!D`{o4;L#H`(&_&69MXgCe`BzoU+!tF?72v9Ywy}vJ>QpqhIh5d@V>0xHtnyvuH zkllrfsI^;%I{@6lUi{~rA_w0mAm940-d++CcVAe<%1_RMLrby@&kK~cJQDXKIiybT z-kqt-K3rNz|3HT@un%{nW0OI{_DTXa-Gt@ONBB`7yPzA#K+GBJn@t@$=}KtxV871R zdlK|BI%we#j)k%=s3KJX%`+e4L~_qWz2@P z#)_IbEn(N_Ea!@g!rjt?kw;wph2ziGM|CPAOSzd(_Cp~tpAPO_7R!r5msJ4J@6?@W zb7r0)y);{W17k3}ls4DaNKdRpv@#b#oh4zlV3U@E2TCET9y3LQs1&)-c6+olCeAYp zOdn^BGxjbJIUL0yuFK_Dqpq%@KGOvu(ZgtKw;O*bxSb1Yp#>D?c~ir9P;<3wS2!-P zMc%jlfyqGiZiTjBA(FcUQ9mq#D-cvB9?$ctRZ;8+0s}_I8~6!fM~(jD=psem4Ee>J zWw&CJ7z{P9{Q7Ubye9)gwd`}~OSe#Rf$+;U1GvliVlhuHCK9yJZ2>_y@94OzD`#Ze z9)jO->@7)Bx~CeDJqQK|0%Pfmg&-w7mHdq3hENhQ;IKK;+>|iFp;c?M^kE!kGY&!y zk0I0Fk*!r6F59pwb<6v2ioT*86d(Tee%E1tmlfVjA#rHqA%a~cH`ct#9wX$-o9erW zXJEEOOJ&dezJO$TrCEB2LVOPr4a1H9%k<&lGZo1LDHNDa_xlUqto!CGM^Y}cxJn@x ziOYwn=mHBj_FAw|vMAK^Oqb(dg4Q?7Umqwc#pL?^vpIVNpINMEiP4Ml+xGo3f$#n$ zSTA3aJ)pM~4OPF>OOXOH&EW^(@T%5hknDw^bLpH%?4DjNr1s9Q9(3+8zy87a{1<&7 zQ@0A|_nnege~*7+LF5%wzLWD`lXWotLU4Y&{0i|(kn5hdwj^9o@)((-j86#TKNN|Got?9j^EYE8XJ}!o>}=@hY~siOur_pZ`mJW+ zg}Q?7Q_~bhh6s%uqEU!cv`B=jEp1K|eld>}I`pHtYzif`aZCe88}u$J6??5!TjY7Z zi_PXV!PdeegMrv48ein(j_-BWXDa73W&U|uQY2%u#HZ5hI@4>q?YPsd?K$Vm;~XD| za8S@laz_>}&|R%BD&V-i4%Q6dPCyvF3vd@kU>rvB!x*5ubENu_D>JSGcAwBe1xXs> z#6>7f9RU7nBW^%VMe9x%V$+)28`I~HD=gM$1Sivq)mNV>xD~CileqbUCO{vWg4Rh# zor2~~5hCEN)_0u$!q<(|hY5H=>Bbu%&{4ZV_rD1<#JLjo7b^d16tZ8WIRSY-f>X{Z zrJFo^lCo+3AagC{EW4g= z#o?8?8vCfRVy)U15jF^~4Gl{&Ybt92qe)hZ^_X>`+9vgWKwyZiaxznCo|TfVh3jIi zcEf?H`U;iFaJh=3Gy2JXApN`o zE=O1Gg$YQt6|76IiMNF?q#SA1bPB@dw#H+-V@9gL>;1mg+Cb#k1ey8`dvR+(4ebj= zUV1Z)tKRo}YEh@TN=$v(;aR{{n8vk`w|nNuHuckt$h27 z8*aBefUxw1*r#xB#9egcpXEi_*UAJYXXk!L7j@ zEHre9TeA?cA^qC?JqR^Tr%MObx)3(nztwV-kCeU-pv~$-T<>1;$_fqD%D@B13@6nJvk$Tb z%oMcxY|wp&wv8pf7?>V>*_$XB&mflZG#J;cO4(H9<>)V(X0~FRrD50GSAr_n^}6UI=}MTD3{q9rAHBj;!)G9GGx;~wMc8S8e@_! z_A@g2tE?_kGw#r}Y07^+v*DjB7v08O#kihqtSjT)2uwHG1UbSIKEAO<7Nt3T;R`YCSSj z!e)qa4Y~g>{F>ed`oWGW>((#s$zQGbsS&sg}^pBd?yeAN05Roe8> zT5^XsnI??pY-edI9fQNz3&cr}&YORzr4;sw1u{|Ne1V}nxSb|%Xa_Xy5#TrcTBpS@ z368Ly!a8oDB$mv21-kqD9t&0#7+@mt50oW4*qGcwbx}EyQ=zv+>?xQUL*ja2`WGq` z)sWi!%{f{lG)P(lu6{68R~smEp!Jy9!#~65DQ1AHIc%r7doy*L!1L>x7gLJdR;hH_ zP$2dAdV+VY*^|&oN=|}3-FdyGooDOM-vAGCT@@JyuF4C(otz>?^9!lR%m-tde}ePe z)Jp)zydtP%C02mCPddGz5R9NYvrS6)Bv$~r@W&cP5lLp7-4NrEQDN3%6AmXH@Tdfj zZ+k^}6%>L=d8BK-pxgvV`ix>w6F;U0C zlZ#lnOYYDhj4r)_+s){%-OP5Z{)Xy~)T{p`w1d-Z`uhiyaHX5R=prRWzg^tr8b$NI z3YKgTUvnV)o{xug^1=F=B;=5i^p6ZQ3ES<#>@?2!i0763S{RDit@XiOrjHyVHS*O` z`z@(K2K8gwhd0$u@upveU3ryuDP~by=Xy(MYd_#3r)*XC z^9+R*>njXE-TIP1lci2Q!U>qTn(dh*x7Zxv8r{aX7H$;tD?d1a-PrZ_=K*c8e050Z zQPw-n`us6g%-5T&A%0G0Pakpyp2}L*esj#H#HB!%;_(n z?@GhGHsn-TmjhdE&(mGUnQ3irA0sJtKpZ!N{aFsHtyTb#dkl=dRF+oo-dwy<#wYi=wik;LC6p#Fm zMTEA@?rBOmn>eCuHR%C{!jx>b|+<6B-)Z%(=lG{@y_@8s2x4Hym6ckPdCB$7NZFp_|El()ANXTORs zO@b$@1`3tXjEm>;bX)%xTUC>T)r6eTFtq*Rp*_?%C+fEzT##kVNH` zV}-lw6&hY;cyl5#RR-w!&K4e)Nf4noLFyjiAbKvP7Y!=2lRiRjc$&d?P~!zM@4!?3-vyqs zhm*63jiRI7cfruv!o=zO%H2cQ#o64%*4YAJ=xp~No53pO?eEA$`fR4x=^|*#{u3bx z1YB3OT97ZU3=ol)l`K!lB?~Dj(p_i0)NN=fdgz(QBu>8xV*FGZUb7m4NEbrA+BJ1O z%CPI+T>JPq9zpg~<>QR+je>?{g)rSuWpyCDcc2@rE8T>oNWPiP*u zLZc3LaQVEsC6emsi7DCL0;U0BP!SwAkXuetI25TYuCwD8~Z|M@2_ z0FaBG|x zW)FZvkPsN^5(Q}whYFk-E8)zC(+hZMRe5VA6GZM!beBdDBqq#Rye$I~h@Kf8ae!Ay z*>8BsT)dYB${E3A^j5m_ks3*1_a^uA+^E{Gxcgw2`f7jw8=^DG391okclzQA zwB6_C;;k_7OnwT<<5RjXf#XxTO9}jrCP+Ina|?UA%gFvNJy7HFEx9r{(c&yDZ9e2aovtJL$um8u>s&1k@G6# z-s55RDvTcFYZji6x+UMyCu{&*d4N<{6;H^PEF!?X@SqMfGFR}LYImL1;U}{iT!qnA zgqLCyvSp>>nS}|sv56Dnwxdo&HrZG1WQL_EkC!D6j)JW4Tv1yyqe&aM- zHXlKm;srQVctoDYl&e}E-P8h#PCQNW{Dg*Te>(zP#h*8faKJ!x-}2Rd)+>ssE`OS? zH{q>EEfl3rrD`3e_VOu!qFXm7TC9*Ni&^{$S76?jtB;*1+&lyEq_j{|Nhg&s;W6R9 zB#r9L#a7UU(Vnq#7asUx%ZyVz{CiVL5!CBl-7p|Kl&=g>)8e?z&u?Q^r>L@P zcB6n=#5Wz+@-j`qSB=wD1p_n<(NhAp8wa!IxDP?M&_ zKNcJonwpOS>a3-OBC9jGV@*WND}F8~E_QS7+H3ZK6w&kq>B}kc123ypkAfx`&en&T z+?U=!q?N5DDkt(2$KU;t^dR}IVC|M)pn@S)m{saxD4V?TZZWh@hK|C|n(P&eXLAq1 zZ#v0gPhHJYiyjEkJT~&%u@zLE`Lm!p!&-VAfk?eF{HN%PeV5S87-u3n;g}^R(OZqI zA|##x9SAAKAb!FSr9+E^(}_HX+lb+XLQiWF2UmH*7tM?y7R{u3(Vr<5h8V>Y-c`SgYgD9RvV*ZP{xBLuk-5sAcGP5G zDdk)Ua8PaYS-R*C(V(}4>%>{X%~yk{l3&El7iOz}m0Y8MAl_Qc`-2(z2T3kJ4L1Ek zW&^0C5lA$XL5oFZ0#iRevGn2ZyiotWRIag?#IT-E$gv92YXfp3P1BJxO zShcix4$;b#UM2o=3x#3;cA8Q#>eO8bAQ6o|-tw;9#7`gGIFVll^%!T5&!M|F|99EZ z?=t(Tag~g}`Wep_VX!|sgf_=8n|trl((YTM-kWDQ1U@WIg!~YjGqsZNOrayhav_lrw< zgSle+;b;p^Ff)tDt~?&TweI#6(}<3?Uw1@|4MvG2w}sQgX*N;Q=eD+(bJ%jKJ9L2o z3%MlC9=i-DKzXOun`;&7ZI$Iw?Y|j!RhIn*O`mRl2_vUnE*Rf6$?{IC&#;ZS4_)ww zZ${m6i^cVHNiw5#0MSjEF!NaQfSr&DbTX&tHM{Ke)6Pt9^4_Jf%G&51@IH0aA7QRc zPHND$ytZTZ7-07AEv8Rn%5+<=Bx1tWJSG_?CqXuJ99Zwp=hP2?0a{F)A8HLWkv z)nWbhcgRVdtQ4DpZiw6*)QeCWDXGN6@7m@}SN?Ai*4{l!jL`wrp_lL`bJF6HVAOnj zNa*fTj+{niV5~*O zN5NwHHcEed1knV2GNSZ~H6A+13`U_yY?Dlr@mtyq*Eutin@fLqITcw+{ zgfCsGo5WmpCuv^;uTtgub$oSUezlUgy1KkqBTfdC=XJ}^QYY+iHNnhYEU)j7Oq^M^ zVSeY5OiE#eElD6|4Haq&dOHw4)&QX=k_Ut{?Uvr21pd&diJ zB2+roNX!_7mJ$9n7GNdG8v{=K#ifQnT&%`l82sR{h&TKf?oxK%8RlG}Ia$WP=oQ3C z8x#$S3Rrheyw7recyTpSGf`^->QMX@9dPE# z?9u`K#Vk!hl`$zv<^Wl(#=J4ewGvm4>kxbr*k(>JDRyr_k#52zWRbBBxSsQfy=+DkvQ40v`jh_1C>g+G@4HuqNae&XeekQeAwk+&jN88l@etjc2U0(3m{pQ8vycb^=k>?R~DSv8<0tRfmLp27RlxR~V8j?ClC z)_B-Ne*s0#m}G~_QwykU<`~vMvpTlr7=W&w=#4eEKq!$muL_QJblmEh6*MUg!$z4fC{DBd*3h=N|lf1X7dTfqL1v6~_al z%J+WD;fSJ>TKV*mid$G+8eIjdfK%pu!#kkan;Qi>LK<0bn$?ecFn-b|@+^+OT=0nl zZzN%OUn9w14s`D45>E^)F8?Z?;l!%DF^oL|Yt!@m^V@3twFD@^D5$*5^c%)sM*sbi zk(RQq-d<^O7T8RfFwEK9_us2+S$&W1-Z3OR+XF6$eJl7IgHM~N8sHzWeuzxpB% zE9h3~^*;?_y)7i>a4#z6(ZQ%RaIo)|BtphTOyY@sM+vd#MYN11?ZV(xUvXb&MFg6g z=p`JrH(5;XsW4xVbiJ?|`nutpC1h*K1p~zS%9GcwUz0UWv0GXKX{69Mbhpcsxie0^ zGqgqzpqFAefIt5 zbjNv;*RSO}%{l!Z)c-Qw`A_=i-}4-?=swGSMI^E7)y37u+#O1^yiI2ehK4F|VMVkK z!hIFgJ+Ixg^6jI3#G8UbMwE1a!y~wFx@T(|6G*f($Q=e5na9eDt?f6v;SI;w0g-j% z!J#+aN|M&6l+$5a()!Cs22!+qIEIPkl)zxaaqx#rxQ_>N-kau^^0U$_bj`Aj28>km zI4^hUZb4$c;z)GTY)9y!5eJ{HNqSO{kJDcTYt-+y5;5RiVE9 z-rfg@X78JdxPkxzqWM?WOW8U(8(Lfc7xz`AqOH6jg!Y-7TpXRJ!mtM~T)9C^L}gSL z;YSLGDG_JZayritQkYm6_9cy96BXEf5-2!+OGf|OA7sdZg?o)Z<$B#|?fq|82c!WU zA|T92NDMBJCWHwuFa{aCfTqmu)kwClHDDbMnUQhx07}$x&ef5J(Vmp?fxerb?&J3W zEcoupee$`(0-Aipdr2XA7n`Vp9X;@`bGTh>URo?1%p&sSNNw!h%G)TZ^kT8~og*H% z!X8H2flq&|Mvn=U>8LSX_1WeQi24JnteP@|j;(g*B2HR-L-*$Ubi+J1heSK4&4lJ| zV!1rQLp=f2`FKko6Wb9aaD_i=<=1h?02JU2)?Ey_SS%6EQ>I20QL=(nW-P4=5mvTJ z&kgssLD)l`rHDCI`%vQMOV-yUxHQyhojHdYC*$H1=nrJKqFo93>xvB=M`$}Roksx# zRgV+d8#sk=v+tN#P-n?dx%RC(iv;9-YS-7PrZu#xJ5%k4i*8joRv1J`M_tOQR`{eV zE~<8%VC63sx|_U&{Bpy&?!~^Ce+CNv^T)?diyKrA zu^d&el}PFVWKFz9wkriy~eruRakPmmS0ZsKRiEMGj!_V`HL0FT$ zQU#r2x}sc&kxyY}K}1C{S`{Vdq_TYD4*4zgkU_ShWmQwGl2*ks*=_2Y*s%9QE)5EL zjq8+CA~jxHywIXd=tyIho1XBio%O)2-sMmqnmR&ZQWWD*!GB&UKv6%Ta=zRBv&eyf z{;f~`|5~B_&z17;pNS$3XoIA~G@mWw1YgrTRH95$f&qLKq5wY@A`UX)0I9GbBoHcu zF+!}=i8N>_J}axHrlmb)A1>vwib%T;N(z z!qkz-mizPTt^2F1``LZ#Is;SC`!6@p@t72+xBF5s!+V#&XJ54bJ|~2p(;ngG3+4NA zG?$Orjti%b`%<{?^7HlMZ3wR29z7?;KBDbAvK`kgqx4(N-xp5MuWJ1**FC|9j~trE zo`+jX&aFP*4hP;(>mA>X7yZujK`$QP9w?a`f9cQJaAA2cdE{Tm@v?W3gT&w=XzhbY zCDpADyRHQ?5fOuf*DrAnVn6BjADR2&!sV&wX1+TC*Qk}9xt8KA7}6LBN-_;c;r`H= zwL1uGsU0;W?OEez?W5HYvu>6SR+O8l#ZM+X@T3>y9G^L76W?!YFcytB^-`NyTDB=; zw421!sr`Wwopu>VDWNN>IN&RxE08d0JJZigpK%)p|Ep&aHWO`AFP)}VkqQg1S#TY> z(W)bm7duX(Nvry|l%sGs+Eudz3=_A0i@M47VtBp1RTz_zxlmqgi53tT!_i)(bad*R zt<1n~oT!|>QLmYf?YL$n8QEJ2A6liMI!hRY#mB@?9sWAUW8! z3#M&1`ZQmRP*o`jtHjbA78}!&iq6v&rlp|5&!}O}NT>|10NoWbiq5@7lhquTSHBCO z2a!-M+(e10feoq(nVw~!ZC;y+4M=F0%n)oHB7{BRYdVpeTN zryeS3Ecv^OC_2HcYbRWnOSY2McCa2PfRXH~!iu|fA^#y<&eJkS1^d|DM3)QKAnMe1 zp%9s~@jq$zOV8LQ$SoOZGMPYE@s<@m$#S(N##mh{yFb!URLo?VmR4c2D<_vio;v$u zEJivu^J$RML#dZFhO#!?D8s-JTIP{sV5EqzlSRH3SEW;p+f8?qW%}bdYNyDgxQcQg z)s4r6KHcPGxO_ErHr?P}mfM;FZE)8_I3? zDjMJvQui}|DLHJ=GXcz4%f~W;nZtC{WKitP66ONo4K<7TO!t?TYs_icsROOjf=!bP z#iDYw8Xa2L$P!_IMS+YdG$s?Gh(pybF}++ekEr=v(g97IC8z28gdGEK?6QPNA@g_H znGEeNG!5O#5gfi{IY+V>Q!Z=}bTeH|H2IGYcgh~!jjG`b~gGo!$<2(Kis_p5;(P-s_l8JWL!*jOOFW7(UIXj)5^C~7r z>g7M$hT|sIVBpur@M~;gi~j(BNMp8UkYv?y&{`-sK=@)-@S(2kqobO@Wt_pSnMh|eW*8azy%8exS@DAQxn9~G zE=4(L_gg-jHh5LtdXPgG=|7Xcq4E&x?X2G2ma(6{%4i1k?yUE4(M*Qk6_ z1vv$_*9q$Ow(QAvO;Y5T^gBQ8XX5ULw$iW6S>Q`+1H*Qj+COZ<4PxD-Fwh71j0cBx zz1pnDR}STs5k`ekB^)M`Iu39H@BwM@^8_X7VVp@epjNMqRjF($LBH!#dnEe)By}7T z7*XbIUY>#irgB@|lb)RRvHN^cPT%6slXqX1FW;4YMtNurd;?3g>rm zCSyAc0+aO+x0NojMi`4bp59%=g=zuk4R4o~hTUxxaj-YA z@UtFr6OY{A=_+?qZnrqBO49}q~-hZ!+0QZzD)8F6c7AMQ8Edl-y|d#R;NOh4ukOeId((#ChBKo`M=8Z@5!BZsX7A3n)%+;0Dy*bI-#fNe6_VV1{v%_*=I&54mqAWAg z3XmVyRkbAG&>7rIx23lx*caz7vL$Tha&FcrqTEUNZXhFsibRbc*L@H$q*&{Bx?^60 zRY;2!ODe~pKwKFrQ{(`51;0#9$tKAkXx7c-OI>j-bmJb*`eqq_;q-_i>B=}Mn^h`z za=K-$4B2-GE(-X{u|gHZ+)8*(@CW35iUra3LHje(qEJao_&fXoo%kNF}#{ zYeCndcH;)cUYsmcLrAwQySyF2t+dUrBDL;uWF|wuX8S|lr+Kg8>%G?Kuzxf;L!gZoxAqhd;`!i$5wZfphJ-c zd|uR@Q=cF4N1HXz1y}KjQJ8{7#aqNM_|j!oz6@&wEfq)8)wG4ngiGocMk=1Ft54#R zLyJe(u>P{fm>k_wUn20W9BZ#%fN9ZePCU*5DGK$uQ{GP3{oE1Qd^}1uSrdHw<-AM% znk>YZOU^R94BahzlbdB994?8{%lZ*NSZ4J+IKP3;K9;B))u#S>TRHMqa-y}{@z#V5wvOmV6zw~pafq=5ncOsU z`b-zkO|3C@lwd3SiQZeinzVP4uu+V>2-LKKA)WQXBXPb#G9E8UQ%5@sBgZtYwKzkq zNI6FloMR!lx7fV|WjJ*b`&y_UK9mPl*` z;XO8P%7{H*K=GrNF#+K3At?5`_oXT|Vz!Rh_05t2S&yd`A2 zjcyVJB|#czi?o<&biP<}0alxnpPLzJ9d#_R9(c$2IPXg7=4mL{7WoN>JTCCZ%zV{) zm691r%m?d5yR3l=Qxn7|f0?e7@ zk^9ia@dNTbyi6%GO;kec5sHCjtyr*i1QSY;G}gTsivUQRTG(i)y`O_~K{I*S+x=>M z;}<><>$k8!-=R}>b#)kmSE&~qf+xi@lJazu^F@~pV>MQ3ISq0)qH;F^;_yT@vc-Pr z390Cb$Zq{edB^7W@Mz_+gQ$>@*@>hJIjn4*`B@N%Lt_t1J1wT!aN`jpEBE5;Z|_X| zT^67k%@CVrtYeC}n;uLV%ZSClL-hu4Q5t8ke5a8BZ`=p#4yh?Xa^Q~OrJm_6aD?yj z!Od*^0L5!;q95XIh28eUbyJRpma5tq`0ds9GcX^qcBuCk#1-M-PcC@xgaV`dTbrNS$rEmz&;`STTF>1pK8< z7ykUcQ^6tZ?Yk3DVGovmRU?@pWL#e2L7cLSeBrZc$+IyWiBmoex!W#F#PlFAMT00niUZfkGz z0o{&eGEc{wC^aE3-eC$<2|Ini!y;&5zPE>9MO-I7kOD#cLp<3a%Juu2?88km=iL=? zg)Nm=ku7YEsu57C#BvklPYQ>o_{4C>a9C*0Px#k2ZkQ)j3FI#lIW3mT#f*2!gL4$_ zZDI76!tIw5o=j7Opkr~D0loH62&g?CHDg;Lp^HZ;W7)N+=s>^NuhmsYC?}lxS;sOE z69`R?BLA*%2m_L7BSZ^X5BKaWF-Y?b-HqGLcTd9NU7vY8k|j{O`cOrwxB2WW@tmhU zt`FA4?YCJwFISu42CLh~%e8Qg093rgqDa!ASGd!qoQ1e+yhXD=@Q7u0*^ddk+;D{) zKG0?!-U>8p8=*&(bw!x;E{EjWUUQyY3zVB2V}@t$lg*Bn3FId6V_Ez&aJ%8kzKZg$ zVwL+>zsp;_`X|m4RRvc|Wtejy* z?bG~}+B%y$b6zBRba$P?mX#UbwE{i{@jbuL@tZ6Rn;SCu#2M*$dpQIn$Hqv`MgjBn zURSnq5+1ReLXsI#*A8G1&h5`YFo^I17Y=&&1eQDtwY8HI3#DdGWslPJSP1` z1D()O()qzD6U~BYRUPw6gfc4Wx!am$yM#i~5MCmF8=7(q7;n3?L@7uuvn$;8B8wk8 z3>T-EJ5X9Z3@yH;L=9QFtWmzdE_;Kw^v+te+u`pF zN4&*o>iRKeC&l_{U^a`eymoog3(GY&2h;5vMyRyld37+7bW+&7tvIfrL9TpA@{Z

dy!05UMhSKsK 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 VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N diff --git a/ruoyi-flyingbook/.mvn/wrapper/maven-wrapper.properties b/ruoyi-flyingbook/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index ca5ab4b..0000000 --- a/ruoyi-flyingbook/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,18 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/ruoyi-flyingbook/pom.xml b/ruoyi-flyingbook/pom.xml index 3b6c6a5..18babe5 100644 --- a/ruoyi-flyingbook/pom.xml +++ b/ruoyi-flyingbook/pom.xml @@ -3,14 +3,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.boot - spring-boot-starter-parent - 2.5.5 - + ruoyi + com.ruoyi + 3.4.0 - com.flyingbook ruoyi-flyingbook - 0.0.1-SNAPSHOT ruoyi-flyingbook Demo project for Spring Boot @@ -39,7 +36,15 @@ oapi-sdk 2.0.13 - + + com.ruoyi + ruoyi-common + + + com.squareup.okhttp3 + okhttp + 4.9.1 + oapi-sdk-servlet-ext com.larksuite.oapi @@ -55,21 +60,5 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/LarkHelper/LarkTokenHelper.java new file mode 100644 index 0000000..fd78fa3 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/LarkHelper/LarkTokenHelper.java @@ -0,0 +1,82 @@ +package com.flyingbook.LarkHelper; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.lark.oapi.Client; +import com.lark.oapi.core.request.RequestOptions; +import com.lark.oapi.core.response.RawResponse; +import com.lark.oapi.core.token.AccessTokenType; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @author yuxiangyong + * @create 2023-03-12 18:10 + */ +@Slf4j +public class LarkTokenHelper { + + private static OkHttpClient client = new OkHttpClient().newBuilder() + .callTimeout(10, TimeUnit.SECONDS) + .connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS) + .build(); + + + public String getToken(String url, String appId, String srcret) { + Response execute = null; + Map map = new HashMap<>(); + map.put("app_id", appId); + map.put("app_secret", srcret); + Request request = new Request.Builder() + .method("POST", RequestBody.create(JSONObject.toJSONString(map), MediaType.get("application/json"))) + .url(url) + .build(); + try { + execute = client.newCall(request).execute(); + if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { + return execute.body().string(); + } + } catch (IOException e) { + log.error("http post 请求失败--{}", e); + } + return null; + } + + public String select(String url,String appToken,String tableId, String token) { + url = url.replace(":app_token",appToken) + .replace(":table_id",tableId); + System.out.println(url); + Response execute = null; + Map map = new HashMap<>(); + map.put("view_id","vewulwhFVT"); + Request request = new Request.Builder() + .method("POST", RequestBody.create(JSONObject.toJSONString(map), MediaType.get("application/json"))) + .url(url) + .addHeader("Authorization",String.format("Bearer %s",token)) + .build(); + try { + execute = client.newCall(request).execute(); + if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { + return execute.body().string(); + } + } catch (IOException e) { + log.error("http post 请求失败--{}", e); + } + return null; + } + + public static void main(String[] args) { + LarkTokenHelper helper = new LarkTokenHelper(); + String token = helper.getToken("https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal", "cli_a482a8572cbc9013", "lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos"); + System.out.println(token); + JSONObject jsonObject = JSONObject.parseObject(token); + String select = helper.select("https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records", "wikcnC7aay4PnFKQ4h3Wkp3tauc", "tblypnmCCE9txNfn", jsonObject.getString("tenant_access_token")); + System.out.println(select); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventController.java deleted file mode 100644 index 49c13c9..0000000 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventController.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.flyingbook.controller; - -import org.springframework.web.bind.annotation.RestController; -import com.lark.oapi.core.utils.Jsons; -import com.lark.oapi.event.EventDispatcher; -import com.lark.oapi.service.contact.v3.ContactService; -import com.lark.oapi.service.contact.v3.model.P2UserCreatedV3; -import com.lark.oapi.service.im.v1.ImService; -import com.lark.oapi.service.im.v1.model.P1MessageReadV1; -import com.lark.oapi.service.im.v1.model.P2MessageReadV1; -import com.lark.oapi.service.im.v1.model.P2MessageReceiveV1; -import com.lark.oapi.sdk.servlet.ext.ServletAdapter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; - - -@RestController -public class EventController { - - //1. 注册消息处理器 - private final EventDispatcher EVENT_DISPATCHER = EventDispatcher.newBuilder("verificationToken", - "encryptKey") - .onP2MessageReceiveV1(new ImService.P2MessageReceiveV1Handler() { - @Override - public void handle(P2MessageReceiveV1 event) { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP2UserCreatedV3(new ContactService.P2UserCreatedV3Handler() { - @Override - public void handle(P2UserCreatedV3 event) { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }) - .onP2MessageReadV1(new ImService.P2MessageReadV1Handler() { - @Override - public void handle(P2MessageReadV1 event) { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1MessageReadV1(new ImService.P1MessageReadV1Handler() { - @Override - public void handle(P1MessageReadV1 event) { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }) - .build(); - - //2. 注入 ServletAdapter 实例 - @Autowired - private ServletAdapter servletAdapter; - - //3. 创建路由处理器 - @RequestMapping("/webhook/event") - public void event(HttpServletRequest request, HttpServletResponse response) - throws Throwable { - //3.1 回调扩展包提供的事件回调处理器 - servletAdapter.handleEvent(request, response, EVENT_DISPATCHER); - } - } - diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/Event.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/Event.java new file mode 100644 index 0000000..c289027 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/Event.java @@ -0,0 +1,70 @@ +package com.flyingbook.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 event + * + * @author ruoyi + * @date 2023-03-12 + */ +public class Event extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private String message; + + /** pendingsuccessfaild */ + @Excel(name = "pendingsuccessfaild") + private String flag; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setMessage(String message) + { + this.message = message; + } + + public String getMessage() + { + return message; + } + public void setFlag(String flag) + { + this.flag = flag; + } + + public String getFlag() + { + return flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("message", getMessage()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("flag", getFlag()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/EventLog.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/EventLog.java new file mode 100644 index 0000000..bfcf155 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/EventLog.java @@ -0,0 +1,154 @@ +package com.flyingbook.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 event_log + * + * @author ruoyi + * @date 2023-03-12 + */ +public class EventLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** id */ + @Excel(name = "id") + private String tableId; + + /** id */ + @Excel(name = "id") + private String recordId; + + /** id */ + @Excel(name = "id") + private Long eventId; + + /** $column.columnComment */ + @Excel(name = "id") + private String operateType; + + /** $column.columnComment */ + @Excel(name = "id") + private String operateStatus; + + /** $column.columnComment */ + @Excel(name = "id") + private String errorCode; + + /** $column.columnComment */ + @Excel(name = "id") + private String errorMessage; + + /** 01 */ + @Excel(name = "01") + private Long flag; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setTableId(String tableId) + { + this.tableId = tableId; + } + + public String getTableId() + { + return tableId; + } + public void setRecordId(String recordId) + { + this.recordId = recordId; + } + + public String getRecordId() + { + return recordId; + } + public void setEventId(Long eventId) + { + this.eventId = eventId; + } + + public Long getEventId() + { + return eventId; + } + public void setOperateType(String operateType) + { + this.operateType = operateType; + } + + public String getOperateType() + { + return operateType; + } + public void setOperateStatus(String operateStatus) + { + this.operateStatus = operateStatus; + } + + public String getOperateStatus() + { + return operateStatus; + } + public void setErrorCode(String errorCode) + { + this.errorCode = errorCode; + } + + public String getErrorCode() + { + return errorCode; + } + public void setErrorMessage(String errorMessage) + { + this.errorMessage = errorMessage; + } + + public String getErrorMessage() + { + return errorMessage; + } + public void setFlag(Long flag) + { + this.flag = flag; + } + + public Long getFlag() + { + return flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("tableId", getTableId()) + .append("recordId", getRecordId()) + .append("eventId", getEventId()) + .append("operateType", getOperateType()) + .append("operateStatus", getOperateStatus()) + .append("errorCode", getErrorCode()) + .append("errorMessage", getErrorMessage()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("flag", getFlag()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkCompanyRelation.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkCompanyRelation.java new file mode 100644 index 0000000..e1fd3e7 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkCompanyRelation.java @@ -0,0 +1,112 @@ +package com.flyingbook.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 lark_company_relation + * + * @author ruoyi + * @date 2023-03-12 + */ +public class LarkCompanyRelation extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** id */ + @Excel(name = "id") + private Long companyId; + + /** $column.columnComment */ + @Excel(name = "id") + private String companyName; + + /** appId */ + @Excel(name = "appId") + private String appId; + + /** +appId */ + @Excel(name = "+appId") + private String secret; + + /** 01 */ + @Excel(name = "01") + private Long flag; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setCompanyId(Long companyId) + { + this.companyId = companyId; + } + + public Long getCompanyId() + { + return companyId; + } + public void setCompanyName(String companyName) + { + this.companyName = companyName; + } + + public String getCompanyName() + { + return companyName; + } + public void setAppId(String appId) + { + this.appId = appId; + } + + public String getAppId() + { + return appId; + } + public void setSecret(String secret) + { + this.secret = secret; + } + + public String getSecret() + { + return secret; + } + public void setFlag(Long flag) + { + this.flag = flag; + } + + public Long getFlag() + { + return flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("companyId", getCompanyId()) + .append("companyName", getCompanyName()) + .append("appId", getAppId()) + .append("secret", getSecret()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("flag", getFlag()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkTableRelation.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkTableRelation.java new file mode 100644 index 0000000..7318286 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkTableRelation.java @@ -0,0 +1,112 @@ +package com.flyingbook.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 lark_table_relation + * + * @author ruoyi + * @date 2023-03-12 + */ +public class LarkTableRelation extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** id */ + @Excel(name = "id") + private Long larkCompanyRelationId; + + /** $column.columnComment */ + @Excel(name = "id") + private String fromTableId; + + /** $column.columnComment */ + @Excel(name = "id") + private String toTableId; + + /** url */ + @Excel(name = "url") + private Long url; + + /** 01 */ + @Excel(name = "01") + private Long flag; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setLarkCompanyRelationId(Long larkCompanyRelationId) + { + this.larkCompanyRelationId = larkCompanyRelationId; + } + + public Long getLarkCompanyRelationId() + { + return larkCompanyRelationId; + } + public void setFromTableId(String fromTableId) + { + this.fromTableId = fromTableId; + } + + public String getFromTableId() + { + return fromTableId; + } + public void setToTableId(String toTableId) + { + this.toTableId = toTableId; + } + + public String getToTableId() + { + return toTableId; + } + public void setUrl(Long url) + { + this.url = url; + } + + public Long getUrl() + { + return url; + } + public void setFlag(Long flag) + { + this.flag = flag; + } + + public Long getFlag() + { + return flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("larkCompanyRelationId", getLarkCompanyRelationId()) + .append("fromTableId", getFromTableId()) + .append("toTableId", getToTableId()) + .append("url", getUrl()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("flag", getFlag()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventLogMapper.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventLogMapper.java new file mode 100644 index 0000000..df29c65 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventLogMapper.java @@ -0,0 +1,63 @@ +package com.flyingbook.mapper; + + +import com.flyingbook.domain.EventLog; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-03-12 + */ +public interface EventLogMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public EventLog selectEventLogById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param eventLog 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectEventLogList(EventLog eventLog); + + /** + * 新增【请填写功能名称】 + * + * @param eventLog 【请填写功能名称】 + * @return 结果 + */ + public int insertEventLog(EventLog eventLog); + + /** + * 修改【请填写功能名称】 + * + * @param eventLog 【请填写功能名称】 + * @return 结果 + */ + public int updateEventLog(EventLog eventLog); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteEventLogById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteEventLogByIds(Long[] ids); +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventMapper.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventMapper.java new file mode 100644 index 0000000..8a17a58 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventMapper.java @@ -0,0 +1,63 @@ +package com.flyingbook.mapper; + + +import com.flyingbook.domain.Event; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-03-12 + */ +public interface EventMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public Event selectEventById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param event 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectEventList(Event event); + + /** + * 新增【请填写功能名称】 + * + * @param event 【请填写功能名称】 + * @return 结果 + */ + public int insertEvent(Event event); + + /** + * 修改【请填写功能名称】 + * + * @param event 【请填写功能名称】 + * @return 结果 + */ + public int updateEvent(Event event); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteEventById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteEventByIds(Long[] ids); +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkCompanyRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkCompanyRelationMapper.java new file mode 100644 index 0000000..dec71f8 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkCompanyRelationMapper.java @@ -0,0 +1,63 @@ +package com.flyingbook.mapper; + + +import com.flyingbook.domain.LarkCompanyRelation; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-03-12 + */ +public interface LarkCompanyRelationMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public LarkCompanyRelation selectLarkCompanyRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param larkCompanyRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectLarkCompanyRelationList(LarkCompanyRelation larkCompanyRelation); + + /** + * 新增【请填写功能名称】 + * + * @param larkCompanyRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertLarkCompanyRelation(LarkCompanyRelation larkCompanyRelation); + + /** + * 修改【请填写功能名称】 + * + * @param larkCompanyRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateLarkCompanyRelation(LarkCompanyRelation larkCompanyRelation); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteLarkCompanyRelationById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteLarkCompanyRelationByIds(Long[] ids); +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkTableRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkTableRelationMapper.java new file mode 100644 index 0000000..6f40c50 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkTableRelationMapper.java @@ -0,0 +1,63 @@ +package com.flyingbook.mapper; + + +import com.flyingbook.domain.LarkTableRelation; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-03-12 + */ +public interface LarkTableRelationMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public LarkTableRelation selectLarkTableRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param larkTableRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectLarkTableRelationList(LarkTableRelation larkTableRelation); + + /** + * 新增【请填写功能名称】 + * + * @param larkTableRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertLarkTableRelation(LarkTableRelation larkTableRelation); + + /** + * 修改【请填写功能名称】 + * + * @param larkTableRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateLarkTableRelation(LarkTableRelation larkTableRelation); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteLarkTableRelationById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteLarkTableRelationByIds(Long[] ids); +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventLogService.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventLogService.java new file mode 100644 index 0000000..35efa88 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventLogService.java @@ -0,0 +1,63 @@ +package com.flyingbook.service; + + +import com.flyingbook.domain.EventLog; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-03-12 + */ +public interface IEventLogService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public EventLog selectEventLogById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param eventLog 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectEventLogList(EventLog eventLog); + + /** + * 新增【请填写功能名称】 + * + * @param eventLog 【请填写功能名称】 + * @return 结果 + */ + public int insertEventLog(EventLog eventLog); + + /** + * 修改【请填写功能名称】 + * + * @param eventLog 【请填写功能名称】 + * @return 结果 + */ + public int updateEventLog(EventLog eventLog); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + public int deleteEventLogByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteEventLogById(Long id); +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventService.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventService.java new file mode 100644 index 0000000..a97183a --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventService.java @@ -0,0 +1,63 @@ +package com.flyingbook.service; + + +import com.flyingbook.domain.Event; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-03-12 + */ +public interface IEventService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public Event selectEventById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param event 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectEventList(Event event); + + /** + * 新增【请填写功能名称】 + * + * @param event 【请填写功能名称】 + * @return 结果 + */ + public int insertEvent(Event event); + + /** + * 修改【请填写功能名称】 + * + * @param event 【请填写功能名称】 + * @return 结果 + */ + public int updateEvent(Event event); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + public int deleteEventByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteEventById(Long id); +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkCompanyRelationService.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkCompanyRelationService.java new file mode 100644 index 0000000..1d5a74b --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkCompanyRelationService.java @@ -0,0 +1,63 @@ +package com.flyingbook.service; + + +import com.flyingbook.domain.LarkCompanyRelation; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-03-12 + */ +public interface ILarkCompanyRelationService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public LarkCompanyRelation selectLarkCompanyRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param larkCompanyRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectLarkCompanyRelationList(LarkCompanyRelation larkCompanyRelation); + + /** + * 新增【请填写功能名称】 + * + * @param larkCompanyRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertLarkCompanyRelation(LarkCompanyRelation larkCompanyRelation); + + /** + * 修改【请填写功能名称】 + * + * @param larkCompanyRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateLarkCompanyRelation(LarkCompanyRelation larkCompanyRelation); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + public int deleteLarkCompanyRelationByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteLarkCompanyRelationById(Long id); +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkTableRelationService.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkTableRelationService.java new file mode 100644 index 0000000..46dc468 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkTableRelationService.java @@ -0,0 +1,63 @@ +package com.flyingbook.service; + + +import com.flyingbook.domain.LarkTableRelation; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-03-12 + */ +public interface ILarkTableRelationService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public LarkTableRelation selectLarkTableRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param larkTableRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectLarkTableRelationList(LarkTableRelation larkTableRelation); + + /** + * 新增【请填写功能名称】 + * + * @param larkTableRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertLarkTableRelation(LarkTableRelation larkTableRelation); + + /** + * 修改【请填写功能名称】 + * + * @param larkTableRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateLarkTableRelation(LarkTableRelation larkTableRelation); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + public int deleteLarkTableRelationByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteLarkTableRelationById(Long id); +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventLogServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventLogServiceImpl.java new file mode 100644 index 0000000..593e207 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventLogServiceImpl.java @@ -0,0 +1,97 @@ +package com.flyingbook.service.impl; + +import java.util.List; + +import com.flyingbook.domain.EventLog; +import com.flyingbook.mapper.EventLogMapper; +import com.flyingbook.service.IEventLogService; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-03-12 + */ +@Service +public class EventLogServiceImpl implements IEventLogService +{ + @Autowired + private EventLogMapper eventLogMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + @Override + public EventLog selectEventLogById(Long id) + { + return eventLogMapper.selectEventLogById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param eventLog 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectEventLogList(EventLog eventLog) + { + return eventLogMapper.selectEventLogList(eventLog); + } + + /** + * 新增【请填写功能名称】 + * + * @param eventLog 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertEventLog(EventLog eventLog) + { + eventLog.setCreateTime(DateUtils.getNowDate()); + return eventLogMapper.insertEventLog(eventLog); + } + + /** + * 修改【请填写功能名称】 + * + * @param eventLog 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateEventLog(EventLog eventLog) + { + eventLog.setUpdateTime(DateUtils.getNowDate()); + return eventLogMapper.updateEventLog(eventLog); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteEventLogByIds(Long[] ids) + { + return eventLogMapper.deleteEventLogByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteEventLogById(Long id) + { + return eventLogMapper.deleteEventLogById(id); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventServiceImpl.java new file mode 100644 index 0000000..7eae668 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventServiceImpl.java @@ -0,0 +1,98 @@ +package com.flyingbook.service.impl; + + +import com.flyingbook.domain.Event; +import com.flyingbook.mapper.EventMapper; +import com.flyingbook.service.IEventService; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-03-12 + */ +@Service +public class EventServiceImpl implements IEventService +{ + @Autowired + private EventMapper eventMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + @Override + public Event selectEventById(Long id) + { + return eventMapper.selectEventById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param event 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectEventList(Event event) + { + return eventMapper.selectEventList(event); + } + + /** + * 新增【请填写功能名称】 + * + * @param event 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertEvent(Event event) + { + event.setCreateTime(DateUtils.getNowDate()); + return eventMapper.insertEvent(event); + } + + /** + * 修改【请填写功能名称】 + * + * @param event 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateEvent(Event event) + { + event.setUpdateTime(DateUtils.getNowDate()); + return eventMapper.updateEvent(event); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteEventByIds(Long[] ids) + { + return eventMapper.deleteEventByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteEventById(Long id) + { + return eventMapper.deleteEventById(id); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java new file mode 100644 index 0000000..885e1e2 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java @@ -0,0 +1,97 @@ +package com.flyingbook.service.impl; + +import java.util.List; + +import com.flyingbook.domain.LarkCompanyRelation; +import com.flyingbook.mapper.LarkCompanyRelationMapper; +import com.flyingbook.service.ILarkCompanyRelationService; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-03-12 + */ +@Service +public class LarkCompanyRelationServiceImpl implements ILarkCompanyRelationService +{ + @Autowired + private LarkCompanyRelationMapper larkCompanyRelationMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + @Override + public LarkCompanyRelation selectLarkCompanyRelationById(Long id) + { + return larkCompanyRelationMapper.selectLarkCompanyRelationById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param larkCompanyRelation 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectLarkCompanyRelationList(LarkCompanyRelation larkCompanyRelation) + { + return larkCompanyRelationMapper.selectLarkCompanyRelationList(larkCompanyRelation); + } + + /** + * 新增【请填写功能名称】 + * + * @param larkCompanyRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertLarkCompanyRelation(LarkCompanyRelation larkCompanyRelation) + { + larkCompanyRelation.setCreateTime(DateUtils.getNowDate()); + return larkCompanyRelationMapper.insertLarkCompanyRelation(larkCompanyRelation); + } + + /** + * 修改【请填写功能名称】 + * + * @param larkCompanyRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateLarkCompanyRelation(LarkCompanyRelation larkCompanyRelation) + { + larkCompanyRelation.setUpdateTime(DateUtils.getNowDate()); + return larkCompanyRelationMapper.updateLarkCompanyRelation(larkCompanyRelation); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteLarkCompanyRelationByIds(Long[] ids) + { + return larkCompanyRelationMapper.deleteLarkCompanyRelationByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteLarkCompanyRelationById(Long id) + { + return larkCompanyRelationMapper.deleteLarkCompanyRelationById(id); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkTableRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkTableRelationServiceImpl.java new file mode 100644 index 0000000..d2e7876 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkTableRelationServiceImpl.java @@ -0,0 +1,97 @@ +package com.flyingbook.service.impl; + +import java.util.List; + +import com.flyingbook.domain.LarkTableRelation; +import com.flyingbook.mapper.LarkTableRelationMapper; +import com.flyingbook.service.ILarkTableRelationService; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-03-12 + */ +@Service +public class LarkTableRelationServiceImpl implements ILarkTableRelationService +{ + @Autowired + private LarkTableRelationMapper larkTableRelationMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + @Override + public LarkTableRelation selectLarkTableRelationById(Long id) + { + return larkTableRelationMapper.selectLarkTableRelationById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param larkTableRelation 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectLarkTableRelationList(LarkTableRelation larkTableRelation) + { + return larkTableRelationMapper.selectLarkTableRelationList(larkTableRelation); + } + + /** + * 新增【请填写功能名称】 + * + * @param larkTableRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertLarkTableRelation(LarkTableRelation larkTableRelation) + { + larkTableRelation.setCreateTime(DateUtils.getNowDate()); + return larkTableRelationMapper.insertLarkTableRelation(larkTableRelation); + } + + /** + * 修改【请填写功能名称】 + * + * @param larkTableRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateLarkTableRelation(LarkTableRelation larkTableRelation) + { + larkTableRelation.setUpdateTime(DateUtils.getNowDate()); + return larkTableRelationMapper.updateLarkTableRelation(larkTableRelation); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteLarkTableRelationByIds(Long[] ids) + { + return larkTableRelationMapper.deleteLarkTableRelationByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteLarkTableRelationById(Long id) + { + return larkTableRelationMapper.deleteLarkTableRelationById(id); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/ApprovalCallback.java new file mode 100644 index 0000000..5da8ea0 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/ApprovalCallback.java @@ -0,0 +1,86 @@ +package com.flyingbook.strategy; + +import com.flyingbook.domain.Event; +import com.flyingbook.domain.EventLog; +import com.flyingbook.service.IEventLogService; +import com.flyingbook.service.IEventService; +import com.ruoyi.common.base.LarkRequest; +import com.ruoyi.common.constant.RedisConstants; +import com.ruoyi.common.enums.EventOperateStatus; +import com.ruoyi.common.enums.EventOperateType; +import com.ruoyi.common.enums.FlagStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * @author yuxiangyong + * @create 2023-03-12 15:58 + */ +@Slf4j +@Component("approvalCallback") +public class ApprovalCallback extends CallbackAbstract { + + @Autowired + private IEventService eventService; + @Autowired + private IEventLogService eventLogService; + @Autowired + private RedisTemplate redisTemplate; + + @Override + protected Boolean check(LarkRequest request) { + String message = ""; + return Boolean.FALSE; + } + + @Override + protected void preOperate(LarkRequest request) { + + } + + @Override + protected void businessProcessing(LarkRequest request) { + String message = "aaa"; + Event event = this.buildDto(message); + int i = eventService.insertEvent(event); + request.setEventId(event.getId()); + + } + + @Override + protected void endHandle(LarkRequest request) { + redisTemplate.opsForList().rightPush(RedisConstants.MULTIDIMENSIONALTABULARFEEDBACK,request.getEventId()); + EventLog eventLog = new EventLog(); + eventLog.setFlag(FlagStatus.OK.getCode()); + eventLog.setOperateStatus(EventOperateStatus.PENDING.getCode()); + eventLog.setOperateType(EventOperateType.CALL_BACK.getCode()); + eventLog.setEventId(request.getEventId()); + eventLogService.insertEventLog(eventLog); + } + + @Override + protected String buildResult(LarkRequest request) { + return ""; + } + + + @Override + protected String getName() { + return this.getClass().getSimpleName(); + } + + + private Event buildDto(String message){ + Event event = new Event(); + event.setFlag(EventOperateStatus.PENDING.getCode()); + event.setMessage(message); + event.setCreateBy("System"); + event.setCreateTime(new Date()); + return event; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/CallbackAbstract.java b/ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/CallbackAbstract.java similarity index 85% rename from ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/CallbackAbstract.java rename to ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/CallbackAbstract.java index f3e061e..755f474 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/CallbackAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/CallbackAbstract.java @@ -1,4 +1,4 @@ -package com.ruoyi.system.lark.strategy; +package com.flyingbook.strategy; import com.ruoyi.common.service.LarkOperateAbstract; import lombok.extern.slf4j.Slf4j; diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml new file mode 100644 index 0000000..b6dfe2f --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + select id, + table_id, + record_id, + event_id, + operate_type, + operate_status, + error_code, + error_message, + create_by, + create_time, + update_by, + update_time, + flag, + remark + from event_log + + + + + + + + insert into event_log + + table_id, + record_id, + event_id, + operate_type, + operate_status, + error_code, + error_message, + create_by, + create_time, + update_by, + update_time, + flag, + remark, + + + #{tableId}, + #{recordId}, + #{eventId}, + #{operateType}, + #{operateStatus}, + #{errorCode}, + #{errorMessage}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update event_log + + table_id = #{tableId}, + record_id = #{recordId}, + event_id = #{eventId}, + operate_type = #{operateType}, + operate_status = #{operateStatus}, + error_code = #{errorCode}, + error_message = #{errorMessage}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + flag = #{flag}, + remark = #{remark}, + + where id = #{id} + + + + delete + from event_log + where id = #{id} + + + + delete from event_log where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml new file mode 100644 index 0000000..436f8b0 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + select id, + message, + create_by, + create_time, + update_by, + update_time, + flag, + remark + from event + + + + + + + + insert into event + + message, + create_by, + create_time, + update_by, + update_time, + flag, + remark, + + + #{message}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update event + + message = #{message}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + flag = #{flag}, + remark = #{remark}, + + where id = #{id} + + + + delete + from event + where id = #{id} + + + + delete from event where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml new file mode 100644 index 0000000..b4ce635 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + select id, + company_id, + company_name, + app_id, + secret, + create_by, + create_time, + update_by, + update_time, + flag, + remark + from lark_company_relation + + + + + + + + insert into lark_company_relation + + company_id, + company_name, + app_id, + secret, + create_by, + create_time, + update_by, + update_time, + flag, + remark, + + + #{companyId}, + #{companyName}, + #{appId}, + #{secret}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update lark_company_relation + + company_id = #{companyId}, + company_name = #{companyName}, + app_id = #{appId}, + secret = #{secret}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + flag = #{flag}, + remark = #{remark}, + + where id = #{id} + + + + delete + from lark_company_relation + where id = #{id} + + + + delete from lark_company_relation where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml new file mode 100644 index 0000000..61a7477 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + select id, + lark_company_relation_id, + from_table_id, + to_table_id, + url, + create_by, + create_time, + update_by, + update_time, + flag, + remark + from lark_table_relation + + + + + + + + insert into lark_table_relation + + lark_company_relation_id, + from_table_id, + to_table_id, + url, + create_by, + create_time, + update_by, + update_time, + flag, + remark, + + + #{larkCompanyRelationId}, + #{fromTableId}, + #{toTableId}, + #{url}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update lark_table_relation + + lark_company_relation_id = #{larkCompanyRelationId}, + from_table_id = #{fromTableId}, + to_table_id = #{toTableId}, + url = #{url}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + flag = #{flag}, + remark = #{remark}, + + where id = #{id} + + + + delete + from lark_table_relation + where id = #{id} + + + + delete from lark_table_relation where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 8cbd872..c8e1c1b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -115,6 +115,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .antMatchers("/druid/**").anonymous() .antMatchers("/flowable/**").permitAll() .antMatchers("/socket/**").permitAll() + .antMatchers("/event/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/ApprovalCallback.java b/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/ApprovalCallback.java deleted file mode 100644 index a28a600..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/system/lark/strategy/ApprovalCallback.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ruoyi.system.lark.strategy; - -import com.ruoyi.common.base.LarkRequest; -import com.ruoyi.common.service.LarkOperateAbstract; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * @author yuxiangyong - * @create 2023-03-12 15:58 - */ -@Slf4j -@Component("approvalCallback") -public class ApprovalCallback extends CallbackAbstract { - - @Override - protected Boolean check(LarkRequest request) { - Boolean result = Boolean.FALSE; - - return result; - } - - @Override - protected void businessProcessing(LarkRequest request) { - - } - - @Override - protected void endHandle(LarkRequest request) { - super.endHandle(request); - } - - - - @Override - protected String getName() { - return this.getClass().getSimpleName(); - } - - -} diff --git a/sql/lark.sql b/sql/lark.sql index 3e5b745..82f0906 100644 --- a/sql/lark.sql +++ b/sql/lark.sql @@ -32,35 +32,37 @@ CREATE TABLE `lark_table_relation` ) ENGINE = INNODB; -- 事务操作日志 -CREATE TABLE `event_log` ( - `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', - `table_id` VARCHAR (255) DEFAULT NULL COMMENT '多维表格id', - `record_id` VARCHAR (255) DEFAULT NULL COMMENT '实际行id', - `event_id` VARCHAR (255) DEFAULT NULL COMMENT '实际事务id', - `operate_type` VARCHAR (255) DEFAULT NULL COMMENT '操作类型', - `operate_status` VARCHAR (255) DEFAULT NULL COMMENT '操作编码', - `error_code` VARCHAR (255) DEFAULT NULL COMMENT '错误编码', - `error_message` VARCHAR (255) DEFAULT NULL COMMENT '错误信息', - `create_by` VARCHAR (255) NOT NULL, - `create_time` datetime NOT NULL, - `update_by` VARCHAR (255) DEFAULT NULL, - `update_time` datetime DEFAULT NULL, - `flag` TINYINT NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', - `remark` VARCHAR (255) DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`) +CREATE TABLE `event_log` +( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `table_id` VARCHAR(255) DEFAULT NULL COMMENT '多维表格id', + `record_id` VARCHAR(255) DEFAULT NULL COMMENT '实际行id', + `event_id` BIGINT DEFAULT NULL COMMENT '实际事务id', + `operate_type` VARCHAR(255) DEFAULT NULL COMMENT '操作类型', + `operate_status` VARCHAR(255) DEFAULT NULL COMMENT '操作编码', + `error_code` VARCHAR(255) DEFAULT NULL COMMENT '错误编码', + `error_message` VARCHAR(255) DEFAULT NULL COMMENT '错误信息', + `create_by` VARCHAR(255) NOT NULL, + `create_time` datetime NOT NULL, + `update_by` VARCHAR(255) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `flag` TINYINT NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', + `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) ) ENGINE = INNODB; -- 事务详情 -CREATE TABLE `event` ( - `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', - `message` text DEFAULT NULL COMMENT '回调信息', - `create_by` VARCHAR (255) NOT NULL, - `create_time` datetime NOT NULL, - `update_by` VARCHAR (255) DEFAULT NULL, - `update_time` datetime DEFAULT NULL, - `flag` VARCHAR (20) NOT NULL COMMENT '状态标记(pending处理中、success成功、faild失败)', - `remark` VARCHAR (255) DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`) +CREATE TABLE `event` +( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `message` text DEFAULT NULL COMMENT '回调信息', + `create_by` VARCHAR(255) NOT NULL, + `create_time` datetime NOT NULL, + `update_by` VARCHAR(255) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `flag` VARCHAR(20) NOT NULL COMMENT '状态标记(pending处理中、success成功、faild失败)', + `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) ) ENGINE = INNODB; From 6878457f4448e750ca20d7770e7afb056d0153d0 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Sun, 12 Mar 2023 22:39:24 +0800 Subject: [PATCH 03/37] change package --- pom.xml | 2 +- .../main/java/com/ruoyi/RuoYiApplication.java | 4 --- .../com/ruoyi/common/base/LarkRequest.java | 1 + ruoyi-flyingbook/pom.xml | 1 + .../LarkHelper/LarkTokenHelper.java | 6 +---- .../RuoyiFlyingbookApplication.java | 2 +- .../flyingbook/config/DocxSample.java | 2 +- .../flyingbook/config/RawApiCall.java | 2 +- .../controller/EventController.java | 26 ++++++++----------- .../controller/EventControllers.java | 2 +- .../{ => ruoyi}/flyingbook/domain/Event.java | 2 +- .../flyingbook/domain/EventLog.java | 2 +- .../domain/LarkCompanyRelation.java | 2 +- .../flyingbook/domain/LarkTableRelation.java | 2 +- .../flyingbook/mapper/EventLogMapper.java | 4 +-- .../flyingbook/mapper/EventMapper.java | 4 +-- .../mapper/LarkCompanyRelationMapper.java | 4 +-- .../mapper/LarkTableRelationMapper.java | 4 +-- .../flyingbook/service/IEventLogService.java | 4 +-- .../flyingbook/service/IEventService.java | 4 +-- .../service/ILarkCompanyRelationService.java | 4 +-- .../service/ILarkTableRelationService.java | 4 +-- .../service/impl/EventLogServiceImpl.java | 8 +++--- .../service/impl/EventServiceImpl.java | 8 +++--- .../impl/LarkCompanyRelationServiceImpl.java | 8 +++--- .../impl/LarkTableRelationServiceImpl.java | 8 +++--- .../flyingbook/strategy/ApprovalCallback.java | 25 +++++++++++------- .../flyingbook/strategy/CallbackAbstract.java | 2 +- .../main/resources/mapper/EventLogMapper.xml | 10 +++---- .../src/main/resources/mapper/EventMapper.xml | 10 +++---- .../mapper/LarkCompanyRelationMapper.xml | 10 +++---- .../mapper/LarkTableRelationMapper.xml | 10 +++---- 32 files changed, 92 insertions(+), 95 deletions(-) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/LarkHelper/LarkTokenHelper.java (93%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/RuoyiFlyingbookApplication.java (94%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/config/DocxSample.java (98%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/config/RawApiCall.java (97%) rename {ruoyi-admin/src/main/java/com/ruoyi/web => ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook}/controller/EventController.java (63%) rename {ruoyi-admin/src/main/java/com/ruoyi/web => ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook}/controller/EventControllers.java (99%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/domain/Event.java (97%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/domain/EventLog.java (98%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/domain/LarkCompanyRelation.java (98%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/domain/LarkTableRelation.java (98%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/mapper/EventLogMapper.java (94%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/mapper/EventMapper.java (94%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/mapper/LarkCompanyRelationMapper.java (94%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/mapper/LarkTableRelationMapper.java (94%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/service/IEventLogService.java (94%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/service/IEventService.java (94%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/service/ILarkCompanyRelationService.java (94%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/service/ILarkTableRelationService.java (94%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/service/impl/EventLogServiceImpl.java (91%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/service/impl/EventServiceImpl.java (91%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java (92%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/service/impl/LarkTableRelationServiceImpl.java (92%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/strategy/ApprovalCallback.java (75%) rename ruoyi-flyingbook/src/main/java/com/{ => ruoyi}/flyingbook/strategy/CallbackAbstract.java (85%) diff --git a/pom.xml b/pom.xml index af91428..cb370af 100644 --- a/pom.xml +++ b/pom.xml @@ -218,7 +218,7 @@ com.ruoyi ruoyi-flyingbook - ${ruoyi.version} + 3.4.1-SNAPSHOT diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java index 2cf8a50..70adbb6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java @@ -20,8 +20,4 @@ public class RuoYiApplication SpringApplication.run(RuoYiApplication.class, args); } - @Bean - public ServletAdapter getServletAdapter() { - return new ServletAdapter(); - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java b/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java index 4964483..728456a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java @@ -9,4 +9,5 @@ import lombok.Data; @Data public class LarkRequest { private Long eventId; + private String message; } diff --git a/ruoyi-flyingbook/pom.xml b/ruoyi-flyingbook/pom.xml index 18babe5..26b17c9 100644 --- a/ruoyi-flyingbook/pom.xml +++ b/ruoyi-flyingbook/pom.xml @@ -7,6 +7,7 @@ com.ruoyi 3.4.0 + 3.4.1-SNAPSHOT ruoyi-flyingbook ruoyi-flyingbook Demo project for Spring Boot diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java similarity index 93% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/LarkHelper/LarkTokenHelper.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java index fd78fa3..aa04d6c 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/LarkHelper/LarkTokenHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java @@ -1,11 +1,7 @@ -package com.flyingbook.LarkHelper; +package com.ruoyi.flyingbook.LarkHelper; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.lark.oapi.Client; -import com.lark.oapi.core.request.RequestOptions; -import com.lark.oapi.core.response.RawResponse; -import com.lark.oapi.core.token.AccessTokenType; import lombok.extern.slf4j.Slf4j; import okhttp3.*; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/RuoyiFlyingbookApplication.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/RuoyiFlyingbookApplication.java similarity index 94% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/RuoyiFlyingbookApplication.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/RuoyiFlyingbookApplication.java index 9a47537..dd5f1a0 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/RuoyiFlyingbookApplication.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/RuoyiFlyingbookApplication.java @@ -1,4 +1,4 @@ -package com.flyingbook; +package com.ruoyi.flyingbook; import com.lark.oapi.sdk.servlet.ext.ServletAdapter; import org.springframework.boot.SpringApplication; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/config/DocxSample.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/config/DocxSample.java similarity index 98% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/config/DocxSample.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/config/DocxSample.java index c188257..c622c38 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/config/DocxSample.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/config/DocxSample.java @@ -1,4 +1,4 @@ -package com.flyingbook.config; +package com.ruoyi.flyingbook.config; import com.lark.oapi.Client; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/config/RawApiCall.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/config/RawApiCall.java similarity index 97% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/config/RawApiCall.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/config/RawApiCall.java index 2ed7a91..fd5db3d 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/config/RawApiCall.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/config/RawApiCall.java @@ -1,4 +1,4 @@ -package com.flyingbook.config; +package com.ruoyi.flyingbook.config; import com.lark.oapi.Client; import com.lark.oapi.core.enums.AppType; import com.lark.oapi.core.response.RawResponse; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java similarity index 63% rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventController.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index c8c04f6..0de8c0d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -1,24 +1,14 @@ -package com.ruoyi.web.controller; +package com.ruoyi.flyingbook.controller; import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.base.LarkRequest; +import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.utils.DecryptUtil; -import com.sun.org.apache.bcel.internal.generic.IfInstruction; +import com.ruoyi.flyingbook.strategy.ApprovalCallback; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.lark.oapi.core.utils.Jsons; -import com.lark.oapi.event.EventDispatcher; -import com.lark.oapi.service.contact.v3.ContactService; -import com.lark.oapi.service.contact.v3.model.P2UserCreatedV3; -import com.lark.oapi.service.im.v1.ImService; -import com.lark.oapi.service.im.v1.model.P1MessageReadV1; -import com.lark.oapi.service.im.v1.model.P2MessageReadV1; -import com.lark.oapi.service.im.v1.model.P2MessageReceiveV1; -import com.lark.oapi.sdk.servlet.ext.ServletAdapter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; @@ -27,7 +17,10 @@ import org.springframework.web.bind.annotation.RequestMapping; @Slf4j @RestController @RequestMapping("/event/test1") -public class EventController { +public class EventController extends BaseController { + + @Autowired + private ApprovalCallback approvalCallback; //3. 创建路由处理器 @PostMapping("/approval") @@ -45,6 +38,9 @@ public class EventController { result = jsonObject.getString("challenge"); log.info("/event/test1/approval request:{} challenge:{}", jsonObject.toJSONString(), result); } + LarkRequest larkRequest = new LarkRequest(); + larkRequest.setMessage(result); + approvalCallback.execute(larkRequest); return result; } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventControllers.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java similarity index 99% rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventControllers.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java index 4706bb7..6c6cdca 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/EventControllers.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java @@ -1,4 +1,4 @@ -package com.ruoyi.web.controller; +package com.ruoyi.flyingbook.controller; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.utils.DecryptUtil; import lombok.extern.slf4j.Slf4j; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/Event.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java similarity index 97% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/domain/Event.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java index c289027..56a86a8 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/Event.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java @@ -1,4 +1,4 @@ -package com.flyingbook.domain; +package com.ruoyi.flyingbook.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/EventLog.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java similarity index 98% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/domain/EventLog.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java index bfcf155..a84d57b 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/EventLog.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java @@ -1,4 +1,4 @@ -package com.flyingbook.domain; +package com.ruoyi.flyingbook.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkCompanyRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java similarity index 98% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkCompanyRelation.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java index e1fd3e7..d9e03b6 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkCompanyRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java @@ -1,4 +1,4 @@ -package com.flyingbook.domain; +package com.ruoyi.flyingbook.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkTableRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java similarity index 98% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkTableRelation.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java index 7318286..5f1f7bc 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/domain/LarkTableRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java @@ -1,4 +1,4 @@ -package com.flyingbook.domain; +package com.ruoyi.flyingbook.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventLogMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventLogMapper.java similarity index 94% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventLogMapper.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventLogMapper.java index df29c65..af10514 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventLogMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventLogMapper.java @@ -1,7 +1,7 @@ -package com.flyingbook.mapper; +package com.ruoyi.flyingbook.mapper; -import com.flyingbook.domain.EventLog; +import com.ruoyi.flyingbook.domain.EventLog; import java.util.List; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java similarity index 94% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventMapper.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java index 8a17a58..3f237e4 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/EventMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java @@ -1,7 +1,7 @@ -package com.flyingbook.mapper; +package com.ruoyi.flyingbook.mapper; -import com.flyingbook.domain.Event; +import com.ruoyi.flyingbook.domain.Event; import java.util.List; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkCompanyRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkCompanyRelationMapper.java similarity index 94% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkCompanyRelationMapper.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkCompanyRelationMapper.java index dec71f8..64ad41a 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkCompanyRelationMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkCompanyRelationMapper.java @@ -1,7 +1,7 @@ -package com.flyingbook.mapper; +package com.ruoyi.flyingbook.mapper; -import com.flyingbook.domain.LarkCompanyRelation; +import com.ruoyi.flyingbook.domain.LarkCompanyRelation; import java.util.List; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkTableRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java similarity index 94% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkTableRelationMapper.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java index 6f40c50..9efe617 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/mapper/LarkTableRelationMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java @@ -1,7 +1,7 @@ -package com.flyingbook.mapper; +package com.ruoyi.flyingbook.mapper; -import com.flyingbook.domain.LarkTableRelation; +import com.ruoyi.flyingbook.domain.LarkTableRelation; import java.util.List; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventLogService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventLogService.java similarity index 94% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventLogService.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventLogService.java index 35efa88..5ee0d25 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventLogService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventLogService.java @@ -1,7 +1,7 @@ -package com.flyingbook.service; +package com.ruoyi.flyingbook.service; -import com.flyingbook.domain.EventLog; +import com.ruoyi.flyingbook.domain.EventLog; import java.util.List; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java similarity index 94% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventService.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java index a97183a..57afc98 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/IEventService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java @@ -1,7 +1,7 @@ -package com.flyingbook.service; +package com.ruoyi.flyingbook.service; -import com.flyingbook.domain.Event; +import com.ruoyi.flyingbook.domain.Event; import java.util.List; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkCompanyRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java similarity index 94% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkCompanyRelationService.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java index 1d5a74b..9fbba5e 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkCompanyRelationService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java @@ -1,7 +1,7 @@ -package com.flyingbook.service; +package com.ruoyi.flyingbook.service; -import com.flyingbook.domain.LarkCompanyRelation; +import com.ruoyi.flyingbook.domain.LarkCompanyRelation; import java.util.List; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkTableRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java similarity index 94% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkTableRelationService.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java index 46dc468..22e6bdd 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/ILarkTableRelationService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java @@ -1,7 +1,7 @@ -package com.flyingbook.service; +package com.ruoyi.flyingbook.service; -import com.flyingbook.domain.LarkTableRelation; +import com.ruoyi.flyingbook.domain.LarkTableRelation; import java.util.List; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventLogServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventLogServiceImpl.java similarity index 91% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventLogServiceImpl.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventLogServiceImpl.java index 593e207..827a50c 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventLogServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventLogServiceImpl.java @@ -1,10 +1,10 @@ -package com.flyingbook.service.impl; +package com.ruoyi.flyingbook.service.impl; import java.util.List; -import com.flyingbook.domain.EventLog; -import com.flyingbook.mapper.EventLogMapper; -import com.flyingbook.service.IEventLogService; +import com.ruoyi.flyingbook.domain.EventLog; +import com.ruoyi.flyingbook.mapper.EventLogMapper; +import com.ruoyi.flyingbook.service.IEventLogService; import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java similarity index 91% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventServiceImpl.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java index 7eae668..98bd8b1 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/EventServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java @@ -1,9 +1,9 @@ -package com.flyingbook.service.impl; +package com.ruoyi.flyingbook.service.impl; -import com.flyingbook.domain.Event; -import com.flyingbook.mapper.EventMapper; -import com.flyingbook.service.IEventService; +import com.ruoyi.flyingbook.domain.Event; +import com.ruoyi.flyingbook.mapper.EventMapper; +import com.ruoyi.flyingbook.service.IEventService; import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java similarity index 92% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java index 885e1e2..30c489d 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java @@ -1,10 +1,10 @@ -package com.flyingbook.service.impl; +package com.ruoyi.flyingbook.service.impl; import java.util.List; -import com.flyingbook.domain.LarkCompanyRelation; -import com.flyingbook.mapper.LarkCompanyRelationMapper; -import com.flyingbook.service.ILarkCompanyRelationService; +import com.ruoyi.flyingbook.domain.LarkCompanyRelation; +import com.ruoyi.flyingbook.mapper.LarkCompanyRelationMapper; +import com.ruoyi.flyingbook.service.ILarkCompanyRelationService; import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkTableRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRelationServiceImpl.java similarity index 92% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkTableRelationServiceImpl.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRelationServiceImpl.java index d2e7876..4e5b2cc 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/service/impl/LarkTableRelationServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRelationServiceImpl.java @@ -1,10 +1,10 @@ -package com.flyingbook.service.impl; +package com.ruoyi.flyingbook.service.impl; import java.util.List; -import com.flyingbook.domain.LarkTableRelation; -import com.flyingbook.mapper.LarkTableRelationMapper; -import com.flyingbook.service.ILarkTableRelationService; +import com.ruoyi.flyingbook.domain.LarkTableRelation; +import com.ruoyi.flyingbook.mapper.LarkTableRelationMapper; +import com.ruoyi.flyingbook.service.ILarkTableRelationService; import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/ApprovalCallback.java similarity index 75% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/ApprovalCallback.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/ApprovalCallback.java index 5da8ea0..622c0a2 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/ApprovalCallback.java @@ -1,9 +1,9 @@ -package com.flyingbook.strategy; +package com.ruoyi.flyingbook.strategy; -import com.flyingbook.domain.Event; -import com.flyingbook.domain.EventLog; -import com.flyingbook.service.IEventLogService; -import com.flyingbook.service.IEventService; +import com.ruoyi.flyingbook.domain.Event; +import com.ruoyi.flyingbook.domain.EventLog; +import com.ruoyi.flyingbook.service.IEventLogService; +import com.ruoyi.flyingbook.service.IEventService; import com.ruoyi.common.base.LarkRequest; import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.enums.EventOperateStatus; @@ -12,7 +12,7 @@ import com.ruoyi.common.enums.FlagStatus; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import java.util.Date; @@ -21,7 +21,7 @@ import java.util.Date; * @create 2023-03-12 15:58 */ @Slf4j -@Component("approvalCallback") +@Service public class ApprovalCallback extends CallbackAbstract { @Autowired @@ -34,7 +34,7 @@ public class ApprovalCallback extends CallbackAbstract { @Override protected Boolean check(LarkRequest request) { String message = ""; - return Boolean.FALSE; + return Boolean.TRUE; } @Override @@ -44,7 +44,7 @@ public class ApprovalCallback extends CallbackAbstract { @Override protected void businessProcessing(LarkRequest request) { - String message = "aaa"; + String message = request.getMessage(); Event event = this.buildDto(message); int i = eventService.insertEvent(event); request.setEventId(event.getId()); @@ -53,13 +53,20 @@ public class ApprovalCallback extends CallbackAbstract { @Override protected void endHandle(LarkRequest request) { + if (request.getEventId() == null){ + return; + } redisTemplate.opsForList().rightPush(RedisConstants.MULTIDIMENSIONALTABULARFEEDBACK,request.getEventId()); EventLog eventLog = new EventLog(); + eventLog.setCreateBy("Syetem"); + eventLog.setCreateTime(new Date()); eventLog.setFlag(FlagStatus.OK.getCode()); eventLog.setOperateStatus(EventOperateStatus.PENDING.getCode()); eventLog.setOperateType(EventOperateType.CALL_BACK.getCode()); eventLog.setEventId(request.getEventId()); eventLogService.insertEventLog(eventLog); + Object o = redisTemplate.opsForList().leftPop(RedisConstants.MULTIDIMENSIONALTABULARFEEDBACK); + System.out.println(String.valueOf(o)); } @Override diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/CallbackAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/CallbackAbstract.java similarity index 85% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/CallbackAbstract.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/CallbackAbstract.java index 755f474..b2112fe 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/strategy/CallbackAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/CallbackAbstract.java @@ -1,4 +1,4 @@ -package com.flyingbook.strategy; +package com.ruoyi.flyingbook.strategy; import com.ruoyi.common.service.LarkOperateAbstract; import lombok.extern.slf4j.Slf4j; diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml index b6dfe2f..cbf0bcc 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml @@ -2,9 +2,9 @@ - + - + @@ -39,7 +39,7 @@ from event_log - and table_id = #{tableId} @@ -58,7 +58,7 @@ where id = #{id} - + insert into event_log table_id, @@ -92,7 +92,7 @@ - + update event_log table_id = #{tableId}, diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml index 436f8b0..324b436 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml @@ -2,9 +2,9 @@ - + - + @@ -27,7 +27,7 @@ from event - and message = #{message} @@ -40,7 +40,7 @@ where id = #{id} - + insert into event message, @@ -62,7 +62,7 @@ - + update event message = #{message}, diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml index b4ce635..256c298 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml @@ -2,9 +2,9 @@ - + - + @@ -33,7 +33,7 @@ from lark_company_relation - - + insert into lark_company_relation company_id, @@ -80,7 +80,7 @@ - + update lark_company_relation company_id = #{companyId}, diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml index 61a7477..553eaf5 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml @@ -2,9 +2,9 @@ - + - + @@ -33,7 +33,7 @@ from lark_table_relation - and lark_company_relation_id = #{larkCompanyRelationId} @@ -49,7 +49,7 @@ where id = #{id} - + insert into lark_table_relation lark_company_relation_id, @@ -77,7 +77,7 @@ - + update lark_table_relation lark_company_relation_id = #{larkCompanyRelationId}, From a4fb4bef4f6c74df84f0005e9f72b2bd166b179f Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Mon, 13 Mar 2023 20:41:24 +0800 Subject: [PATCH 04/37] =?UTF-8?q?=E6=89=93=E5=BC=80=E7=99=BD=E5=90=8D?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/LarkApplicationRunner.java | 107 ++++++++++++++++++ .../controller/EventController.java | 2 +- .../controller/EventControllers.java | 3 +- .../com/ruoyi/flyingbook/domain/Event.java | 14 ++- .../ruoyi/flyingbook/mapper/EventMapper.java | 6 + .../src/main/resources/mapper/EventMapper.xml | 21 +++- .../framework/config/SecurityConfig.java | 4 +- 7 files changed, 149 insertions(+), 8 deletions(-) create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java new file mode 100644 index 0000000..75a33e3 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -0,0 +1,107 @@ +package com.ruoyi.flyingbook.consumer; + +import cn.hutool.core.thread.ThreadFactoryBuilder; +import com.ruoyi.common.constant.RedisConstants; +import com.ruoyi.common.enums.EventOperateStatus; +import com.ruoyi.flyingbook.domain.Event; +import com.ruoyi.flyingbook.mapper.EventMapper; +import com.ruoyi.flyingbook.service.IEventService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author yuxiangyong + * @create 2023-03-12 23:04 + */ +@Slf4j +@Component +public class LarkApplicationRunner implements ApplicationRunner { + + + + /** + * 核心线程数 + */ + private static final Integer CORE_POOL_SIZE = 1; + /** + * 最大线程数 + */ + private static final Integer MAX_POOL_SIZE = 1; + /** + * 存活时间 + */ + private static final Integer KEEP_ALIVE_TIME = 30; + + /** + * 队列长度 + */ + private static final Integer QUEUE_SIZE = 20; + /** + * 线程睡眠时间 + */ + private static final Integer WAIT_TIME = 5000; + + @Autowired + private EventMapper eventMapper; + + ThreadPoolExecutor threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, + TimeUnit.SECONDS, new LinkedBlockingQueue(QUEUE_SIZE), new ThreadPoolExecutor.AbortPolicy()); + + @Override + public void run(ApplicationArguments args) throws Exception { + //这里用线程池,后续如果出现量大的情况下可以调整 +// threadPool.execute(() -> { +// +// while (true) { +// List statusList = Arrays.asList(EventOperateStatus.PENDING.getCode(),EventOperateStatus.FAIL.getCode()); +// List eventList = eventMapper.queryListOperate(statusList); +// if (CollectionUtils.isEmpty(eventList)) { +// try { +// // 没有订单,休息一下 +// Thread.sleep(WAIT_TIME); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } else { +// try { +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// }); + } + + private void operate(Event event){ + if (StringUtils.isNotBlank(event.getMessage())){ + queryAndOperate(event); + }else { + executeOperate(event); + } + } + + + private void queryAndOperate(Event event){ + + } + + private void executeOperate(Event event){ + + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index 0de8c0d..4b89f01 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -16,7 +16,6 @@ import org.springframework.web.bind.annotation.RequestMapping; @Slf4j @RestController -@RequestMapping("/event/test1") public class EventController extends BaseController { @Autowired @@ -30,6 +29,7 @@ public class EventController extends BaseController { log.error("没有值"); return result; } + log.info("/event/test1/approval request:{} encrypt:{}", jsonObject.toJSONString(), result); if (jsonObject.containsKey("encrypt")) { result = DecryptUtil.decrypt(jsonObject.getString("encrypt")); log.info("/event/test1/approval request:{} encrypt:{}", jsonObject.toJSONString(), result); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java index 6c6cdca..5d649e0 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java @@ -31,7 +31,6 @@ import java.util.Map; @Slf4j @RestController -@RequestMapping("/event/test2") public class EventControllers { @@ -174,7 +173,7 @@ public class EventControllers { private ServletAdapter servletAdapter; //3. 创建路由处理器 - @PostMapping("/approval") + @PostMapping("/approval2") public void event(HttpServletRequest request, HttpServletResponse response) throws Throwable { //3.1 回调扩展包提供的事件回调处理器 diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java index 56a86a8..a125290 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java @@ -17,7 +17,8 @@ public class Event extends BaseEntity /** $column.columnComment */ private Long id; - + private Integer numbers; + private String eventCode; /** $column.columnComment */ @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String message; @@ -26,7 +27,15 @@ public class Event extends BaseEntity @Excel(name = "pendingsuccessfaild") private String flag; - public void setId(Long id) + public Integer getNumbers() { + return numbers; + } + + public void setNumbers(Integer numbers) { + this.numbers = numbers; + } + + public void setId(Long id) { this.id = id; } @@ -59,6 +68,7 @@ public class Event extends BaseEntity return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("id", getId()) .append("message", getMessage()) + .append("numbers", getMessage()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java index 3f237e4..4cd1e18 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.flyingbook.mapper; import com.ruoyi.flyingbook.domain.Event; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -60,4 +61,9 @@ public interface EventMapper * @return 结果 */ public int deleteEventByIds(Long[] ids); + + /** + * 查询需要推送的列表信息 + */ + public List queryListOperate(@Param("statusList") List statusList); } diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml index 324b436..0a792d3 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml @@ -6,7 +6,9 @@ + + @@ -17,7 +19,9 @@ select id, + event_code, message, + numbers, create_by, create_time, update_by, @@ -43,7 +47,9 @@ insert into event + event_code, message, + numbers, create_by, create_time, update_by, @@ -52,7 +58,9 @@ remark, + #{event_code}, #{message}, + #{numbers}, #{createBy}, #{createTime}, #{updateBy}, @@ -65,7 +73,9 @@ update event - message = #{message}, + message = #{event_code}, + message = #{message}, + message = #{numbers}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, @@ -88,4 +98,13 @@ #{id} + + \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index c8e1c1b..e618f63 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter // 过滤请求 .authorizeRequests() // 对于登录login 验证码captchaImage 允许匿名访问 - .antMatchers("/login", "/captchaImage").anonymous() + .antMatchers("/login", "/captchaImage", "/approval", "/approval2").anonymous() .antMatchers( HttpMethod.GET, "/*.html", @@ -115,7 +115,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .antMatchers("/druid/**").anonymous() .antMatchers("/flowable/**").permitAll() .antMatchers("/socket/**").permitAll() - .antMatchers("/event/**").permitAll() + .antMatchers("//event/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() From bfa4fe19209ca915e51c301c564594536fbe2ba2 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Mon, 13 Mar 2023 22:54:38 +0800 Subject: [PATCH 05/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/base/LarkRequest.java | 13 --- .../common/constant/CompanyNameConstants.java | 14 +++ .../LarkHelper/LarkTokenHelper.java | 44 ++++++--- .../consumer/LarkApplicationRunner.java | 67 ++++++-------- .../controller/EventController.java | 5 +- .../com/ruoyi/flyingbook/domain/Event.java | 8 ++ .../ruoyi/flyingbook/domain/LarkRequest.java | 30 ++++++ .../service/ILarkCompanyRelationService.java | 2 + .../impl/LarkCompanyRelationServiceImpl.java | 19 ++++ .../strategy}/LarkOperateAbstract.java | 4 +- .../{ => callback}/ApprovalCallback.java | 5 +- .../{ => callback}/CallbackAbstract.java | 4 +- .../strategy/operate/LarkAbstract.java | 33 +++++++ .../operate/MultidimensionalTableOperate.java | 92 +++++++++++++++++++ .../framework/config/SecurityConfig.java | 1 - 15 files changed, 269 insertions(+), 72 deletions(-) delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/CompanyNameConstants.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java rename {ruoyi-common/src/main/java/com/ruoyi/common/service => ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy}/LarkOperateAbstract.java (94%) rename ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/{ => callback}/ApprovalCallback.java (95%) rename ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/{ => callback}/CallbackAbstract.java (62%) create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java b/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java deleted file mode 100644 index 728456a..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/base/LarkRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.ruoyi.common.base; - -import lombok.Data; - -/** - * @author yuxiangyong - * @create 2023-03-12 16:00 - */ -@Data -public class LarkRequest { - private Long eventId; - private String message; -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CompanyNameConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CompanyNameConstants.java new file mode 100644 index 0000000..5b89d6e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CompanyNameConstants.java @@ -0,0 +1,14 @@ +package com.ruoyi.common.constant; + +/** + * @author yuxiangyong + * @create 2023-03-12 19:30 + */ +public class CompanyNameConstants { + + /** + * 公司名称 + */ + public static final String COMPANY_NAME = "COMPANY_NAME"; + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java index aa04d6c..f4205a5 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import okhttp3.*; +import org.springframework.stereotype.Component; import java.io.IOException; import java.util.HashMap; @@ -15,6 +16,7 @@ import java.util.concurrent.TimeUnit; * @create 2023-03-12 18:10 */ @Slf4j +@Component public class LarkTokenHelper { private static OkHttpClient client = new OkHttpClient().newBuilder() @@ -24,14 +26,14 @@ public class LarkTokenHelper { .build(); - public String getToken(String url, String appId, String srcret) { + public String getToken(String appId, String srcret) { Response execute = null; Map map = new HashMap<>(); map.put("app_id", appId); map.put("app_secret", srcret); Request request = new Request.Builder() .method("POST", RequestBody.create(JSONObject.toJSONString(map), MediaType.get("application/json"))) - .url(url) + .url("https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal") .build(); try { execute = client.newCall(request).execute(); @@ -44,18 +46,37 @@ public class LarkTokenHelper { return null; } - public String select(String url,String appToken,String tableId, String token) { - url = url.replace(":app_token",appToken) - .replace(":table_id",tableId); - System.out.println(url); + /** + * @param url + * @param token + * @return + */ + public String getLark(String url,Map body, String token) { Response execute = null; - Map map = new HashMap<>(); - map.put("view_id","vewulwhFVT"); Request request = new Request.Builder() - .method("POST", RequestBody.create(JSONObject.toJSONString(map), MediaType.get("application/json"))) .url(url) .addHeader("Authorization",String.format("Bearer %s",token)) .build(); + try { + execute = client.newCall(request).execute(); + log.info(JSONObject.toJSONString(execute.body().string())); + if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { + return execute.body().string(); + } + } catch (IOException e) { + log.error("http get 请求失败--{}", e); + } + return null; + } + + public String postLark(String url,Map body, String token) { + Response execute = null; + Request request = new Request.Builder() + .method("POST", RequestBody + .create(JSONObject.toJSONString(body), MediaType.get("application/json"))) + .url(url) +// .addHeader("Authorization",String.format("Bearer %s",token)) + .build(); try { execute = client.newCall(request).execute(); if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { @@ -69,10 +90,9 @@ public class LarkTokenHelper { public static void main(String[] args) { LarkTokenHelper helper = new LarkTokenHelper(); - String token = helper.getToken("https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal", "cli_a482a8572cbc9013", "lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos"); + String token = helper.getToken( "cli_a482a8572cbc9013", "lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos"); System.out.println(token); JSONObject jsonObject = JSONObject.parseObject(token); - String select = helper.select("https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records", "wikcnC7aay4PnFKQ4h3Wkp3tauc", "tblypnmCCE9txNfn", jsonObject.getString("tenant_access_token")); - System.out.println(select); + helper.getLark("https://open.feishu.cn/open-apis/approval/v4/instances/81D31358-93AF-92D6-7425-01A5D67C4E71",null,jsonObject.getString("tenant_access_token")); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index 75a33e3..53be82d 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -4,8 +4,10 @@ import cn.hutool.core.thread.ThreadFactoryBuilder; import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.enums.EventOperateStatus; import com.ruoyi.flyingbook.domain.Event; +import com.ruoyi.flyingbook.domain.LarkRequest; import com.ruoyi.flyingbook.mapper.EventMapper; import com.ruoyi.flyingbook.service.IEventService; +import com.ruoyi.flyingbook.strategy.operate.MultidimensionalTableOperate; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.compress.utils.Lists; @@ -59,49 +61,40 @@ public class LarkApplicationRunner implements ApplicationRunner { @Autowired private EventMapper eventMapper; + @Autowired + private MultidimensionalTableOperate multidimensionalTableOperate; + ThreadPoolExecutor threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingQueue(QUEUE_SIZE), new ThreadPoolExecutor.AbortPolicy()); @Override public void run(ApplicationArguments args) throws Exception { //这里用线程池,后续如果出现量大的情况下可以调整 -// threadPool.execute(() -> { -// -// while (true) { -// List statusList = Arrays.asList(EventOperateStatus.PENDING.getCode(),EventOperateStatus.FAIL.getCode()); -// List eventList = eventMapper.queryListOperate(statusList); -// if (CollectionUtils.isEmpty(eventList)) { -// try { -// // 没有订单,休息一下 -// Thread.sleep(WAIT_TIME); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } else { -// try { -// -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// }); - } - - private void operate(Event event){ - if (StringUtils.isNotBlank(event.getMessage())){ - queryAndOperate(event); - }else { - executeOperate(event); - } - } - - - private void queryAndOperate(Event event){ - + threadPool.execute(() -> { + + while (true) { + List statusList = Arrays.asList(EventOperateStatus.PENDING.getCode(),EventOperateStatus.FAIL.getCode()); + List eventList = eventMapper.queryListOperate(statusList); + if (CollectionUtils.isEmpty(eventList)) { + try { + // 没有订单,休息一下 + Thread.sleep(WAIT_TIME); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + try { + for (Event event : eventList) { + LarkRequest request = new LarkRequest(); + request.setEvent(event); + multidimensionalTableOperate.execute(request); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }); } - private void executeOperate(Event event){ - - } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index 4b89f01..021e186 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -1,17 +1,16 @@ package com.ruoyi.flyingbook.controller; import com.alibaba.fastjson.JSONObject; -import com.ruoyi.common.base.LarkRequest; +import com.ruoyi.flyingbook.domain.LarkRequest; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.utils.DecryptUtil; -import com.ruoyi.flyingbook.strategy.ApprovalCallback; +import com.ruoyi.flyingbook.strategy.callback.ApprovalCallback; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; @Slf4j diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java index a125290..64899e8 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java @@ -63,6 +63,14 @@ public class Event extends BaseEntity return flag; } + public String getEventCode() { + return eventCode; + } + + public void setEventCode(String eventCode) { + this.eventCode = eventCode; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java new file mode 100644 index 0000000..23a29eb --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java @@ -0,0 +1,30 @@ +package com.ruoyi.flyingbook.domain; + +import lombok.Data; + +/** + * @author yuxiangyong + * @create 2023-03-12 16:00 + */ +@Data +public class LarkRequest { + + /** + * 通用信息,不可修改不可删除 + */ + private String token; + private String appId; + private String url; + private String errorMessage; + + /** + * ApprovalCallback 用参数 + */ + private Long eventId; + private String message; + + /** + * MultidimensionalTableOperate 用参数 + */ + private Event event; +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java index 9fbba5e..a324994 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java @@ -60,4 +60,6 @@ public interface ILarkCompanyRelationService * @return 结果 */ public int deleteLarkCompanyRelationById(Long id); + + public LarkCompanyRelation getByCompanyName(String companyName); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java index 30c489d..ffac965 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java @@ -2,10 +2,12 @@ package com.ruoyi.flyingbook.service.impl; import java.util.List; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.flyingbook.domain.LarkCompanyRelation; import com.ruoyi.flyingbook.mapper.LarkCompanyRelationMapper; import com.ruoyi.flyingbook.service.ILarkCompanyRelationService; import com.ruoyi.common.utils.DateUtils; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -94,4 +96,21 @@ public class LarkCompanyRelationServiceImpl implements ILarkCompanyRelationServi { return larkCompanyRelationMapper.deleteLarkCompanyRelationById(id); } + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + @Override + public LarkCompanyRelation getByCompanyName(String companyName) + { + if (StringUtils.isEmpty(companyName)){ + return null; + } + LarkCompanyRelation relation = new LarkCompanyRelation(); + List larkCompanyRelations = larkCompanyRelationMapper.selectLarkCompanyRelationList(relation); + return CollectionUtils.isEmpty(larkCompanyRelations) ? null : larkCompanyRelations.get(0); + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java similarity index 94% rename from ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java index c4811dd..309af69 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/service/LarkOperateAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java @@ -1,6 +1,6 @@ -package com.ruoyi.common.service; +package com.ruoyi.flyingbook.strategy; -import com.ruoyi.common.base.LarkRequest; +import com.ruoyi.flyingbook.domain.LarkRequest; import lombok.extern.slf4j.Slf4j; /** diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java similarity index 95% rename from ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/ApprovalCallback.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index 622c0a2..d416731 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -1,10 +1,10 @@ -package com.ruoyi.flyingbook.strategy; +package com.ruoyi.flyingbook.strategy.callback; import com.ruoyi.flyingbook.domain.Event; import com.ruoyi.flyingbook.domain.EventLog; import com.ruoyi.flyingbook.service.IEventLogService; import com.ruoyi.flyingbook.service.IEventService; -import com.ruoyi.common.base.LarkRequest; +import com.ruoyi.flyingbook.domain.LarkRequest; import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.enums.EventOperateStatus; import com.ruoyi.common.enums.EventOperateType; @@ -85,6 +85,7 @@ public class ApprovalCallback extends CallbackAbstract { Event event = new Event(); event.setFlag(EventOperateStatus.PENDING.getCode()); event.setMessage(message); + event.setEventCode("test"); event.setCreateBy("System"); event.setCreateTime(new Date()); return event; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/CallbackAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/CallbackAbstract.java similarity index 62% rename from ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/CallbackAbstract.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/CallbackAbstract.java index b2112fe..deca072 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/CallbackAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/CallbackAbstract.java @@ -1,6 +1,6 @@ -package com.ruoyi.flyingbook.strategy; +package com.ruoyi.flyingbook.strategy.callback; -import com.ruoyi.common.service.LarkOperateAbstract; +import com.ruoyi.flyingbook.strategy.LarkOperateAbstract; import lombok.extern.slf4j.Slf4j; /** diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java new file mode 100644 index 0000000..f03a8b6 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java @@ -0,0 +1,33 @@ +package com.ruoyi.flyingbook.strategy.operate; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.strategy.LarkOperateAbstract; +import org.apache.commons.lang3.StringUtils; + +import java.util.Map; + +/** + * @author yuxiangyong + * @create 2023-03-13 20:45 + */ +public abstract class LarkAbstract extends LarkOperateAbstract { + + + /** + * 获取URL地址 + */ + protected abstract String getUrl(LarkRequest request); + /** + * 获取body体 + */ + protected abstract Map getBody(String message); + + /** + * 文本解析 + */ + protected abstract JSONObject send(String url,Map body,String token); + + + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java new file mode 100644 index 0000000..24a49a8 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -0,0 +1,92 @@ +package com.ruoyi.flyingbook.strategy.operate; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.constant.CompanyNameConstants; +import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper; +import com.ruoyi.flyingbook.domain.Event; +import com.ruoyi.flyingbook.domain.LarkCompanyRelation; +import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.service.IEventService; +import com.ruoyi.flyingbook.service.ILarkCompanyRelationService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + + +/** + * 多维表格操作类 + * @author yuxiangyong + * @create 2023-03-13 20:47 + */ +@Component("MultidimensionalTableOperate") +public class MultidimensionalTableOperate extends LarkAbstract { + + @Autowired + protected LarkTokenHelper larkTokenHelper; + @Autowired + protected ILarkCompanyRelationService larkCompanyRelationService; + @Autowired + protected IEventService iEventService; + + private String getDetailUrl = "https://open.feishu.cn/open-apis/approval/v4/instances/:instance_id"; + + @Override + protected void preOperate(LarkRequest request) { + Event event = request.getEvent(); + if (event == null) { + return; + } + LarkCompanyRelation relation = larkCompanyRelationService.getByCompanyName(CompanyNameConstants.COMPANY_NAME); + if (relation == null) { + return; + } + String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret()); + if (StringUtils.isBlank(token)) { + return; + } + request.setToken(token); + if (StringUtils.isNotBlank(event.getMessage())) { + return; + } + getDetailUrl.replace(":instance_id", "aaa"); + String message = larkTokenHelper.postLark(getDetailUrl, null, token); + event.setMessage(message); + } + + @Override + protected void businessProcessing(LarkRequest request) { + if (StringUtils.isBlank(request.getToken()) || request.getEvent() == null || StringUtils.isBlank(request.getEvent().getMessage())) { + return; + } + send(getUrl(request), getBody(request.getMessage()), request.getToken()); + } + + @Override + protected String getUrl(LarkRequest request) { + return null; + } + + @Override + protected Map getBody(String message) { + return null; + } + + @Override + protected JSONObject send(String url, Map body, String token) { + larkTokenHelper.postLark(url,body,token); + return null; + } + + @Override + protected String buildResult(LarkRequest request) { + return null; + } + + @Override + protected String getName() { + return this.getClass().getSimpleName(); + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index e618f63..aa0b33c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -115,7 +115,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .antMatchers("/druid/**").anonymous() .antMatchers("/flowable/**").permitAll() .antMatchers("/socket/**").permitAll() - .antMatchers("//event/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() From fed3b370006037a1b86e85fe88e0268976c03aea Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Wed, 15 Mar 2023 00:40:22 +0800 Subject: [PATCH 06/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5(=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/constant/RedisConstants.java | 8 +- .../java/com/ruoyi/common/enums/AppType.java | 29 ++++ .../LarkHelper/LarkTokenHelper.java | 60 +++++++- .../MultidimensionalTableParamHelper.java | 77 +++++++++++ .../consumer/LarkApplicationRunner.java | 50 +++---- .../com/ruoyi/flyingbook/domain/Event.java | 98 +++++++++---- .../com/ruoyi/flyingbook/domain/EventLog.java | 86 +++--------- .../domain/LarkCompanyRelation.java | 16 ++- .../ruoyi/flyingbook/domain/LarkRequest.java | 11 +- .../flyingbook/domain/LarkTableRelation.java | 44 ++++-- .../mapper/LarkTableRelationMapper.java | 2 + .../service/ILarkCompanyRelationService.java | 2 +- .../service/ILarkTableRelationService.java | 1 + .../impl/LarkCompanyRelationServiceImpl.java | 6 +- .../impl/LarkTableRelationServiceImpl.java | 3 + .../strategy/callback/ApprovalCallback.java | 79 ++++++++--- .../strategy/operate/LarkAbstract.java | 4 +- .../operate/MultidimensionalTableOperate.java | 130 ++++++++++++++++-- .../main/resources/mapper/EventLogMapper.xml | 102 +++++--------- .../src/main/resources/mapper/EventMapper.xml | 110 +++++++-------- .../mapper/LarkCompanyRelationMapper.xml | 85 +++++------- .../mapper/LarkTableRelationMapper.xml | 93 ++++++------- .../system/domain/LarkCallbackRequest.java | 11 -- sql/lark.sql | 104 +++++++------- 24 files changed, 763 insertions(+), 448 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/MultidimensionalTableParamHelper.java delete mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/LarkCallbackRequest.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java index f5d3e58..993bfff 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java @@ -7,7 +7,7 @@ package com.ruoyi.common.constant; public class RedisConstants { public static void main(String[] args) { - System.out.println("Multidimensional tabular feedback".replaceAll(" ","").toUpperCase()); + System.out.println("multiple tabular feedback".replaceAll(" ","").toUpperCase()); } /** @@ -15,4 +15,10 @@ public class RedisConstants { */ public static final String MULTIDIMENSIONALTABULARFEEDBACK = "MULTIDIMENSIONALTABULARFEEDBACK"; + + /** + * 多维表格更新记录 + */ + public static final String MULTIPLE_TABLE_RECORD = "MULTIPLE_TABLE_RECORD"; + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java new file mode 100644 index 0000000..c20761e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java @@ -0,0 +1,29 @@ +package com.ruoyi.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum AppType { + /** + * + */ + APPROVAL("APPROVAL", "多维表格"); + + private final String code; + private final String info; + + AppType(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java index f4205a5..c461be8 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java @@ -39,6 +39,8 @@ public class LarkTokenHelper { execute = client.newCall(request).execute(); if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { return execute.body().string(); + }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ + System.out.println(execute.body()); } } catch (IOException e) { log.error("http post 请求失败--{}", e); @@ -62,6 +64,8 @@ public class LarkTokenHelper { log.info(JSONObject.toJSONString(execute.body().string())); if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { return execute.body().string(); + }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ + System.out.println(execute.body()); } } catch (IOException e) { log.error("http get 请求失败--{}", e); @@ -75,12 +79,59 @@ public class LarkTokenHelper { .method("POST", RequestBody .create(JSONObject.toJSONString(body), MediaType.get("application/json"))) .url(url) -// .addHeader("Authorization",String.format("Bearer %s",token)) + .addHeader("Authorization",String.format("Bearer %s",token)) + .build(); + try { + execute = client.newCall(request).execute(); + if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { + return execute.body().string(); + }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ + System.out.println(execute.body()); + } + } catch (IOException e) { + log.error("http post 请求失败--{}", e); + } + return null; + } + + public String putLark(String url,Map body, String token) { + Response execute = null; + Request request = new Request.Builder() + .put(RequestBody + .create(JSONObject.toJSONString(body), MediaType.get("application/json"))) + .url(url) + .addHeader("Authorization",String.format("Bearer %s",token)) .build(); try { execute = client.newCall(request).execute(); if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { return execute.body().string(); + }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ + System.out.println(execute.body()); + } + } catch (IOException e) { + log.error("http post 请求失败--{}", e); + } + return null; + } + + public String deleteLark(String url,Map body, String token) { + Response execute = null; + Request.Builder builder = new Request.Builder() + .url(url) + .addHeader("Authorization", String.format("Bearer %s", token)); + if (body == null || body.isEmpty()){ + builder.delete(); + }else { + builder.delete(RequestBody + .create(JSONObject.toJSONString(body), MediaType.get("application/json"))); + } + try { + execute = client.newCall(builder.build()).execute(); + if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { + return execute.body().string(); + }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ + System.out.println(execute.body()); } } catch (IOException e) { log.error("http post 请求失败--{}", e); @@ -93,6 +144,11 @@ public class LarkTokenHelper { String token = helper.getToken( "cli_a482a8572cbc9013", "lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos"); System.out.println(token); JSONObject jsonObject = JSONObject.parseObject(token); - helper.getLark("https://open.feishu.cn/open-apis/approval/v4/instances/81D31358-93AF-92D6-7425-01A5D67C4E71",null,jsonObject.getString("tenant_access_token")); + Map map = new HashMap<>(); + JSONObject b = new JSONObject(); + map.put("fields",b); + b.put("多行文本","345"); + helper.putLark("https://open.feishu.cn/open-apis/bitable/v1/apps/Gyu1b8VAFaYiEysfEUjcCKomnVc/tables/tbloMVR0ACW2uO33/records/rece1nuKGU",map,jsonObject.getString("tenant_access_token")); + } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/MultidimensionalTableParamHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/MultidimensionalTableParamHelper.java new file mode 100644 index 0000000..881b903 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/MultidimensionalTableParamHelper.java @@ -0,0 +1,77 @@ +package com.ruoyi.flyingbook.LarkHelper; + +/** + * @author yuxiangyong + * @create 2023-03-14 21:24 + */ +public class MultidimensionalTableParamHelper { + + public static Object analyseParam(String param,Integer type){ + Object result = null; + switch (type){ + case 1: + //多行文本 + break; + case 2: + //数字 + break; + case 3: + //单选 + break; + case 4: + //多选 + break; + case 5: + //日期 + break; + case 7: + //复选框 + break; + case 11: + //人员 + break; + case 13: + //电话号码 + break; + case 15: + //超链接 + break; + case 17: + //附件 + break; + case 18: + //单向关联 + break; + case 19: + //查找引用 + break; + case 20: + //公式 + break; + case 21: + //双向关联 + break; + case 22: + //地理位置 + break; + case 1001: + //创建时间 + break; + case 1002: + //最后更新时间 + break; + case 1003: + //创建人 + break; + case 1004: + //修改人 + break; + case 1005: + //自动编号 + break; + + } + return result; + } + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index 53be82d..5b06b53 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -70,31 +70,31 @@ public class LarkApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { //这里用线程池,后续如果出现量大的情况下可以调整 - threadPool.execute(() -> { - - while (true) { - List statusList = Arrays.asList(EventOperateStatus.PENDING.getCode(),EventOperateStatus.FAIL.getCode()); - List eventList = eventMapper.queryListOperate(statusList); - if (CollectionUtils.isEmpty(eventList)) { - try { - // 没有订单,休息一下 - Thread.sleep(WAIT_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } else { - try { - for (Event event : eventList) { - LarkRequest request = new LarkRequest(); - request.setEvent(event); - multidimensionalTableOperate.execute(request); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - }); +// threadPool.execute(() -> { +// +// while (true) { +// List statusList = Arrays.asList(EventOperateStatus.PENDING.getCode(),EventOperateStatus.FAIL.getCode()); +// List eventList = eventMapper.queryListOperate(statusList); +// if (CollectionUtils.isEmpty(eventList)) { +// try { +// // 没有订单,休息一下 +// Thread.sleep(WAIT_TIME); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } else { +// try { +// for (Event event : eventList) { +// LarkRequest request = new LarkRequest(); +// request.setEvent(event); +// multidimensionalTableOperate.execute(request); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// }); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java index 64899e8..eb9db22 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java @@ -9,7 +9,7 @@ import com.ruoyi.common.core.domain.BaseEntity; * 【请填写功能名称】对象 event * * @author ruoyi - * @date 2023-03-12 + * @date 2023-03-14 */ public class Event extends BaseEntity { @@ -17,25 +17,36 @@ public class Event extends BaseEntity /** $column.columnComment */ private Long id; - private Integer numbers; - private String eventCode; + + /** id */ + @Excel(name = "id") + private String appToken; + + /** id */ + @Excel(name = "id") + private String tableId; + + /** id */ + @Excel(name = "id") + private String recordId; + /** $column.columnComment */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + @Excel(name = "id") private String message; - /** pendingsuccessfaild */ - @Excel(name = "pendingsuccessfaild") - private String flag; + /** $column.columnComment */ + @Excel(name = "id") + private Long numbers; - public Integer getNumbers() { - return numbers; - } + /** (pendingsuccessfail) */ + @Excel(name = "(pendingsuccessfail)") + private String operateStatus; - public void setNumbers(Integer numbers) { - this.numbers = numbers; - } + /** (01) */ + @Excel(name = "(01)") + private Long flag; - public void setId(Long id) + public void setId(Long id) { this.id = id; } @@ -44,6 +55,33 @@ public class Event extends BaseEntity { return id; } + public void setAppToken(String appToken) + { + this.appToken = appToken; + } + + public String getAppToken() + { + return appToken; + } + public void setTableId(String tableId) + { + this.tableId = tableId; + } + + public String getTableId() + { + return tableId; + } + public void setRecordId(String recordId) + { + this.recordId = recordId; + } + + public String getRecordId() + { + return recordId; + } public void setMessage(String message) { this.message = message; @@ -53,30 +91,44 @@ public class Event extends BaseEntity { return message; } - public void setFlag(String flag) + public void setNumbers(Long numbers) { - this.flag = flag; + this.numbers = numbers; } - public String getFlag() + public Long getNumbers() { - return flag; + return numbers; + } + public void setOperateStatus(String operateStatus) + { + this.operateStatus = operateStatus; } - public String getEventCode() { - return eventCode; + public String getOperateStatus() + { + return operateStatus; + } + public void setFlag(Long flag) + { + this.flag = flag; } - public void setEventCode(String eventCode) { - this.eventCode = eventCode; + public Long getFlag() + { + return flag; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("id", getId()) + .append("appToken", getAppToken()) + .append("tableId", getTableId()) + .append("recordId", getRecordId()) .append("message", getMessage()) - .append("numbers", getMessage()) + .append("numbers", getNumbers()) + .append("operateStatus", getOperateStatus()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java index a84d57b..d19cf2d 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java @@ -5,51 +5,47 @@ import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; +import java.util.Date; + /** * 【请填写功能名称】对象 event_log * * @author ruoyi - * @date 2023-03-12 + * @date 2023-03-14 */ public class EventLog extends BaseEntity { private static final long serialVersionUID = 1L; - /** $column.columnComment */ - private Long id; + public EventLog() { + } - /** id */ - @Excel(name = "id") - private String tableId; + public EventLog(Long eventId, String operateType) { + this.eventId = eventId; + this.operateType = operateType; + this.setCreateBy("SYSTEM"); + this.setCreateTime(new Date()); + } - /** id */ - @Excel(name = "id") - private String recordId; + /** $column.columnComment */ + private Long id; - /** id */ - @Excel(name = "id") + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private Long eventId; /** $column.columnComment */ - @Excel(name = "id") + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String operateType; /** $column.columnComment */ - @Excel(name = "id") - private String operateStatus; - - /** $column.columnComment */ - @Excel(name = "id") + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String errorCode; /** $column.columnComment */ - @Excel(name = "id") + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String errorMessage; - /** 01 */ - @Excel(name = "01") - private Long flag; - public void setId(Long id) { this.id = id; @@ -59,30 +55,12 @@ public class EventLog extends BaseEntity { return id; } - public void setTableId(String tableId) - { - this.tableId = tableId; - } - - public String getTableId() - { - return tableId; - } - public void setRecordId(String recordId) - { - this.recordId = recordId; - } - - public String getRecordId() - { - return recordId; - } - public void setEventId(Long eventId) + public void setEventId(Long eventId) { this.eventId = eventId; } - public Long getEventId() + public Long getEventId() { return eventId; } @@ -95,15 +73,6 @@ public class EventLog extends BaseEntity { return operateType; } - public void setOperateStatus(String operateStatus) - { - this.operateStatus = operateStatus; - } - - public String getOperateStatus() - { - return operateStatus; - } public void setErrorCode(String errorCode) { this.errorCode = errorCode; @@ -122,33 +91,20 @@ public class EventLog extends BaseEntity { return errorMessage; } - public void setFlag(Long flag) - { - this.flag = flag; - } - - public Long getFlag() - { - return flag; - } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("id", getId()) - .append("tableId", getTableId()) - .append("recordId", getRecordId()) .append("eventId", getEventId()) .append("operateType", getOperateType()) - .append("operateStatus", getOperateStatus()) .append("errorCode", getErrorCode()) .append("errorMessage", getErrorMessage()) + .append("remark", getRemark()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) - .append("flag", getFlag()) - .append("remark", getRemark()) .toString(); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java index d9e03b6..b6a77ed 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java @@ -9,7 +9,7 @@ import com.ruoyi.common.core.domain.BaseEntity; * 【请填写功能名称】对象 lark_company_relation * * @author ruoyi - * @date 2023-03-12 + * @date 2023-03-14 */ public class LarkCompanyRelation extends BaseEntity { @@ -34,6 +34,10 @@ public class LarkCompanyRelation extends BaseEntity @Excel(name = "+appId") private String secret; + /** app */ + @Excel(name = "app") + private String appType; + /** 01 */ @Excel(name = "01") private Long flag; @@ -83,6 +87,15 @@ public class LarkCompanyRelation extends BaseEntity { return secret; } + public void setAppType(String appType) + { + this.appType = appType; + } + + public String getAppType() + { + return appType; + } public void setFlag(Long flag) { this.flag = flag; @@ -101,6 +114,7 @@ public class LarkCompanyRelation extends BaseEntity .append("companyName", getCompanyName()) .append("appId", getAppId()) .append("secret", getSecret()) + .append("appType", getAppType()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java index 23a29eb..ba7fb3e 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java @@ -2,6 +2,9 @@ package com.ruoyi.flyingbook.domain; import lombok.Data; +import java.util.List; +import java.util.Map; + /** * @author yuxiangyong * @create 2023-03-12 16:00 @@ -13,8 +16,7 @@ public class LarkRequest { * 通用信息,不可修改不可删除 */ private String token; - private String appId; - private String url; + private String appToken; private String errorMessage; /** @@ -26,5 +28,10 @@ public class LarkRequest { /** * MultidimensionalTableOperate 用参数 */ + private String tableId; + private String recordId; + private String operateType; + private String callBackMessage; private Event event; + private Map> tableRelationMap; } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java index 5f1f7bc..6bb00eb 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java @@ -9,7 +9,7 @@ import com.ruoyi.common.core.domain.BaseEntity; * 【请填写功能名称】对象 lark_table_relation * * @author ruoyi - * @date 2023-03-12 + * @date 2023-03-14 */ public class LarkTableRelation extends BaseEntity { @@ -26,13 +26,21 @@ public class LarkTableRelation extends BaseEntity @Excel(name = "id") private String fromTableId; + /** toColName */ + @Excel(name = "toColName") + private String fromColName; + /** $column.columnComment */ - @Excel(name = "id") + @Excel(name = "toColName") private String toTableId; /** url */ @Excel(name = "url") - private Long url; + private String toColName; + + /** $column.columnComment */ + @Excel(name = "url") + private Long colType; /** 01 */ @Excel(name = "01") @@ -65,6 +73,15 @@ public class LarkTableRelation extends BaseEntity { return fromTableId; } + public void setFromColName(String fromColName) + { + this.fromColName = fromColName; + } + + public String getFromColName() + { + return fromColName; + } public void setToTableId(String toTableId) { this.toTableId = toTableId; @@ -74,14 +91,23 @@ public class LarkTableRelation extends BaseEntity { return toTableId; } - public void setUrl(Long url) + public void setToColName(String toColName) + { + this.toColName = toColName; + } + + public String getToColName() + { + return toColName; + } + public void setColType(Long colType) { - this.url = url; + this.colType = colType; } - public Long getUrl() + public Long getColType() { - return url; + return colType; } public void setFlag(Long flag) { @@ -99,8 +125,10 @@ public class LarkTableRelation extends BaseEntity .append("id", getId()) .append("larkCompanyRelationId", getLarkCompanyRelationId()) .append("fromTableId", getFromTableId()) + .append("fromColName", getFromColName()) .append("toTableId", getToTableId()) - .append("url", getUrl()) + .append("toColName", getToColName()) + .append("colType", getColType()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java index 9efe617..227fb05 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.flyingbook.mapper; import com.ruoyi.flyingbook.domain.LarkTableRelation; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -60,4 +61,5 @@ public interface LarkTableRelationMapper * @return 结果 */ public int deleteLarkTableRelationByIds(Long[] ids); + } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java index a324994..c26a4ed 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java @@ -61,5 +61,5 @@ public interface ILarkCompanyRelationService */ public int deleteLarkCompanyRelationById(Long id); - public LarkCompanyRelation getByCompanyName(String companyName); + public LarkCompanyRelation getByCompanyName(String companyName,String appType); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java index 22e6bdd..abcf626 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java @@ -60,4 +60,5 @@ public interface ILarkTableRelationService * @return 结果 */ public int deleteLarkTableRelationById(Long id); + } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java index ffac965..c8ad2f8 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java @@ -104,12 +104,14 @@ public class LarkCompanyRelationServiceImpl implements ILarkCompanyRelationServi * @return 【请填写功能名称】 */ @Override - public LarkCompanyRelation getByCompanyName(String companyName) + public LarkCompanyRelation getByCompanyName(String companyName,String appType) { - if (StringUtils.isEmpty(companyName)){ + if (StringUtils.isEmpty(companyName) || StringUtils.isEmpty(appType)){ return null; } LarkCompanyRelation relation = new LarkCompanyRelation(); + relation.setCompanyName(companyName); + relation.setAppType(appType); List larkCompanyRelations = larkCompanyRelationMapper.selectLarkCompanyRelationList(relation); return CollectionUtils.isEmpty(larkCompanyRelations) ? null : larkCompanyRelations.get(0); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRelationServiceImpl.java index 4e5b2cc..36ad050 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRelationServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRelationServiceImpl.java @@ -1,7 +1,9 @@ package com.ruoyi.flyingbook.service.impl; +import java.util.ArrayList; import java.util.List; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.flyingbook.domain.LarkTableRelation; import com.ruoyi.flyingbook.mapper.LarkTableRelationMapper; import com.ruoyi.flyingbook.service.ILarkTableRelationService; @@ -94,4 +96,5 @@ public class LarkTableRelationServiceImpl implements ILarkTableRelationService { return larkTableRelationMapper.deleteLarkTableRelationById(id); } + } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index d416731..9eec109 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -1,5 +1,7 @@ package com.ruoyi.flyingbook.strategy.callback; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.ruoyi.flyingbook.domain.Event; import com.ruoyi.flyingbook.domain.EventLog; import com.ruoyi.flyingbook.service.IEventLogService; @@ -9,12 +11,16 @@ import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.enums.EventOperateStatus; import com.ruoyi.common.enums.EventOperateType; import com.ruoyi.common.enums.FlagStatus; +import com.sun.corba.se.impl.orbutil.RepIdDelegator; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Date; +import java.util.List; /** * @author yuxiangyong @@ -33,22 +39,46 @@ public class ApprovalCallback extends CallbackAbstract { @Override protected Boolean check(LarkRequest request) { - String message = ""; return Boolean.TRUE; } @Override protected void preOperate(LarkRequest request) { - + if (StringUtils.isBlank(request.getMessage())) { + return; + } + String message = request.getMessage(); + JSONObject jsonObject = JSONObject.parseObject(message); + JSONObject event = jsonObject.getJSONObject("event"); + if (event == null) { + return; + } + request.setAppToken(event.getString("file_token")); + request.setTableId(event.getString("table_id")); + JSONArray actionList = event.getJSONArray("action_list"); + if (CollectionUtils.isEmpty(actionList)) { + return; + } + JSONObject action = actionList.getJSONObject(0); + String recordId = action.getString("record_id"); + request.setRecordId(recordId); } @Override protected void businessProcessing(LarkRequest request) { - String message = request.getMessage(); - Event event = this.buildDto(message); - int i = eventService.insertEvent(event); + String cacheKey = String.format("%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getTableId(), request.getRecordId()); + Long eventId = (Long)redisTemplate.opsForValue().get(cacheKey); + if (eventId == null){ + eventId = queryEvent(request.getTableId(), request.getRecordId()); + } + Event event = this.buildDto(request,eventId); + if (eventId == null){ + eventService.insertEvent(event); + redisTemplate.opsForValue().set(cacheKey,event.getId()); + }else { + eventService.updateEvent(event); + } request.setEventId(event.getId()); - } @Override @@ -56,17 +86,8 @@ public class ApprovalCallback extends CallbackAbstract { if (request.getEventId() == null){ return; } - redisTemplate.opsForList().rightPush(RedisConstants.MULTIDIMENSIONALTABULARFEEDBACK,request.getEventId()); - EventLog eventLog = new EventLog(); - eventLog.setCreateBy("Syetem"); - eventLog.setCreateTime(new Date()); - eventLog.setFlag(FlagStatus.OK.getCode()); - eventLog.setOperateStatus(EventOperateStatus.PENDING.getCode()); - eventLog.setOperateType(EventOperateType.CALL_BACK.getCode()); - eventLog.setEventId(request.getEventId()); + EventLog eventLog = new EventLog(request.getEventId(),EventOperateType.CALL_BACK.getCode()); eventLogService.insertEventLog(eventLog); - Object o = redisTemplate.opsForList().leftPop(RedisConstants.MULTIDIMENSIONALTABULARFEEDBACK); - System.out.println(String.valueOf(o)); } @Override @@ -80,14 +101,32 @@ public class ApprovalCallback extends CallbackAbstract { return this.getClass().getSimpleName(); } + private Long queryEvent(String tableId,String recordId){ + + Event event = new Event(); + event.setTableId(tableId); + event.setRecordId(recordId); + List events = eventService.selectEventList(event); + if (CollectionUtils.isNotEmpty(events)){ + return events.get(0).getId(); + } + return null; + } - private Event buildDto(String message){ + private Event buildDto(LarkRequest request,Long eventId){ Event event = new Event(); - event.setFlag(EventOperateStatus.PENDING.getCode()); - event.setMessage(message); - event.setEventCode("test"); + event.setId(eventId); + event.setFlag(FlagStatus.OK.getCode()); + event.setAppToken(request.getAppToken()); + event.setMessage(request.getMessage()); + event.setTableId(request.getTableId()); + event.setRecordId(request.getRecordId()); + event.setNumbers(0L); + event.setOperateStatus(EventOperateStatus.SUCCESS.getCode()); event.setCreateBy("System"); event.setCreateTime(new Date()); + event.setUpdateTime(new Date()); + event.setUpdateBy("System"); return event; } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java index f03a8b6..9089abf 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java @@ -21,12 +21,12 @@ public abstract class LarkAbstract extends LarkOperateAbstract { /** * 获取body体 */ - protected abstract Map getBody(String message); + protected abstract Map getBody(LarkRequest request); /** * 文本解析 */ - protected abstract JSONObject send(String url,Map body,String token); + protected abstract JSONObject send(String type,String url,Map body,String token); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index 24a49a8..5f536de 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -1,22 +1,35 @@ package com.ruoyi.flyingbook.strategy.operate; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.constant.CompanyNameConstants; +import com.ruoyi.common.constant.RedisConstants; +import com.ruoyi.common.enums.AppType; import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper; +import com.ruoyi.flyingbook.LarkHelper.MultidimensionalTableParamHelper; import com.ruoyi.flyingbook.domain.Event; import com.ruoyi.flyingbook.domain.LarkCompanyRelation; import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.domain.LarkTableRelation; import com.ruoyi.flyingbook.service.IEventService; import com.ruoyi.flyingbook.service.ILarkCompanyRelationService; +import com.ruoyi.flyingbook.service.ILarkTableRelationService; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 多维表格操作类 + * * @author yuxiangyong * @create 2023-03-13 20:47 */ @@ -29,8 +42,24 @@ public class MultidimensionalTableOperate extends LarkAbstract { protected ILarkCompanyRelationService larkCompanyRelationService; @Autowired protected IEventService iEventService; - - private String getDetailUrl = "https://open.feishu.cn/open-apis/approval/v4/instances/:instance_id"; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + protected ILarkTableRelationService iLarkTableRelationService; + /** + * 获取明细行 + */ + private static final String DETAIL = "DETAIL"; + private String getDetail = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/:record_id"; + //新增明细行 + private static final String CREATE_OPERATE = "CREATE_OPERATE"; + private String addLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records"; + //修改明细行 + private static final String UPDATE_OPERATE = "UPDATE_OPERATE"; + private String updateLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/batch_update"; + //删除明细行 + private static final String DELETE_OPERATE = "DELETE_OPERATE"; + private String deleteLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/batch_delete"; @Override protected void preOperate(LarkRequest request) { @@ -38,10 +67,19 @@ public class MultidimensionalTableOperate extends LarkAbstract { if (event == null) { return; } - LarkCompanyRelation relation = larkCompanyRelationService.getByCompanyName(CompanyNameConstants.COMPANY_NAME); + LarkCompanyRelation relation = larkCompanyRelationService.getByCompanyName(CompanyNameConstants.COMPANY_NAME, AppType.APPROVAL.getCode()); if (relation == null) { return; } + LarkTableRelation tableRelation = new LarkTableRelation(); + tableRelation.setLarkCompanyRelationId(relation.getId()); + List larkTableRelations = iLarkTableRelationService.selectLarkTableRelationList(tableRelation); + if (CollectionUtils.isEmpty(larkTableRelations)) { + return; + } + //主表与副表的对应关系 + Map> map = larkTableRelations.stream().collect(Collectors.groupingBy(LarkTableRelation::getToTableId)); + request.setTableRelationMap(map); String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret()); if (StringUtils.isBlank(token)) { return; @@ -50,9 +88,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { if (StringUtils.isNotBlank(event.getMessage())) { return; } - getDetailUrl.replace(":instance_id", "aaa"); - String message = larkTokenHelper.postLark(getDetailUrl, null, token); - event.setMessage(message); + event.setMessage(request.getCallBackMessage()); } @Override @@ -60,22 +96,94 @@ public class MultidimensionalTableOperate extends LarkAbstract { if (StringUtils.isBlank(request.getToken()) || request.getEvent() == null || StringUtils.isBlank(request.getEvent().getMessage())) { return; } - send(getUrl(request), getBody(request.getMessage()), request.getToken()); + for (Map.Entry> entry : request.getTableRelationMap().entrySet()) { + request.setTableId(entry.getKey()); + Map body = getBody(request); + + String url = getUrl(request); + send(request.getOperateType(),url, body, request.getToken()); + } } @Override protected String getUrl(LarkRequest request) { + Event event = request.getEvent(); + if (UPDATE_OPERATE.equals(request.getOperateType())) { + return updateLine.replace(":app_token", event.getAppToken()).replace(":table_id", event.getTableId()); + } else if (CREATE_OPERATE.equals(request.getOperateType())) { + return addLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getTableId()); + } else if (DELETE_OPERATE.equals(request.getOperateType())) { + String cacheKey = String.format("%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getTableId(), request.getRecordId()); + redisTemplate.delete(cacheKey); + return deleteLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getTableId()); + } else if (DETAIL.equals(request.getOperateType())) { + return getDetail.replace(":app_token", event.getAppToken()).replace(":table_id", request.getTableId()).replace(":record_id", request.getRecordId()); + } return null; } @Override - protected Map getBody(String message) { - return null; + protected Map getBody(LarkRequest request) { + Map result = new HashMap<>(); + if (StringUtils.isBlank(request.getMessage())) { + return result; + } + String message = request.getMessage(); + JSONObject jsonObject = JSONObject.parseObject(message); + JSONObject event = jsonObject.getJSONObject("event"); + if (event == null) { + return result; + } + request.setTableId(event.getString("table_id")); + JSONArray actionList = event.getJSONArray("action_list"); + if (CollectionUtils.isEmpty(actionList)) { + return result; + } + JSONObject action = actionList.getJSONObject(0); + request.setRecordId(action.getString("record_id")); + if (action.containsKey("before_value") && action.containsKey("after_value")) { + request.setOperateType(UPDATE_OPERATE); + result = parseMap(request); + } else if (action.containsKey("after_value")) { + request.setOperateType(CREATE_OPERATE); + result = parseMap(request); + } else { + request.setOperateType(DELETE_OPERATE); + } + + return result; + } + + private Map parseMap(LarkRequest request) { + Map result = new HashMap<>(); + request.setOperateType(DETAIL); + String message = larkTokenHelper.getLark(getUrl(request), null, request.getToken()); + if (StringUtils.isBlank(message)) { + return result; + } + Map colRelation = request.getTableRelationMap().getOrDefault(request.getTableId(),new ArrayList<>()).stream().collect(Collectors.toMap(LarkTableRelation::getFromColName, LarkTableRelation::getToColName, (k1, k2) -> k1)); + JSONObject jsonObject = JSONObject.parseObject(message); + String fields = jsonObject.getJSONObject("data").getJSONObject("record").getString("fields"); + Map midMap = JSONObject.parseObject(fields, Map.class); + for (Map.Entry entry : midMap.entrySet()) { + String key = String.valueOf(entry); + if (!colRelation.containsKey(key)){ + continue; + } + result.put(key,String.valueOf(entry.getValue())); + } + return result; } @Override - protected JSONObject send(String url, Map body, String token) { - larkTokenHelper.postLark(url,body,token); + protected JSONObject send(String type,String url, Map body, String token) { + if (CREATE_OPERATE.equals(type)){ + larkTokenHelper.postLark(url, body, token); + }else if (UPDATE_OPERATE.equals(type)){ + larkTokenHelper.putLark(url, body, token); + }else if (DELETE_OPERATE.equals(type)){ + larkTokenHelper.deleteLark(url, body, token); + } return null; } diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml index cbf0bcc..21eea7c 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml @@ -1,125 +1,89 @@ - - - - - - - - - - - - - - - - - +PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + + - select id, - table_id, - record_id, - event_id, - operate_type, - operate_status, - error_code, - error_message, - create_by, - create_time, - update_by, - update_time, - flag, - remark - from event_log + select id, event_id, operate_type, error_code, error_message, remark, create_by, create_time, update_by, update_time from event_log - - - and table_id = #{tableId} - and record_id = #{recordId} - and event_id = #{eventId} - and operate_type = #{operateType} - and operate_status = #{operateStatus} - and error_code = #{errorCode} - and error_message = #{errorMessage} - and flag = #{flag} + + and event_id = #{eventId} + and operate_type = #{operateType} + and error_code = #{errorCode} + and error_message = #{errorMessage} - + - - + + insert into event_log - table_id, - record_id, event_id, operate_type, - operate_status, error_code, error_message, + remark, create_by, create_time, update_by, update_time, - flag, - remark, - + - #{tableId}, - #{recordId}, #{eventId}, #{operateType}, - #{operateStatus}, #{errorCode}, #{errorMessage}, + #{remark}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, - #{flag}, - #{remark}, - + - + update event_log - table_id = #{tableId}, - record_id = #{recordId}, event_id = #{eventId}, operate_type = #{operateType}, - operate_status = #{operateStatus}, error_code = #{errorCode}, error_message = #{errorMessage}, + remark = #{remark}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, update_time = #{updateTime}, - flag = #{flag}, - remark = #{remark}, where id = #{id} - delete - from event_log - where id = #{id} + delete from event_log where id = #{id} - delete from event_log where id in + delete from event_log where id in #{id} diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml index 0a792d3..229e635 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml @@ -1,110 +1,106 @@ - - - - - - - - - - - - - +PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + + + + + - select id, - event_code, - message, - numbers, - create_by, - create_time, - update_by, - update_time, - flag, - remark - from event + select id, app_token, table_id, record_id, message, numbers, operate_status, create_by, create_time, update_by, update_time, flag, remark from event - - - and message = #{message} - and flag = #{flag} + + and app_token = #{appToken} + and table_id = #{tableId} + and record_id = #{recordId} + and message = #{message} + and numbers = #{numbers} + and operate_status = #{operateStatus} + and flag = #{flag} - + - - + + insert into event - event_code, + app_token, + table_id, + record_id, message, numbers, + operate_status, create_by, create_time, update_by, update_time, - flag, + flag, remark, - + - #{event_code}, + #{appToken}, + #{tableId}, + #{recordId}, #{message}, #{numbers}, + #{operateStatus}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, - #{flag}, + #{flag}, #{remark}, - + - + update event - message = #{event_code}, - message = #{message}, - message = #{numbers}, + app_token = #{appToken}, + table_id = #{tableId}, + record_id = #{recordId}, + message = #{message}, + numbers = #{numbers}, + operate_status = #{operateStatus}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, update_time = #{updateTime}, - flag = #{flag}, + flag = #{flag}, remark = #{remark}, where id = #{id} - delete - from event - where id = #{id} + delete from event where id = #{id} - delete from event where id in + delete from event where id in #{id} - - \ No newline at end of file diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml index 256c298..07557ea 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml @@ -1,92 +1,83 @@ - - - - - - - - - - - - - - +PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + + + + - select id, - company_id, - company_name, - app_id, - secret, - create_by, - create_time, - update_by, - update_time, - flag, - remark - from lark_company_relation + select id, company_id, company_name, app_id, secret, app_type, create_by, create_time, update_by, update_time, flag, remark from lark_company_relation - - - and company_id = #{companyId} - and company_name like concat('%', #{companyName}, - '%') - - and app_id = #{appId} - and secret = #{secret} - and flag = #{flag} + + and company_id = #{companyId} + and company_name like concat('%', #{companyName}, '%') + and app_id = #{appId} + and secret = #{secret} + and app_type = #{appType} + and flag = #{flag} - + - - + + insert into lark_company_relation company_id, company_name, app_id, secret, + app_type, create_by, create_time, update_by, update_time, flag, remark, - + #{companyId}, #{companyName}, #{appId}, #{secret}, + #{appType}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{flag}, #{remark}, - + - + update lark_company_relation company_id = #{companyId}, company_name = #{companyName}, app_id = #{appId}, secret = #{secret}, + app_type = #{appType}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, @@ -98,13 +89,11 @@ - delete - from lark_company_relation - where id = #{id} + delete from lark_company_relation where id = #{id} - delete from lark_company_relation where id in + delete from lark_company_relation where id in #{id} diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml index 553eaf5..c5d1353 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml @@ -1,89 +1,88 @@ - - - - - - - - - - - - - - +PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + + + + + - select id, - lark_company_relation_id, - from_table_id, - to_table_id, - url, - create_by, - create_time, - update_by, - update_time, - flag, - remark - from lark_table_relation + select id, lark_company_relation_id, from_table_id, from_col_name, to_table_id, to_col_name, col_type, create_by, create_time, update_by, update_time, flag, remark from lark_table_relation - - - and lark_company_relation_id = #{larkCompanyRelationId} - and from_table_id = #{fromTableId} - and to_table_id = #{toTableId} - and url = #{url} - and flag = #{flag} + + and lark_company_relation_id = #{larkCompanyRelationId} + and from_table_id = #{fromTableId} + and from_col_name like concat('%', #{fromColName}, '%') + and to_table_id = #{toTableId} + and to_col_name like concat('%', #{toColName}, '%') + and col_type = #{colType} + and flag = #{flag} - + - - + + insert into lark_table_relation lark_company_relation_id, from_table_id, + from_col_name, to_table_id, - url, + to_col_name, + col_type, create_by, create_time, update_by, update_time, flag, remark, - + #{larkCompanyRelationId}, #{fromTableId}, + #{fromColName}, #{toTableId}, - #{url}, + #{toColName}, + #{colType}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{flag}, #{remark}, - + - + update lark_table_relation lark_company_relation_id = #{larkCompanyRelationId}, from_table_id = #{fromTableId}, + from_col_name = #{fromColName}, to_table_id = #{toTableId}, - url = #{url}, + to_col_name = #{toColName}, + col_type = #{colType}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, @@ -95,13 +94,11 @@ - delete - from lark_table_relation - where id = #{id} + delete from lark_table_relation where id = #{id} - delete from lark_table_relation where id in + delete from lark_table_relation where id in #{id} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/LarkCallbackRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/LarkCallbackRequest.java deleted file mode 100644 index 5a11647..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/LarkCallbackRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ruoyi.system.domain; - -import com.ruoyi.common.base.LarkRequest; - -/** - * @author yuxiangyong - * @create 2023-03-12 16:00 - */ -public class LarkCallbackRequest extends LarkRequest { - -} diff --git a/sql/lark.sql b/sql/lark.sql index 82f0906..e081921 100644 --- a/sql/lark.sql +++ b/sql/lark.sql @@ -1,4 +1,39 @@ --- 飞书-公司关联表 +DROP TABLE IF EXISTS `event`; +CREATE TABLE `event` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `app_token` varchar(255) DEFAULT NULL COMMENT '文件id', + `table_id` varchar(255) DEFAULT NULL COMMENT '表格id', + `record_id` varchar(255) DEFAULT NULL COMMENT '行id', + `message` text COMMENT '回调信息', + `numbers` int DEFAULT 0 COMMENT '重推次数', + `operate_status` varchar(255) DEFAULT NULL COMMENT '状态标记(pending处理中、success成功、fail失败)', + `create_by` varchar(255) NOT NULL, + `create_time` datetime NOT NULL, + `update_by` varchar(255) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `flag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标记(0未删除,1删除)', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +DROP TABLE IF EXISTS `event_log`; +CREATE TABLE `event_log` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `event_id` bigint DEFAULT NULL, + `operate_type` varchar(255) DEFAULT NULL COMMENT '操作类型', + `error_code` varchar(255) DEFAULT NULL COMMENT '错误编码', + `error_message` varchar(255) DEFAULT NULL COMMENT '错误信息', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + `create_by` varchar(255) NOT NULL, + `create_time` datetime NOT NULL, + `update_by` varchar(255) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +DROP TABLE IF EXISTS `lark_company_relation`; CREATE TABLE `lark_company_relation` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键', @@ -6,66 +41,31 @@ CREATE TABLE `lark_company_relation` `company_name` varchar(255) DEFAULT NULL COMMENT '公司名称', `app_id` varchar(255) NOT NULL COMMENT '飞书的appId', `secret` varchar(255) NOT NULL COMMENT '公司+appId对应的唯一密钥', + `app_type` varchar(255) DEFAULT NULL COMMENT 'app应用类型', `create_by` varchar(255) NOT NULL, `create_time` datetime NOT NULL, `update_by` varchar(255) DEFAULT NULL, `update_time` datetime DEFAULT NULL, - `flag` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', + `flag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标记(0未删除、1已删除)', `remark` varchar(255) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) ) ENGINE=InnoDB; --- AppId-table关联表 + +DROP TABLE IF EXISTS `lark_table_relation`; CREATE TABLE `lark_table_relation` ( - `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', - `lark_company_relation_id` BIGINT DEFAULT NULL COMMENT '公司与飞书关联表id', - `from_table_id` VARCHAR(255) DEFAULT NULL COMMENT '来源表', - `to_table_id` VARCHAR(255) DEFAULT NULL COMMENT '对应更新表', - `url` BIGINT DEFAULT NULL COMMENT 'url地址', - `create_by` VARCHAR(255) NOT NULL, + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `lark_company_relation_id` bigint DEFAULT NULL COMMENT '公司与飞书关联表id', + `from_table_id` varchar(255) DEFAULT NULL COMMENT '来源表', + `from_col_name` varchar(255) DEFAULT NULL COMMENT '来源表的列名,要与toColName对应', + `to_table_id` varchar(255) DEFAULT NULL COMMENT '对应更新表', + `to_col_name` varchar(255) DEFAULT NULL COMMENT 'url地址', + `col_type` int DEFAULT NULL COMMENT '列的类型', + `create_by` varchar(255) NOT NULL, `create_time` datetime NOT NULL, - `update_by` VARCHAR(255) DEFAULT NULL, + `update_by` varchar(255) DEFAULT NULL, `update_time` datetime DEFAULT NULL, - `flag` TINYINT NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', - `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`) -) ENGINE = INNODB; - --- 事务操作日志 -CREATE TABLE `event_log` -( - `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', - `table_id` VARCHAR(255) DEFAULT NULL COMMENT '多维表格id', - `record_id` VARCHAR(255) DEFAULT NULL COMMENT '实际行id', - `event_id` BIGINT DEFAULT NULL COMMENT '实际事务id', - `operate_type` VARCHAR(255) DEFAULT NULL COMMENT '操作类型', - `operate_status` VARCHAR(255) DEFAULT NULL COMMENT '操作编码', - `error_code` VARCHAR(255) DEFAULT NULL COMMENT '错误编码', - `error_message` VARCHAR(255) DEFAULT NULL COMMENT '错误信息', - `create_by` VARCHAR(255) NOT NULL, - `create_time` datetime NOT NULL, - `update_by` VARCHAR(255) DEFAULT NULL, - `update_time` datetime DEFAULT NULL, - `flag` TINYINT NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', - `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`) -) ENGINE = INNODB; - --- 事务详情 -CREATE TABLE `event` -( - `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '唯一主键', - `message` text DEFAULT NULL COMMENT '回调信息', - `create_by` VARCHAR(255) NOT NULL, - `create_time` datetime NOT NULL, - `update_by` VARCHAR(255) DEFAULT NULL, - `update_time` datetime DEFAULT NULL, - `flag` VARCHAR(20) NOT NULL COMMENT '状态标记(pending处理中、success成功、faild失败)', - `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', + `flag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标记(0未删除、1已删除)', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) -) ENGINE = INNODB; - - - - - +) ENGINE=InnoDB; \ No newline at end of file From cdcdf90a1eb22eb6099549d7b4e4d9a3329cfc39 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Wed, 15 Mar 2023 01:39:01 +0800 Subject: [PATCH 07/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5(=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/flyingbook/domain/LarkRequest.java | 9 +- .../domain/LarkTableRowRelation.java | 143 ++++++++++++++++++ .../mapper/LarkTableRowRelationMapper.java | 63 ++++++++ .../service/ILarkTableRowRelationService.java | 63 ++++++++ .../impl/LarkCompanyRelationServiceImpl.java | 2 + .../impl/LarkTableRowRelationServiceImpl.java | 97 ++++++++++++ .../strategy/callback/ApprovalCallback.java | 12 +- .../strategy/operate/LarkAbstract.java | 4 - .../operate/MultidimensionalTableOperate.java | 73 ++++++--- .../mapper/LarkTableRowRelationMapper.xml | 101 +++++++++++++ 10 files changed, 534 insertions(+), 33 deletions(-) create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRowRelationServiceImpl.java create mode 100644 ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java index ba7fb3e..d0bd215 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java @@ -19,6 +19,7 @@ public class LarkRequest { private String appToken; private String errorMessage; + /** * ApprovalCallback 用参数 */ @@ -28,10 +29,14 @@ public class LarkRequest { /** * MultidimensionalTableOperate 用参数 */ - private String tableId; - private String recordId; + private Long companyRelationId; + private String fromTableId; + private String toTableId; + private String fromRecordId; + private String toRecordId; private String operateType; private String callBackMessage; private Event event; private Map> tableRelationMap; + private Map> tableRowRelationMap; } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java new file mode 100644 index 0000000..bbe573a --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java @@ -0,0 +1,143 @@ +package com.ruoyi.flyingbook.domain; + +import com.ruoyi.common.enums.FlagStatus; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 【请填写功能名称】对象 lark_table_row_relation + * + * @author ruoyi + * @date 2023-03-15 + */ +public class LarkTableRowRelation extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + public LarkTableRowRelation() { + } + + public LarkTableRowRelation(Long larkCompanyRelationId, String fromTableId, String fromRow, String toTableId, String toRow) { + this.larkCompanyRelationId = larkCompanyRelationId; + this.fromTableId = fromTableId; + this.fromRow = fromRow; + this.toTableId = toTableId; + this.toRow = toRow; + this.flag = FlagStatus.OK.getCode(); + this.setCreateBy("System"); + this.setCreateTime(new Date()); + } + + /** $column.columnComment */ + private Long id; + + /** id */ + @Excel(name = "id") + private Long larkCompanyRelationId; + + /** $column.columnComment */ + @Excel(name = "id") + private String fromTableId; + + /** toColName */ + @Excel(name = "toColName") + private String fromRow; + + /** $column.columnComment */ + @Excel(name = "toColName") + private String toTableId; + + /** url */ + @Excel(name = "url") + private String toRow; + + /** 01 */ + @Excel(name = "01") + private Long flag; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setLarkCompanyRelationId(Long larkCompanyRelationId) + { + this.larkCompanyRelationId = larkCompanyRelationId; + } + + public Long getLarkCompanyRelationId() + { + return larkCompanyRelationId; + } + public void setFromTableId(String fromTableId) + { + this.fromTableId = fromTableId; + } + + public String getFromTableId() + { + return fromTableId; + } + public void setFromRow(String fromRow) + { + this.fromRow = fromRow; + } + + public String getFromRow() + { + return fromRow; + } + public void setToTableId(String toTableId) + { + this.toTableId = toTableId; + } + + public String getToTableId() + { + return toTableId; + } + public void setToRow(String toRow) + { + this.toRow = toRow; + } + + public String getToRow() + { + return toRow; + } + public void setFlag(Long flag) + { + this.flag = flag; + } + + public Long getFlag() + { + return flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("larkCompanyRelationId", getLarkCompanyRelationId()) + .append("fromTableId", getFromTableId()) + .append("fromRow", getFromRow()) + .append("toTableId", getToTableId()) + .append("toRow", getToRow()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("flag", getFlag()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java new file mode 100644 index 0000000..b3dbdc3 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java @@ -0,0 +1,63 @@ +package com.ruoyi.flyingbook.mapper; + + +import com.ruoyi.flyingbook.domain.LarkTableRowRelation; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-03-15 + */ +public interface LarkTableRowRelationMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public LarkTableRowRelation selectLarkTableRowRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param larkTableRowRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectLarkTableRowRelationList(LarkTableRowRelation larkTableRowRelation); + + /** + * 新增【请填写功能名称】 + * + * @param larkTableRowRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertLarkTableRowRelation(LarkTableRowRelation larkTableRowRelation); + + /** + * 修改【请填写功能名称】 + * + * @param larkTableRowRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateLarkTableRowRelation(LarkTableRowRelation larkTableRowRelation); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteLarkTableRowRelationById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteLarkTableRowRelationByIds(Long[] ids); +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java new file mode 100644 index 0000000..7f8bdae --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java @@ -0,0 +1,63 @@ +package com.ruoyi.flyingbook.service; + + +import com.ruoyi.flyingbook.domain.LarkTableRowRelation; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-03-15 + */ +public interface ILarkTableRowRelationService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public LarkTableRowRelation selectLarkTableRowRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param larkTableRowRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectLarkTableRowRelationList(LarkTableRowRelation larkTableRowRelation); + + /** + * 新增【请填写功能名称】 + * + * @param larkTableRowRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertLarkTableRowRelation(LarkTableRowRelation larkTableRowRelation); + + /** + * 修改【请填写功能名称】 + * + * @param larkTableRowRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateLarkTableRowRelation(LarkTableRowRelation larkTableRowRelation); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + public int deleteLarkTableRowRelationByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteLarkTableRowRelationById(Long id); +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java index c8ad2f8..e93a261 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.flyingbook.service.impl; import java.util.List; +import com.ruoyi.common.enums.FlagStatus; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.flyingbook.domain.LarkCompanyRelation; import com.ruoyi.flyingbook.mapper.LarkCompanyRelationMapper; @@ -112,6 +113,7 @@ public class LarkCompanyRelationServiceImpl implements ILarkCompanyRelationServi LarkCompanyRelation relation = new LarkCompanyRelation(); relation.setCompanyName(companyName); relation.setAppType(appType); + relation.setFlag(FlagStatus.OK.getCode()); List larkCompanyRelations = larkCompanyRelationMapper.selectLarkCompanyRelationList(relation); return CollectionUtils.isEmpty(larkCompanyRelations) ? null : larkCompanyRelations.get(0); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRowRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRowRelationServiceImpl.java new file mode 100644 index 0000000..224d5a3 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRowRelationServiceImpl.java @@ -0,0 +1,97 @@ +package com.ruoyi.flyingbook.service.impl; + +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.flyingbook.domain.LarkTableRowRelation; +import com.ruoyi.flyingbook.mapper.LarkTableRowRelationMapper; +import com.ruoyi.flyingbook.service.ILarkTableRowRelationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-03-15 + */ +@Service +public class LarkTableRowRelationServiceImpl implements ILarkTableRowRelationService +{ + @Autowired + private LarkTableRowRelationMapper larkTableRowRelationMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + @Override + public LarkTableRowRelation selectLarkTableRowRelationById(Long id) + { + return larkTableRowRelationMapper.selectLarkTableRowRelationById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param larkTableRowRelation 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectLarkTableRowRelationList(LarkTableRowRelation larkTableRowRelation) + { + return larkTableRowRelationMapper.selectLarkTableRowRelationList(larkTableRowRelation); + } + + /** + * 新增【请填写功能名称】 + * + * @param larkTableRowRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertLarkTableRowRelation(LarkTableRowRelation larkTableRowRelation) + { + larkTableRowRelation.setCreateTime(DateUtils.getNowDate()); + return larkTableRowRelationMapper.insertLarkTableRowRelation(larkTableRowRelation); + } + + /** + * 修改【请填写功能名称】 + * + * @param larkTableRowRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateLarkTableRowRelation(LarkTableRowRelation larkTableRowRelation) + { + larkTableRowRelation.setUpdateTime(DateUtils.getNowDate()); + return larkTableRowRelationMapper.updateLarkTableRowRelation(larkTableRowRelation); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteLarkTableRowRelationByIds(Long[] ids) + { + return larkTableRowRelationMapper.deleteLarkTableRowRelationByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteLarkTableRowRelationById(Long id) + { + return larkTableRowRelationMapper.deleteLarkTableRowRelationById(id); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index 9eec109..6fa2327 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -54,22 +54,22 @@ public class ApprovalCallback extends CallbackAbstract { return; } request.setAppToken(event.getString("file_token")); - request.setTableId(event.getString("table_id")); + request.setFromTableId(event.getString("table_id")); JSONArray actionList = event.getJSONArray("action_list"); if (CollectionUtils.isEmpty(actionList)) { return; } JSONObject action = actionList.getJSONObject(0); String recordId = action.getString("record_id"); - request.setRecordId(recordId); + request.setFromRecordId(recordId); } @Override protected void businessProcessing(LarkRequest request) { - String cacheKey = String.format("%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getTableId(), request.getRecordId()); + String cacheKey = String.format("%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getFromTableId(), request.getFromRecordId()); Long eventId = (Long)redisTemplate.opsForValue().get(cacheKey); if (eventId == null){ - eventId = queryEvent(request.getTableId(), request.getRecordId()); + eventId = queryEvent(request.getFromTableId(), request.getFromRecordId()); } Event event = this.buildDto(request,eventId); if (eventId == null){ @@ -119,8 +119,8 @@ public class ApprovalCallback extends CallbackAbstract { event.setFlag(FlagStatus.OK.getCode()); event.setAppToken(request.getAppToken()); event.setMessage(request.getMessage()); - event.setTableId(request.getTableId()); - event.setRecordId(request.getRecordId()); + event.setTableId(request.getFromTableId()); + event.setRecordId(request.getFromRecordId()); event.setNumbers(0L); event.setOperateStatus(EventOperateStatus.SUCCESS.getCode()); event.setCreateBy("System"); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java index 9089abf..8a6f8f8 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java @@ -23,10 +23,6 @@ public abstract class LarkAbstract extends LarkOperateAbstract { */ protected abstract Map getBody(LarkRequest request); - /** - * 文本解析 - */ - protected abstract JSONObject send(String type,String url,Map body,String token); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index 5f536de..800f64c 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -5,15 +5,14 @@ import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.constant.CompanyNameConstants; import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.enums.AppType; +import com.ruoyi.common.enums.FlagStatus; import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper; import com.ruoyi.flyingbook.LarkHelper.MultidimensionalTableParamHelper; -import com.ruoyi.flyingbook.domain.Event; -import com.ruoyi.flyingbook.domain.LarkCompanyRelation; -import com.ruoyi.flyingbook.domain.LarkRequest; -import com.ruoyi.flyingbook.domain.LarkTableRelation; +import com.ruoyi.flyingbook.domain.*; import com.ruoyi.flyingbook.service.IEventService; import com.ruoyi.flyingbook.service.ILarkCompanyRelationService; import com.ruoyi.flyingbook.service.ILarkTableRelationService; +import com.ruoyi.flyingbook.service.ILarkTableRowRelationService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -46,6 +45,8 @@ public class MultidimensionalTableOperate extends LarkAbstract { private RedisTemplate redisTemplate; @Autowired protected ILarkTableRelationService iLarkTableRelationService; + @Autowired + protected ILarkTableRowRelationService iLarkTableRowRelationService; /** * 获取明细行 */ @@ -56,10 +57,10 @@ public class MultidimensionalTableOperate extends LarkAbstract { private String addLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records"; //修改明细行 private static final String UPDATE_OPERATE = "UPDATE_OPERATE"; - private String updateLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/batch_update"; + private String updateLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/:record_id"; //删除明细行 private static final String DELETE_OPERATE = "DELETE_OPERATE"; - private String deleteLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/batch_delete"; + private String deleteLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/:record_id"; @Override protected void preOperate(LarkRequest request) { @@ -71,15 +72,26 @@ public class MultidimensionalTableOperate extends LarkAbstract { if (relation == null) { return; } + request.setCompanyRelationId(relation.getId()); LarkTableRelation tableRelation = new LarkTableRelation(); tableRelation.setLarkCompanyRelationId(relation.getId()); + tableRelation.setFromTableId(request.getEvent().getTableId()); + tableRelation.setFlag(FlagStatus.OK.getCode()); List larkTableRelations = iLarkTableRelationService.selectLarkTableRelationList(tableRelation); if (CollectionUtils.isEmpty(larkTableRelations)) { return; } - //主表与副表的对应关系 + //主表与副表的列对应关系 Map> map = larkTableRelations.stream().collect(Collectors.groupingBy(LarkTableRelation::getToTableId)); request.setTableRelationMap(map); + //主表与副表的行对应关系 + LarkTableRowRelation larkTableRowRelation = new LarkTableRowRelation(); + larkTableRowRelation.setLarkCompanyRelationId(relation.getId()); + larkTableRowRelation.setFromTableId(request.getEvent().getTableId()); + larkTableRowRelation.setFlag(FlagStatus.OK.getCode()); + List larkTableRowRelations = iLarkTableRowRelationService.selectLarkTableRowRelationList(larkTableRowRelation); + Map> rowMap = larkTableRowRelations.stream().collect(Collectors.groupingBy(LarkTableRowRelation::getToTableId)); + request.setTableRowRelationMap(rowMap); String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret()); if (StringUtils.isBlank(token)) { return; @@ -97,27 +109,33 @@ public class MultidimensionalTableOperate extends LarkAbstract { return; } for (Map.Entry> entry : request.getTableRelationMap().entrySet()) { - request.setTableId(entry.getKey()); + request.setToTableId(entry.getKey()); Map body = getBody(request); String url = getUrl(request); - send(request.getOperateType(),url, body, request.getToken()); + send(request.getOperateType(),url, body,request); } } @Override protected String getUrl(LarkRequest request) { Event event = request.getEvent(); + Map rowRelation = request.getTableRowRelationMap().getOrDefault(request.getToTableId(),new ArrayList<>()).stream().collect(Collectors.toMap(LarkTableRowRelation::getFromRow, LarkTableRowRelation::getToRow, (k1, k2) -> k1)); + if (UPDATE_OPERATE.equals(request.getOperateType())) { - return updateLine.replace(":app_token", event.getAppToken()).replace(":table_id", event.getTableId()); + if (rowRelation.containsKey(request.getFromRecordId())) { + return updateLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(request.getFromRecordId())); + } } else if (CREATE_OPERATE.equals(request.getOperateType())) { - return addLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getTableId()); + return addLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()); } else if (DELETE_OPERATE.equals(request.getOperateType())) { - String cacheKey = String.format("%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getTableId(), request.getRecordId()); - redisTemplate.delete(cacheKey); - return deleteLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getTableId()); + if (rowRelation.containsKey(request.getFromRecordId())) { + String cacheKey = String.format("%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getFromTableId(), request.getFromRecordId()); + redisTemplate.delete(cacheKey); + return deleteLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(request.getFromRecordId())); + } } else if (DETAIL.equals(request.getOperateType())) { - return getDetail.replace(":app_token", event.getAppToken()).replace(":table_id", request.getTableId()).replace(":record_id", request.getRecordId()); + return getDetail.replace(":app_token", event.getAppToken()).replace(":table_id", request.getFromTableId()).replace(":record_id", request.getFromRecordId()); } return null; } @@ -134,13 +152,13 @@ public class MultidimensionalTableOperate extends LarkAbstract { if (event == null) { return result; } - request.setTableId(event.getString("table_id")); + request.setFromTableId(event.getString("table_id")); JSONArray actionList = event.getJSONArray("action_list"); if (CollectionUtils.isEmpty(actionList)) { return result; } JSONObject action = actionList.getJSONObject(0); - request.setRecordId(action.getString("record_id")); + request.setFromRecordId(action.getString("record_id")); if (action.containsKey("before_value") && action.containsKey("after_value")) { request.setOperateType(UPDATE_OPERATE); result = parseMap(request); @@ -161,7 +179,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { if (StringUtils.isBlank(message)) { return result; } - Map colRelation = request.getTableRelationMap().getOrDefault(request.getTableId(),new ArrayList<>()).stream().collect(Collectors.toMap(LarkTableRelation::getFromColName, LarkTableRelation::getToColName, (k1, k2) -> k1)); + Map colRelation = request.getTableRelationMap().getOrDefault(request.getToTableId(),new ArrayList<>()).stream().collect(Collectors.toMap(LarkTableRelation::getFromColName, LarkTableRelation::getToColName, (k1, k2) -> k1)); JSONObject jsonObject = JSONObject.parseObject(message); String fields = jsonObject.getJSONObject("data").getJSONObject("record").getString("fields"); Map midMap = JSONObject.parseObject(fields, Map.class); @@ -175,10 +193,23 @@ public class MultidimensionalTableOperate extends LarkAbstract { return result; } - @Override - protected JSONObject send(String type,String url, Map body, String token) { + protected JSONObject send(String type,String url, Map body,LarkRequest request) { + String token = request.getToken(); if (CREATE_OPERATE.equals(type)){ - larkTokenHelper.postLark(url, body, token); + String result = larkTokenHelper.postLark(url, body, token); + if (StringUtils.isNotBlank(result)){ + JSONObject jsonObject = JSONObject.parseObject(result); + JSONObject data = jsonObject.getJSONObject("data"); + if (data != null){ + JSONObject record = data.getJSONObject("record"); + if (record != null && StringUtils.isNotBlank(record.getString("record_id"))){ + String recordId = record.getString("record_id"); + LarkTableRowRelation rowRelation = new LarkTableRowRelation(request.getCompanyRelationId(),request.getFromTableId(),request.getFromRecordId(),request.getToTableId(),recordId); + + iLarkTableRowRelationService.insertLarkTableRowRelation(rowRelation); + } + } + } }else if (UPDATE_OPERATE.equals(type)){ larkTokenHelper.putLark(url, body, token); }else if (DELETE_OPERATE.equals(type)){ diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml new file mode 100644 index 0000000..b888b23 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + select id, lark_company_relation_id, from_table_id, from_row, to_table_id, to_row, create_by, create_time, update_by, update_time, flag, remark from lark_table_row_relation + + + + + + + + insert into lark_table_row_relation + + lark_company_relation_id, + from_table_id, + from_row, + to_table_id, + to_row, + create_by, + create_time, + update_by, + update_time, + flag, + remark, + + + #{larkCompanyRelationId}, + #{fromTableId}, + #{fromRow}, + #{toTableId}, + #{toRow}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update lark_table_row_relation + + lark_company_relation_id = #{larkCompanyRelationId}, + from_table_id = #{fromTableId}, + from_row = #{fromRow}, + to_table_id = #{toTableId}, + to_row = #{toRow}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + flag = #{flag}, + remark = #{remark}, + + where id = #{id} + + + + delete from lark_table_row_relation where id = #{id} + + + + delete from lark_table_row_relation where id in + + #{id} + + + \ No newline at end of file From 773a6ad578b35c15b723748247f9e217bb6d18de Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Wed, 15 Mar 2023 22:49:56 +0800 Subject: [PATCH 08/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5(=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/EventOperateStatus.java | 3 +- .../enums/TableDetailRelationTypeEnum.java | 29 +++ .../LarkHelper/LarkTokenHelper.java | 97 +++----- .../consumer/LarkApplicationRunner.java | 17 +- .../com/ruoyi/flyingbook/domain/Event.java | 77 +++--- .../com/ruoyi/flyingbook/domain/EventLog.java | 53 +++-- .../domain/LarkCompanyRelation.java | 2 +- .../ruoyi/flyingbook/domain/LarkRequest.java | 17 +- .../flyingbook/domain/LarkTableRelation.java | 62 ++--- .../domain/LarkTableRowRelation.java | 89 ++++--- .../ruoyi/flyingbook/mapper/EventMapper.java | 7 +- .../mapper/LarkTableRowRelationMapper.java | 3 + .../flyingbook/service/IEventService.java | 2 + .../service/ILarkTableRelationService.java | 1 + .../service/ILarkTableRowRelationService.java | 2 + .../service/impl/EventServiceImpl.java | 5 + .../impl/LarkTableRowRelationServiceImpl.java | 10 + .../strategy/LarkOperateAbstract.java | 20 +- .../strategy/callback/ApprovalCallback.java | 47 ++-- .../operate/MultidimensionalTableOperate.java | 221 ++++++++++-------- .../main/resources/mapper/EventLogMapper.xml | 9 +- .../src/main/resources/mapper/EventMapper.xml | 13 +- .../mapper/LarkCompanyRelationMapper.xml | 2 +- .../mapper/LarkTableRelationMapper.xml | 29 +-- .../mapper/LarkTableRowRelationMapper.xml | 118 ++++++---- sql/lark.sql | 38 ++- 26 files changed, 536 insertions(+), 437 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/TableDetailRelationTypeEnum.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateStatus.java index 3c2e52d..dcfa3e1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateStatus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateStatus.java @@ -11,8 +11,7 @@ public enum EventOperateStatus { * */ PENDING("PENDING", "未处理"), - SUCCESS("SUCCESS", "成功"), - FAIL("FAIL", "失败"); + SUCCESS("SUCCESS", "处理完成"); private final String code; private final String info; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableDetailRelationTypeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableDetailRelationTypeEnum.java new file mode 100644 index 0000000..6c1e032 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableDetailRelationTypeEnum.java @@ -0,0 +1,29 @@ +package com.ruoyi.common.enums; + +/** + * @author ruoyi + */ +public enum TableDetailRelationTypeEnum { + + /** + * + */ + ROW("ROW", "行"), + COL("COL", "列"); + + private final String code; + private final String info; + + TableDetailRelationTypeEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java index c461be8..017b4b0 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java @@ -25,9 +25,27 @@ public class LarkTokenHelper { .readTimeout(10, TimeUnit.SECONDS) .build(); - - public String getToken(String appId, String srcret) { + private JSONObject execute(Request request){ Response execute = null; + try { + execute = client.newCall(request).execute(); + } catch (IOException e) { + String errorMessage = String.format("飞书接口调用失败:{}",e.getMessage()); + throw new RuntimeException(errorMessage); + } + if (execute == null || execute.body() == null){ + throw new RuntimeException("飞书返回结果为空"); + } + JSONObject jsonObject = JSONObject.parseObject(execute.body().toString()); + if ("0".equals(jsonObject.getString("code"))){ + return jsonObject; + }else { + String errorMessage = String.format("%s##%s", jsonObject.getString("code"), jsonObject.getString("msg")); + throw new RuntimeException(errorMessage); + } + } + + public String getToken(String appId, String srcret,String tokenType) { Map map = new HashMap<>(); map.put("app_id", appId); map.put("app_secret", srcret); @@ -35,17 +53,8 @@ public class LarkTokenHelper { .method("POST", RequestBody.create(JSONObject.toJSONString(map), MediaType.get("application/json"))) .url("https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal") .build(); - try { - execute = client.newCall(request).execute(); - if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { - return execute.body().string(); - }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ - System.out.println(execute.body()); - } - } catch (IOException e) { - log.error("http post 请求失败--{}", e); - } - return null; + + return execute(request).getString(tokenType); } /** @@ -53,70 +62,36 @@ public class LarkTokenHelper { * @param token * @return */ - public String getLark(String url,Map body, String token) { + public JSONObject getLark(String url,Map body, String token) { Response execute = null; Request request = new Request.Builder() .url(url) .addHeader("Authorization",String.format("Bearer %s",token)) .build(); - try { - execute = client.newCall(request).execute(); - log.info(JSONObject.toJSONString(execute.body().string())); - if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { - return execute.body().string(); - }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ - System.out.println(execute.body()); - } - } catch (IOException e) { - log.error("http get 请求失败--{}", e); - } - return null; + return execute(request); } - public String postLark(String url,Map body, String token) { - Response execute = null; + public JSONObject postLark(String url,Map body, String token) { Request request = new Request.Builder() .method("POST", RequestBody .create(JSONObject.toJSONString(body), MediaType.get("application/json"))) .url(url) .addHeader("Authorization",String.format("Bearer %s",token)) .build(); - try { - execute = client.newCall(request).execute(); - if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { - return execute.body().string(); - }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ - System.out.println(execute.body()); - } - } catch (IOException e) { - log.error("http post 请求失败--{}", e); - } - return null; + return execute(request); } - public String putLark(String url,Map body, String token) { - Response execute = null; + public JSONObject putLark(String url,Map body, String token) { Request request = new Request.Builder() .put(RequestBody .create(JSONObject.toJSONString(body), MediaType.get("application/json"))) .url(url) .addHeader("Authorization",String.format("Bearer %s",token)) .build(); - try { - execute = client.newCall(request).execute(); - if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { - return execute.body().string(); - }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ - System.out.println(execute.body()); - } - } catch (IOException e) { - log.error("http post 请求失败--{}", e); - } - return null; + return execute(request); } - public String deleteLark(String url,Map body, String token) { - Response execute = null; + public JSONObject deleteLark(String url,Map body, String token) { Request.Builder builder = new Request.Builder() .url(url) .addHeader("Authorization", String.format("Bearer %s", token)); @@ -126,22 +101,12 @@ public class LarkTokenHelper { builder.delete(RequestBody .create(JSONObject.toJSONString(body), MediaType.get("application/json"))); } - try { - execute = client.newCall(builder.build()).execute(); - if (ObjectUtil.isNotNull(execute) && execute.isSuccessful()) { - return execute.body().string(); - }else if (ObjectUtil.isNotNull(execute) && !execute.isSuccessful()){ - System.out.println(execute.body()); - } - } catch (IOException e) { - log.error("http post 请求失败--{}", e); - } - return null; + return execute(builder.build()); } public static void main(String[] args) { LarkTokenHelper helper = new LarkTokenHelper(); - String token = helper.getToken( "cli_a482a8572cbc9013", "lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos"); + String token = helper.getToken( "cli_a482a8572cbc9013", "lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos","tenant_access_token"); System.out.println(token); JSONObject jsonObject = JSONObject.parseObject(token); Map map = new HashMap<>(); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index 5b06b53..dca9540 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -35,7 +35,6 @@ import java.util.concurrent.TimeUnit; public class LarkApplicationRunner implements ApplicationRunner { - /** * 核心线程数 */ @@ -73,8 +72,10 @@ public class LarkApplicationRunner implements ApplicationRunner { // threadPool.execute(() -> { // // while (true) { -// List statusList = Arrays.asList(EventOperateStatus.PENDING.getCode(),EventOperateStatus.FAIL.getCode()); -// List eventList = eventMapper.queryListOperate(statusList); + Event query = new Event(); + query.setOperateStatus(EventOperateStatus.PENDING.getCode()); + List statusList = Arrays.asList(EventOperateStatus.PENDING.getCode()); + List eventList = eventMapper.selectEventList(query); // if (CollectionUtils.isEmpty(eventList)) { // try { // // 没有订单,休息一下 @@ -84,11 +85,11 @@ public class LarkApplicationRunner implements ApplicationRunner { // } // } else { // try { -// for (Event event : eventList) { -// LarkRequest request = new LarkRequest(); -// request.setEvent(event); -// multidimensionalTableOperate.execute(request); -// } + for (Event event : eventList) { + LarkRequest request = new LarkRequest(); + request.setEvent(event); + multidimensionalTableOperate.execute(request); + } // } catch (Exception e) { // e.printStackTrace(); // } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java index eb9db22..5ed6cee 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java @@ -5,11 +5,12 @@ import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; + /** * 【请填写功能名称】对象 event - * + * * @author ruoyi - * @date 2023-03-14 + * @date 2023-03-15 */ public class Event extends BaseEntity { @@ -30,91 +31,78 @@ public class Event extends BaseEntity @Excel(name = "id") private String recordId; - /** $column.columnComment */ - @Excel(name = "id") - private String message; - /** $column.columnComment */ @Excel(name = "id") private Long numbers; - /** (pendingsuccessfail) */ - @Excel(name = "(pendingsuccessfail)") + /** () */ + @Excel(name = "()") private String operateStatus; /** (01) */ @Excel(name = "(01)") private Long flag; - public void setId(Long id) + public void setId(Long id) { this.id = id; } - public Long getId() + public Long getId() { return id; } - public void setAppToken(String appToken) + public void setAppToken(String appToken) { this.appToken = appToken; } - public String getAppToken() + public String getAppToken() { return appToken; } - public void setTableId(String tableId) + public void setTableId(String tableId) { this.tableId = tableId; } - public String getTableId() + public String getTableId() { return tableId; } - public void setRecordId(String recordId) + public void setRecordId(String recordId) { this.recordId = recordId; } - public String getRecordId() + public String getRecordId() { return recordId; } - public void setMessage(String message) - { - this.message = message; - } - - public String getMessage() - { - return message; - } - public void setNumbers(Long numbers) + public void setNumbers(Long numbers) { this.numbers = numbers; } - public Long getNumbers() + public Long getNumbers() { return numbers; } - public void setOperateStatus(String operateStatus) + public void setOperateStatus(String operateStatus) { this.operateStatus = operateStatus; } - public String getOperateStatus() + public String getOperateStatus() { return operateStatus; } - public void setFlag(Long flag) + public void setFlag(Long flag) { this.flag = flag; } - public Long getFlag() + public Long getFlag() { return flag; } @@ -122,19 +110,18 @@ public class Event extends BaseEntity @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("appToken", getAppToken()) - .append("tableId", getTableId()) - .append("recordId", getRecordId()) - .append("message", getMessage()) - .append("numbers", getNumbers()) - .append("operateStatus", getOperateStatus()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("flag", getFlag()) - .append("remark", getRemark()) - .toString(); + .append("id", getId()) + .append("appToken", getAppToken()) + .append("tableId", getTableId()) + .append("recordId", getRecordId()) + .append("numbers", getNumbers()) + .append("operateStatus", getOperateStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("flag", getFlag()) + .append("remark", getRemark()) + .toString(); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java index d19cf2d..b10e103 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java @@ -9,9 +9,9 @@ import java.util.Date; /** * 【请填写功能名称】对象 event_log - * + * * @author ruoyi - * @date 2023-03-14 + * @date 2023-03-15 */ public class EventLog extends BaseEntity { @@ -20,11 +20,22 @@ public class EventLog extends BaseEntity public EventLog() { } - public EventLog(Long eventId, String operateType) { + public EventLog(Long eventId, String operateType, String operateInfo) { this.eventId = eventId; this.operateType = operateType; - this.setCreateBy("SYSTEM"); + this.operateInfo = operateInfo; this.setCreateTime(new Date()); + this.setCreateBy("System"); + } + + public EventLog(Long eventId, String operateType, String operateInfo, String errorCode, String errorMessage) { + this.eventId = eventId; + this.operateType = operateType; + this.operateInfo = operateInfo; + this.errorCode = errorCode; + this.errorMessage = errorMessage; + this.setCreateTime(new Date()); + this.setCreateBy("System"); } /** $column.columnComment */ @@ -38,6 +49,10 @@ public class EventLog extends BaseEntity @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String operateType; + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private String operateInfo; + /** $column.columnComment */ @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String errorCode; @@ -46,48 +61,57 @@ public class EventLog extends BaseEntity @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String errorMessage; - public void setId(Long id) + public void setId(Long id) { this.id = id; } - public Long getId() + public Long getId() { return id; } - public void setEventId(Long eventId) + public void setEventId(Long eventId) { this.eventId = eventId; } - public Long getEventId() + public Long getEventId() { return eventId; } - public void setOperateType(String operateType) + public void setOperateType(String operateType) { this.operateType = operateType; } - public String getOperateType() + public String getOperateType() { return operateType; } - public void setErrorCode(String errorCode) + public void setOperateInfo(String operateInfo) + { + this.operateInfo = operateInfo; + } + + public String getOperateInfo() + { + return operateInfo; + } + public void setErrorCode(String errorCode) { this.errorCode = errorCode; } - public String getErrorCode() + public String getErrorCode() { return errorCode; } - public void setErrorMessage(String errorMessage) + public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } - public String getErrorMessage() + public String getErrorMessage() { return errorMessage; } @@ -98,6 +122,7 @@ public class EventLog extends BaseEntity .append("id", getId()) .append("eventId", getEventId()) .append("operateType", getOperateType()) + .append("operateInfo", getOperateInfo()) .append("errorCode", getErrorCode()) .append("errorMessage", getErrorMessage()) .append("remark", getRemark()) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java index b6a77ed..41acdf9 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java @@ -9,7 +9,7 @@ import com.ruoyi.common.core.domain.BaseEntity; * 【请填写功能名称】对象 lark_company_relation * * @author ruoyi - * @date 2023-03-14 + * @date 2023-03-15 */ public class LarkCompanyRelation extends BaseEntity { diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java index d0bd215..c149827 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java @@ -1,5 +1,7 @@ package com.ruoyi.flyingbook.domain; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.enums.EventOperateType; import lombok.Data; import java.util.List; @@ -16,7 +18,9 @@ public class LarkRequest { * 通用信息,不可修改不可删除 */ private String token; - private String appToken; + private String fromAppToken; + private String toAppToken; + private String errorCode; private String errorMessage; @@ -29,7 +33,9 @@ public class LarkRequest { /** * MultidimensionalTableOperate 用参数 */ + private JSONObject record; private Long companyRelationId; + private Long tableRelationId; private String fromTableId; private String toTableId; private String fromRecordId; @@ -37,6 +43,11 @@ public class LarkRequest { private String operateType; private String callBackMessage; private Event event; - private Map> tableRelationMap; - private Map> tableRowRelationMap; + private EventOperateType eventOperateType; + /** + * 表关系 + */ + private Map tableRelationMap; + private Map> tableRowRelationMap; + private Map> tableColRelationMap; } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java index 6bb00eb..3147dc8 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java @@ -9,7 +9,7 @@ import com.ruoyi.common.core.domain.BaseEntity; * 【请填写功能名称】对象 lark_table_relation * * @author ruoyi - * @date 2023-03-14 + * @date 2023-03-15 */ public class LarkTableRelation extends BaseEntity { @@ -24,23 +24,19 @@ public class LarkTableRelation extends BaseEntity /** $column.columnComment */ @Excel(name = "id") - private String fromTableId; - - /** toColName */ - @Excel(name = "toColName") - private String fromColName; + private String fromAppToken; /** $column.columnComment */ - @Excel(name = "toColName") - private String toTableId; + @Excel(name = "id") + private String fromTableId; - /** url */ - @Excel(name = "url") - private String toColName; + /** $column.columnComment */ + @Excel(name = "id") + private String toAppToken; /** $column.columnComment */ - @Excel(name = "url") - private Long colType; + @Excel(name = "id") + private String toTableId; /** 01 */ @Excel(name = "01") @@ -64,6 +60,15 @@ public class LarkTableRelation extends BaseEntity { return larkCompanyRelationId; } + public void setFromAppToken(String fromAppToken) + { + this.fromAppToken = fromAppToken; + } + + public String getFromAppToken() + { + return fromAppToken; + } public void setFromTableId(String fromTableId) { this.fromTableId = fromTableId; @@ -73,14 +78,14 @@ public class LarkTableRelation extends BaseEntity { return fromTableId; } - public void setFromColName(String fromColName) + public void setToAppToken(String toAppToken) { - this.fromColName = fromColName; + this.toAppToken = toAppToken; } - public String getFromColName() + public String getToAppToken() { - return fromColName; + return toAppToken; } public void setToTableId(String toTableId) { @@ -91,24 +96,6 @@ public class LarkTableRelation extends BaseEntity { return toTableId; } - public void setToColName(String toColName) - { - this.toColName = toColName; - } - - public String getToColName() - { - return toColName; - } - public void setColType(Long colType) - { - this.colType = colType; - } - - public Long getColType() - { - return colType; - } public void setFlag(Long flag) { this.flag = flag; @@ -124,11 +111,10 @@ public class LarkTableRelation extends BaseEntity return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("id", getId()) .append("larkCompanyRelationId", getLarkCompanyRelationId()) + .append("fromAppToken", getFromAppToken()) .append("fromTableId", getFromTableId()) - .append("fromColName", getFromColName()) + .append("toAppToken", getToAppToken()) .append("toTableId", getToTableId()) - .append("toColName", getToColName()) - .append("colType", getColType()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java index bbe573a..62fac0c 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java @@ -6,8 +6,6 @@ import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; -import java.util.Date; - /** * 【请填写功能名称】对象 lark_table_row_relation * @@ -18,18 +16,17 @@ public class LarkTableRowRelation extends BaseEntity { private static final long serialVersionUID = 1L; + public LarkTableRowRelation() { } - public LarkTableRowRelation(Long larkCompanyRelationId, String fromTableId, String fromRow, String toTableId, String toRow) { - this.larkCompanyRelationId = larkCompanyRelationId; - this.fromTableId = fromTableId; - this.fromRow = fromRow; - this.toTableId = toTableId; - this.toRow = toRow; + public LarkTableRowRelation(Long tableRelationId, String fromId, String toId, String type, String subType) { + this.tableRelationId = tableRelationId; + this.fromId = fromId; + this.toId = toId; + this.type = type; + this.subType = subType; this.flag = FlagStatus.OK.getCode(); - this.setCreateBy("System"); - this.setCreateTime(new Date()); } /** $column.columnComment */ @@ -37,23 +34,23 @@ public class LarkTableRowRelation extends BaseEntity /** id */ @Excel(name = "id") - private Long larkCompanyRelationId; + private Long tableRelationId; /** $column.columnComment */ @Excel(name = "id") - private String fromTableId; - - /** toColName */ - @Excel(name = "toColName") - private String fromRow; + private String fromId; /** $column.columnComment */ - @Excel(name = "toColName") - private String toTableId; + @Excel(name = "id") + private String toId; + + /** */ + @Excel(name = " ") + private String type; - /** url */ - @Excel(name = "url") - private String toRow; + /** $column.columnComment */ + @Excel(name = " ") + private String subType; /** 01 */ @Excel(name = "01") @@ -68,50 +65,50 @@ public class LarkTableRowRelation extends BaseEntity { return id; } - public void setLarkCompanyRelationId(Long larkCompanyRelationId) + public void setTableRelationId(Long tableRelationId) { - this.larkCompanyRelationId = larkCompanyRelationId; + this.tableRelationId = tableRelationId; } - public Long getLarkCompanyRelationId() + public Long getTableRelationId() { - return larkCompanyRelationId; + return tableRelationId; } - public void setFromTableId(String fromTableId) + public void setFromId(String fromId) { - this.fromTableId = fromTableId; + this.fromId = fromId; } - public String getFromTableId() + public String getFromId() { - return fromTableId; + return fromId; } - public void setFromRow(String fromRow) + public void setToId(String toId) { - this.fromRow = fromRow; + this.toId = toId; } - public String getFromRow() + public String getToId() { - return fromRow; + return toId; } - public void setToTableId(String toTableId) + public void setType(String type) { - this.toTableId = toTableId; + this.type = type; } - public String getToTableId() + public String getType() { - return toTableId; + return type; } - public void setToRow(String toRow) + public void setSubType(String subType) { - this.toRow = toRow; + this.subType = subType; } - public String getToRow() + public String getSubType() { - return toRow; + return subType; } public void setFlag(Long flag) { @@ -127,11 +124,11 @@ public class LarkTableRowRelation extends BaseEntity public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("id", getId()) - .append("larkCompanyRelationId", getLarkCompanyRelationId()) - .append("fromTableId", getFromTableId()) - .append("fromRow", getFromRow()) - .append("toTableId", getToTableId()) - .append("toRow", getToRow()) + .append("tableRelationId", getTableRelationId()) + .append("fromId", getFromId()) + .append("toId", getToId()) + .append("type", getType()) + .append("subType", getSubType()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java index 4cd1e18..3498149 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java @@ -62,8 +62,7 @@ public interface EventMapper */ public int deleteEventByIds(Long[] ids); - /** - * 查询需要推送的列表信息 - */ - public List queryListOperate(@Param("statusList") List statusList); + + public int updateStatus(@Param("id") Long id,@Param("status") String status); + } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java index b3dbdc3..bbb2ebd 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.flyingbook.mapper; import com.ruoyi.flyingbook.domain.LarkTableRowRelation; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -60,4 +61,6 @@ public interface LarkTableRowRelationMapper * @return 结果 */ public int deleteLarkTableRowRelationByIds(Long[] ids); + + public List queryListByTableRelationIdList(@Param("tableRelationIdList") List tableRelationIdList); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java index 57afc98..ea97d2d 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java @@ -60,4 +60,6 @@ public interface IEventService * @return 结果 */ public int deleteEventById(Long id); + + public int updateStatus(Long id,String status); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java index abcf626..23e28b6 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java @@ -61,4 +61,5 @@ public interface ILarkTableRelationService */ public int deleteLarkTableRelationById(Long id); + } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java index 7f8bdae..c091c57 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java @@ -60,4 +60,6 @@ public interface ILarkTableRowRelationService * @return 结果 */ public int deleteLarkTableRowRelationById(Long id); + + public List queryListByTableRelationIdList(List tableRelationIdList); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java index 98bd8b1..256a6a8 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java @@ -95,4 +95,9 @@ public class EventServiceImpl implements IEventService { return eventMapper.deleteEventById(id); } + + @Override + public int updateStatus(Long id, String status) { + return 0; + } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRowRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRowRelationServiceImpl.java index 224d5a3..e512141 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRowRelationServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRowRelationServiceImpl.java @@ -4,9 +4,11 @@ import com.ruoyi.common.utils.DateUtils; import com.ruoyi.flyingbook.domain.LarkTableRowRelation; import com.ruoyi.flyingbook.mapper.LarkTableRowRelationMapper; import com.ruoyi.flyingbook.service.ILarkTableRowRelationService; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; /** @@ -94,4 +96,12 @@ public class LarkTableRowRelationServiceImpl implements ILarkTableRowRelationSer { return larkTableRowRelationMapper.deleteLarkTableRowRelationById(id); } + + @Override + public List queryListByTableRelationIdList(List tableRelationIdList) { + if (CollectionUtils.isEmpty(tableRelationIdList)){ + return new ArrayList<>(); + } + return larkTableRowRelationMapper.queryListByTableRelationIdList(tableRelationIdList); + } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java index 309af69..9bd706c 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java @@ -1,5 +1,7 @@ package com.ruoyi.flyingbook.strategy; +import com.ruoyi.common.enums.EventOperateType; +import com.ruoyi.flyingbook.domain.EventLog; import com.ruoyi.flyingbook.domain.LarkRequest; import lombok.extern.slf4j.Slf4j; @@ -21,10 +23,20 @@ public abstract class LarkOperateAbstract{ preOperate(request); //真正的业务处理逻辑 businessProcessing(request); - //业务处理完成后的系列操作,例如日志 - endHandle(request); + }catch (Exception e){ log.error("{} execute error: {}",getName(),e); + String message = e.getMessage(); + if (message.contains("##")){ + String[] split = message.split("##"); + request.setErrorCode(split[0]); + request.setErrorMessage(split[1]); + }else { + request.setErrorMessage(message); + } + }finally { + //业务处理完成后的系列操作,例如日志 + endHandle(request); } //构建返回对象并返回 return buildResult(request); @@ -52,9 +64,7 @@ public abstract class LarkOperateAbstract{ /** * 业务处理完成后的附加操作 */ - protected void endHandle(LarkRequest request){ - - } + protected void endHandle(LarkRequest request){}; /** * 具体的返回内容 diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index 6fa2327..1fbb567 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -53,7 +53,7 @@ public class ApprovalCallback extends CallbackAbstract { if (event == null) { return; } - request.setAppToken(event.getString("file_token")); + request.setFromAppToken(event.getString("file_token")); request.setFromTableId(event.getString("table_id")); JSONArray actionList = event.getJSONArray("action_list"); if (CollectionUtils.isEmpty(actionList)) { @@ -66,17 +66,24 @@ public class ApprovalCallback extends CallbackAbstract { @Override protected void businessProcessing(LarkRequest request) { - String cacheKey = String.format("%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getFromTableId(), request.getFromRecordId()); - Long eventId = (Long)redisTemplate.opsForValue().get(cacheKey); - if (eventId == null){ - eventId = queryEvent(request.getFromTableId(), request.getFromRecordId()); + String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getFromAppToken(),request.getFromTableId(), request.getFromRecordId()); + String eventStr = (String)redisTemplate.opsForValue().get(cacheKey); + Event event = null; + if (StringUtils.isBlank(eventStr)){ + event = queryEvent(request.getFromAppToken(),request.getFromTableId(), request.getFromRecordId()); + }else { + event = JSONObject.parseObject(eventStr,Event.class); + } + //如果已经存在处理中的就不需要操作数据库了 + if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus())){ + return; } - Event event = this.buildDto(request,eventId); - if (eventId == null){ + this.buildDto(request,event); + if (event.getId() == null){ eventService.insertEvent(event); - redisTemplate.opsForValue().set(cacheKey,event.getId()); + redisTemplate.opsForValue().set(cacheKey,JSONObject.toJSONString(event)); }else { - eventService.updateEvent(event); + eventService.updateStatus(event.getId(),EventOperateStatus.PENDING.getCode()); } request.setEventId(event.getId()); } @@ -86,7 +93,12 @@ public class ApprovalCallback extends CallbackAbstract { if (request.getEventId() == null){ return; } - EventLog eventLog = new EventLog(request.getEventId(),EventOperateType.CALL_BACK.getCode()); + if (StringUtils.isNotBlank(request.getErrorMessage())){ + + } + EventLog eventLog = StringUtils.isBlank(request.getErrorMessage()) ? + new EventLog(request.getEventId(),EventOperateType.CALL_BACK.getCode(),request.getMessage()) + : new EventLog(request.getEventId(),EventOperateType.CALL_BACK.getCode(),request.getMessage(),request.getErrorCode(),request.getErrorMessage()); eventLogService.insertEventLog(eventLog); } @@ -101,28 +113,27 @@ public class ApprovalCallback extends CallbackAbstract { return this.getClass().getSimpleName(); } - private Long queryEvent(String tableId,String recordId){ + private Event queryEvent(String appToken,String tableId,String recordId){ Event event = new Event(); + event.setAppToken(appToken); event.setTableId(tableId); event.setRecordId(recordId); List events = eventService.selectEventList(event); if (CollectionUtils.isNotEmpty(events)){ - return events.get(0).getId(); + return events.get(0); } return null; } - private Event buildDto(LarkRequest request,Long eventId){ - Event event = new Event(); - event.setId(eventId); + private Event buildDto(LarkRequest request,Event event){ + event = event == null ? new Event() :event; event.setFlag(FlagStatus.OK.getCode()); - event.setAppToken(request.getAppToken()); - event.setMessage(request.getMessage()); + event.setAppToken(request.getFromAppToken()); event.setTableId(request.getFromTableId()); event.setRecordId(request.getFromRecordId()); event.setNumbers(0L); - event.setOperateStatus(EventOperateStatus.SUCCESS.getCode()); + event.setOperateStatus(EventOperateStatus.PENDING.getCode()); event.setCreateBy("System"); event.setCreateTime(new Date()); event.setUpdateTime(new Date()); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index 800f64c..c397075 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -1,18 +1,16 @@ package com.ruoyi.flyingbook.strategy.operate; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.constant.CompanyNameConstants; import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.enums.AppType; +import com.ruoyi.common.enums.EventOperateStatus; import com.ruoyi.common.enums.FlagStatus; +import com.ruoyi.common.enums.TableDetailRelationTypeEnum; import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper; -import com.ruoyi.flyingbook.LarkHelper.MultidimensionalTableParamHelper; import com.ruoyi.flyingbook.domain.*; -import com.ruoyi.flyingbook.service.IEventService; -import com.ruoyi.flyingbook.service.ILarkCompanyRelationService; -import com.ruoyi.flyingbook.service.ILarkTableRelationService; -import com.ruoyi.flyingbook.service.ILarkTableRowRelationService; +import com.ruoyi.flyingbook.service.*; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +21,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** @@ -32,6 +29,7 @@ import java.util.stream.Collectors; * @author yuxiangyong * @create 2023-03-13 20:47 */ +@Slf4j @Component("MultidimensionalTableOperate") public class MultidimensionalTableOperate extends LarkAbstract { @@ -47,6 +45,10 @@ public class MultidimensionalTableOperate extends LarkAbstract { protected ILarkTableRelationService iLarkTableRelationService; @Autowired protected ILarkTableRowRelationService iLarkTableRowRelationService; + @Autowired + private IEventService eventService; + @Autowired + private IEventLogService eventLogService; /** * 获取明细行 */ @@ -62,80 +64,104 @@ public class MultidimensionalTableOperate extends LarkAbstract { private static final String DELETE_OPERATE = "DELETE_OPERATE"; private String deleteLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/:record_id"; - @Override - protected void preOperate(LarkRequest request) { - Event event = request.getEvent(); - if (event == null) { - return; - } - LarkCompanyRelation relation = larkCompanyRelationService.getByCompanyName(CompanyNameConstants.COMPANY_NAME, AppType.APPROVAL.getCode()); - if (relation == null) { - return; - } - request.setCompanyRelationId(relation.getId()); + + private void fillTableRelation(LarkRequest request) { LarkTableRelation tableRelation = new LarkTableRelation(); - tableRelation.setLarkCompanyRelationId(relation.getId()); + tableRelation.setLarkCompanyRelationId(request.getCompanyRelationId()); tableRelation.setFromTableId(request.getEvent().getTableId()); tableRelation.setFlag(FlagStatus.OK.getCode()); List larkTableRelations = iLarkTableRelationService.selectLarkTableRelationList(tableRelation); if (CollectionUtils.isEmpty(larkTableRelations)) { - return; + String errorMessage = String.format("tableId:{}表关系未配置", request.getEvent().getTableId()); + log.error("iLarkTableRelationService.selectLarkTableRelationList:{}", errorMessage); + throw new RuntimeException(errorMessage); } //主表与副表的列对应关系 - Map> map = larkTableRelations.stream().collect(Collectors.groupingBy(LarkTableRelation::getToTableId)); - request.setTableRelationMap(map); + List tableRelationIdList = new ArrayList<>(); + Map tableRelationMap = new HashMap<>(); + for (LarkTableRelation larkTableRelation : larkTableRelations) { + String to = String.format("%s_%s", larkTableRelation.getToAppToken(), larkTableRelation.getToTableId()); + tableRelationMap.put(to, larkTableRelation.getId()); + tableRelationIdList.add(larkTableRelation.getId()); + } + request.setTableRelationMap(tableRelationMap); //主表与副表的行对应关系 - LarkTableRowRelation larkTableRowRelation = new LarkTableRowRelation(); - larkTableRowRelation.setLarkCompanyRelationId(relation.getId()); - larkTableRowRelation.setFromTableId(request.getEvent().getTableId()); - larkTableRowRelation.setFlag(FlagStatus.OK.getCode()); - List larkTableRowRelations = iLarkTableRowRelationService.selectLarkTableRowRelationList(larkTableRowRelation); - Map> rowMap = larkTableRowRelations.stream().collect(Collectors.groupingBy(LarkTableRowRelation::getToTableId)); - request.setTableRowRelationMap(rowMap); - String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret()); - if (StringUtils.isBlank(token)) { - return; + List larkTableRowRelations = iLarkTableRowRelationService.queryListByTableRelationIdList(tableRelationIdList); + Map> tableRowRelationMap = new HashMap<>(); + Map> tableColRelationMap = new HashMap<>(); + for (LarkTableRowRelation larkTableRowRelation : larkTableRowRelations) { + Map map = new HashMap<>(); + map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId()); + if (TableDetailRelationTypeEnum.ROW.getCode().equals(larkTableRowRelation.getType())) { + tableRowRelationMap.put(larkTableRowRelation.getTableRelationId(), map); + } else if (TableDetailRelationTypeEnum.COL.getCode().equals(larkTableRowRelation.getType())) { + tableColRelationMap.put(larkTableRowRelation.getTableRelationId(), map); + } } - request.setToken(token); - if (StringUtils.isNotBlank(event.getMessage())) { - return; + if (tableColRelationMap.isEmpty()) { + String errorMessage = String.format("tableId:{} 列关系未配置", request.getEvent().getTableId()); + log.error("iLarkTableRowRelationService.queryListByTableRelationIdList:{}", errorMessage); + throw new RuntimeException(errorMessage); } - event.setMessage(request.getCallBackMessage()); + request.setTableRowRelationMap(tableRowRelationMap); + request.setTableColRelationMap(tableColRelationMap); } @Override - protected void businessProcessing(LarkRequest request) { - if (StringUtils.isBlank(request.getToken()) || request.getEvent() == null || StringUtils.isBlank(request.getEvent().getMessage())) { - return; + protected void preOperate(LarkRequest request) { + Event event = request.getEvent(); + if (event == null) { + throw new RuntimeException("当前事件为空"); + } + LarkCompanyRelation relation = larkCompanyRelationService.getByCompanyName(CompanyNameConstants.COMPANY_NAME, AppType.APPROVAL.getCode()); + if (relation == null) { + String errorMessage = String.format("获取app值为空 companyName:{} appType:{}", CompanyNameConstants.COMPANY_NAME, AppType.APPROVAL.getCode()); + log.error("larkCompanyRelationService.getByCompanyName:{}", errorMessage); + throw new RuntimeException(errorMessage); } - for (Map.Entry> entry : request.getTableRelationMap().entrySet()) { + //用于后续追加row时候做关联关系 + request.setCompanyRelationId(relation.getId()); + //关联关系表填充 + this.fillTableRelation(request); + String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret(),"tenant_access_token"); + request.setToken(token); + } + + @Override + protected void businessProcessing(LarkRequest request) { + request.setOperateType(DETAIL); + JSONObject message = larkTokenHelper.getLark(getUrl(request), null, request.getToken()); + request.setRecord(message); + for (Map.Entry entry : request.getTableRelationMap().entrySet()) { request.setToTableId(entry.getKey()); + request.setTableRelationId(entry.getValue()); Map body = getBody(request); - String url = getUrl(request); - send(request.getOperateType(),url, body,request); + if (StringUtils.isBlank(url)) { + return; + } + send(request.getOperateType(), url, body, request); } } @Override protected String getUrl(LarkRequest request) { Event event = request.getEvent(); - Map rowRelation = request.getTableRowRelationMap().getOrDefault(request.getToTableId(),new ArrayList<>()).stream().collect(Collectors.toMap(LarkTableRowRelation::getFromRow, LarkTableRowRelation::getToRow, (k1, k2) -> k1)); - + Map rowRelation = request.getTableRowRelationMap().get(request.getTableRelationId()); + String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, event.getAppToken(), event.getTableId(), event.getRecordId()); + redisTemplate.delete(cacheKey); if (UPDATE_OPERATE.equals(request.getOperateType())) { - if (rowRelation.containsKey(request.getFromRecordId())) { - return updateLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(request.getFromRecordId())); + if (rowRelation.containsKey(event.getRecordId())) { + return updateLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(event.getRecordId())); } } else if (CREATE_OPERATE.equals(request.getOperateType())) { return addLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()); } else if (DELETE_OPERATE.equals(request.getOperateType())) { - if (rowRelation.containsKey(request.getFromRecordId())) { - String cacheKey = String.format("%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getFromTableId(), request.getFromRecordId()); - redisTemplate.delete(cacheKey); - return deleteLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(request.getFromRecordId())); + if (rowRelation.containsKey(event.getRecordId())) { + return deleteLine.replace(":app_token", event.getAppToken()).replace(":table_id", event.getTableId()).replace(":record_id", rowRelation.get(event.getRecordId())); } } else if (DETAIL.equals(request.getOperateType())) { - return getDetail.replace(":app_token", event.getAppToken()).replace(":table_id", request.getFromTableId()).replace(":record_id", request.getFromRecordId()); + return getDetail.replace(":app_token", event.getAppToken()).replace(":table_id", event.getTableId()).replace(":record_id", event.getRecordId()); } return null; } @@ -143,79 +169,68 @@ public class MultidimensionalTableOperate extends LarkAbstract { @Override protected Map getBody(LarkRequest request) { Map result = new HashMap<>(); - if (StringUtils.isBlank(request.getMessage())) { - return result; - } - String message = request.getMessage(); - JSONObject jsonObject = JSONObject.parseObject(message); - JSONObject event = jsonObject.getJSONObject("event"); - if (event == null) { - return result; - } - request.setFromTableId(event.getString("table_id")); - JSONArray actionList = event.getJSONArray("action_list"); - if (CollectionUtils.isEmpty(actionList)) { - return result; - } - JSONObject action = actionList.getJSONObject(0); - request.setFromRecordId(action.getString("record_id")); - if (action.containsKey("before_value") && action.containsKey("after_value")) { - request.setOperateType(UPDATE_OPERATE); - result = parseMap(request); - } else if (action.containsKey("after_value")) { - request.setOperateType(CREATE_OPERATE); - result = parseMap(request); - } else { + JSONObject record = request.getRecord(); + String responseCode = record.getString("code"); + Map rowMap = request.getTableRowRelationMap().get(request.getTableRelationId()); + if ("1254043".equals(responseCode)) { request.setOperateType(DELETE_OPERATE); + } else if ("0".equals(responseCode)) { + result = parseMap(request); + if (rowMap.containsKey(request.getEvent().getRecordId())) { + request.setOperateType(UPDATE_OPERATE); + } else { + request.setOperateType(CREATE_OPERATE); + } } - return result; } private Map parseMap(LarkRequest request) { Map result = new HashMap<>(); - request.setOperateType(DETAIL); - String message = larkTokenHelper.getLark(getUrl(request), null, request.getToken()); - if (StringUtils.isBlank(message)) { - return result; - } - Map colRelation = request.getTableRelationMap().getOrDefault(request.getToTableId(),new ArrayList<>()).stream().collect(Collectors.toMap(LarkTableRelation::getFromColName, LarkTableRelation::getToColName, (k1, k2) -> k1)); - JSONObject jsonObject = JSONObject.parseObject(message); - String fields = jsonObject.getJSONObject("data").getJSONObject("record").getString("fields"); - Map midMap = JSONObject.parseObject(fields, Map.class); + JSONObject record = request.getRecord(); + Map colRelation = request.getTableColRelationMap().get(request.getToTableId()); + String fields = record.getJSONObject("data").getJSONObject("record").getString("fields"); + Map midMap = JSONObject.parseObject(fields, Map.class); for (Map.Entry entry : midMap.entrySet()) { String key = String.valueOf(entry); - if (!colRelation.containsKey(key)){ + if (!colRelation.containsKey(key)) { continue; } - result.put(key,String.valueOf(entry.getValue())); + result.put(colRelation.get(key), entry.getValue()); } + Map> map = new HashMap<>(); + map.put("fields",result); return result; } - protected JSONObject send(String type,String url, Map body,LarkRequest request) { + protected void send(String type, String url, Map body, LarkRequest request) { String token = request.getToken(); - if (CREATE_OPERATE.equals(type)){ - String result = larkTokenHelper.postLark(url, body, token); - if (StringUtils.isNotBlank(result)){ - JSONObject jsonObject = JSONObject.parseObject(result); - JSONObject data = jsonObject.getJSONObject("data"); - if (data != null){ - JSONObject record = data.getJSONObject("record"); - if (record != null && StringUtils.isNotBlank(record.getString("record_id"))){ - String recordId = record.getString("record_id"); - LarkTableRowRelation rowRelation = new LarkTableRowRelation(request.getCompanyRelationId(),request.getFromTableId(),request.getFromRecordId(),request.getToTableId(),recordId); - - iLarkTableRowRelationService.insertLarkTableRowRelation(rowRelation); - } + if (CREATE_OPERATE.equals(type)) { + JSONObject result = larkTokenHelper.postLark(url, body, token); + JSONObject data = result.getJSONObject("data"); + if (data != null) { + JSONObject record = data.getJSONObject("record"); + if (record != null && StringUtils.isNotBlank(record.getString("record_id"))) { + String recordId = record.getString("record_id"); + LarkTableRowRelation rowRelation = new LarkTableRowRelation(request.getCompanyRelationId(), request.getEvent().getRecordId(), recordId, TableDetailRelationTypeEnum.ROW.getCode(), TableDetailRelationTypeEnum.ROW.getCode()); + iLarkTableRowRelationService.insertLarkTableRowRelation(rowRelation); } } - }else if (UPDATE_OPERATE.equals(type)){ + } else if (UPDATE_OPERATE.equals(type)) { larkTokenHelper.putLark(url, body, token); - }else if (DELETE_OPERATE.equals(type)){ + } else if (DELETE_OPERATE.equals(type)) { larkTokenHelper.deleteLark(url, body, token); } - return null; + } + + @Override + protected void endHandle(LarkRequest request) { + Event event = request.getEvent(); + eventService.updateStatus(event.getId(), EventOperateStatus.SUCCESS.getCode()); + EventLog eventLog = StringUtils.isBlank(request.getErrorMessage()) ? + new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage()) + : new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); + eventLogService.insertEventLog(eventLog); } @Override diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml index 21eea7c..ec36349 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml @@ -2,12 +2,13 @@ - + + @@ -18,7 +19,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, event_id, operate_type, error_code, error_message, remark, create_by, create_time, update_by, update_time from event_log + select id, event_id, operate_type, operate_info, error_code, error_message, remark, create_by, create_time, update_by, update_time from event_log @@ -30,7 +29,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and app_token = #{appToken} and table_id = #{tableId} and record_id = #{recordId} - and message = #{message} and numbers = #{numbers} and operate_status = #{operateStatus} and flag = #{flag} @@ -48,7 +46,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" app_token, table_id, record_id, - message, numbers, operate_status, create_by, @@ -62,7 +59,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{appToken}, #{tableId}, #{recordId}, - #{message}, #{numbers}, #{operateStatus}, #{createBy}, @@ -80,7 +76,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" app_token = #{appToken}, table_id = #{tableId}, record_id = #{recordId}, - message = #{message}, numbers = #{numbers}, operate_status = #{operateStatus}, create_by = #{createBy}, @@ -103,4 +98,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + update event set operate_status = #{status} where id = #{id} + \ No newline at end of file diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml index 07557ea..cf35671 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml @@ -2,7 +2,7 @@ - + diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml index c5d1353..2833f24 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml @@ -2,16 +2,15 @@ - + + - + - - @@ -21,18 +20,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, lark_company_relation_id, from_table_id, from_col_name, to_table_id, to_col_name, col_type, create_by, create_time, update_by, update_time, flag, remark from lark_table_relation + select id, lark_company_relation_id, from_app_token, from_table_id, to_app_token, to_table_id, create_by, create_time, update_by, update_time, flag, remark from lark_table_relation @@ -46,11 +44,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into lark_table_relation lark_company_relation_id, + from_app_token, from_table_id, - from_col_name, + to_app_token, to_table_id, - to_col_name, - col_type, create_by, create_time, update_by, @@ -60,11 +57,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{larkCompanyRelationId}, + #{fromAppToken}, #{fromTableId}, - #{fromColName}, + #{toAppToken}, #{toTableId}, - #{toColName}, - #{colType}, #{createBy}, #{createTime}, #{updateBy}, @@ -78,11 +74,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update lark_table_relation lark_company_relation_id = #{larkCompanyRelationId}, + from_app_token = #{fromAppToken}, from_table_id = #{fromTableId}, - from_col_name = #{fromColName}, + to_app_token = #{toAppToken}, to_table_id = #{toTableId}, - to_col_name = #{toColName}, - col_type = #{colType}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml index b888b23..e14809c 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml @@ -1,83 +1,97 @@ - - + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + - - - - - - - - - - - - + + + + + + + + + + + + - select id, lark_company_relation_id, from_table_id, from_row, to_table_id, to_row, create_by, create_time, update_by, update_time, flag, remark from lark_table_row_relation + select id, + table_relation_id, + from_id, + to_id, + type, + sub_type, + create_by, + create_time, + update_by, + update_time, + flag, + remark + from lark_table_row_relation - - - and lark_company_relation_id = #{larkCompanyRelationId} - and from_table_id = #{fromTableId} - and from_row = #{fromRow} - and to_table_id = #{toTableId} - and to_row = #{toRow} - and flag = #{flag} + + and table_relation_id = #{tableRelationId} + and from_id = #{fromId} + and to_id = #{toId} + and type = #{type} + and sub_type = #{subType} + and flag = #{flag} - + - - + + insert into lark_table_row_relation - lark_company_relation_id, - from_table_id, - from_row, - to_table_id, - to_row, + table_relation_id, + from_id, + to_id, + type, + sub_type, create_by, create_time, update_by, update_time, flag, remark, - + - #{larkCompanyRelationId}, - #{fromTableId}, - #{fromRow}, - #{toTableId}, - #{toRow}, + #{tableRelationId}, + #{fromId}, + #{toId}, + #{type}, + #{subType}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{flag}, #{remark}, - + update lark_table_row_relation - lark_company_relation_id = #{larkCompanyRelationId}, - from_table_id = #{fromTableId}, - from_row = #{fromRow}, - to_table_id = #{toTableId}, - to_row = #{toRow}, + table_relation_id = #{tableRelationId}, + from_id = #{fromId}, + to_id = #{toId}, + type = #{type}, + sub_type = #{subType}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, @@ -89,13 +103,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from lark_table_row_relation where id = #{id} + delete + from lark_table_row_relation + where id = #{id} - delete from lark_table_row_relation where id in + delete from lark_table_row_relation where id in #{id} + + \ No newline at end of file diff --git a/sql/lark.sql b/sql/lark.sql index e081921..59a2582 100644 --- a/sql/lark.sql +++ b/sql/lark.sql @@ -5,14 +5,13 @@ CREATE TABLE `event` `app_token` varchar(255) DEFAULT NULL COMMENT '文件id', `table_id` varchar(255) DEFAULT NULL COMMENT '表格id', `record_id` varchar(255) DEFAULT NULL COMMENT '行id', - `message` text COMMENT '回调信息', - `numbers` int DEFAULT 0 COMMENT '重推次数', - `operate_status` varchar(255) DEFAULT NULL COMMENT '状态标记(pending处理中、success成功、fail失败)', + `numbers` int DEFAULT '0' COMMENT '重推次数', + `operate_status` varchar(255) DEFAULT NULL COMMENT '状态标记(未处理,处理完成)', `create_by` varchar(255) NOT NULL, `create_time` datetime NOT NULL, `update_by` varchar(255) DEFAULT NULL, `update_time` datetime DEFAULT NULL, - `flag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标记(0未删除,1删除)', + `flag` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除,1删除)', `remark` varchar(255) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) ) ENGINE=InnoDB; @@ -23,6 +22,7 @@ CREATE TABLE `event_log` `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键', `event_id` bigint DEFAULT NULL, `operate_type` varchar(255) DEFAULT NULL COMMENT '操作类型', + `operate_info` text COMMENT '操作日志', `error_code` varchar(255) DEFAULT NULL COMMENT '错误编码', `error_message` varchar(255) DEFAULT NULL COMMENT '错误信息', `remark` varchar(255) DEFAULT NULL COMMENT '备注', @@ -46,7 +46,7 @@ CREATE TABLE `lark_company_relation` `create_time` datetime NOT NULL, `update_by` varchar(255) DEFAULT NULL, `update_time` datetime DEFAULT NULL, - `flag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标记(0未删除、1已删除)', + `flag` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', `remark` varchar(255) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) ) ENGINE=InnoDB; @@ -56,16 +56,34 @@ CREATE TABLE `lark_table_relation` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键', `lark_company_relation_id` bigint DEFAULT NULL COMMENT '公司与飞书关联表id', + `from_app_token` varchar(255) DEFAULT NULL, `from_table_id` varchar(255) DEFAULT NULL COMMENT '来源表', - `from_col_name` varchar(255) DEFAULT NULL COMMENT '来源表的列名,要与toColName对应', + `to_app_token` varchar(255) DEFAULT NULL, `to_table_id` varchar(255) DEFAULT NULL COMMENT '对应更新表', - `to_col_name` varchar(255) DEFAULT NULL COMMENT 'url地址', - `col_type` int DEFAULT NULL COMMENT '列的类型', `create_by` varchar(255) NOT NULL, `create_time` datetime NOT NULL, `update_by` varchar(255) DEFAULT NULL, `update_time` datetime DEFAULT NULL, - `flag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标记(0未删除、1已删除)', + `flag` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', `remark` varchar(255) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) -) ENGINE=InnoDB; \ No newline at end of file +) ENGINE=InnoDB; + + +DROP TABLE IF EXISTS `lark_table_row_relation`; +CREATE TABLE `lark_table_row_relation` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `table_relation_id` bigint DEFAULT NULL COMMENT '公司与飞书关联表id', + `from_id` varchar(255) DEFAULT NULL COMMENT '来源表', + `to_id` varchar(255) DEFAULT NULL COMMENT '对应更新表', + `type` varchar(20) DEFAULT NULL COMMENT '行,或者 列', + `sub_type` varchar(20) DEFAULT NULL COMMENT '列或行的明细属性', + `create_by` varchar(255) NOT NULL, + `create_time` datetime NOT NULL, + `update_by` varchar(255) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `flag` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0未删除、1已删除)', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE=InnoDB; From 9b4b3e415a6dd7953b0cc1042167834907e3ff4c Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Wed, 15 Mar 2023 23:12:00 +0800 Subject: [PATCH 09/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5(=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/LarkApplicationRunner.java | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index dca9540..6263b02 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -55,7 +55,7 @@ public class LarkApplicationRunner implements ApplicationRunner { /** * 线程睡眠时间 */ - private static final Integer WAIT_TIME = 5000; + private static final Integer WAIT_TIME = 10000; @Autowired private EventMapper eventMapper; @@ -69,33 +69,32 @@ public class LarkApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { //这里用线程池,后续如果出现量大的情况下可以调整 -// threadPool.execute(() -> { -// -// while (true) { - Event query = new Event(); - query.setOperateStatus(EventOperateStatus.PENDING.getCode()); - List statusList = Arrays.asList(EventOperateStatus.PENDING.getCode()); - List eventList = eventMapper.selectEventList(query); -// if (CollectionUtils.isEmpty(eventList)) { -// try { -// // 没有订单,休息一下 -// Thread.sleep(WAIT_TIME); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } else { -// try { - for (Event event : eventList) { - LarkRequest request = new LarkRequest(); - request.setEvent(event); - multidimensionalTableOperate.execute(request); - } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// }); + threadPool.execute(() -> { + + while (true) { + Event query = new Event(); + query.setOperateStatus(EventOperateStatus.PENDING.getCode()); + List eventList = eventMapper.selectEventList(query); + if (CollectionUtils.isEmpty(eventList)) { + try { + // 没有订单,休息一下 + Thread.sleep(WAIT_TIME); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + try { + for (Event event : eventList) { + LarkRequest request = new LarkRequest(); + request.setEvent(event); + multidimensionalTableOperate.execute(request); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }); } } From 0e36df7cdb778584206caa3d2cfc41c08c191b16 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Wed, 15 Mar 2023 23:12:28 +0800 Subject: [PATCH 10/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5(=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/flyingbook/controller/EventController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index 021e186..6edba8c 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -37,9 +37,9 @@ public class EventController extends BaseController { result = jsonObject.getString("challenge"); log.info("/event/test1/approval request:{} challenge:{}", jsonObject.toJSONString(), result); } - LarkRequest larkRequest = new LarkRequest(); - larkRequest.setMessage(result); - approvalCallback.execute(larkRequest); +// LarkRequest larkRequest = new LarkRequest(); +// larkRequest.setMessage(result); +// approvalCallback.execute(larkRequest); return result; } } From e9662c954fd76c29fb00d594a8186874c20391ed Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Wed, 15 Mar 2023 23:58:56 +0800 Subject: [PATCH 11/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5(=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/LarkApplicationRunner.java | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index 6263b02..14aa06d 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -69,32 +69,32 @@ public class LarkApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { //这里用线程池,后续如果出现量大的情况下可以调整 - threadPool.execute(() -> { - - while (true) { - Event query = new Event(); - query.setOperateStatus(EventOperateStatus.PENDING.getCode()); - List eventList = eventMapper.selectEventList(query); - if (CollectionUtils.isEmpty(eventList)) { - try { - // 没有订单,休息一下 - Thread.sleep(WAIT_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } else { - try { - for (Event event : eventList) { - LarkRequest request = new LarkRequest(); - request.setEvent(event); - multidimensionalTableOperate.execute(request); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - }); +// threadPool.execute(() -> { +// +// while (true) { +// Event query = new Event(); +// query.setOperateStatus(EventOperateStatus.PENDING.getCode()); +// List eventList = eventMapper.selectEventList(query); +// if (CollectionUtils.isEmpty(eventList)) { +// try { +// // 没有订单,休息一下 +// Thread.sleep(WAIT_TIME); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } else { +// try { +// for (Event event : eventList) { +// LarkRequest request = new LarkRequest(); +// request.setEvent(event); +// multidimensionalTableOperate.execute(request); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// }); } } From 7e1756466ebd994d0bef787c5be520299004fda6 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Thu, 16 Mar 2023 02:09:41 +0800 Subject: [PATCH 12/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5(=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LarkHelper/LarkTokenHelper.java | 36 ++++---- .../MultidimensionalTableParamHelper.java | 77 ----------------- .../consumer/LarkApplicationRunner.java | 50 ++++++----- .../controller/EventController.java | 7 +- .../domain/LarkTableRowRelation.java | 4 + .../ruoyi/flyingbook/mapper/EventMapper.java | 3 +- .../flyingbook/service/IEventService.java | 2 +- .../service/impl/EventServiceImpl.java | 4 +- .../strategy/callback/ApprovalCallback.java | 4 +- .../strategy/operate/LarkAbstract.java | 2 +- .../operate/MultidimensionalTableOperate.java | 55 ++++++++----- .../src/main/resources/mapper/EventMapper.xml | 82 ++++++++++++------- 12 files changed, 145 insertions(+), 181 deletions(-) delete mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/MultidimensionalTableParamHelper.java diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java index 017b4b0..ecde660 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java @@ -25,18 +25,20 @@ public class LarkTokenHelper { .readTimeout(10, TimeUnit.SECONDS) .build(); - private JSONObject execute(Request request){ + private JSONObject execute(Request request) { Response execute = null; + JSONObject jsonObject = null; try { execute = client.newCall(request).execute(); + if (execute == null || execute.body() == null){ + throw new RuntimeException("飞书返回结果为空"); + } + jsonObject = JSONObject.parseObject(execute.body().string()); } catch (IOException e) { String errorMessage = String.format("飞书接口调用失败:{}",e.getMessage()); throw new RuntimeException(errorMessage); } - if (execute == null || execute.body() == null){ - throw new RuntimeException("飞书返回结果为空"); - } - JSONObject jsonObject = JSONObject.parseObject(execute.body().toString()); + if ("0".equals(jsonObject.getString("code"))){ return jsonObject; }else { @@ -49,12 +51,12 @@ public class LarkTokenHelper { Map map = new HashMap<>(); map.put("app_id", appId); map.put("app_secret", srcret); - Request request = new Request.Builder() - .method("POST", RequestBody.create(JSONObject.toJSONString(map), MediaType.get("application/json"))) - .url("https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal") - .build(); + Request.Builder builder = new Request.Builder(); + builder.url("https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal"); + RequestBody requestBody = RequestBody.create(MediaType.get("application/json"),JSONObject.toJSONString(map)); - return execute(request).getString(tokenType); + builder.post(requestBody); + return execute(builder.build()).getString(tokenType); } /** @@ -71,27 +73,27 @@ public class LarkTokenHelper { return execute(request); } - public JSONObject postLark(String url,Map body, String token) { + public JSONObject postLark(String url,Map> body, String token) { Request request = new Request.Builder() .method("POST", RequestBody - .create(JSONObject.toJSONString(body), MediaType.get("application/json"))) + .create(MediaType.get("application/json"),JSONObject.toJSONString(body))) .url(url) .addHeader("Authorization",String.format("Bearer %s",token)) .build(); return execute(request); } - public JSONObject putLark(String url,Map body, String token) { + public JSONObject putLark(String url,Map> body, String token) { Request request = new Request.Builder() .put(RequestBody - .create(JSONObject.toJSONString(body), MediaType.get("application/json"))) + .create( MediaType.get("application/json"),JSONObject.toJSONString(body))) .url(url) .addHeader("Authorization",String.format("Bearer %s",token)) .build(); return execute(request); } - public JSONObject deleteLark(String url,Map body, String token) { + public JSONObject deleteLark(String url,Map> body, String token) { Request.Builder builder = new Request.Builder() .url(url) .addHeader("Authorization", String.format("Bearer %s", token)); @@ -99,7 +101,7 @@ public class LarkTokenHelper { builder.delete(); }else { builder.delete(RequestBody - .create(JSONObject.toJSONString(body), MediaType.get("application/json"))); + .create(MediaType.get("application/json"),JSONObject.toJSONString(body))); } return execute(builder.build()); } @@ -113,7 +115,7 @@ public class LarkTokenHelper { JSONObject b = new JSONObject(); map.put("fields",b); b.put("多行文本","345"); - helper.putLark("https://open.feishu.cn/open-apis/bitable/v1/apps/Gyu1b8VAFaYiEysfEUjcCKomnVc/tables/tbloMVR0ACW2uO33/records/rece1nuKGU",map,jsonObject.getString("tenant_access_token")); +// helper.putLark("https://open.feishu.cn/open-apis/bitable/v1/apps/Gyu1b8VAFaYiEysfEUjcCKomnVc/tables/tbloMVR0ACW2uO33/records/rece1nuKGU",map,jsonObject.getString("tenant_access_token")); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/MultidimensionalTableParamHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/MultidimensionalTableParamHelper.java deleted file mode 100644 index 881b903..0000000 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/MultidimensionalTableParamHelper.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.ruoyi.flyingbook.LarkHelper; - -/** - * @author yuxiangyong - * @create 2023-03-14 21:24 - */ -public class MultidimensionalTableParamHelper { - - public static Object analyseParam(String param,Integer type){ - Object result = null; - switch (type){ - case 1: - //多行文本 - break; - case 2: - //数字 - break; - case 3: - //单选 - break; - case 4: - //多选 - break; - case 5: - //日期 - break; - case 7: - //复选框 - break; - case 11: - //人员 - break; - case 13: - //电话号码 - break; - case 15: - //超链接 - break; - case 17: - //附件 - break; - case 18: - //单向关联 - break; - case 19: - //查找引用 - break; - case 20: - //公式 - break; - case 21: - //双向关联 - break; - case 22: - //地理位置 - break; - case 1001: - //创建时间 - break; - case 1002: - //最后更新时间 - break; - case 1003: - //创建人 - break; - case 1004: - //修改人 - break; - case 1005: - //自动编号 - break; - - } - return result; - } - -} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index 14aa06d..dbf0c59 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -69,32 +69,30 @@ public class LarkApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { //这里用线程池,后续如果出现量大的情况下可以调整 -// threadPool.execute(() -> { -// -// while (true) { -// Event query = new Event(); -// query.setOperateStatus(EventOperateStatus.PENDING.getCode()); -// List eventList = eventMapper.selectEventList(query); -// if (CollectionUtils.isEmpty(eventList)) { -// try { -// // 没有订单,休息一下 -// Thread.sleep(WAIT_TIME); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } else { -// try { -// for (Event event : eventList) { -// LarkRequest request = new LarkRequest(); -// request.setEvent(event); -// multidimensionalTableOperate.execute(request); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// }); + threadPool.execute(() -> { + + while (true) { + List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode()); + if (CollectionUtils.isEmpty(eventList)) { + try { + // 没有订单,休息一下 + Thread.sleep(WAIT_TIME); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + try { + for (Event event : eventList) { + LarkRequest request = new LarkRequest(); + request.setEvent(event); + multidimensionalTableOperate.execute(request); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index 6edba8c..92dc901 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -37,9 +37,10 @@ public class EventController extends BaseController { result = jsonObject.getString("challenge"); log.info("/event/test1/approval request:{} challenge:{}", jsonObject.toJSONString(), result); } -// LarkRequest larkRequest = new LarkRequest(); -// larkRequest.setMessage(result); -// approvalCallback.execute(larkRequest); + result = result.replace("多行文本","a"); + LarkRequest larkRequest = new LarkRequest(); + larkRequest.setMessage(result); + approvalCallback.execute(larkRequest); return result; } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java index 62fac0c..7b487f3 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java @@ -6,6 +6,8 @@ import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; +import java.util.Date; + /** * 【请填写功能名称】对象 lark_table_row_relation * @@ -26,6 +28,8 @@ public class LarkTableRowRelation extends BaseEntity this.toId = toId; this.type = type; this.subType = subType; + this.setCreateTime(new Date()); + this.setCreateBy("System"); this.flag = FlagStatus.OK.getCode(); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java index 3498149..136c07d 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java @@ -62,7 +62,8 @@ public interface EventMapper */ public int deleteEventByIds(Long[] ids); + public List queryEventList(@Param("status") String status); - public int updateStatus(@Param("id") Long id,@Param("status") String status); + public int updateStatus(@Param("id") Long id,@Param("status") String status,@Param("numbers") Long numbers); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java index ea97d2d..41a32c3 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java @@ -61,5 +61,5 @@ public interface IEventService */ public int deleteEventById(Long id); - public int updateStatus(Long id,String status); + public int updateStatus(Long id,String status,Long numbsers); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java index 256a6a8..3fc23a7 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java @@ -97,7 +97,7 @@ public class EventServiceImpl implements IEventService } @Override - public int updateStatus(Long id, String status) { - return 0; + public int updateStatus(Long id, String status,Long numbsers) { + return eventMapper.updateStatus(id,status,numbsers); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index 1fbb567..6b32ad3 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -78,12 +78,12 @@ public class ApprovalCallback extends CallbackAbstract { if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus())){ return; } - this.buildDto(request,event); + event = this.buildDto(request,event); if (event.getId() == null){ eventService.insertEvent(event); redisTemplate.opsForValue().set(cacheKey,JSONObject.toJSONString(event)); }else { - eventService.updateStatus(event.getId(),EventOperateStatus.PENDING.getCode()); + eventService.updateStatus(event.getId(),EventOperateStatus.PENDING.getCode(),0L); } request.setEventId(event.getId()); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java index 8a6f8f8..1c46e52 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java @@ -21,7 +21,7 @@ public abstract class LarkAbstract extends LarkOperateAbstract { /** * 获取body体 */ - protected abstract Map getBody(LarkRequest request); + protected abstract Map> getBody(LarkRequest request); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index c397075..00bec73 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -3,14 +3,14 @@ package com.ruoyi.flyingbook.strategy.operate; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.constant.CompanyNameConstants; import com.ruoyi.common.constant.RedisConstants; -import com.ruoyi.common.enums.AppType; -import com.ruoyi.common.enums.EventOperateStatus; -import com.ruoyi.common.enums.FlagStatus; -import com.ruoyi.common.enums.TableDetailRelationTypeEnum; +import com.ruoyi.common.enums.*; import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper; import com.ruoyi.flyingbook.domain.*; import com.ruoyi.flyingbook.service.*; import lombok.extern.slf4j.Slf4j; +import okhttp3.MediaType; +import okhttp3.Request; +import okhttp3.RequestBody; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -119,6 +119,9 @@ public class MultidimensionalTableOperate extends LarkAbstract { log.error("larkCompanyRelationService.getByCompanyName:{}", errorMessage); throw new RuntimeException(errorMessage); } + Map map = new HashMap<>(); + map.put("app_id", "app_id"); + map.put("app_secret", "app_id"); //用于后续追加row时候做关联关系 request.setCompanyRelationId(relation.getId()); //关联关系表填充 @@ -133,9 +136,11 @@ public class MultidimensionalTableOperate extends LarkAbstract { JSONObject message = larkTokenHelper.getLark(getUrl(request), null, request.getToken()); request.setRecord(message); for (Map.Entry entry : request.getTableRelationMap().entrySet()) { - request.setToTableId(entry.getKey()); + String[] arr = entry.getKey().split("_"); + request.setToAppToken(arr[0]); + request.setToTableId(arr[1]); request.setTableRelationId(entry.getValue()); - Map body = getBody(request); + Map> body = getBody(request); String url = getUrl(request); if (StringUtils.isBlank(url)) { return; @@ -152,13 +157,13 @@ public class MultidimensionalTableOperate extends LarkAbstract { redisTemplate.delete(cacheKey); if (UPDATE_OPERATE.equals(request.getOperateType())) { if (rowRelation.containsKey(event.getRecordId())) { - return updateLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(event.getRecordId())); + return updateLine.replace(":app_token", request.getToAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(event.getRecordId())); } } else if (CREATE_OPERATE.equals(request.getOperateType())) { - return addLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()); + return addLine.replace(":app_token", request.getToAppToken()).replace(":table_id", request.getToTableId()); } else if (DELETE_OPERATE.equals(request.getOperateType())) { if (rowRelation.containsKey(event.getRecordId())) { - return deleteLine.replace(":app_token", event.getAppToken()).replace(":table_id", event.getTableId()).replace(":record_id", rowRelation.get(event.getRecordId())); + return deleteLine.replace(":app_token", request.getToAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(event.getRecordId())); } } else if (DETAIL.equals(request.getOperateType())) { return getDetail.replace(":app_token", event.getAppToken()).replace(":table_id", event.getTableId()).replace(":record_id", event.getRecordId()); @@ -167,11 +172,11 @@ public class MultidimensionalTableOperate extends LarkAbstract { } @Override - protected Map getBody(LarkRequest request) { - Map result = new HashMap<>(); + protected Map> getBody(LarkRequest request) { + Map> result = new HashMap<>(); JSONObject record = request.getRecord(); String responseCode = record.getString("code"); - Map rowMap = request.getTableRowRelationMap().get(request.getTableRelationId()); + Map rowMap = request.getTableRowRelationMap().getOrDefault(request.getTableRelationId(),new HashMap<>()); if ("1254043".equals(responseCode)) { request.setOperateType(DELETE_OPERATE); } else if ("0".equals(responseCode)) { @@ -185,14 +190,14 @@ public class MultidimensionalTableOperate extends LarkAbstract { return result; } - private Map parseMap(LarkRequest request) { + private Map> parseMap(LarkRequest request) { Map result = new HashMap<>(); JSONObject record = request.getRecord(); - Map colRelation = request.getTableColRelationMap().get(request.getToTableId()); + Map colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(),new HashMap<>()); String fields = record.getJSONObject("data").getJSONObject("record").getString("fields"); Map midMap = JSONObject.parseObject(fields, Map.class); for (Map.Entry entry : midMap.entrySet()) { - String key = String.valueOf(entry); + String key = String.valueOf(entry.getKey()); if (!colRelation.containsKey(key)) { continue; } @@ -200,10 +205,10 @@ public class MultidimensionalTableOperate extends LarkAbstract { } Map> map = new HashMap<>(); map.put("fields",result); - return result; + return map; } - protected void send(String type, String url, Map body, LarkRequest request) { + protected void send(String type, String url, Map> body, LarkRequest request) { String token = request.getToken(); if (CREATE_OPERATE.equals(type)) { JSONObject result = larkTokenHelper.postLark(url, body, token); @@ -216,9 +221,12 @@ public class MultidimensionalTableOperate extends LarkAbstract { iLarkTableRowRelationService.insertLarkTableRowRelation(rowRelation); } } + request.setEventOperateType(EventOperateType.CREATE); } else if (UPDATE_OPERATE.equals(type)) { + request.setEventOperateType(EventOperateType.UPDATE); larkTokenHelper.putLark(url, body, token); } else if (DELETE_OPERATE.equals(type)) { + request.setEventOperateType(EventOperateType.DELETE); larkTokenHelper.deleteLark(url, body, token); } } @@ -226,10 +234,15 @@ public class MultidimensionalTableOperate extends LarkAbstract { @Override protected void endHandle(LarkRequest request) { Event event = request.getEvent(); - eventService.updateStatus(event.getId(), EventOperateStatus.SUCCESS.getCode()); - EventLog eventLog = StringUtils.isBlank(request.getErrorMessage()) ? - new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage()) - : new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); + EventLog eventLog = null; + if (StringUtils.isBlank(request.getErrorMessage())){ + eventService.updateStatus(event.getId(),EventOperateStatus.SUCCESS.getCode(),event.getNumbers()); + eventLog = new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage()); + }else { + eventService.updateStatus(event.getId(),EventOperateStatus.PENDING.getCode(),event.getNumbers()+1); + new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); + } + eventLogService.insertEventLog(eventLog); } diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml index 968e4e6..889ad71 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml @@ -1,45 +1,57 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - - - - - + + + + + + + + + + + + - select id, app_token, table_id, record_id, numbers, operate_status, create_by, create_time, update_by, update_time, flag, remark from event + select id, + app_token, + table_id, + record_id, + numbers, + operate_status, + create_by, + create_time, + update_by, + update_time, + flag, + remark + from event - + - + insert into event @@ -54,7 +66,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_time, flag, remark, - + #{appToken}, #{tableId}, @@ -67,7 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{updateTime}, #{flag}, #{remark}, - + @@ -89,17 +101,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from event where id = #{id} + delete + from event + where id = #{id} - delete from event where id in + delete from event where id in #{id} + + - update event set operate_status = #{status} where id = #{id} + update event + set operate_status = #{status}, + numbers = #{numbers} + where id = #{id} \ No newline at end of file From b7e1d5c7a1d4972360e9faf008064ed8663e1bcc Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Thu, 16 Mar 2023 02:18:38 +0800 Subject: [PATCH 13/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5(=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/EventController.java | 1 - .../operate/MultidimensionalTableOperate.java | 25 +++++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index 92dc901..021e186 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -37,7 +37,6 @@ public class EventController extends BaseController { result = jsonObject.getString("challenge"); log.info("/event/test1/approval request:{} challenge:{}", jsonObject.toJSONString(), result); } - result = result.replace("多行文本","a"); LarkRequest larkRequest = new LarkRequest(); larkRequest.setMessage(result); approvalCallback.execute(larkRequest); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index 00bec73..6b38b3d 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -126,7 +126,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { request.setCompanyRelationId(relation.getId()); //关联关系表填充 this.fillTableRelation(request); - String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret(),"tenant_access_token"); + String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret(), "tenant_access_token"); request.setToken(token); } @@ -176,7 +176,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { Map> result = new HashMap<>(); JSONObject record = request.getRecord(); String responseCode = record.getString("code"); - Map rowMap = request.getTableRowRelationMap().getOrDefault(request.getTableRelationId(),new HashMap<>()); + Map rowMap = request.getTableRowRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); if ("1254043".equals(responseCode)) { request.setOperateType(DELETE_OPERATE); } else if ("0".equals(responseCode)) { @@ -193,7 +193,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { private Map> parseMap(LarkRequest request) { Map result = new HashMap<>(); JSONObject record = request.getRecord(); - Map colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(),new HashMap<>()); + Map colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); String fields = record.getJSONObject("data").getJSONObject("record").getString("fields"); Map midMap = JSONObject.parseObject(fields, Map.class); for (Map.Entry entry : midMap.entrySet()) { @@ -204,7 +204,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { result.put(colRelation.get(key), entry.getValue()); } Map> map = new HashMap<>(); - map.put("fields",result); + map.put("fields", result); return map; } @@ -235,15 +235,18 @@ public class MultidimensionalTableOperate extends LarkAbstract { protected void endHandle(LarkRequest request) { Event event = request.getEvent(); EventLog eventLog = null; - if (StringUtils.isBlank(request.getErrorMessage())){ - eventService.updateStatus(event.getId(),EventOperateStatus.SUCCESS.getCode(),event.getNumbers()); + if (StringUtils.isBlank(request.getErrorMessage())) { + eventService.updateStatus(event.getId(), EventOperateStatus.SUCCESS.getCode(), event.getNumbers()); eventLog = new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage()); - }else { - eventService.updateStatus(event.getId(),EventOperateStatus.PENDING.getCode(),event.getNumbers()+1); - new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); + } else { + eventService.updateStatus(event.getId(), EventOperateStatus.PENDING.getCode(), event.getNumbers() + 1); + if (request.getEventOperateType() != null) { + new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); + } + } + if (eventLog != null) { + eventLogService.insertEventLog(eventLog); } - - eventLogService.insertEventLog(eventLog); } @Override From d30ceb45f815966bc0d88d496f7e9d34cd8f7ad3 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Thu, 16 Mar 2023 02:20:25 +0800 Subject: [PATCH 14/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5(=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java | 1 + .../strategy/operate/MultidimensionalTableOperate.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java index c149827..1a7dc90 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java @@ -44,6 +44,7 @@ public class LarkRequest { private String callBackMessage; private Event event; private EventOperateType eventOperateType; + private String operateInfo; /** * 表关系 */ diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index 6b38b3d..cc49438 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -209,6 +209,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { } protected void send(String type, String url, Map> body, LarkRequest request) { + request.setOperateInfo(String.valueOf(body)); String token = request.getToken(); if (CREATE_OPERATE.equals(type)) { JSONObject result = larkTokenHelper.postLark(url, body, token); @@ -245,6 +246,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { } } if (eventLog != null) { + eventLog.setOperateInfo(request.getOperateType()); eventLogService.insertEventLog(eventLog); } } From 5ffa6b0cd1bbd06be44d81f5687408f3a52ba4ea Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Thu, 16 Mar 2023 20:41:00 +0800 Subject: [PATCH 15/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=EF=BC=88=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LarkHelper/LarkTokenHelper.java | 19 ++- .../consumer/LarkApplicationRunner.java | 3 +- .../com/ruoyi/flyingbook/domain/Event.java | 119 +++--------------- .../com/ruoyi/flyingbook/domain/EventLog.java | 98 +-------------- .../domain/LarkCompanyRelation.java | 116 ++--------------- .../ruoyi/flyingbook/domain/LarkRequest.java | 1 + .../flyingbook/domain/LarkTableRelation.java | 113 ++--------------- .../domain/LarkTableRowRelation.java | 107 ++-------------- .../ruoyi/flyingbook/mapper/EventMapper.java | 2 +- .../service/ILarkCompanyRelationService.java | 2 +- .../impl/LarkCompanyRelationServiceImpl.java | 6 +- .../strategy/callback/ApprovalCallback.java | 10 ++ .../operate/MultidimensionalTableOperate.java | 7 +- .../src/main/resources/mapper/EventMapper.xml | 14 ++- 14 files changed, 95 insertions(+), 522 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java index ecde660..7f9a2a0 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java @@ -70,7 +70,24 @@ public class LarkTokenHelper { .url(url) .addHeader("Authorization",String.format("Bearer %s",token)) .build(); - return execute(request); + JSONObject jsonObject = null; + try { + execute = client.newCall(request).execute(); + if (execute == null || execute.body() == null){ + throw new RuntimeException("飞书返回结果为空"); + } + jsonObject = JSONObject.parseObject(execute.body().string()); + } catch (IOException e) { + String errorMessage = String.format("飞书接口调用失败:{}",e.getMessage()); + throw new RuntimeException(errorMessage); + } + String code = jsonObject.getString("code"); + if ("0".equals(code) || "1254043".equals(code)){ + return jsonObject; + }else { + String errorMessage = String.format("%s##%s", code, jsonObject.getString("msg")); + throw new RuntimeException(errorMessage); + } } public JSONObject postLark(String url,Map> body, String token) { diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index dbf0c59..6d63018 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -2,6 +2,7 @@ package com.ruoyi.flyingbook.consumer; import cn.hutool.core.thread.ThreadFactoryBuilder; import com.ruoyi.common.constant.RedisConstants; +import com.ruoyi.common.enums.AppType; import com.ruoyi.common.enums.EventOperateStatus; import com.ruoyi.flyingbook.domain.Event; import com.ruoyi.flyingbook.domain.LarkRequest; @@ -72,7 +73,7 @@ public class LarkApplicationRunner implements ApplicationRunner { threadPool.execute(() -> { while (true) { - List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode()); + List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode(), AppType.APPROVAL.getCode()); if (CollectionUtils.isEmpty(eventList)) { try { // 没有订单,休息一下 diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java index 5ed6cee..8f9cd41 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java @@ -1,8 +1,6 @@ package com.ruoyi.flyingbook.domain; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.ruoyi.common.annotation.Excel; +import lombok.Data; import com.ruoyi.common.core.domain.BaseEntity; @@ -12,116 +10,27 @@ import com.ruoyi.common.core.domain.BaseEntity; * @author ruoyi * @date 2023-03-15 */ -public class Event extends BaseEntity -{ +@Data +public class Event extends BaseEntity { private static final long serialVersionUID = 1L; - /** $column.columnComment */ private Long id; - - /** id */ - @Excel(name = "id") + private String appId; + /** + * @see com.ruoyi.common.enums.AppType + */ + private String type; private String appToken; - - /** id */ - @Excel(name = "id") private String tableId; - - /** id */ - @Excel(name = "id") private String recordId; - - /** $column.columnComment */ - @Excel(name = "id") private Long numbers; - - /** () */ - @Excel(name = "()") + /** + * @see com.ruoyi.common.enums.EventOperateStatus + */ private String operateStatus; - - /** (01) */ - @Excel(name = "(01)") + /** + * @see com.ruoyi.common.enums.FlagStatus + */ private Long flag; - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - public void setAppToken(String appToken) - { - this.appToken = appToken; - } - - public String getAppToken() - { - return appToken; - } - public void setTableId(String tableId) - { - this.tableId = tableId; - } - - public String getTableId() - { - return tableId; - } - public void setRecordId(String recordId) - { - this.recordId = recordId; - } - - public String getRecordId() - { - return recordId; - } - public void setNumbers(Long numbers) - { - this.numbers = numbers; - } - - public Long getNumbers() - { - return numbers; - } - public void setOperateStatus(String operateStatus) - { - this.operateStatus = operateStatus; - } - - public String getOperateStatus() - { - return operateStatus; - } - public void setFlag(Long flag) - { - this.flag = flag; - } - - public Long getFlag() - { - return flag; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("appToken", getAppToken()) - .append("tableId", getTableId()) - .append("recordId", getRecordId()) - .append("numbers", getNumbers()) - .append("operateStatus", getOperateStatus()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("flag", getFlag()) - .append("remark", getRemark()) - .toString(); - } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java index b10e103..ecf17b4 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java @@ -1,8 +1,6 @@ package com.ruoyi.flyingbook.domain; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.ruoyi.common.annotation.Excel; +import lombok.Data; import com.ruoyi.common.core.domain.BaseEntity; import java.util.Date; @@ -13,8 +11,8 @@ import java.util.Date; * @author ruoyi * @date 2023-03-15 */ -public class EventLog extends BaseEntity -{ +@Data +public class EventLog extends BaseEntity { private static final long serialVersionUID = 1L; public EventLog() { @@ -38,98 +36,14 @@ public class EventLog extends BaseEntity this.setCreateBy("System"); } - /** $column.columnComment */ private Long id; - - /** $column.columnComment */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private Long eventId; - - /** $column.columnComment */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + /** + * @see com.ruoyi.common.enums.EventOperateType + */ private String operateType; - - /** $column.columnComment */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String operateInfo; - - /** $column.columnComment */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String errorCode; - - /** $column.columnComment */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String errorMessage; - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - public void setEventId(Long eventId) - { - this.eventId = eventId; - } - - public Long getEventId() - { - return eventId; - } - public void setOperateType(String operateType) - { - this.operateType = operateType; - } - - public String getOperateType() - { - return operateType; - } - public void setOperateInfo(String operateInfo) - { - this.operateInfo = operateInfo; - } - - public String getOperateInfo() - { - return operateInfo; - } - public void setErrorCode(String errorCode) - { - this.errorCode = errorCode; - } - - public String getErrorCode() - { - return errorCode; - } - public void setErrorMessage(String errorMessage) - { - this.errorMessage = errorMessage; - } - - public String getErrorMessage() - { - return errorMessage; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("eventId", getEventId()) - .append("operateType", getOperateType()) - .append("operateInfo", getOperateInfo()) - .append("errorCode", getErrorCode()) - .append("errorMessage", getErrorMessage()) - .append("remark", getRemark()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .toString(); - } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java index 41acdf9..3ca60ed 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java @@ -1,126 +1,28 @@ package com.ruoyi.flyingbook.domain; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.ruoyi.common.annotation.Excel; +import lombok.Data; import com.ruoyi.common.core.domain.BaseEntity; /** - * 【请填写功能名称】对象 lark_company_relation - * * @author ruoyi * @date 2023-03-15 */ -public class LarkCompanyRelation extends BaseEntity -{ +@Data +public class LarkCompanyRelation extends BaseEntity { private static final long serialVersionUID = 1L; - /** $column.columnComment */ private Long id; - - /** id */ - @Excel(name = "id") private Long companyId; - - /** $column.columnComment */ - @Excel(name = "id") private String companyName; - - /** appId */ - @Excel(name = "appId") private String appId; - - /** +appId */ - @Excel(name = "+appId") private String secret; - - /** app */ - @Excel(name = "app") + /** + * @see com.ruoyi.common.enums.AppType + */ private String appType; - - /** 01 */ - @Excel(name = "01") + /** + * @see com.ruoyi.common.enums.FlagStatus + */ private Long flag; - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - public void setCompanyId(Long companyId) - { - this.companyId = companyId; - } - - public Long getCompanyId() - { - return companyId; - } - public void setCompanyName(String companyName) - { - this.companyName = companyName; - } - - public String getCompanyName() - { - return companyName; - } - public void setAppId(String appId) - { - this.appId = appId; - } - - public String getAppId() - { - return appId; - } - public void setSecret(String secret) - { - this.secret = secret; - } - - public String getSecret() - { - return secret; - } - public void setAppType(String appType) - { - this.appType = appType; - } - - public String getAppType() - { - return appType; - } - public void setFlag(Long flag) - { - this.flag = flag; - } - - public Long getFlag() - { - return flag; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("companyId", getCompanyId()) - .append("companyName", getCompanyName()) - .append("appId", getAppId()) - .append("secret", getSecret()) - .append("appType", getAppType()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("flag", getFlag()) - .append("remark", getRemark()) - .toString(); - } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java index 1a7dc90..47350bb 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java @@ -18,6 +18,7 @@ public class LarkRequest { * 通用信息,不可修改不可删除 */ private String token; + private String appId; private String fromAppToken; private String toAppToken; private String errorCode; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java index 3147dc8..1ad7b24 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java @@ -1,126 +1,27 @@ package com.ruoyi.flyingbook.domain; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.ruoyi.common.annotation.Excel; +import lombok.Data; import com.ruoyi.common.core.domain.BaseEntity; /** * 【请填写功能名称】对象 lark_table_relation - * + * * @author ruoyi * @date 2023-03-15 */ -public class LarkTableRelation extends BaseEntity -{ +@Data +public class LarkTableRelation extends BaseEntity { private static final long serialVersionUID = 1L; - /** $column.columnComment */ private Long id; - - /** id */ - @Excel(name = "id") private Long larkCompanyRelationId; - - /** $column.columnComment */ - @Excel(name = "id") private String fromAppToken; - - /** $column.columnComment */ - @Excel(name = "id") private String fromTableId; - - /** $column.columnComment */ - @Excel(name = "id") private String toAppToken; - - /** $column.columnComment */ - @Excel(name = "id") private String toTableId; - - /** 01 */ - @Excel(name = "01") + /** + * @see com.ruoyi.common.enums.FlagStatus + */ private Long flag; - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - public void setLarkCompanyRelationId(Long larkCompanyRelationId) - { - this.larkCompanyRelationId = larkCompanyRelationId; - } - - public Long getLarkCompanyRelationId() - { - return larkCompanyRelationId; - } - public void setFromAppToken(String fromAppToken) - { - this.fromAppToken = fromAppToken; - } - - public String getFromAppToken() - { - return fromAppToken; - } - public void setFromTableId(String fromTableId) - { - this.fromTableId = fromTableId; - } - - public String getFromTableId() - { - return fromTableId; - } - public void setToAppToken(String toAppToken) - { - this.toAppToken = toAppToken; - } - - public String getToAppToken() - { - return toAppToken; - } - public void setToTableId(String toTableId) - { - this.toTableId = toTableId; - } - - public String getToTableId() - { - return toTableId; - } - public void setFlag(Long flag) - { - this.flag = flag; - } - - public Long getFlag() - { - return flag; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("larkCompanyRelationId", getLarkCompanyRelationId()) - .append("fromAppToken", getFromAppToken()) - .append("fromTableId", getFromTableId()) - .append("toAppToken", getToAppToken()) - .append("toTableId", getToTableId()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("flag", getFlag()) - .append("remark", getRemark()) - .toString(); - } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java index 7b487f3..ed8c836 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java @@ -1,6 +1,7 @@ package com.ruoyi.flyingbook.domain; import com.ruoyi.common.enums.FlagStatus; +import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -14,6 +15,7 @@ import java.util.Date; * @author ruoyi * @date 2023-03-15 */ +@Data public class LarkTableRowRelation extends BaseEntity { private static final long serialVersionUID = 1L; @@ -35,110 +37,17 @@ public class LarkTableRowRelation extends BaseEntity /** $column.columnComment */ private Long id; - - /** id */ - @Excel(name = "id") private Long tableRelationId; - - /** $column.columnComment */ - @Excel(name = "id") private String fromId; - - /** $column.columnComment */ - @Excel(name = "id") private String toId; - - /** */ - @Excel(name = " ") + /** + * @see com.ruoyi.common.enums.TableDetailRelationTypeEnum + */ private String type; - - /** $column.columnComment */ - @Excel(name = " ") private String subType; - - /** 01 */ - @Excel(name = "01") + /** + * @see com.ruoyi.common.enums.FlagStatus + */ private Long flag; - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - public void setTableRelationId(Long tableRelationId) - { - this.tableRelationId = tableRelationId; - } - - public Long getTableRelationId() - { - return tableRelationId; - } - public void setFromId(String fromId) - { - this.fromId = fromId; - } - - public String getFromId() - { - return fromId; - } - public void setToId(String toId) - { - this.toId = toId; - } - - public String getToId() - { - return toId; - } - public void setType(String type) - { - this.type = type; - } - - public String getType() - { - return type; - } - public void setSubType(String subType) - { - this.subType = subType; - } - - public String getSubType() - { - return subType; - } - public void setFlag(Long flag) - { - this.flag = flag; - } - - public Long getFlag() - { - return flag; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("tableRelationId", getTableRelationId()) - .append("fromId", getFromId()) - .append("toId", getToId()) - .append("type", getType()) - .append("subType", getSubType()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("flag", getFlag()) - .append("remark", getRemark()) - .toString(); - } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java index 136c07d..67ae9b0 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java @@ -62,7 +62,7 @@ public interface EventMapper */ public int deleteEventByIds(Long[] ids); - public List queryEventList(@Param("status") String status); + public List queryEventList(@Param("status") String status,@Param("type") String type); public int updateStatus(@Param("id") Long id,@Param("status") String status,@Param("numbers") Long numbers); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java index c26a4ed..eb6fc7f 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java @@ -61,5 +61,5 @@ public interface ILarkCompanyRelationService */ public int deleteLarkCompanyRelationById(Long id); - public LarkCompanyRelation getByCompanyName(String companyName,String appType); + public LarkCompanyRelation getByAppIdAndType(String appId,String appType); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java index e93a261..9d63681 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java @@ -105,13 +105,13 @@ public class LarkCompanyRelationServiceImpl implements ILarkCompanyRelationServi * @return 【请填写功能名称】 */ @Override - public LarkCompanyRelation getByCompanyName(String companyName,String appType) + public LarkCompanyRelation getByAppIdAndType(String appId,String appType) { - if (StringUtils.isEmpty(companyName) || StringUtils.isEmpty(appType)){ + if (StringUtils.isEmpty(appId) || StringUtils.isEmpty(appType)){ return null; } LarkCompanyRelation relation = new LarkCompanyRelation(); - relation.setCompanyName(companyName); + relation.setAppId(appId); relation.setAppType(appType); relation.setFlag(FlagStatus.OK.getCode()); List larkCompanyRelations = larkCompanyRelationMapper.selectLarkCompanyRelationList(relation); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index 6b32ad3..211c6c1 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -2,6 +2,7 @@ package com.ruoyi.flyingbook.strategy.callback; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.enums.AppType; import com.ruoyi.flyingbook.domain.Event; import com.ruoyi.flyingbook.domain.EventLog; import com.ruoyi.flyingbook.service.IEventLogService; @@ -62,6 +63,13 @@ public class ApprovalCallback extends CallbackAbstract { JSONObject action = actionList.getJSONObject(0); String recordId = action.getString("record_id"); request.setFromRecordId(recordId); + + JSONObject header = jsonObject.getJSONObject("header"); + if (header == null) { + return; + } + String appId = header.getString("app_id"); + request.setAppId(appId); } @Override @@ -138,6 +146,8 @@ public class ApprovalCallback extends CallbackAbstract { event.setCreateTime(new Date()); event.setUpdateTime(new Date()); event.setUpdateBy("System"); + event.setAppId(request.getAppId()); + event.setType(AppType.APPROVAL.getCode()); return event; } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index cc49438..777ac99 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -113,15 +113,12 @@ public class MultidimensionalTableOperate extends LarkAbstract { if (event == null) { throw new RuntimeException("当前事件为空"); } - LarkCompanyRelation relation = larkCompanyRelationService.getByCompanyName(CompanyNameConstants.COMPANY_NAME, AppType.APPROVAL.getCode()); + LarkCompanyRelation relation = larkCompanyRelationService.getByAppIdAndType(request.getEvent().getAppId(), AppType.APPROVAL.getCode()); if (relation == null) { - String errorMessage = String.format("获取app值为空 companyName:{} appType:{}", CompanyNameConstants.COMPANY_NAME, AppType.APPROVAL.getCode()); + String errorMessage = String.format("获取app值为空 appId:{} appType:{}", request.getEvent().getAppId(), AppType.APPROVAL.getCode()); log.error("larkCompanyRelationService.getByCompanyName:{}", errorMessage); throw new RuntimeException(errorMessage); } - Map map = new HashMap<>(); - map.put("app_id", "app_id"); - map.put("app_secret", "app_id"); //用于后续追加row时候做关联关系 request.setCompanyRelationId(relation.getId()); //关联关系表填充 diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml index 889ad71..0849919 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml @@ -6,6 +6,8 @@ + + @@ -21,6 +23,8 @@ select id, + app_id, + `type`, app_token, table_id, record_id, @@ -38,6 +42,8 @@ - where operate_status = #{status} and 3 > numbers + where operate_status = #{status} and `type` = #{type} and 3 > numbers From c4f78188fc2ce657aedd63c24909a01f2b38b2a3 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Thu, 16 Mar 2023 20:41:43 +0800 Subject: [PATCH 16/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=EF=BC=88=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/lark.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql/lark.sql b/sql/lark.sql index 59a2582..5b17f29 100644 --- a/sql/lark.sql +++ b/sql/lark.sql @@ -2,6 +2,8 @@ DROP TABLE IF EXISTS `event`; CREATE TABLE `event` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `app_id` varchar(255) DEFAULT NULL COMMENT '关联查找secret', + `type` varchar(255) DEFAULT NULL COMMENT '事件类型', `app_token` varchar(255) DEFAULT NULL COMMENT '文件id', `table_id` varchar(255) DEFAULT NULL COMMENT '表格id', `record_id` varchar(255) DEFAULT NULL COMMENT '行id', From 3d4c8df8f58c4d79b327ba6067f8bf4df503bdf8 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Thu, 16 Mar 2023 20:44:35 +0800 Subject: [PATCH 17/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=EF=BC=88=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/flyingbook/strategy/callback/ApprovalCallback.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index 211c6c1..2b2a737 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -61,7 +61,11 @@ public class ApprovalCallback extends CallbackAbstract { return; } JSONObject action = actionList.getJSONObject(0); + //如果不存在说明是行变更以外的事件,跳过 String recordId = action.getString("record_id"); + if (StringUtils.isBlank(recordId)) { + return; + } request.setFromRecordId(recordId); JSONObject header = jsonObject.getJSONObject("header"); From 4d5c87441616f136b0629f36c3f8ca1e33873795 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Thu, 16 Mar 2023 21:11:11 +0800 Subject: [PATCH 18/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=EF=BC=88=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/enums/CallBackTypeEnum.java | 39 +++++++++++++++++ .../controller/EventController.java | 6 +-- .../ruoyi/flyingbook/domain/LarkRequest.java | 1 + .../ruoyi/flyingbook/factory/LarkFactory.java | 43 +++++++++++++++++++ ...ava => MultidimensionalTableCallback.java} | 4 +- 5 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/CallBackTypeEnum.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkFactory.java rename ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/{ApprovalCallback.java => MultidimensionalTableCallback.java} (97%) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/CallBackTypeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CallBackTypeEnum.java new file mode 100644 index 0000000..a2c00d3 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CallBackTypeEnum.java @@ -0,0 +1,39 @@ +package com.ruoyi.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum CallBackTypeEnum { + /** + * + */ + TABLE_ROW_CHANGE("drive.file.bitable_record_changed_v1", "多维表格行记录变更"), + APPROVAL_TASK("approval_task", "审批事件回调"); + + private final String code; + private final String info; + + CallBackTypeEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + + public static CallBackTypeEnum getByCode(String code){ + for (CallBackTypeEnum value : CallBackTypeEnum.values()) { + if (value.getCode().equals(code)){ + return value; + } + } + return null; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index 021e186..3920637 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.ruoyi.flyingbook.domain.LarkRequest; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.utils.DecryptUtil; -import com.ruoyi.flyingbook.strategy.callback.ApprovalCallback; +import com.ruoyi.flyingbook.strategy.callback.MultidimensionalTableCallback; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -18,7 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; public class EventController extends BaseController { @Autowired - private ApprovalCallback approvalCallback; + private MultidimensionalTableCallback multidimensionalTableCallback; //3. 创建路由处理器 @PostMapping("/approval") @@ -39,7 +39,7 @@ public class EventController extends BaseController { } LarkRequest larkRequest = new LarkRequest(); larkRequest.setMessage(result); - approvalCallback.execute(larkRequest); + multidimensionalTableCallback.execute(larkRequest); return result; } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java index 47350bb..7a1cfa3 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java @@ -30,6 +30,7 @@ public class LarkRequest { */ private Long eventId; private String message; + private String eventType; /** * MultidimensionalTableOperate 用参数 diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkFactory.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkFactory.java new file mode 100644 index 0000000..c8933c2 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkFactory.java @@ -0,0 +1,43 @@ +package com.ruoyi.flyingbook.factory; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.enums.CallBackTypeEnum; +import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.strategy.callback.MultidimensionalTableCallback; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author yuxiangyong + * @create 2023-03-16 20:54 + */ +@Component +public class LarkFactory { + + @Autowired + private MultidimensionalTableCallback approvalCallback; + + public void execute(LarkRequest larkRequest) { + String message = larkRequest.getMessage(); + if (StringUtils.isBlank(message)) { + return; + } + JSONObject jsonObject = JSONObject.parseObject(message); + String eventType = jsonObject.getJSONObject("header").getString("event_type"); + CallBackTypeEnum callBackTypeEnum = CallBackTypeEnum.getByCode(eventType); + if (callBackTypeEnum == null) { + return; + } + switch (callBackTypeEnum) { + case TABLE_ROW_CHANGE: + approvalCallback.execute(larkRequest); + break; + case APPROVAL_TASK: + break; + default: + break; + } + } + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java similarity index 97% rename from ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java index 2b2a737..77377ea 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java @@ -12,7 +12,6 @@ import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.enums.EventOperateStatus; import com.ruoyi.common.enums.EventOperateType; import com.ruoyi.common.enums.FlagStatus; -import com.sun.corba.se.impl.orbutil.RepIdDelegator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -29,7 +28,7 @@ import java.util.List; */ @Slf4j @Service -public class ApprovalCallback extends CallbackAbstract { +public class MultidimensionalTableCallback extends CallbackAbstract { @Autowired private IEventService eventService; @@ -74,6 +73,7 @@ public class ApprovalCallback extends CallbackAbstract { } String appId = header.getString("app_id"); request.setAppId(appId); + request.setEventType(header.getString("event_type")); } @Override From 1f1ced9a25d023958c18f7e783d9a03c5e553afe Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Fri, 17 Mar 2023 22:59:36 +0800 Subject: [PATCH 19/37] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/enums/EventTypeEnum.java | 39 ++++ .../LarkHelper/LarkTokenHelper.java | 6 +- .../consumer/LarkApplicationRunner.java | 25 +- .../controller/EventController.java | 14 +- .../ruoyi/flyingbook/domain/LarkRequest.java | 1 - ...kFactory.java => LarkCallBackFactory.java} | 17 +- .../factory/LarkOperateFactory.java | 42 ++++ .../ruoyi/flyingbook/mapper/EventMapper.java | 2 +- .../strategy/callback/ApprovalCallback.java | 120 ++++++++++ .../MultidimensionalTableCallback.java | 8 +- .../operate/ApprovalCallbackOperate.java | 220 ++++++++++++++++++ .../operate/MultidimensionalTableOperate.java | 8 +- .../src/main/resources/mapper/EventMapper.xml | 2 +- 13 files changed, 456 insertions(+), 48 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/EventTypeEnum.java rename ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/{LarkFactory.java => LarkCallBackFactory.java} (67%) create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkOperateFactory.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventTypeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventTypeEnum.java new file mode 100644 index 0000000..5a760a1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventTypeEnum.java @@ -0,0 +1,39 @@ +package com.ruoyi.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum EventTypeEnum { + /** + * + */ + ROW_CHANGE("ROW_CHANGE", "多维表格行记录变更"), + APPROVAL_TASK("APPROVAL_TASK", "审批事件"); + + private final String code; + private final String info; + + EventTypeEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + + public static EventTypeEnum getByCode(String code){ + for (EventTypeEnum value : EventTypeEnum.values()) { + if (value.getCode().equals(code)){ + return value; + } + } + return null; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java index 7f9a2a0..619dd2f 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java @@ -4,10 +4,12 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import okhttp3.*; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -64,7 +66,7 @@ public class LarkTokenHelper { * @param token * @return */ - public JSONObject getLark(String url,Map body, String token) { + public JSONObject getLark(String url, Map body, String token, List safeCodeList) { Response execute = null; Request request = new Request.Builder() .url(url) @@ -82,7 +84,7 @@ public class LarkTokenHelper { throw new RuntimeException(errorMessage); } String code = jsonObject.getString("code"); - if ("0".equals(code) || "1254043".equals(code)){ + if ("0".equals(code) || (CollectionUtils.isNotEmpty(safeCodeList) && safeCodeList.contains(code))){ return jsonObject; }else { String errorMessage = String.format("%s##%s", code, jsonObject.getString("msg")); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index 6d63018..5946ea7 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -1,29 +1,18 @@ package com.ruoyi.flyingbook.consumer; -import cn.hutool.core.thread.ThreadFactoryBuilder; -import com.ruoyi.common.constant.RedisConstants; -import com.ruoyi.common.enums.AppType; import com.ruoyi.common.enums.EventOperateStatus; import com.ruoyi.flyingbook.domain.Event; -import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.factory.LarkOperateFactory; import com.ruoyi.flyingbook.mapper.EventMapper; -import com.ruoyi.flyingbook.service.IEventService; -import com.ruoyi.flyingbook.strategy.operate.MultidimensionalTableOperate; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.compress.utils.Lists; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -39,11 +28,11 @@ public class LarkApplicationRunner implements ApplicationRunner { /** * 核心线程数 */ - private static final Integer CORE_POOL_SIZE = 1; + private static final Integer CORE_POOL_SIZE = 3; /** * 最大线程数 */ - private static final Integer MAX_POOL_SIZE = 1; + private static final Integer MAX_POOL_SIZE = 3; /** * 存活时间 */ @@ -62,7 +51,7 @@ public class LarkApplicationRunner implements ApplicationRunner { private EventMapper eventMapper; @Autowired - private MultidimensionalTableOperate multidimensionalTableOperate; + private LarkOperateFactory larkOperateFactory; ThreadPoolExecutor threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingQueue(QUEUE_SIZE), new ThreadPoolExecutor.AbortPolicy()); @@ -73,7 +62,7 @@ public class LarkApplicationRunner implements ApplicationRunner { threadPool.execute(() -> { while (true) { - List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode(), AppType.APPROVAL.getCode()); + List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode()); if (CollectionUtils.isEmpty(eventList)) { try { // 没有订单,休息一下 @@ -84,9 +73,7 @@ public class LarkApplicationRunner implements ApplicationRunner { } else { try { for (Event event : eventList) { - LarkRequest request = new LarkRequest(); - request.setEvent(event); - multidimensionalTableOperate.execute(request); + larkOperateFactory.execute(event); } } catch (Exception e) { e.printStackTrace(); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index 3920637..d68aade 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.ruoyi.flyingbook.domain.LarkRequest; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.utils.DecryptUtil; -import com.ruoyi.flyingbook.strategy.callback.MultidimensionalTableCallback; +import com.ruoyi.flyingbook.factory.LarkCallBackFactory; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -18,7 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; public class EventController extends BaseController { @Autowired - private MultidimensionalTableCallback multidimensionalTableCallback; + private LarkCallBackFactory larkFactory; //3. 创建路由处理器 @PostMapping("/approval") @@ -28,18 +28,14 @@ public class EventController extends BaseController { log.error("没有值"); return result; } - log.info("/event/test1/approval request:{} encrypt:{}", jsonObject.toJSONString(), result); + log.info("/event/test1/approval request:{}", jsonObject.toJSONString()); if (jsonObject.containsKey("encrypt")) { result = DecryptUtil.decrypt(jsonObject.getString("encrypt")); - log.info("/event/test1/approval request:{} encrypt:{}", jsonObject.toJSONString(), result); - } - if (jsonObject.containsKey("challenge")) { - result = jsonObject.getString("challenge"); - log.info("/event/test1/approval request:{} challenge:{}", jsonObject.toJSONString(), result); + log.info("/event/test1/approval encrypt:{}", JSONObject.toJSONString(result)); } LarkRequest larkRequest = new LarkRequest(); larkRequest.setMessage(result); - multidimensionalTableCallback.execute(larkRequest); + larkFactory.execute(larkRequest); return result; } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java index 7a1cfa3..47350bb 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java @@ -30,7 +30,6 @@ public class LarkRequest { */ private Long eventId; private String message; - private String eventType; /** * MultidimensionalTableOperate 用参数 diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkFactory.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkCallBackFactory.java similarity index 67% rename from ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkFactory.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkCallBackFactory.java index c8933c2..c1ed4a7 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkFactory.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkCallBackFactory.java @@ -3,6 +3,7 @@ package com.ruoyi.flyingbook.factory; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.enums.CallBackTypeEnum; import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.strategy.callback.ApprovalCallback; import com.ruoyi.flyingbook.strategy.callback.MultidimensionalTableCallback; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -13,10 +14,12 @@ import org.springframework.stereotype.Component; * @create 2023-03-16 20:54 */ @Component -public class LarkFactory { +public class LarkCallBackFactory { @Autowired - private MultidimensionalTableCallback approvalCallback; + private MultidimensionalTableCallback multidimensionalTableCallback; + @Autowired + private ApprovalCallback approvalCallback; public void execute(LarkRequest larkRequest) { String message = larkRequest.getMessage(); @@ -24,16 +27,22 @@ public class LarkFactory { return; } JSONObject jsonObject = JSONObject.parseObject(message); - String eventType = jsonObject.getJSONObject("header").getString("event_type"); + String eventType = null; + if (jsonObject.containsKey("header")){ + eventType = jsonObject.getJSONObject("header").getString("event_type"); + }else{ + eventType = jsonObject.getJSONObject("event").getString("type"); + } CallBackTypeEnum callBackTypeEnum = CallBackTypeEnum.getByCode(eventType); if (callBackTypeEnum == null) { return; } switch (callBackTypeEnum) { case TABLE_ROW_CHANGE: - approvalCallback.execute(larkRequest); + multidimensionalTableCallback.execute(larkRequest); break; case APPROVAL_TASK: + approvalCallback.execute(larkRequest); break; default: break; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkOperateFactory.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkOperateFactory.java new file mode 100644 index 0000000..fd44f0c --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkOperateFactory.java @@ -0,0 +1,42 @@ +package com.ruoyi.flyingbook.factory; + +import com.ruoyi.common.enums.EventTypeEnum; +import com.ruoyi.flyingbook.domain.Event; +import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.strategy.operate.ApprovalCallbackOperate; +import com.ruoyi.flyingbook.strategy.operate.MultidimensionalTableOperate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author yuxiangyong + * @create 2023-03-16 20:54 + */ +@Component +public class LarkOperateFactory { + + @Autowired + private MultidimensionalTableOperate multidimensionalTableOperate; + @Autowired + private ApprovalCallbackOperate approvalCallbackOperate; + + public void execute(Event event) { + EventTypeEnum eventTypeEnum = EventTypeEnum.getByCode(event.getType()); + if (eventTypeEnum == null) { + return; + } + LarkRequest request = new LarkRequest(); + request.setEvent(event); + switch (eventTypeEnum) { + case ROW_CHANGE: + multidimensionalTableOperate.execute(request); + break; + case APPROVAL_TASK: + approvalCallbackOperate.execute(request); + break; + default: + break; + } + } + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java index 67ae9b0..136c07d 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java @@ -62,7 +62,7 @@ public interface EventMapper */ public int deleteEventByIds(Long[] ids); - public List queryEventList(@Param("status") String status,@Param("type") String type); + public List queryEventList(@Param("status") String status); public int updateStatus(@Param("id") Long id,@Param("status") String status,@Param("numbers") Long numbers); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java new file mode 100644 index 0000000..0d8677e --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -0,0 +1,120 @@ +package com.ruoyi.flyingbook.strategy.callback; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.enums.AppType; +import com.ruoyi.common.enums.EventOperateStatus; +import com.ruoyi.common.enums.EventOperateType; +import com.ruoyi.common.enums.FlagStatus; +import com.ruoyi.flyingbook.domain.Event; +import com.ruoyi.flyingbook.domain.EventLog; +import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.service.IEventLogService; +import com.ruoyi.flyingbook.service.IEventService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * @author yuxiangyong + * @create 2023-03-12 15:58 + */ +@Slf4j +@Service +public class ApprovalCallback extends CallbackAbstract { + + @Autowired + private IEventService eventService; + @Autowired + private IEventLogService eventLogService; + @Autowired + private RedisTemplate redisTemplate; + + @Override + protected Boolean check(LarkRequest request) { + return Boolean.TRUE; + } + + @Override + protected void preOperate(LarkRequest request) { + String message = request.getMessage(); + JSONObject jsonObject = JSONObject.parseObject(message); + JSONObject event = jsonObject.getJSONObject("event"); + request.setAppId(event.getString("app_id")); + request.setFromRecordId(event.getString("instance_code")); + } + + @Override + protected void businessProcessing(LarkRequest request) { + Event event = queryEvent(request.getAppId(),request.getFromRecordId()); + //如果已经存在处理中的就不需要操作数据库了 + if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus())){ + return; + } + event = this.buildDto(request,event); + if (event.getId() == null){ + eventService.insertEvent(event); + }else { + eventService.updateStatus(event.getId(),EventOperateStatus.PENDING.getCode(),0L); + } + request.setEventId(event.getId()); + } + + @Override + protected void endHandle(LarkRequest request) { + if (request.getEventId() == null){ + return; + } + if (StringUtils.isNotBlank(request.getErrorMessage())){ + + } + EventLog eventLog = StringUtils.isBlank(request.getErrorMessage()) ? + new EventLog(request.getEventId(),EventOperateType.CALL_BACK.getCode(),request.getMessage()) + : new EventLog(request.getEventId(),EventOperateType.CALL_BACK.getCode(),request.getMessage(),request.getErrorCode(),request.getErrorMessage()); + eventLogService.insertEventLog(eventLog); + } + + @Override + protected String buildResult(LarkRequest request) { + return ""; + } + + + @Override + protected String getName() { + return this.getClass().getSimpleName(); + } + + private Event queryEvent(String appId,String recordId){ + + Event event = new Event(); + event.setAppId(appId); + event.setRecordId(recordId); + List events = eventService.selectEventList(event); + if (CollectionUtils.isNotEmpty(events)){ + return events.get(0); + } + return null; + } + + private Event buildDto(LarkRequest request,Event event){ + event = event == null ? new Event() :event; + event.setFlag(FlagStatus.OK.getCode()); + event.setRecordId(request.getFromRecordId()); + event.setNumbers(0L); + event.setOperateStatus(EventOperateStatus.PENDING.getCode()); + event.setCreateBy("System"); + event.setCreateTime(new Date()); + event.setUpdateTime(new Date()); + event.setUpdateBy("System"); + event.setAppId(request.getAppId()); + event.setType(AppType.APPROVAL.getCode()); + return event; + } + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java index 77377ea..9fd1517 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java @@ -2,16 +2,13 @@ package com.ruoyi.flyingbook.strategy.callback; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.ruoyi.common.enums.AppType; +import com.ruoyi.common.enums.*; import com.ruoyi.flyingbook.domain.Event; import com.ruoyi.flyingbook.domain.EventLog; import com.ruoyi.flyingbook.service.IEventLogService; import com.ruoyi.flyingbook.service.IEventService; import com.ruoyi.flyingbook.domain.LarkRequest; import com.ruoyi.common.constant.RedisConstants; -import com.ruoyi.common.enums.EventOperateStatus; -import com.ruoyi.common.enums.EventOperateType; -import com.ruoyi.common.enums.FlagStatus; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -73,7 +70,6 @@ public class MultidimensionalTableCallback extends CallbackAbstract { } String appId = header.getString("app_id"); request.setAppId(appId); - request.setEventType(header.getString("event_type")); } @Override @@ -151,7 +147,7 @@ public class MultidimensionalTableCallback extends CallbackAbstract { event.setUpdateTime(new Date()); event.setUpdateBy("System"); event.setAppId(request.getAppId()); - event.setType(AppType.APPROVAL.getCode()); + event.setType(EventTypeEnum.APPROVAL_TASK.getCode()); return event; } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java new file mode 100644 index 0000000..d7fda10 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -0,0 +1,220 @@ +package com.ruoyi.flyingbook.strategy.operate; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.enums.*; +import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper; +import com.ruoyi.flyingbook.domain.*; +import com.ruoyi.flyingbook.service.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 多维表格操作类 + * + * @author yuxiangyong + * @create 2023-03-13 20:47 + */ +@Slf4j +@Component("ApprovalCallbackOperate") +public class ApprovalCallbackOperate extends LarkAbstract { + + @Autowired + protected LarkTokenHelper larkTokenHelper; + @Autowired + protected ILarkCompanyRelationService larkCompanyRelationService; + @Autowired + protected IEventService iEventService; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + protected ILarkTableRelationService iLarkTableRelationService; + @Autowired + protected ILarkTableRowRelationService iLarkTableRowRelationService; + @Autowired + private IEventService eventService; + @Autowired + private IEventLogService eventLogService; + /** + * 获取明细行 + */ + private static final String DETAIL = "DETAIL"; + private String getDetail = "https://open.feishu.cn/open-apis/approval/v4/instances/:instance_id"; + //新增明细行 + private static final String CREATE_OPERATE = "CREATE_OPERATE"; + private String addLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records"; + + + private void fillTableRelation(LarkRequest request) { + LarkTableRelation tableRelation = new LarkTableRelation(); + + tableRelation.setLarkCompanyRelationId(request.getCompanyRelationId()); + //todo yxy 表关联关系 tableId取值 + tableRelation.setFromTableId(request.getEvent().getTableId()); + tableRelation.setFlag(FlagStatus.OK.getCode()); + List larkTableRelations = iLarkTableRelationService.selectLarkTableRelationList(tableRelation); + if (CollectionUtils.isEmpty(larkTableRelations)) { + String errorMessage = String.format("tableId:{}表关系未配置", request.getEvent().getTableId()); + log.error("iLarkTableRelationService.selectLarkTableRelationList:{}", errorMessage); + throw new RuntimeException(errorMessage); + } + //主表与副表的列对应关系 + List tableRelationIdList = new ArrayList<>(); + Map tableRelationMap = new HashMap<>(); + for (LarkTableRelation larkTableRelation : larkTableRelations) { + String to = String.format("%s_%s", larkTableRelation.getToAppToken(), larkTableRelation.getToTableId()); + tableRelationMap.put(to, larkTableRelation.getId()); + tableRelationIdList.add(larkTableRelation.getId()); + } + request.setTableRelationMap(tableRelationMap); + //主表与副表的行对应关系 + List larkTableRowRelations = iLarkTableRowRelationService.queryListByTableRelationIdList(tableRelationIdList); + Map> tableColRelationMap = new HashMap<>(); + for (LarkTableRowRelation larkTableRowRelation : larkTableRowRelations) { + Map map = new HashMap<>(); + map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId()); + if (TableDetailRelationTypeEnum.COL.getCode().equals(larkTableRowRelation.getType())) { + tableColRelationMap.put(larkTableRowRelation.getTableRelationId(), map); + } + } + if (tableColRelationMap.isEmpty()) { + String errorMessage = String.format("tableId:{} 列关系未配置", request.getEvent().getTableId()); + log.error("iLarkTableRowRelationService.queryListByTableRelationIdList:{}", errorMessage); + throw new RuntimeException(errorMessage); + } + request.setTableColRelationMap(tableColRelationMap); + } + + @Override + protected void preOperate(LarkRequest request) { + Event event = request.getEvent(); + if (event == null) { + throw new RuntimeException("当前事件为空"); + } + LarkCompanyRelation relation = larkCompanyRelationService.getByAppIdAndType(request.getEvent().getAppId(), AppType.APPROVAL.getCode()); + if (relation == null) { + String errorMessage = String.format("获取app值为空 appId:{} appType:{}", request.getEvent().getAppId(), AppType.APPROVAL.getCode()); + log.error("larkCompanyRelationService.getByCompanyName:{}", errorMessage); + throw new RuntimeException(errorMessage); + } + //用于后续追加row时候做关联关系 + request.setCompanyRelationId(relation.getId()); + //关联关系表填充 + this.fillTableRelation(request); + String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret(), "tenant_access_token"); + request.setToken(token); + } + + @Override + protected void businessProcessing(LarkRequest request) { + request.setOperateType(DETAIL); + JSONObject message = larkTokenHelper.getLark(getUrl(request), null, request.getToken(), null); + request.setRecord(message); + for (Map.Entry entry : request.getTableRelationMap().entrySet()) { + String[] arr = entry.getKey().split("_"); + request.setToAppToken(arr[0]); + request.setToTableId(arr[1]); + request.setTableRelationId(entry.getValue()); + Map> body = getBody(request); + String url = getUrl(request); + if (StringUtils.isBlank(url)) { + return; + } + send(request.getOperateType(), url, body, request); + } + } + + @Override + protected String getUrl(LarkRequest request) { + Event event = request.getEvent(); + if (CREATE_OPERATE.equals(request.getOperateType())) { + return addLine.replace(":app_token", request.getToAppToken()).replace(":table_id", request.getToTableId()); + } else if (DETAIL.equals(request.getOperateType())) { + return getDetail.replace(":instance_id", event.getRecordId()); + } + return null; + } + + @Override + protected Map> getBody(LarkRequest request) { + Map> result = new HashMap<>(); + JSONObject record = request.getRecord(); + String responseCode = record.getString("code"); + if ("0".equals(responseCode)) { + result = parseMap(request); + request.setOperateType(CREATE_OPERATE); + } + return result; + } + + private Map> parseMap(LarkRequest request) { + Map result = new HashMap<>(); + JSONObject record = request.getRecord(); + Map colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); + for (Map.Entry entry : colRelation.entrySet()) { + result.put(entry.getValue(), recursiveValue(record,entry.getKey())); + } + Map> map = new HashMap<>(); + map.put("fields", result); + return map; + } + + private Object recursiveValue(JSONObject record,String key){ + String[] split = key.split(","); + for (int i = 0; i < split.length - 1; i++) { + String k = split[i]; + if (key.startsWith("#")){ + k = k.replace("#",""); + record = record.getJSONArray(k).getJSONObject(0); + } + } + return record.get(split[split.length-1]); + } + + protected void send(String type, String url, Map> body, LarkRequest request) { + request.setOperateInfo(String.valueOf(body)); + String token = request.getToken(); + if (CREATE_OPERATE.equals(type)) { + JSONObject result = larkTokenHelper.postLark(url, body, token); + } + } + + @Override + protected void endHandle(LarkRequest request) { + Event event = request.getEvent(); + EventLog eventLog = null; + if (StringUtils.isBlank(request.getErrorMessage())) { + eventService.updateStatus(event.getId(), EventOperateStatus.SUCCESS.getCode(), event.getNumbers()); + eventLog = new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage()); + } else { + eventService.updateStatus(event.getId(), EventOperateStatus.PENDING.getCode(), event.getNumbers() + 1); + if (request.getEventOperateType() != null) { + new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); + } + } + if (eventLog != null) { + eventLog.setOperateInfo(request.getOperateType()); + eventLogService.insertEventLog(eventLog); + } + } + + @Override + protected String buildResult(LarkRequest request) { + return null; + } + + @Override + protected String getName() { + return this.getClass().getSimpleName(); + } + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index 777ac99..6bddc63 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -1,16 +1,12 @@ package com.ruoyi.flyingbook.strategy.operate; import com.alibaba.fastjson.JSONObject; -import com.ruoyi.common.constant.CompanyNameConstants; import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.enums.*; import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper; import com.ruoyi.flyingbook.domain.*; import com.ruoyi.flyingbook.service.*; import lombok.extern.slf4j.Slf4j; -import okhttp3.MediaType; -import okhttp3.Request; -import okhttp3.RequestBody; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -130,7 +126,9 @@ public class MultidimensionalTableOperate extends LarkAbstract { @Override protected void businessProcessing(LarkRequest request) { request.setOperateType(DETAIL); - JSONObject message = larkTokenHelper.getLark(getUrl(request), null, request.getToken()); + List safeCodeList = new ArrayList<>(); + safeCodeList.add("1254043"); + JSONObject message = larkTokenHelper.getLark(getUrl(request), null, request.getToken(),safeCodeList); request.setRecord(message); for (Map.Entry entry : request.getTableRelationMap().entrySet()) { String[] arr = entry.getKey().split("_"); diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml index 0849919..3951e3e 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml @@ -127,7 +127,7 @@ From b4fe718103dddcacdd8c1ca38868975d70448e3d Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Sat, 18 Mar 2023 01:21:05 +0800 Subject: [PATCH 20/37] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LarkHelper/LarkApprovalHelper.java | 42 ++++++ .../flyingbook/LarkHelper/LarkHelper.java | 37 +++++ .../LarkHelper/LarkTableHelper.java | 110 ++++++++++++++ .../LarkHelper/LarkTokenHelper.java | 140 ------------------ .../controller/EventController.java | 4 +- .../{LarkRequest.java => RequestVo.java} | 10 +- .../domain/lark/LarkApprovalRequest.java | 21 +++ .../flyingbook/domain/lark/LarkRequest.java | 30 ++++ .../domain/lark/LarkTableRequest.java | 44 ++++++ .../factory/LarkCallBackFactory.java | 4 +- .../factory/LarkOperateFactory.java | 4 +- .../strategy/LarkOperateAbstract.java | 16 +- .../strategy/callback/ApprovalCallback.java | 14 +- .../MultidimensionalTableCallback.java | 14 +- .../operate/ApprovalCallbackOperate.java | 82 ++++------ .../strategy/operate/LarkAbstract.java | 12 +- .../operate/MultidimensionalTableOperate.java | 136 +++++++---------- 17 files changed, 406 insertions(+), 314 deletions(-) create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkHelper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java delete mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java rename ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/{LarkRequest.java => RequestVo.java} (78%) create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkApprovalRequest.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkRequest.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableRequest.java diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java new file mode 100644 index 0000000..198d260 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java @@ -0,0 +1,42 @@ +package com.ruoyi.flyingbook.LarkHelper; + +import com.lark.oapi.service.approval.v4.model.GetInstanceReq; +import com.lark.oapi.service.approval.v4.model.GetInstanceRespBody; +import com.ruoyi.flyingbook.domain.lark.LarkApprovalRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + + + +/** + * @author yuxiangyong + * @create 2023-03-12 18:10 + */ +@Slf4j +@Component +public class LarkApprovalHelper extends LarkHelper{ + + static String instanceId = "3487F263-9116-42A3-99EC-A737845E66AD"; + + public static void main(String[] args) throws Exception { + LarkApprovalHelper bk = new LarkApprovalHelper(); + GetInstanceRespBody approvalInfoDetail = bk.getApprovalInfoDetail(new LarkApprovalRequest(appId, secret, instanceId)); + System.out.println(approvalInfoDetail); + } + + + /** + * 获取行详情 + * + * @return + */ + public GetInstanceRespBody getApprovalInfoDetail(LarkApprovalRequest request) { + try { + return buildClient(request).approval().instance().get(GetInstanceReq.newBuilder() + .instanceId(request.getInstanceId()).build()).getData(); + } catch (Exception e) { + + } + return null; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkHelper.java new file mode 100644 index 0000000..67cc74d --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkHelper.java @@ -0,0 +1,37 @@ +package com.ruoyi.flyingbook.LarkHelper; + +import com.lark.oapi.Client; +import com.lark.oapi.core.cache.ICache; +import com.lark.oapi.core.enums.AppType; +import com.lark.oapi.service.bitable.v1.model.*; +import com.ruoyi.flyingbook.domain.lark.LarkRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author yuxiangyong + * @create 2023-03-12 18:10 + */ +@Slf4j +public class LarkHelper { + + static String appId = "cli_a482a8572cbc9013"; + static String secret = "lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos"; + + + /** + * cli_a482a8572cbc9013 + * lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos + * @param request + * @return + */ + protected Client buildClient(LarkRequest request){ + return Client.newBuilder(request.getAppId(), request.getAppSecret()) + .marketplaceApp() + .appType(AppType.SELF_BUILT) + .build(); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java new file mode 100644 index 0000000..ca14c40 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java @@ -0,0 +1,110 @@ +package com.ruoyi.flyingbook.LarkHelper; + +import com.lark.oapi.service.bitable.v1.model.*; +import com.ruoyi.flyingbook.domain.lark.LarkTableRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + + +/** + * @author yuxiangyong + * @create 2023-03-12 18:10 + */ +@Slf4j +@Component +public class LarkTableHelper extends LarkHelper{ + + static String appToken = "Gyu1b8VAFaYiEysfEUjcCKomnVc"; + static String tableId = "tbloMVR0ACW2uO33"; + static String record = "rec8umOjIh"; + static Map map = new HashMap<>(); + + + public static void main(String[] args) throws Exception { + LarkTableHelper bk = new LarkTableHelper(); + map.put("b", "aaa"); + LarkTableRequest add = new LarkTableRequest(appId, secret, appToken, tableId,map); + CreateAppTableRecordRespBody createAppTableRecordRespBody = bk.addTableRecord(add); + String recordId = createAppTableRecordRespBody.getRecord().getRecordId(); +// map.put("b", "EEE"); +// LarkTableRequest update = new LarkTableRequest(appId, secret, appToken,tableId, record,map); +// bk.updateTableRecord(update); + LarkTableRequest delete = new LarkTableRequest(appId, secret, appToken,tableId, recordId); + bk.deleteTableRecord(delete); + } + + + /** + * 获取行详情 + * + * @return + */ + public GetAppTableRecordResp getTableRecordDetail(LarkTableRequest request) { + try { + return buildClient(request).bitable().appTableRecord().get( + GetAppTableRecordReq + .newBuilder() + .appToken(request.getAppToken()) + .tableId(request.getAppTable()) + .recordId(request.getRecord()). + build()); + } catch (Exception e) { + + } + return null; + } + + public CreateAppTableRecordRespBody addTableRecord(LarkTableRequest request) { + try { + return buildClient(request).bitable().appTableRecord() + .create(CreateAppTableRecordReq.newBuilder() + .appToken(request.getAppToken()) + .tableId(request.getAppTable()) + .appTableRecord( + AppTableRecord.newBuilder() + .fields(request.getBody()) + .build()) + .build()).getData(); + } catch (Exception e) { + + } + return null; + } + + public DeleteAppTableRecordRespBody deleteTableRecord(LarkTableRequest request) { + try { + return buildClient(request).bitable().appTableRecord().delete( + DeleteAppTableRecordReq.newBuilder() + .appToken(request.getAppToken()) + .tableId(request.getAppTable()) + .recordId(request.getRecord()) + .build() + ).getData(); + } catch (Exception e) { + + } + return null; + } + + public UpdateAppTableRecordRespBody updateTableRecord(LarkTableRequest request) { + try { + return buildClient(request).bitable().appTableRecord().update( + UpdateAppTableRecordReq.newBuilder() + .appToken(request.getAppToken()) + .tableId(request.getAppTable()) + .recordId(request.getRecord()) + .appTableRecord( + AppTableRecord.newBuilder() + .fields(request.getBody()) + .build() + ).build() + ).getData(); + } catch (Exception e) { + + } + return null; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java deleted file mode 100644 index 619dd2f..0000000 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.ruoyi.flyingbook.LarkHelper; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; -import okhttp3.*; -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * @author yuxiangyong - * @create 2023-03-12 18:10 - */ -@Slf4j -@Component -public class LarkTokenHelper { - - private static OkHttpClient client = new OkHttpClient().newBuilder() - .callTimeout(10, TimeUnit.SECONDS) - .connectTimeout(10, TimeUnit.SECONDS) - .readTimeout(10, TimeUnit.SECONDS) - .build(); - - private JSONObject execute(Request request) { - Response execute = null; - JSONObject jsonObject = null; - try { - execute = client.newCall(request).execute(); - if (execute == null || execute.body() == null){ - throw new RuntimeException("飞书返回结果为空"); - } - jsonObject = JSONObject.parseObject(execute.body().string()); - } catch (IOException e) { - String errorMessage = String.format("飞书接口调用失败:{}",e.getMessage()); - throw new RuntimeException(errorMessage); - } - - if ("0".equals(jsonObject.getString("code"))){ - return jsonObject; - }else { - String errorMessage = String.format("%s##%s", jsonObject.getString("code"), jsonObject.getString("msg")); - throw new RuntimeException(errorMessage); - } - } - - public String getToken(String appId, String srcret,String tokenType) { - Map map = new HashMap<>(); - map.put("app_id", appId); - map.put("app_secret", srcret); - Request.Builder builder = new Request.Builder(); - builder.url("https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal"); - RequestBody requestBody = RequestBody.create(MediaType.get("application/json"),JSONObject.toJSONString(map)); - - builder.post(requestBody); - return execute(builder.build()).getString(tokenType); - } - - /** - * @param url - * @param token - * @return - */ - public JSONObject getLark(String url, Map body, String token, List safeCodeList) { - Response execute = null; - Request request = new Request.Builder() - .url(url) - .addHeader("Authorization",String.format("Bearer %s",token)) - .build(); - JSONObject jsonObject = null; - try { - execute = client.newCall(request).execute(); - if (execute == null || execute.body() == null){ - throw new RuntimeException("飞书返回结果为空"); - } - jsonObject = JSONObject.parseObject(execute.body().string()); - } catch (IOException e) { - String errorMessage = String.format("飞书接口调用失败:{}",e.getMessage()); - throw new RuntimeException(errorMessage); - } - String code = jsonObject.getString("code"); - if ("0".equals(code) || (CollectionUtils.isNotEmpty(safeCodeList) && safeCodeList.contains(code))){ - return jsonObject; - }else { - String errorMessage = String.format("%s##%s", code, jsonObject.getString("msg")); - throw new RuntimeException(errorMessage); - } - } - - public JSONObject postLark(String url,Map> body, String token) { - Request request = new Request.Builder() - .method("POST", RequestBody - .create(MediaType.get("application/json"),JSONObject.toJSONString(body))) - .url(url) - .addHeader("Authorization",String.format("Bearer %s",token)) - .build(); - return execute(request); - } - - public JSONObject putLark(String url,Map> body, String token) { - Request request = new Request.Builder() - .put(RequestBody - .create( MediaType.get("application/json"),JSONObject.toJSONString(body))) - .url(url) - .addHeader("Authorization",String.format("Bearer %s",token)) - .build(); - return execute(request); - } - - public JSONObject deleteLark(String url,Map> body, String token) { - Request.Builder builder = new Request.Builder() - .url(url) - .addHeader("Authorization", String.format("Bearer %s", token)); - if (body == null || body.isEmpty()){ - builder.delete(); - }else { - builder.delete(RequestBody - .create(MediaType.get("application/json"),JSONObject.toJSONString(body))); - } - return execute(builder.build()); - } - - public static void main(String[] args) { - LarkTokenHelper helper = new LarkTokenHelper(); - String token = helper.getToken( "cli_a482a8572cbc9013", "lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos","tenant_access_token"); - System.out.println(token); - JSONObject jsonObject = JSONObject.parseObject(token); - Map map = new HashMap<>(); - JSONObject b = new JSONObject(); - map.put("fields",b); - b.put("多行文本","345"); -// helper.putLark("https://open.feishu.cn/open-apis/bitable/v1/apps/Gyu1b8VAFaYiEysfEUjcCKomnVc/tables/tbloMVR0ACW2uO33/records/rece1nuKGU",map,jsonObject.getString("tenant_access_token")); - - } -} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index d68aade..43fc996 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -1,7 +1,7 @@ package com.ruoyi.flyingbook.controller; import com.alibaba.fastjson.JSONObject; -import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.domain.RequestVo; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.utils.DecryptUtil; import com.ruoyi.flyingbook.factory.LarkCallBackFactory; @@ -33,7 +33,7 @@ public class EventController extends BaseController { result = DecryptUtil.decrypt(jsonObject.getString("encrypt")); log.info("/event/test1/approval encrypt:{}", JSONObject.toJSONString(result)); } - LarkRequest larkRequest = new LarkRequest(); + RequestVo larkRequest = new RequestVo(); larkRequest.setMessage(result); larkFactory.execute(larkRequest); return result; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java similarity index 78% rename from ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java index 47350bb..96700eb 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java @@ -1,10 +1,12 @@ package com.ruoyi.flyingbook.domain; import com.alibaba.fastjson.JSONObject; +import com.lark.oapi.service.approval.v4.model.GetInstanceRespBody; +import com.lark.oapi.service.bitable.v1.model.GetAppTableRecordResp; import com.ruoyi.common.enums.EventOperateType; +import com.ruoyi.flyingbook.domain.lark.LarkApprovalRequest; import lombok.Data; -import java.util.List; import java.util.Map; /** @@ -12,13 +14,14 @@ import java.util.Map; * @create 2023-03-12 16:00 */ @Data -public class LarkRequest { +public class RequestVo { /** * 通用信息,不可修改不可删除 */ private String token; private String appId; + private String appSecret; private String fromAppToken; private String toAppToken; private String errorCode; @@ -29,11 +32,14 @@ public class LarkRequest { * ApprovalCallback 用参数 */ private Long eventId; + private String instance; + private GetInstanceRespBody instanceRespBody; private String message; /** * MultidimensionalTableOperate 用参数 */ + private GetAppTableRecordResp respBody; private JSONObject record; private Long companyRelationId; private Long tableRelationId; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkApprovalRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkApprovalRequest.java new file mode 100644 index 0000000..7c2e363 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkApprovalRequest.java @@ -0,0 +1,21 @@ +package com.ruoyi.flyingbook.domain.lark; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author yuxiangyong + * @create 2023-03-18 1:05 + */ +@Data +@NoArgsConstructor +public class LarkApprovalRequest extends LarkRequest{ + + + private String instanceId; + + public LarkApprovalRequest(String appId, String appSecret, String instanceId) { + super(appId, appSecret); + this.instanceId = instanceId; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkRequest.java new file mode 100644 index 0000000..f3016c7 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkRequest.java @@ -0,0 +1,30 @@ +package com.ruoyi.flyingbook.domain.lark; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author yuxiangyong + * @create 2023-03-18 0:12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LarkRequest { + + private String appId; + + private String appSecret; + /** + * 可以安全放过的code + */ + private List safeCode; + + public LarkRequest(String appId, String appSecret) { + this.appId = appId; + this.appSecret = appSecret; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableRequest.java new file mode 100644 index 0000000..4201594 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableRequest.java @@ -0,0 +1,44 @@ +package com.ruoyi.flyingbook.domain.lark; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +/** + * @author yuxiangyong + * @create 2023-03-18 0:12 + */ +@Data +@NoArgsConstructor +public class LarkTableRequest extends LarkRequest{ + + private String appToken; + private String appTable; + private String record; + private Map body; + + + + public LarkTableRequest(String appId,String appSecret,String appToken, String appTable, Map body) { + super(appId,appSecret); + this.appToken = appToken; + this.appTable = appTable; + this.body = body; + } + + public LarkTableRequest(String appId,String appSecret,String appToken, String appTable, String record, Map body) { + super(appId,appSecret); + this.appToken = appToken; + this.appTable = appTable; + this.record = record; + this.body = body; + } + + public LarkTableRequest(String appId,String appSecret,String appToken, String appTable, String record) { + super(appId,appSecret); + this.appToken = appToken; + this.appTable = appTable; + this.record = record; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkCallBackFactory.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkCallBackFactory.java index c1ed4a7..11d1b82 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkCallBackFactory.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkCallBackFactory.java @@ -2,7 +2,7 @@ package com.ruoyi.flyingbook.factory; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.enums.CallBackTypeEnum; -import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.domain.RequestVo; import com.ruoyi.flyingbook.strategy.callback.ApprovalCallback; import com.ruoyi.flyingbook.strategy.callback.MultidimensionalTableCallback; import org.apache.commons.lang3.StringUtils; @@ -21,7 +21,7 @@ public class LarkCallBackFactory { @Autowired private ApprovalCallback approvalCallback; - public void execute(LarkRequest larkRequest) { + public void execute(RequestVo larkRequest) { String message = larkRequest.getMessage(); if (StringUtils.isBlank(message)) { return; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkOperateFactory.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkOperateFactory.java index fd44f0c..95fdb5e 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkOperateFactory.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/factory/LarkOperateFactory.java @@ -2,7 +2,7 @@ package com.ruoyi.flyingbook.factory; import com.ruoyi.common.enums.EventTypeEnum; import com.ruoyi.flyingbook.domain.Event; -import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.domain.RequestVo; import com.ruoyi.flyingbook.strategy.operate.ApprovalCallbackOperate; import com.ruoyi.flyingbook.strategy.operate.MultidimensionalTableOperate; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +25,7 @@ public class LarkOperateFactory { if (eventTypeEnum == null) { return; } - LarkRequest request = new LarkRequest(); + RequestVo request = new RequestVo(); request.setEvent(event); switch (eventTypeEnum) { case ROW_CHANGE: diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java index 9bd706c..7b1cfe6 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java @@ -1,8 +1,6 @@ package com.ruoyi.flyingbook.strategy; -import com.ruoyi.common.enums.EventOperateType; -import com.ruoyi.flyingbook.domain.EventLog; -import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.domain.RequestVo; import lombok.extern.slf4j.Slf4j; /** @@ -12,7 +10,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public abstract class LarkOperateAbstract{ - public String execute(LarkRequest request){ + public String execute(RequestVo request){ try { //参数校验逻辑 if (!check(request)){ @@ -46,30 +44,30 @@ public abstract class LarkOperateAbstract{ * 由子类实现自己的校验逻辑,并输出对应的日志 * 默认校验通过 */ - protected Boolean check(LarkRequest request){ + protected Boolean check(RequestVo request){ return Boolean.TRUE; } /** * 由子类实现自己的预处理逻辑 */ - protected abstract void preOperate(LarkRequest request); + protected abstract void preOperate(RequestVo request); /** * 实际业务处理阶段 * @param request 请求参数 */ - protected abstract void businessProcessing(LarkRequest request); + protected abstract void businessProcessing(RequestVo request); /** * 业务处理完成后的附加操作 */ - protected void endHandle(LarkRequest request){}; + protected void endHandle(RequestVo request){}; /** * 具体的返回内容 */ - protected abstract String buildResult(LarkRequest request); + protected abstract String buildResult(RequestVo request); protected abstract String getName(); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index 0d8677e..43928dc 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -7,7 +7,7 @@ import com.ruoyi.common.enums.EventOperateType; import com.ruoyi.common.enums.FlagStatus; import com.ruoyi.flyingbook.domain.Event; import com.ruoyi.flyingbook.domain.EventLog; -import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.domain.RequestVo; import com.ruoyi.flyingbook.service.IEventLogService; import com.ruoyi.flyingbook.service.IEventService; import lombok.extern.slf4j.Slf4j; @@ -36,12 +36,12 @@ public class ApprovalCallback extends CallbackAbstract { private RedisTemplate redisTemplate; @Override - protected Boolean check(LarkRequest request) { + protected Boolean check(RequestVo request) { return Boolean.TRUE; } @Override - protected void preOperate(LarkRequest request) { + protected void preOperate(RequestVo request) { String message = request.getMessage(); JSONObject jsonObject = JSONObject.parseObject(message); JSONObject event = jsonObject.getJSONObject("event"); @@ -50,7 +50,7 @@ public class ApprovalCallback extends CallbackAbstract { } @Override - protected void businessProcessing(LarkRequest request) { + protected void businessProcessing(RequestVo request) { Event event = queryEvent(request.getAppId(),request.getFromRecordId()); //如果已经存在处理中的就不需要操作数据库了 if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus())){ @@ -66,7 +66,7 @@ public class ApprovalCallback extends CallbackAbstract { } @Override - protected void endHandle(LarkRequest request) { + protected void endHandle(RequestVo request) { if (request.getEventId() == null){ return; } @@ -80,7 +80,7 @@ public class ApprovalCallback extends CallbackAbstract { } @Override - protected String buildResult(LarkRequest request) { + protected String buildResult(RequestVo request) { return ""; } @@ -102,7 +102,7 @@ public class ApprovalCallback extends CallbackAbstract { return null; } - private Event buildDto(LarkRequest request,Event event){ + private Event buildDto(RequestVo request, Event event){ event = event == null ? new Event() :event; event.setFlag(FlagStatus.OK.getCode()); event.setRecordId(request.getFromRecordId()); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java index 9fd1517..ab59de0 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java @@ -7,7 +7,7 @@ import com.ruoyi.flyingbook.domain.Event; import com.ruoyi.flyingbook.domain.EventLog; import com.ruoyi.flyingbook.service.IEventLogService; import com.ruoyi.flyingbook.service.IEventService; -import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.domain.RequestVo; import com.ruoyi.common.constant.RedisConstants; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -35,12 +35,12 @@ public class MultidimensionalTableCallback extends CallbackAbstract { private RedisTemplate redisTemplate; @Override - protected Boolean check(LarkRequest request) { + protected Boolean check(RequestVo request) { return Boolean.TRUE; } @Override - protected void preOperate(LarkRequest request) { + protected void preOperate(RequestVo request) { if (StringUtils.isBlank(request.getMessage())) { return; } @@ -73,7 +73,7 @@ public class MultidimensionalTableCallback extends CallbackAbstract { } @Override - protected void businessProcessing(LarkRequest request) { + protected void businessProcessing(RequestVo request) { String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getFromAppToken(),request.getFromTableId(), request.getFromRecordId()); String eventStr = (String)redisTemplate.opsForValue().get(cacheKey); Event event = null; @@ -97,7 +97,7 @@ public class MultidimensionalTableCallback extends CallbackAbstract { } @Override - protected void endHandle(LarkRequest request) { + protected void endHandle(RequestVo request) { if (request.getEventId() == null){ return; } @@ -111,7 +111,7 @@ public class MultidimensionalTableCallback extends CallbackAbstract { } @Override - protected String buildResult(LarkRequest request) { + protected String buildResult(RequestVo request) { return ""; } @@ -134,7 +134,7 @@ public class MultidimensionalTableCallback extends CallbackAbstract { return null; } - private Event buildDto(LarkRequest request,Event event){ + private Event buildDto(RequestVo request, Event event){ event = event == null ? new Event() :event; event.setFlag(FlagStatus.OK.getCode()); event.setAppToken(request.getFromAppToken()); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java index d7fda10..f858b9f 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -1,15 +1,19 @@ package com.ruoyi.flyingbook.strategy.operate; import com.alibaba.fastjson.JSONObject; +import com.lark.oapi.service.approval.v4.model.GetInstanceRespBody; +import com.lark.oapi.service.bitable.v1.model.CreateAppTableRecordRespBody; import com.ruoyi.common.enums.*; -import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper; +import com.ruoyi.flyingbook.LarkHelper.LarkApprovalHelper; +import com.ruoyi.flyingbook.LarkHelper.LarkTableHelper; import com.ruoyi.flyingbook.domain.*; +import com.ruoyi.flyingbook.domain.lark.LarkApprovalRequest; +import com.ruoyi.flyingbook.domain.lark.LarkTableRequest; import com.ruoyi.flyingbook.service.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -29,14 +33,14 @@ import java.util.Map; public class ApprovalCallbackOperate extends LarkAbstract { @Autowired - protected LarkTokenHelper larkTokenHelper; + protected LarkTableHelper larkTableHelper; + @Autowired + protected LarkApprovalHelper larkApprovalHelper; @Autowired protected ILarkCompanyRelationService larkCompanyRelationService; @Autowired protected IEventService iEventService; @Autowired - private RedisTemplate redisTemplate; - @Autowired protected ILarkTableRelationService iLarkTableRelationService; @Autowired protected ILarkTableRowRelationService iLarkTableRowRelationService; @@ -44,17 +48,9 @@ public class ApprovalCallbackOperate extends LarkAbstract { private IEventService eventService; @Autowired private IEventLogService eventLogService; - /** - * 获取明细行 - */ - private static final String DETAIL = "DETAIL"; - private String getDetail = "https://open.feishu.cn/open-apis/approval/v4/instances/:instance_id"; - //新增明细行 - private static final String CREATE_OPERATE = "CREATE_OPERATE"; - private String addLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records"; - private void fillTableRelation(LarkRequest request) { + private void fillTableRelation(RequestVo request) { LarkTableRelation tableRelation = new LarkTableRelation(); tableRelation.setLarkCompanyRelationId(request.getCompanyRelationId()); @@ -95,7 +91,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { } @Override - protected void preOperate(LarkRequest request) { + protected void preOperate(RequestVo request) { Event event = request.getEvent(); if (event == null) { throw new RuntimeException("当前事件为空"); @@ -110,62 +106,43 @@ public class ApprovalCallbackOperate extends LarkAbstract { request.setCompanyRelationId(relation.getId()); //关联关系表填充 this.fillTableRelation(request); - String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret(), "tenant_access_token"); - request.setToken(token); + request.setAppId(relation.getAppId()); + request.setAppSecret(relation.getSecret()); } @Override - protected void businessProcessing(LarkRequest request) { - request.setOperateType(DETAIL); - JSONObject message = larkTokenHelper.getLark(getUrl(request), null, request.getToken(), null); - request.setRecord(message); + protected void businessProcessing(RequestVo request) { + LarkApprovalRequest detailRequest = new LarkApprovalRequest(request.getAppId(), request.getAppSecret(), request.getInstance()); + GetInstanceRespBody approvalInfoDetail = larkApprovalHelper.getApprovalInfoDetail(detailRequest); + request.setInstanceRespBody(approvalInfoDetail); for (Map.Entry entry : request.getTableRelationMap().entrySet()) { String[] arr = entry.getKey().split("_"); request.setToAppToken(arr[0]); request.setToTableId(arr[1]); request.setTableRelationId(entry.getValue()); - Map> body = getBody(request); - String url = getUrl(request); - if (StringUtils.isBlank(url)) { - return; - } - send(request.getOperateType(), url, body, request); + send( request); } } @Override - protected String getUrl(LarkRequest request) { - Event event = request.getEvent(); - if (CREATE_OPERATE.equals(request.getOperateType())) { - return addLine.replace(":app_token", request.getToAppToken()).replace(":table_id", request.getToTableId()); - } else if (DETAIL.equals(request.getOperateType())) { - return getDetail.replace(":instance_id", event.getRecordId()); - } - return null; - } - - @Override - protected Map> getBody(LarkRequest request) { - Map> result = new HashMap<>(); + protected Map getBody(RequestVo request) { + Map result = new HashMap<>(); JSONObject record = request.getRecord(); String responseCode = record.getString("code"); if ("0".equals(responseCode)) { result = parseMap(request); - request.setOperateType(CREATE_OPERATE); } return result; } - private Map> parseMap(LarkRequest request) { - Map result = new HashMap<>(); + private Map parseMap(RequestVo request) { + Map result = new HashMap<>(); JSONObject record = request.getRecord(); Map colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); for (Map.Entry entry : colRelation.entrySet()) { result.put(entry.getValue(), recursiveValue(record,entry.getKey())); } - Map> map = new HashMap<>(); - map.put("fields", result); - return map; + return result; } private Object recursiveValue(JSONObject record,String key){ @@ -180,16 +157,15 @@ public class ApprovalCallbackOperate extends LarkAbstract { return record.get(split[split.length-1]); } - protected void send(String type, String url, Map> body, LarkRequest request) { + protected void send(RequestVo request) { + Map body = getBody(request); request.setOperateInfo(String.valueOf(body)); - String token = request.getToken(); - if (CREATE_OPERATE.equals(type)) { - JSONObject result = larkTokenHelper.postLark(url, body, token); - } + LarkTableRequest add = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(), body); + CreateAppTableRecordRespBody resp = larkTableHelper.addTableRecord(add); } @Override - protected void endHandle(LarkRequest request) { + protected void endHandle(RequestVo request) { Event event = request.getEvent(); EventLog eventLog = null; if (StringUtils.isBlank(request.getErrorMessage())) { @@ -208,7 +184,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { } @Override - protected String buildResult(LarkRequest request) { + protected String buildResult(RequestVo request) { return null; } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java index 1c46e52..ede45f5 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java @@ -1,9 +1,7 @@ package com.ruoyi.flyingbook.strategy.operate; -import com.alibaba.fastjson.JSONObject; -import com.ruoyi.flyingbook.domain.LarkRequest; +import com.ruoyi.flyingbook.domain.RequestVo; import com.ruoyi.flyingbook.strategy.LarkOperateAbstract; -import org.apache.commons.lang3.StringUtils; import java.util.Map; @@ -14,15 +12,11 @@ import java.util.Map; public abstract class LarkAbstract extends LarkOperateAbstract { - /** - * 获取URL地址 - */ - protected abstract String getUrl(LarkRequest request); + /** * 获取body体 */ - protected abstract Map> getBody(LarkRequest request); - + protected abstract Map getBody(RequestVo request); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index 6bddc63..4db8613 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -1,10 +1,12 @@ package com.ruoyi.flyingbook.strategy.operate; -import com.alibaba.fastjson.JSONObject; +import com.lark.oapi.service.bitable.v1.model.CreateAppTableRecordRespBody; +import com.lark.oapi.service.bitable.v1.model.GetAppTableRecordResp; import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.enums.*; -import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper; +import com.ruoyi.flyingbook.LarkHelper.LarkTableHelper; import com.ruoyi.flyingbook.domain.*; +import com.ruoyi.flyingbook.domain.lark.LarkTableRequest; import com.ruoyi.flyingbook.service.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -13,10 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** @@ -30,7 +29,7 @@ import java.util.Map; public class MultidimensionalTableOperate extends LarkAbstract { @Autowired - protected LarkTokenHelper larkTokenHelper; + protected LarkTableHelper larkTokenHelper; @Autowired protected ILarkCompanyRelationService larkCompanyRelationService; @Autowired @@ -46,22 +45,20 @@ public class MultidimensionalTableOperate extends LarkAbstract { @Autowired private IEventLogService eventLogService; /** - * 获取明细行 + * 新增明细行 */ - private static final String DETAIL = "DETAIL"; - private String getDetail = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/:record_id"; - //新增明细行 private static final String CREATE_OPERATE = "CREATE_OPERATE"; - private String addLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records"; - //修改明细行 + /** + * 修改明细行 + */ private static final String UPDATE_OPERATE = "UPDATE_OPERATE"; - private String updateLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/:record_id"; - //删除明细行 + /** + * 删除明细行 + */ private static final String DELETE_OPERATE = "DELETE_OPERATE"; - private String deleteLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/:record_id"; - private void fillTableRelation(LarkRequest request) { + private void fillTableRelation(RequestVo request) { LarkTableRelation tableRelation = new LarkTableRelation(); tableRelation.setLarkCompanyRelationId(request.getCompanyRelationId()); tableRelation.setFromTableId(request.getEvent().getTableId()); @@ -104,7 +101,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { } @Override - protected void preOperate(LarkRequest request) { + protected void preOperate(RequestVo request) { Event event = request.getEvent(); if (event == null) { throw new RuntimeException("当前事件为空"); @@ -115,62 +112,36 @@ public class MultidimensionalTableOperate extends LarkAbstract { log.error("larkCompanyRelationService.getByCompanyName:{}", errorMessage); throw new RuntimeException(errorMessage); } + request.setAppId(relation.getAppId()); + request.setAppSecret(relation.getSecret()); //用于后续追加row时候做关联关系 request.setCompanyRelationId(relation.getId()); //关联关系表填充 this.fillTableRelation(request); - String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret(), "tenant_access_token"); - request.setToken(token); } @Override - protected void businessProcessing(LarkRequest request) { - request.setOperateType(DETAIL); - List safeCodeList = new ArrayList<>(); - safeCodeList.add("1254043"); - JSONObject message = larkTokenHelper.getLark(getUrl(request), null, request.getToken(),safeCodeList); - request.setRecord(message); + protected void businessProcessing(RequestVo request) { + Event event = request.getEvent(); + LarkTableRequest detailRequest = new LarkTableRequest(request.getAppId(), request.getAppSecret(), event.getAppToken(), event.getTableId(), event.getRecordId()); + detailRequest.setSafeCode(Arrays.asList(1254043)); + GetAppTableRecordResp recordDetail = larkTokenHelper.getTableRecordDetail(detailRequest); + request.setRespBody(recordDetail); for (Map.Entry entry : request.getTableRelationMap().entrySet()) { String[] arr = entry.getKey().split("_"); request.setToAppToken(arr[0]); request.setToTableId(arr[1]); request.setTableRelationId(entry.getValue()); - Map> body = getBody(request); - String url = getUrl(request); - if (StringUtils.isBlank(url)) { - return; - } - send(request.getOperateType(), url, body, request); + send(request); } } - @Override - protected String getUrl(LarkRequest request) { - Event event = request.getEvent(); - Map rowRelation = request.getTableRowRelationMap().get(request.getTableRelationId()); - String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, event.getAppToken(), event.getTableId(), event.getRecordId()); - redisTemplate.delete(cacheKey); - if (UPDATE_OPERATE.equals(request.getOperateType())) { - if (rowRelation.containsKey(event.getRecordId())) { - return updateLine.replace(":app_token", request.getToAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(event.getRecordId())); - } - } else if (CREATE_OPERATE.equals(request.getOperateType())) { - return addLine.replace(":app_token", request.getToAppToken()).replace(":table_id", request.getToTableId()); - } else if (DELETE_OPERATE.equals(request.getOperateType())) { - if (rowRelation.containsKey(event.getRecordId())) { - return deleteLine.replace(":app_token", request.getToAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(event.getRecordId())); - } - } else if (DETAIL.equals(request.getOperateType())) { - return getDetail.replace(":app_token", event.getAppToken()).replace(":table_id", event.getTableId()).replace(":record_id", event.getRecordId()); - } - return null; - } @Override - protected Map> getBody(LarkRequest request) { - Map> result = new HashMap<>(); - JSONObject record = request.getRecord(); - String responseCode = record.getString("code"); + protected Map getBody(RequestVo request) { + Map result = new HashMap<>(); + GetAppTableRecordResp respBody = request.getRespBody(); + Integer responseCode = respBody.getCode(); Map rowMap = request.getTableRowRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); if ("1254043".equals(responseCode)) { request.setOperateType(DELETE_OPERATE); @@ -185,50 +156,53 @@ public class MultidimensionalTableOperate extends LarkAbstract { return result; } - private Map> parseMap(LarkRequest request) { - Map result = new HashMap<>(); - JSONObject record = request.getRecord(); + /** + * 对两个表的列进行映射 + */ + private Map parseMap(RequestVo request) { + Map result = new HashMap<>(); Map colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); - String fields = record.getJSONObject("data").getJSONObject("record").getString("fields"); - Map midMap = JSONObject.parseObject(fields, Map.class); - for (Map.Entry entry : midMap.entrySet()) { + Map midMap = request.getRespBody().getData().getRecord().getFields(); + for (Map.Entry entry : midMap.entrySet()) { String key = String.valueOf(entry.getKey()); if (!colRelation.containsKey(key)) { continue; } result.put(colRelation.get(key), entry.getValue()); } - Map> map = new HashMap<>(); - map.put("fields", result); - return map; + return result; } - protected void send(String type, String url, Map> body, LarkRequest request) { + private void send(RequestVo request) { + String type = request.getOperateType(); + Map body = getBody(request); + Event event = request.getEvent(); + String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, event.getAppToken(), event.getTableId(), event.getRecordId()); + redisTemplate.delete(cacheKey); request.setOperateInfo(String.valueOf(body)); - String token = request.getToken(); if (CREATE_OPERATE.equals(type)) { - JSONObject result = larkTokenHelper.postLark(url, body, token); - JSONObject data = result.getJSONObject("data"); - if (data != null) { - JSONObject record = data.getJSONObject("record"); - if (record != null && StringUtils.isNotBlank(record.getString("record_id"))) { - String recordId = record.getString("record_id"); - LarkTableRowRelation rowRelation = new LarkTableRowRelation(request.getCompanyRelationId(), request.getEvent().getRecordId(), recordId, TableDetailRelationTypeEnum.ROW.getCode(), TableDetailRelationTypeEnum.ROW.getCode()); - iLarkTableRowRelationService.insertLarkTableRowRelation(rowRelation); - } + LarkTableRequest add = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(), body); + CreateAppTableRecordRespBody addResp = larkTokenHelper.addTableRecord(add); + if (addResp != null) { + String recordId = addResp.getRecord().getRecordId(); + LarkTableRowRelation rowRelation = new LarkTableRowRelation(request.getCompanyRelationId(), event.getRecordId(), recordId, TableDetailRelationTypeEnum.ROW.getCode(), TableDetailRelationTypeEnum.ROW.getCode()); + iLarkTableRowRelationService.insertLarkTableRowRelation(rowRelation); } request.setEventOperateType(EventOperateType.CREATE); } else if (UPDATE_OPERATE.equals(type)) { request.setEventOperateType(EventOperateType.UPDATE); - larkTokenHelper.putLark(url, body, token); + LarkTableRequest update = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(),request.getToRecordId(), body); + larkTokenHelper.updateTableRecord(update); } else if (DELETE_OPERATE.equals(type)) { request.setEventOperateType(EventOperateType.DELETE); - larkTokenHelper.deleteLark(url, body, token); + LarkTableRequest delete = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(),request.getToRecordId()); + larkTokenHelper.deleteTableRecord(delete); + } } @Override - protected void endHandle(LarkRequest request) { + protected void endHandle(RequestVo request) { Event event = request.getEvent(); EventLog eventLog = null; if (StringUtils.isBlank(request.getErrorMessage())) { @@ -247,7 +221,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { } @Override - protected String buildResult(LarkRequest request) { + protected String buildResult(RequestVo request) { return null; } From f3ec707b9a89778a4979551e5d5bb0f3ec979a31 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Sat, 18 Mar 2023 08:22:53 +0800 Subject: [PATCH 21/37] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/LarkApplicationRunner.java | 44 ++--- .../controller/EventController.java | 6 +- .../controller/EventControllers.java | 157 +----------------- 3 files changed, 33 insertions(+), 174 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index 5946ea7..cc62f5c 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -59,28 +59,28 @@ public class LarkApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { //这里用线程池,后续如果出现量大的情况下可以调整 - threadPool.execute(() -> { - - while (true) { - List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode()); - if (CollectionUtils.isEmpty(eventList)) { - try { - // 没有订单,休息一下 - Thread.sleep(WAIT_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } else { - try { - for (Event event : eventList) { - larkOperateFactory.execute(event); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - }); +// threadPool.execute(() -> { +// +// while (true) { +// List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode()); +// if (CollectionUtils.isEmpty(eventList)) { +// try { +// // 没有订单,休息一下 +// Thread.sleep(WAIT_TIME); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } else { +// try { +// for (Event event : eventList) { +// larkOperateFactory.execute(event); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// }); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index 43fc996..9f157b9 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -33,9 +33,9 @@ public class EventController extends BaseController { result = DecryptUtil.decrypt(jsonObject.getString("encrypt")); log.info("/event/test1/approval encrypt:{}", JSONObject.toJSONString(result)); } - RequestVo larkRequest = new RequestVo(); - larkRequest.setMessage(result); - larkFactory.execute(larkRequest); +// RequestVo larkRequest = new RequestVo(); +// larkRequest.setMessage(result); +// larkFactory.execute(larkRequest); return result; } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java index 5d649e0..78dd410 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java @@ -1,33 +1,15 @@ package com.ruoyi.flyingbook.controller; -import com.alibaba.fastjson.JSONObject; -import com.ruoyi.common.utils.DecryptUtil; +import com.lark.oapi.service.drive.v1.DriveService; +import com.lark.oapi.service.drive.v1.model.P2FileBitableFieldChangedV1; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import com.lark.oapi.core.utils.Jsons; import com.lark.oapi.event.EventDispatcher; import com.lark.oapi.sdk.servlet.ext.ServletAdapter; -import com.lark.oapi.service.application.v6.ApplicationService.P1AppOpenV6Handler; -import com.lark.oapi.service.application.v6.ApplicationService.P1AppStatusChangedV6Handler; -import com.lark.oapi.service.application.v6.ApplicationService.P1AppUninstalledV6Handler; -import com.lark.oapi.service.application.v6.ApplicationService.P1OrderPaidV6Handler; -import com.lark.oapi.service.application.v6.model.P1AppOpenV6; -import com.lark.oapi.service.application.v6.model.P1AppStatusChangedV6; -import com.lark.oapi.service.application.v6.model.P1AppUninstalledV6; -import com.lark.oapi.service.application.v6.model.P1OrderPaidV6; -import com.lark.oapi.service.approval.v4.ApprovalService.*; -import com.lark.oapi.service.approval.v4.model.*; -import com.lark.oapi.service.contact.v3.ContactService.*; -import com.lark.oapi.service.contact.v3.model.*; -import com.lark.oapi.service.im.v1.ImService.*; -import com.lark.oapi.service.im.v1.model.*; -import com.lark.oapi.service.meeting_room.v1.MeetingRoomService.P1ThirdPartyMeetingRoomChangedV1Handler; -import com.lark.oapi.service.meeting_room.v1.model.P1ThirdPartyMeetingRoomChangedV1; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.util.Map; @Slf4j @RestController @@ -36,134 +18,12 @@ public class EventControllers { //1. 注册消息处理器 private final EventDispatcher EVENT_DISPATCHER = EventDispatcher.newBuilder("xJJE7c2rlHzDCk2uPZk77fQNJFtXgTW3", - "ND2ANZB8F7NplUqcrmKD530lDRFssNWJ") - .onP2MessageReceiveV1(new P2MessageReceiveV1Handler() { + "ND2ANZB8F7NplUqcrmKD530lDRFssNWJ") + .onP2FileBitableFieldChangedV1(new DriveService.P2FileBitableFieldChangedV1Handler(){ @Override - public void handle(P2MessageReceiveV1 event) throws Exception { - // 处理消息 - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP2UserCreatedV3(new P2UserCreatedV3Handler() { - @Override - public void handle(P2UserCreatedV3 event) { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }) - .onP2MessageReadV1(new P2MessageReadV1Handler() { - @Override - public void handle(P2MessageReadV1 event) { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1MessageReadV1(new P1MessageReadV1Handler() { - @Override - public void handle(P1MessageReadV1 event) { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1MessageReceivedV1(new P1MessageReceivedV1Handler() { - @Override - public void handle(P1MessageReceivedV1 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1UserChangedV3(new P1UserChangedV3Handler() { - @Override - public void handle(P1UserChangedV3 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1UserStatusChangedV3(new P1UserStatusChangedV3Handler() { - @Override - public void handle(P1UserStatusChangedV3 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1DepartmentChangedV3(new P1DepartmentChangedV3Handler() { - @Override - public void handle(P1DepartmentChangedV3 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1ContactScopeChangedV3(new P1ContactScopeChangedV3Handler() { - @Override - public void handle(P1ContactScopeChangedV3 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1P2PChatCreatedV1(new P1P2PChatCreatedV1Handler() { - @Override - public void handle(P1P2PChatCreatedV1 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1ThirdPartyMeetingRoomChangedV1(new P1ThirdPartyMeetingRoomChangedV1Handler() { - @Override - public void handle(P1ThirdPartyMeetingRoomChangedV1 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1LeaveApprovalV4(new P1LeaveApprovalV4Handler() { - @Override - public void handle(P1LeaveApprovalV4 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1WorkApprovalV4(new P1WorkApprovalV4Handler() { - @Override - public void handle(P1WorkApprovalV4 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1ShiftApprovalV4(new P1ShiftApprovalV4Handler() { - @Override - public void handle(P1ShiftApprovalV4 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1RemedyApprovalV4(new P1RemedyApprovalV4Handler() { - @Override - public void handle(P1RemedyApprovalV4 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1TripApprovalV4(new P1TripApprovalV4Handler() { - @Override - public void handle(P1TripApprovalV4 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1OutApprovalV4(new P1OutApprovalV4Handler() { - @Override - public void handle(P1OutApprovalV4 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1AppOpenV6(new P1AppOpenV6Handler() { - @Override - public void handle(P1AppOpenV6 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1AppStatusChangedV6(new P1AppStatusChangedV6Handler() { - @Override - public void handle(P1AppStatusChangedV6 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1OrderPaidV6(new P1OrderPaidV6Handler() { - @Override - public void handle(P1OrderPaidV6 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); - } - }).onP1AppUninstalledV6(new P1AppUninstalledV6Handler() { - @Override - public void handle(P1AppUninstalledV6 event) throws Exception { - System.out.println(Jsons.DEFAULT.toJson(event)); - System.out.println(event.getRequestId()); + public void handle(P2FileBitableFieldChangedV1 p2FileBitableFieldChangedV1) throws Exception { + System.out.println(Jsons.DEFAULT.toJson(p2FileBitableFieldChangedV1)); + System.out.println(p2FileBitableFieldChangedV1.getRequestId()); } }) .build(); @@ -172,14 +32,13 @@ public class EventControllers { @Autowired private ServletAdapter servletAdapter; + //3. 创建路由处理器 @PostMapping("/approval2") public void event(HttpServletRequest request, HttpServletResponse response) throws Throwable { //3.1 回调扩展包提供的事件回调处理器 servletAdapter.handleEvent(request, response, EVENT_DISPATCHER); - Map parameterMap = request.getParameterMap(); - log.info("/event/test2/approval request:{}", JSONObject.toJSONString(parameterMap)); } From 5e1a9023db8411005eb35ffc74d99fd5cd51e735 Mon Sep 17 00:00:00 2001 From: bob Date: Sat, 18 Mar 2023 09:00:20 +0800 Subject: [PATCH 22/37] feat(cd) add drone --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 7fcc0f9..6f8a0ac 100644 --- a/.drone.yml +++ b/.drone.yml @@ -40,6 +40,6 @@ volumes: # 定义流水线挂载目录,用于共享数据 host: path: /app/maven/cache # drone执行触发器 -trigger:g +trigger: branch: - test From 7d15e59dcf9e2f5d04d34a9e4004784a8ae39ad6 Mon Sep 17 00:00:00 2001 From: bob Date: Sat, 18 Mar 2023 09:00:43 +0800 Subject: [PATCH 23/37] feat(cd) add drone --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 6f8a0ac..9ae987a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -42,4 +42,4 @@ volumes: # 定义流水线挂载目录,用于共享数据 # drone执行触发器 trigger: branch: - - test + - 于相涌/Lark From 35e917bb9c9ade340ab1017bd971823e4e0c018d Mon Sep 17 00:00:00 2001 From: bob Date: Sat, 18 Mar 2023 09:23:36 +0800 Subject: [PATCH 24/37] feat(cd) add drone drone --- .drone.yml | 16 ++++++++-------- ruoyi-admin/Dockerfile | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.drone.yml b/.drone.yml index 9ae987a..170c81e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,25 +1,25 @@ kind: pipeline # 定义对象类型,还有secret和signature两种类型 type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型 name: jar-deploy # 定义流水线名称 -node: - name: centos-runner steps: # 定义流水线执行步骤,这些步骤将顺序执行 - name: build-package # 流水线名称 image: maven:3.8-openjdk-11 # 定义创建容器的Docker镜像 + pull: if-not-exists volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-cache path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 commands: # 定义在Docker容器中执行的shell命令 - - mvn -T 8 clean package -Dmaven.test.skip=true -pl ruoyi-admin -am # 应用打包命令 - - cp target/*.jar /app/build/ + - mvn clean package -Dmaven.test.skip=true -pl ruoyi-admin -am # 应用打包命令 + - cp ruoyi-admin/target/*.jar /app/build/ - cp ruoyi-admin/Dockerfile /app/build/Dockerfile - cp run.sh /app/build/run.sh - name: deploy-start image: appleboy/drone-ssh # SSH工具镜像 + pull: if-not-exists settings: host: 49.232.170.154 # 远程连接地址 username: root # 远程连接账号 @@ -31,7 +31,6 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行 - cd /app/build # 进入宿主机构建目录 - chmod +x run.sh # 更改为可执行脚本 - ./run.sh # 运行脚本打包应用镜像并运行 - volumes: # 定义流水线挂载目录,用于共享数据 - name: maven-build host: @@ -39,7 +38,8 @@ volumes: # 定义流水线挂载目录,用于共享数据 - name: maven-cache host: path: /app/maven/cache -# drone执行触发器 -trigger: +when: branch: - - 于相涌/Lark + - test + event: + - pull_request diff --git a/ruoyi-admin/Dockerfile b/ruoyi-admin/Dockerfile index 126ce2f..fd71385 100644 --- a/ruoyi-admin/Dockerfile +++ b/ruoyi-admin/Dockerfile @@ -6,6 +6,6 @@ ARG SPRING_PROFILE ENV JAVA_OPTS "${JAVA_OPTS} ${CUSTOM_OPTS}" -COPY target/*.jar /javarun +COPY *.jar /javarun CMD ["bash","-c","java ${JAVA_OPTS} -Dspring.profiles.active=${SPRING_PROFILE} -jar /javarun/*.jar"] From b7a8c4ab8f2025a2170692f5753ef0b0e50b2467 Mon Sep 17 00:00:00 2001 From: bob Date: Sat, 18 Mar 2023 09:38:39 +0800 Subject: [PATCH 25/37] feat(log) change log file --- ruoyi-admin/src/main/resources/logback.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml index 5184d9b..31ae0a3 100644 --- a/ruoyi-admin/src/main/resources/logback.xml +++ b/ruoyi-admin/src/main/resources/logback.xml @@ -36,7 +36,7 @@ 60 - ${log.pattern} + ${CONSOLE_LOG_PATTERN} @@ -58,7 +58,7 @@ 60 - ${log.pattern} + ${CONSOLE_LOG_PATTERN} @@ -80,7 +80,7 @@ 60 - ${log.pattern} + ${CONSOLE_LOG_PATTERN} From efdf5c222bb97e3d55021131e7917330935b2f3b Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Sat, 18 Mar 2023 14:38:04 +0800 Subject: [PATCH 26/37] =?UTF-8?q?=E5=AE=A1=E6=89=B9=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=EF=BC=88=E5=BE=85=E6=B5=8B=E8=AF=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/common/enums/AppType.java | 3 +- .../ruoyi/common/enums/DataStructureEnum.java | 39 ++++++++ .../LarkHelper/DataStructureHelper.java | 8 ++ .../LarkHelper/LarkApprovalHelper.java | 3 +- .../consumer/LarkApplicationRunner.java | 44 ++++----- .../controller/EventController.java | 6 +- .../ruoyi/flyingbook/domain/RequestVo.java | 2 + .../strategy/callback/ApprovalCallback.java | 12 +-- .../MultidimensionalTableCallback.java | 2 +- .../operate/ApprovalCallbackOperate.java | 91 +++++++++++++------ .../strategy/operate/LarkAbstract.java | 4 +- .../operate/MultidimensionalTableOperate.java | 10 +- 12 files changed, 149 insertions(+), 75 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/DataStructureEnum.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/DataStructureHelper.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java index c20761e..ddf0ce4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java @@ -9,7 +9,8 @@ public enum AppType { /** * */ - APPROVAL("APPROVAL", "多维表格"); + MULTIDIMENSIONAL_TABLE("APPROVAL", "多维表格"), + APPROVAL_TASK("APPROVAL_TASK", "审批回调"); private final String code; private final String info; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataStructureEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataStructureEnum.java new file mode 100644 index 0000000..f3791fe --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataStructureEnum.java @@ -0,0 +1,39 @@ +package com.ruoyi.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum DataStructureEnum { + /** + * + */ + TRIP_GROUP("tripGroup", "出差审批"), + CONTACK("contact", "合同审批"); + + private final String code; + private final String info; + + DataStructureEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + + public static DataStructureEnum getByCode(String code){ + for (DataStructureEnum value : DataStructureEnum.values()) { + if (value.getCode().equals(code)){ + return value; + } + } + return null; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/DataStructureHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/DataStructureHelper.java new file mode 100644 index 0000000..df1a546 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/DataStructureHelper.java @@ -0,0 +1,8 @@ +package com.ruoyi.flyingbook.LarkHelper; + +/** + * @author yuxiangyong + * @create 2023-03-18 11:09 + */ +public class DataStructureHelper { +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java index 198d260..1f7c277 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java @@ -1,7 +1,6 @@ package com.ruoyi.flyingbook.LarkHelper; -import com.lark.oapi.service.approval.v4.model.GetInstanceReq; -import com.lark.oapi.service.approval.v4.model.GetInstanceRespBody; +import com.lark.oapi.service.approval.v4.model.*; import com.ruoyi.flyingbook.domain.lark.LarkApprovalRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index cc62f5c..5946ea7 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -59,28 +59,28 @@ public class LarkApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { //这里用线程池,后续如果出现量大的情况下可以调整 -// threadPool.execute(() -> { -// -// while (true) { -// List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode()); -// if (CollectionUtils.isEmpty(eventList)) { -// try { -// // 没有订单,休息一下 -// Thread.sleep(WAIT_TIME); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } else { -// try { -// for (Event event : eventList) { -// larkOperateFactory.execute(event); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// }); + threadPool.execute(() -> { + + while (true) { + List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode()); + if (CollectionUtils.isEmpty(eventList)) { + try { + // 没有订单,休息一下 + Thread.sleep(WAIT_TIME); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + try { + for (Event event : eventList) { + larkOperateFactory.execute(event); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java index 9f157b9..43fc996 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -33,9 +33,9 @@ public class EventController extends BaseController { result = DecryptUtil.decrypt(jsonObject.getString("encrypt")); log.info("/event/test1/approval encrypt:{}", JSONObject.toJSONString(result)); } -// RequestVo larkRequest = new RequestVo(); -// larkRequest.setMessage(result); -// larkFactory.execute(larkRequest); + RequestVo larkRequest = new RequestVo(); + larkRequest.setMessage(result); + larkFactory.execute(larkRequest); return result; } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java index 96700eb..6e83561 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java @@ -35,6 +35,8 @@ public class RequestVo { private String instance; private GetInstanceRespBody instanceRespBody; private String message; + private String instanceId; + private String approveName; /** * MultidimensionalTableOperate 用参数 diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index 43928dc..dac7300 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -1,10 +1,7 @@ package com.ruoyi.flyingbook.strategy.callback; import com.alibaba.fastjson.JSONObject; -import com.ruoyi.common.enums.AppType; -import com.ruoyi.common.enums.EventOperateStatus; -import com.ruoyi.common.enums.EventOperateType; -import com.ruoyi.common.enums.FlagStatus; +import com.ruoyi.common.enums.*; import com.ruoyi.flyingbook.domain.Event; import com.ruoyi.flyingbook.domain.EventLog; import com.ruoyi.flyingbook.domain.RequestVo; @@ -32,8 +29,6 @@ public class ApprovalCallback extends CallbackAbstract { private IEventService eventService; @Autowired private IEventLogService eventLogService; - @Autowired - private RedisTemplate redisTemplate; @Override protected Boolean check(RequestVo request) { @@ -69,9 +64,6 @@ public class ApprovalCallback extends CallbackAbstract { protected void endHandle(RequestVo request) { if (request.getEventId() == null){ return; - } - if (StringUtils.isNotBlank(request.getErrorMessage())){ - } EventLog eventLog = StringUtils.isBlank(request.getErrorMessage()) ? new EventLog(request.getEventId(),EventOperateType.CALL_BACK.getCode(),request.getMessage()) @@ -113,7 +105,7 @@ public class ApprovalCallback extends CallbackAbstract { event.setUpdateTime(new Date()); event.setUpdateBy("System"); event.setAppId(request.getAppId()); - event.setType(AppType.APPROVAL.getCode()); + event.setType(EventTypeEnum.APPROVAL_TASK.getCode()); return event; } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java index ab59de0..7e984ce 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java @@ -147,7 +147,7 @@ public class MultidimensionalTableCallback extends CallbackAbstract { event.setUpdateTime(new Date()); event.setUpdateBy("System"); event.setAppId(request.getAppId()); - event.setType(EventTypeEnum.APPROVAL_TASK.getCode()); + event.setType(EventTypeEnum.ROW_CHANGE.getCode()); return event; } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java index f858b9f..8b1b574 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -1,5 +1,6 @@ package com.ruoyi.flyingbook.strategy.operate; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.lark.oapi.service.approval.v4.model.GetInstanceRespBody; import com.lark.oapi.service.bitable.v1.model.CreateAppTableRecordRespBody; @@ -54,8 +55,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { LarkTableRelation tableRelation = new LarkTableRelation(); tableRelation.setLarkCompanyRelationId(request.getCompanyRelationId()); - //todo yxy 表关联关系 tableId取值 - tableRelation.setFromTableId(request.getEvent().getTableId()); + tableRelation.setFromTableId(request.getApproveName()); tableRelation.setFlag(FlagStatus.OK.getCode()); List larkTableRelations = iLarkTableRelationService.selectLarkTableRelationList(tableRelation); if (CollectionUtils.isEmpty(larkTableRelations)) { @@ -76,9 +76,10 @@ public class ApprovalCallbackOperate extends LarkAbstract { List larkTableRowRelations = iLarkTableRowRelationService.queryListByTableRelationIdList(tableRelationIdList); Map> tableColRelationMap = new HashMap<>(); for (LarkTableRowRelation larkTableRowRelation : larkTableRowRelations) { - Map map = new HashMap<>(); - map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId()); + if (TableDetailRelationTypeEnum.COL.getCode().equals(larkTableRowRelation.getType())) { + Map map = tableColRelationMap.getOrDefault(larkTableRowRelation.getTableRelationId(), new HashMap<>()); + map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId()); tableColRelationMap.put(larkTableRowRelation.getTableRelationId(), map); } } @@ -96,65 +97,95 @@ public class ApprovalCallbackOperate extends LarkAbstract { if (event == null) { throw new RuntimeException("当前事件为空"); } - LarkCompanyRelation relation = larkCompanyRelationService.getByAppIdAndType(request.getEvent().getAppId(), AppType.APPROVAL.getCode()); + LarkCompanyRelation relation = larkCompanyRelationService.getByAppIdAndType(request.getEvent().getAppId(), AppType.APPROVAL_TASK.getCode()); if (relation == null) { - String errorMessage = String.format("获取app值为空 appId:{} appType:{}", request.getEvent().getAppId(), AppType.APPROVAL.getCode()); + String errorMessage = String.format("获取app值为空 appId:{} appType:{}", request.getEvent().getAppId(), AppType.APPROVAL_TASK.getCode()); log.error("larkCompanyRelationService.getByCompanyName:{}", errorMessage); throw new RuntimeException(errorMessage); } //用于后续追加row时候做关联关系 request.setCompanyRelationId(relation.getId()); - //关联关系表填充 - this.fillTableRelation(request); request.setAppId(relation.getAppId()); request.setAppSecret(relation.getSecret()); + LarkApprovalRequest detailRequest = new LarkApprovalRequest(request.getAppId(), request.getAppSecret(), event.getRecordId()); + GetInstanceRespBody approvalInfoDetail = larkApprovalHelper.getApprovalInfoDetail(detailRequest); + request.setInstanceRespBody(approvalInfoDetail); + String approvalName = approvalInfoDetail.getApprovalName(); + request.setApproveName(approvalName); + //关联关系表填充 + this.fillTableRelation(request); + } @Override protected void businessProcessing(RequestVo request) { - LarkApprovalRequest detailRequest = new LarkApprovalRequest(request.getAppId(), request.getAppSecret(), request.getInstance()); - GetInstanceRespBody approvalInfoDetail = larkApprovalHelper.getApprovalInfoDetail(detailRequest); - request.setInstanceRespBody(approvalInfoDetail); + for (Map.Entry entry : request.getTableRelationMap().entrySet()) { String[] arr = entry.getKey().split("_"); request.setToAppToken(arr[0]); request.setToTableId(arr[1]); request.setTableRelationId(entry.getValue()); - send( request); + send(request); } } @Override protected Map getBody(RequestVo request) { - Map result = new HashMap<>(); - JSONObject record = request.getRecord(); - String responseCode = record.getString("code"); - if ("0".equals(responseCode)) { - result = parseMap(request); + Map bodyMap = new HashMap<>(); + JSONArray paramList = JSONArray.parseArray(request.getInstanceRespBody().getForm()); + for (int i = 0; i < paramList.size(); i++) { + JSONObject jsonObject = paramList.getJSONObject(i); + bodyMap.put(jsonObject.getString("name"), jsonObject); } - return result; - } - - private Map parseMap(RequestVo request) { Map result = new HashMap<>(); - JSONObject record = request.getRecord(); Map colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); for (Map.Entry entry : colRelation.entrySet()) { - result.put(entry.getValue(), recursiveValue(record,entry.getKey())); + result.put(entry.getValue(), recursiveValue(bodyMap.get(entry.getValue()), entry.getKey())); } return result; } - private Object recursiveValue(JSONObject record,String key){ + + /** + * 无前缀表示直接取值 + * #前缀表示对象 + * ##表示数组 + * + * @param record + * @param key + * @return + */ + private Object recursiveValue(JSONObject record, String key) { String[] split = key.split(","); - for (int i = 0; i < split.length - 1; i++) { - String k = split[i]; - if (key.startsWith("#")){ - k = k.replace("#",""); - record = record.getJSONArray(k).getJSONObject(0); + int index = 0; + for (index = 0; index < split.length; index++) { + String k = split[index]; + if (k.startsWith("##")) { + k = k.replace("##", ""); + List list = new ArrayList<>(); + JSONArray jsonArray = record.getJSONArray(k); + for (int i = 0; i < jsonArray.size(); i++) { + Object object = jsonArray.get(i); + if (object instanceof String) { + list.add(String.valueOf(object)); + } else { + List keyList = new ArrayList<>(); + for (int j = index+1; j < split.length; j++) { + keyList.add(split[j]); + } + Object o = recursiveValue(jsonArray.getJSONObject(i), String.join(",",keyList)); + list.add(String.valueOf(o)); + } + } + return String.join(",", list); + } else if (k.startsWith("#")) { + k = k.replace("#", ""); + record = record.getJSONObject(k); + } else { + break; } } - return record.get(split[split.length-1]); + return record.get(split[index]); } protected void send(RequestVo request) { diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java index ede45f5..0dee448 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java @@ -3,6 +3,8 @@ package com.ruoyi.flyingbook.strategy.operate; import com.ruoyi.flyingbook.domain.RequestVo; import com.ruoyi.flyingbook.strategy.LarkOperateAbstract; +import java.util.ArrayList; +import java.util.List; import java.util.Map; /** @@ -18,6 +20,4 @@ public abstract class LarkAbstract extends LarkOperateAbstract { */ protected abstract Map getBody(RequestVo request); - - } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index 4db8613..4a7e482 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -83,11 +83,13 @@ public class MultidimensionalTableOperate extends LarkAbstract { Map> tableRowRelationMap = new HashMap<>(); Map> tableColRelationMap = new HashMap<>(); for (LarkTableRowRelation larkTableRowRelation : larkTableRowRelations) { - Map map = new HashMap<>(); - map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId()); if (TableDetailRelationTypeEnum.ROW.getCode().equals(larkTableRowRelation.getType())) { + Map map = tableRowRelationMap.getOrDefault(larkTableRowRelation.getTableRelationId(),new HashMap<>()); + map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId()); tableRowRelationMap.put(larkTableRowRelation.getTableRelationId(), map); } else if (TableDetailRelationTypeEnum.COL.getCode().equals(larkTableRowRelation.getType())) { + Map map = tableColRelationMap.getOrDefault(larkTableRowRelation.getTableRelationId(),new HashMap<>()); + map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId()); tableColRelationMap.put(larkTableRowRelation.getTableRelationId(), map); } } @@ -106,9 +108,9 @@ public class MultidimensionalTableOperate extends LarkAbstract { if (event == null) { throw new RuntimeException("当前事件为空"); } - LarkCompanyRelation relation = larkCompanyRelationService.getByAppIdAndType(request.getEvent().getAppId(), AppType.APPROVAL.getCode()); + LarkCompanyRelation relation = larkCompanyRelationService.getByAppIdAndType(request.getEvent().getAppId(), AppType.MULTIDIMENSIONAL_TABLE.getCode()); if (relation == null) { - String errorMessage = String.format("获取app值为空 appId:{} appType:{}", request.getEvent().getAppId(), AppType.APPROVAL.getCode()); + String errorMessage = String.format("获取app值为空 appId:{} appType:{}", request.getEvent().getAppId(), AppType.MULTIDIMENSIONAL_TABLE.getCode()); log.error("larkCompanyRelationService.getByCompanyName:{}", errorMessage); throw new RuntimeException(errorMessage); } From f2bc41604489c269118d8a0569ceadd89994332a Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Sat, 18 Mar 2023 15:59:53 +0800 Subject: [PATCH 27/37] =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/common/enums/AppType.java | 2 +- .../consumer/LarkApplicationRunner.java | 42 ++++---- .../ruoyi/flyingbook/domain/RequestVo.java | 3 + .../flyingbook/mapper/EventLogMapper.java | 2 + .../ruoyi/flyingbook/mapper/EventMapper.java | 3 + .../flyingbook/service/IEventLogService.java | 1 + .../flyingbook/service/IEventService.java | 1 + .../service/impl/EventLogServiceImpl.java | 6 ++ .../service/impl/EventServiceImpl.java | 6 ++ .../MultidimensionalTableCallback.java | 99 +++++++++++-------- .../operate/MultidimensionalTableOperate.java | 25 +++-- .../main/resources/mapper/EventLogMapper.xml | 86 ++++++++++------ .../src/main/resources/mapper/EventMapper.xml | 14 ++- 13 files changed, 189 insertions(+), 101 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java index ddf0ce4..600f38e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java @@ -9,7 +9,7 @@ public enum AppType { /** * */ - MULTIDIMENSIONAL_TABLE("APPROVAL", "多维表格"), + MULTIDIMENSIONAL_TABLE("MULTIDIMENSIONAL_TABLE", "多维表格"), APPROVAL_TASK("APPROVAL_TASK", "审批回调"); private final String code; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java index 5946ea7..e35dd8e 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -59,28 +59,34 @@ public class LarkApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { //这里用线程池,后续如果出现量大的情况下可以调整 - threadPool.execute(() -> { - - while (true) { - List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode()); - if (CollectionUtils.isEmpty(eventList)) { - try { - // 没有订单,休息一下 - Thread.sleep(WAIT_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } else { - try { - for (Event event : eventList) { - larkOperateFactory.execute(event); + new Thread(new Runnable() { + @Override + public void run() { + while (true) { + List eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode()); + if (CollectionUtils.isEmpty(eventList)) { + try { + // 没有订单,休息一下 + Thread.sleep(WAIT_TIME); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + try { + for (Event event : eventList) { + larkOperateFactory.execute(event); + } + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); } } } - }); + }).start(); +// threadPool.execute(() -> { +// +// +// }); } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java index 6e83561..b96b99c 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/RequestVo.java @@ -7,6 +7,7 @@ import com.ruoyi.common.enums.EventOperateType; import com.ruoyi.flyingbook.domain.lark.LarkApprovalRequest; import lombok.Data; +import java.util.List; import java.util.Map; /** @@ -32,6 +33,7 @@ public class RequestVo { * ApprovalCallback 用参数 */ private Long eventId; + private List eventIdList; private String instance; private GetInstanceRespBody instanceRespBody; private String message; @@ -47,6 +49,7 @@ public class RequestVo { private Long tableRelationId; private String fromTableId; private String toTableId; + private List fromRecordIdList; private String fromRecordId; private String toRecordId; private String operateType; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventLogMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventLogMapper.java index af10514..d3b133a 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventLogMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventLogMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.flyingbook.mapper; import com.ruoyi.flyingbook.domain.EventLog; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -36,6 +37,7 @@ public interface EventLogMapper * @return 结果 */ public int insertEventLog(EventLog eventLog); + public int insertBatchEventLog(@Param("eventLogList") List eventLogList); /** * 修改【请填写功能名称】 diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java index 136c07d..e9e332d 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java @@ -38,6 +38,7 @@ public interface EventMapper */ public int insertEvent(Event event); + /** * 修改【请填写功能名称】 * @@ -66,4 +67,6 @@ public interface EventMapper public int updateStatus(@Param("id") Long id,@Param("status") String status,@Param("numbers") Long numbers); + public int updateStatusByIdList(@Param("idList") List idList,@Param("status") String status,@Param("numbers") Long numbers); + } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventLogService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventLogService.java index 5ee0d25..5bfb3f1 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventLogService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventLogService.java @@ -36,6 +36,7 @@ public interface IEventLogService * @return 结果 */ public int insertEventLog(EventLog eventLog); + public int insertBatchEventLog(List eventLogList); /** * 修改【请填写功能名称】 diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java index 41a32c3..9107c6f 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java @@ -62,4 +62,5 @@ public interface IEventService public int deleteEventById(Long id); public int updateStatus(Long id,String status,Long numbsers); + public int updateStatusByIdList(List id,String status,Long numbsers); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventLogServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventLogServiceImpl.java index 827a50c..d45302a 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventLogServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventLogServiceImpl.java @@ -58,6 +58,12 @@ public class EventLogServiceImpl implements IEventLogService return eventLogMapper.insertEventLog(eventLog); } + @Override + public int insertBatchEventLog(List eventLogList) + { + return eventLogMapper.insertBatchEventLog(eventLogList); + } + /** * 修改【请填写功能名称】 * diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java index 3fc23a7..c4e0f81 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java @@ -59,6 +59,7 @@ public class EventServiceImpl implements IEventService return eventMapper.insertEvent(event); } + /** * 修改【请填写功能名称】 * @@ -100,4 +101,9 @@ public class EventServiceImpl implements IEventService public int updateStatus(Long id, String status,Long numbsers) { return eventMapper.updateStatus(id,status,numbsers); } + + @Override + public int updateStatusByIdList(List idList, String status,Long numbsers) { + return eventMapper.updateStatusByIdList(idList,status,numbsers); + } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java index 7e984ce..1188ac7 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -56,58 +57,70 @@ public class MultidimensionalTableCallback extends CallbackAbstract { if (CollectionUtils.isEmpty(actionList)) { return; } - JSONObject action = actionList.getJSONObject(0); - //如果不存在说明是行变更以外的事件,跳过 - String recordId = action.getString("record_id"); - if (StringUtils.isBlank(recordId)) { - return; + List recordIdList = new ArrayList<>(); + for (int i = 0; i < actionList.size(); i++) { + JSONObject action = actionList.getJSONObject(i); + //如果不存在说明是行变更以外的事件,跳过 + String recordId = action.getString("record_id"); + if (StringUtils.isBlank(recordId)) { + continue; + } + recordIdList.add(recordId); + if (StringUtils.isBlank(request.getAppId())) { + JSONObject header = jsonObject.getJSONObject("header"); + request.setAppId(header == null ? null : header.getString("app_id")); + } } - request.setFromRecordId(recordId); - - JSONObject header = jsonObject.getJSONObject("header"); - if (header == null) { - return; - } - String appId = header.getString("app_id"); - request.setAppId(appId); + request.setFromRecordIdList(recordIdList); } @Override protected void businessProcessing(RequestVo request) { - String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getFromAppToken(),request.getFromTableId(), request.getFromRecordId()); - String eventStr = (String)redisTemplate.opsForValue().get(cacheKey); - Event event = null; - if (StringUtils.isBlank(eventStr)){ - event = queryEvent(request.getFromAppToken(),request.getFromTableId(), request.getFromRecordId()); - }else { - event = JSONObject.parseObject(eventStr,Event.class); + List updateEventList = new ArrayList<>(); + List eventIdList = new ArrayList<>(); + for (String recordId : request.getFromRecordIdList()) { + String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getFromAppToken(), request.getFromTableId(), recordId); + String eventStr = (String) redisTemplate.opsForValue().get(cacheKey); + Event event = null; + if (StringUtils.isBlank(eventStr)) { + event = queryEvent(request.getFromAppToken(), request.getFromTableId(), recordId); + } else { + event = JSONObject.parseObject(eventStr, Event.class); + } + //如果已经存在处理中的就不需要操作数据库了 + if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus())) { + continue; + } + event = this.buildDto(request, event,recordId); + if (event.getId() == null) { + eventService.insertEvent(event); + redisTemplate.opsForValue().set(cacheKey, JSONObject.toJSONString(event)); + } else { + updateEventList.add(event.getId()); + } + eventIdList.add(event.getId()); } - //如果已经存在处理中的就不需要操作数据库了 - if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus())){ - return; + if (CollectionUtils.isNotEmpty(updateEventList)) { + eventService.updateStatusByIdList(updateEventList, EventOperateStatus.PENDING.getCode(), 0L); } - event = this.buildDto(request,event); - if (event.getId() == null){ - eventService.insertEvent(event); - redisTemplate.opsForValue().set(cacheKey,JSONObject.toJSONString(event)); - }else { - eventService.updateStatus(event.getId(),EventOperateStatus.PENDING.getCode(),0L); - } - request.setEventId(event.getId()); + request.setEventIdList(eventIdList); } @Override protected void endHandle(RequestVo request) { - if (request.getEventId() == null){ + if (CollectionUtils.isEmpty(request.getEventIdList())) { return; } - if (StringUtils.isNotBlank(request.getErrorMessage())){ - + List list = new ArrayList<>(); + for (Long eventLogId : request.getEventIdList()) { + EventLog eventLog = StringUtils.isBlank(request.getErrorMessage()) ? + new EventLog(eventLogId, EventOperateType.CALL_BACK.getCode(), request.getMessage()) + : new EventLog(eventLogId, EventOperateType.CALL_BACK.getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); + list.add(eventLog); + } + if (CollectionUtils.isNotEmpty(list)) { + eventLogService.insertBatchEventLog(list); } - EventLog eventLog = StringUtils.isBlank(request.getErrorMessage()) ? - new EventLog(request.getEventId(),EventOperateType.CALL_BACK.getCode(),request.getMessage()) - : new EventLog(request.getEventId(),EventOperateType.CALL_BACK.getCode(),request.getMessage(),request.getErrorCode(),request.getErrorMessage()); - eventLogService.insertEventLog(eventLog); } @Override @@ -121,25 +134,25 @@ public class MultidimensionalTableCallback extends CallbackAbstract { return this.getClass().getSimpleName(); } - private Event queryEvent(String appToken,String tableId,String recordId){ + private Event queryEvent(String appToken, String tableId, String recordId) { Event event = new Event(); event.setAppToken(appToken); event.setTableId(tableId); event.setRecordId(recordId); List events = eventService.selectEventList(event); - if (CollectionUtils.isNotEmpty(events)){ + if (CollectionUtils.isNotEmpty(events)) { return events.get(0); } return null; } - private Event buildDto(RequestVo request, Event event){ - event = event == null ? new Event() :event; + private Event buildDto(RequestVo request, Event event,String recordId) { + event = event == null ? new Event() : event; event.setFlag(FlagStatus.OK.getCode()); event.setAppToken(request.getFromAppToken()); event.setTableId(request.getFromTableId()); - event.setRecordId(request.getFromRecordId()); + event.setRecordId(recordId); event.setNumbers(0L); event.setOperateStatus(EventOperateStatus.PENDING.getCode()); event.setCreateBy("System"); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java index 4a7e482..c52fa03 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -125,6 +125,8 @@ public class MultidimensionalTableOperate extends LarkAbstract { @Override protected void businessProcessing(RequestVo request) { Event event = request.getEvent(); + String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, event.getAppToken(), event.getTableId(), event.getRecordId()); + redisTemplate.delete(cacheKey); LarkTableRequest detailRequest = new LarkTableRequest(request.getAppId(), request.getAppSecret(), event.getAppToken(), event.getTableId(), event.getRecordId()); detailRequest.setSafeCode(Arrays.asList(1254043)); GetAppTableRecordResp recordDetail = larkTokenHelper.getTableRecordDetail(detailRequest); @@ -143,11 +145,11 @@ public class MultidimensionalTableOperate extends LarkAbstract { protected Map getBody(RequestVo request) { Map result = new HashMap<>(); GetAppTableRecordResp respBody = request.getRespBody(); - Integer responseCode = respBody.getCode(); + int responseCode = respBody.getCode(); Map rowMap = request.getTableRowRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); - if ("1254043".equals(responseCode)) { + if (1254043 == responseCode) { request.setOperateType(DELETE_OPERATE); - } else if ("0".equals(responseCode)) { + } else if (0 == responseCode) { result = parseMap(request); if (rowMap.containsKey(request.getEvent().getRecordId())) { request.setOperateType(UPDATE_OPERATE); @@ -155,6 +157,9 @@ public class MultidimensionalTableOperate extends LarkAbstract { request.setOperateType(CREATE_OPERATE); } } + if (result.isEmpty() && DELETE_OPERATE != request.getOperateType()){ + throw new RuntimeException("post 的body为空,请检查映射参数"); + } return result; } @@ -176,12 +181,13 @@ public class MultidimensionalTableOperate extends LarkAbstract { } private void send(RequestVo request) { - String type = request.getOperateType(); + Map body = getBody(request); + String type = request.getOperateType(); Event event = request.getEvent(); - String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, event.getAppToken(), event.getTableId(), event.getRecordId()); - redisTemplate.delete(cacheKey); + request.setOperateInfo(String.valueOf(body)); + Map rowRelationMap = request.getTableRowRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); if (CREATE_OPERATE.equals(type)) { LarkTableRequest add = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(), body); CreateAppTableRecordRespBody addResp = larkTokenHelper.addTableRecord(add); @@ -193,11 +199,12 @@ public class MultidimensionalTableOperate extends LarkAbstract { request.setEventOperateType(EventOperateType.CREATE); } else if (UPDATE_OPERATE.equals(type)) { request.setEventOperateType(EventOperateType.UPDATE); - LarkTableRequest update = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(),request.getToRecordId(), body); + + LarkTableRequest update = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(),rowRelationMap.get(request.getEvent().getRecordId()), body); larkTokenHelper.updateTableRecord(update); } else if (DELETE_OPERATE.equals(type)) { request.setEventOperateType(EventOperateType.DELETE); - LarkTableRequest delete = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(),request.getToRecordId()); + LarkTableRequest delete = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(),rowRelationMap.get(request.getEvent().getRecordId())); larkTokenHelper.deleteTableRecord(delete); } @@ -213,7 +220,7 @@ public class MultidimensionalTableOperate extends LarkAbstract { } else { eventService.updateStatus(event.getId(), EventOperateStatus.PENDING.getCode(), event.getNumbers() + 1); if (request.getEventOperateType() != null) { - new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); + eventLog = new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); } } if (eventLog != null) { diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml index ec36349..2014f0a 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml @@ -1,44 +1,56 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - - - - + + + + + + + + + + + - select id, event_id, operate_type, operate_info, error_code, error_message, remark, create_by, create_time, update_by, update_time from event_log + select id, + event_id, + operate_type, + operate_info, + error_code, + error_message, + remark, + create_by, + create_time, + update_by, + update_time + from event_log - + - - + + insert into event_log event_id, @@ -51,7 +63,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time, update_by, update_time, - + #{eventId}, #{operateType}, @@ -63,7 +75,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{createTime}, #{updateBy}, #{updateTime}, - + + + + + insert into event_log(event_id,operate_type,operate_info,error_code,error_message,create_by,create_time) + values + + ( + #{eventLog.eventId} + ,#{eventLog.operateType} + ,#{eventLog.operateInfo} + ,#{eventLog.errorCode} + ,#{eventLog.errorMessage} + ,#{eventLog.createBy},#{eventLog.createTime} + ) + @@ -84,11 +112,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from event_log where id = #{id} + delete + from event_log + where id = #{id} - delete from event_log where id in + delete from event_log where id in #{id} diff --git a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml index 3951e3e..975770d 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml @@ -130,10 +130,20 @@ where operate_status = #{status} and 3 > numbers - + update event set operate_status = #{status}, - numbers = #{numbers} + numbers = #{numbers} where id = #{id} + + + update event + set operate_status = #{status}, + numbers = #{numbers} + where id in + + #{id} + + \ No newline at end of file From 65e9339b03cbaf9e7e9ea0fe260c076bc4fc5466 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Sat, 18 Mar 2023 16:25:50 +0800 Subject: [PATCH 28/37] =?UTF-8?q?=E5=9B=9E=E8=B0=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strategy/operate/ApprovalCallbackOperate.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java index 8b1b574..d7e4bda 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -140,7 +140,10 @@ public class ApprovalCallbackOperate extends LarkAbstract { Map result = new HashMap<>(); Map colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); for (Map.Entry entry : colRelation.entrySet()) { - result.put(entry.getValue(), recursiveValue(bodyMap.get(entry.getValue()), entry.getKey())); + String[] split = entry.getValue().split("@"); + String toColName = split[0]; + String path = split[1]; + result.put(entry.getValue(), recursiveValue(bodyMap.get(toColName), path)); } return result; } @@ -201,15 +204,15 @@ public class ApprovalCallbackOperate extends LarkAbstract { EventLog eventLog = null; if (StringUtils.isBlank(request.getErrorMessage())) { eventService.updateStatus(event.getId(), EventOperateStatus.SUCCESS.getCode(), event.getNumbers()); - eventLog = new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage()); + eventLog = new EventLog(event.getId(), request.getApproveName(), request.getMessage()); } else { eventService.updateStatus(event.getId(), EventOperateStatus.PENDING.getCode(), event.getNumbers() + 1); if (request.getEventOperateType() != null) { - new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); + new EventLog(event.getId(), request.getApproveName(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); } } if (eventLog != null) { - eventLog.setOperateInfo(request.getOperateType()); + eventLog.setOperateInfo(request.getOperateInfo()); eventLogService.insertEventLog(eventLog); } } From 809af2613d977866f1b1c5f5d5695a322ceaf5f7 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Sat, 18 Mar 2023 16:39:23 +0800 Subject: [PATCH 29/37] =?UTF-8?q?=E5=9B=9E=E8=B0=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flyingbook/strategy/LarkOperateAbstract.java | 1 + .../operate/ApprovalCallbackOperate.java | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java index 7b1cfe6..0899b5b 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java @@ -32,6 +32,7 @@ public abstract class LarkOperateAbstract{ }else { request.setErrorMessage(message); } + }finally { //业务处理完成后的系列操作,例如日志 endHandle(request); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java index d7e4bda..7730ed3 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -109,6 +109,10 @@ public class ApprovalCallbackOperate extends LarkAbstract { request.setAppSecret(relation.getSecret()); LarkApprovalRequest detailRequest = new LarkApprovalRequest(request.getAppId(), request.getAppSecret(), event.getRecordId()); GetInstanceRespBody approvalInfoDetail = larkApprovalHelper.getApprovalInfoDetail(detailRequest); + JSONArray objects = JSONArray.parseArray(approvalInfoDetail.getForm()); + if (objects.size() == 1){ + return; + } request.setInstanceRespBody(approvalInfoDetail); String approvalName = approvalInfoDetail.getApprovalName(); request.setApproveName(approvalName); @@ -119,7 +123,9 @@ public class ApprovalCallbackOperate extends LarkAbstract { @Override protected void businessProcessing(RequestVo request) { - + if (request.getInstanceRespBody() == null){ + return; + } for (Map.Entry entry : request.getTableRelationMap().entrySet()) { String[] arr = entry.getKey().split("_"); request.setToAppToken(arr[0]); @@ -173,10 +179,10 @@ public class ApprovalCallbackOperate extends LarkAbstract { list.add(String.valueOf(object)); } else { List keyList = new ArrayList<>(); - for (int j = index+1; j < split.length; j++) { + for (int j = index + 1; j < split.length; j++) { keyList.add(split[j]); } - Object o = recursiveValue(jsonArray.getJSONObject(i), String.join(",",keyList)); + Object o = recursiveValue(jsonArray.getJSONObject(i), String.join(",", keyList)); list.add(String.valueOf(o)); } } @@ -207,9 +213,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { eventLog = new EventLog(event.getId(), request.getApproveName(), request.getMessage()); } else { eventService.updateStatus(event.getId(), EventOperateStatus.PENDING.getCode(), event.getNumbers() + 1); - if (request.getEventOperateType() != null) { - new EventLog(event.getId(), request.getApproveName(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); - } + eventLog = new EventLog(event.getId(), request.getApproveName(), request.getMessage(), request.getErrorCode(), request.getErrorMessage()); } if (eventLog != null) { eventLog.setOperateInfo(request.getOperateInfo()); From 02588501d5cac9c2995cb72feb828be19bd17013 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Mon, 20 Mar 2023 20:14:51 +0800 Subject: [PATCH 30/37] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=96=E5=80=BC?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/flyingbook/LarkHelper/LarkTableHelper.java | 12 ++++-------- .../strategy/operate/ApprovalCallbackOperate.java | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java index ca14c40..4973e88 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java @@ -52,9 +52,8 @@ public class LarkTableHelper extends LarkHelper{ .recordId(request.getRecord()). build()); } catch (Exception e) { - + throw new RuntimeException(e.getMessage()); } - return null; } public CreateAppTableRecordRespBody addTableRecord(LarkTableRequest request) { @@ -69,9 +68,8 @@ public class LarkTableHelper extends LarkHelper{ .build()) .build()).getData(); } catch (Exception e) { - + throw new RuntimeException(e.getMessage()); } - return null; } public DeleteAppTableRecordRespBody deleteTableRecord(LarkTableRequest request) { @@ -84,9 +82,8 @@ public class LarkTableHelper extends LarkHelper{ .build() ).getData(); } catch (Exception e) { - + throw new RuntimeException(e.getMessage()); } - return null; } public UpdateAppTableRecordRespBody updateTableRecord(LarkTableRequest request) { @@ -103,8 +100,7 @@ public class LarkTableHelper extends LarkHelper{ ).build() ).getData(); } catch (Exception e) { - + throw new RuntimeException(e.getMessage()); } - return null; } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java index 7730ed3..5226840 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -146,7 +146,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { Map result = new HashMap<>(); Map colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); for (Map.Entry entry : colRelation.entrySet()) { - String[] split = entry.getValue().split("@"); + String[] split = entry.getKey().split("@"); String toColName = split[0]; String path = split[1]; result.put(entry.getValue(), recursiveValue(bodyMap.get(toColName), path)); From f037698ede69cf2d7deeb48b97536f6b6c63533a Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Mon, 20 Mar 2023 20:31:29 +0800 Subject: [PATCH 31/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LarkHelper/LarkApprovalHelper.java | 14 +++++---- .../LarkHelper/LarkTableHelper.java | 29 ++++++++++++++----- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java index 1f7c277..83b53b3 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkApprovalHelper.java @@ -26,16 +26,18 @@ public class LarkApprovalHelper extends LarkHelper{ /** * 获取行详情 - * - * @return */ public GetInstanceRespBody getApprovalInfoDetail(LarkApprovalRequest request) { try { - return buildClient(request).approval().instance().get(GetInstanceReq.newBuilder() - .instanceId(request.getInstanceId()).build()).getData(); + GetInstanceResp getInstanceResp = buildClient(request).approval().instance().get(GetInstanceReq.newBuilder() + .instanceId(request.getInstanceId()).build()); + if (getInstanceResp.getCode() == 0){ + return getInstanceResp.getData(); + }else { + throw new RuntimeException(getInstanceResp.getMsg()); + } } catch (Exception e) { - + throw new RuntimeException(e.getMessage()); } - return null; } } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java index 4973e88..e8353a6 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java @@ -25,7 +25,7 @@ public class LarkTableHelper extends LarkHelper{ public static void main(String[] args) throws Exception { LarkTableHelper bk = new LarkTableHelper(); - map.put("b", "aaa"); + map.put("a", "aaa"); LarkTableRequest add = new LarkTableRequest(appId, secret, appToken, tableId,map); CreateAppTableRecordRespBody createAppTableRecordRespBody = bk.addTableRecord(add); String recordId = createAppTableRecordRespBody.getRecord().getRecordId(); @@ -58,7 +58,7 @@ public class LarkTableHelper extends LarkHelper{ public CreateAppTableRecordRespBody addTableRecord(LarkTableRequest request) { try { - return buildClient(request).bitable().appTableRecord() + CreateAppTableRecordResp createAppTableRecordResp = buildClient(request).bitable().appTableRecord() .create(CreateAppTableRecordReq.newBuilder() .appToken(request.getAppToken()) .tableId(request.getAppTable()) @@ -66,7 +66,12 @@ public class LarkTableHelper extends LarkHelper{ AppTableRecord.newBuilder() .fields(request.getBody()) .build()) - .build()).getData(); + .build()); + if (createAppTableRecordResp.getCode() == 0){ + return createAppTableRecordResp.getData(); + }else { + throw new RuntimeException(createAppTableRecordResp.getMsg()); + } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } @@ -74,13 +79,18 @@ public class LarkTableHelper extends LarkHelper{ public DeleteAppTableRecordRespBody deleteTableRecord(LarkTableRequest request) { try { - return buildClient(request).bitable().appTableRecord().delete( + DeleteAppTableRecordResp delete = buildClient(request).bitable().appTableRecord().delete( DeleteAppTableRecordReq.newBuilder() .appToken(request.getAppToken()) .tableId(request.getAppTable()) .recordId(request.getRecord()) .build() - ).getData(); + ); + if (delete.getCode() == 0){ + return delete.getData(); + }else { + throw new RuntimeException(delete.getMsg()); + } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } @@ -88,7 +98,7 @@ public class LarkTableHelper extends LarkHelper{ public UpdateAppTableRecordRespBody updateTableRecord(LarkTableRequest request) { try { - return buildClient(request).bitable().appTableRecord().update( + UpdateAppTableRecordResp update = buildClient(request).bitable().appTableRecord().update( UpdateAppTableRecordReq.newBuilder() .appToken(request.getAppToken()) .tableId(request.getAppTable()) @@ -98,7 +108,12 @@ public class LarkTableHelper extends LarkHelper{ .fields(request.getBody()) .build() ).build() - ).getData(); + ); + if (update.getCode() == 0){ + return update.getData(); + }else { + throw new RuntimeException(update.getMsg()); + } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } From 74fb26cd7aed813358e410a4aa987927b4a758fe Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Mon, 20 Mar 2023 21:04:16 +0800 Subject: [PATCH 32/37] =?UTF-8?q?=E9=87=8D=E8=AF=95=E6=AC=A1=E6=95=B0?= =?UTF-8?q?=E4=BB=A5=E5=A4=96=E7=9A=84=E5=8F=AF=E4=BB=A5=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E5=8F=91=E8=B5=B7=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/flyingbook/strategy/callback/ApprovalCallback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java index dac7300..4698eaf 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/ApprovalCallback.java @@ -48,7 +48,7 @@ public class ApprovalCallback extends CallbackAbstract { protected void businessProcessing(RequestVo request) { Event event = queryEvent(request.getAppId(),request.getFromRecordId()); //如果已经存在处理中的就不需要操作数据库了 - if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus())){ + if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus()) && event.getNumbers() < 3){ return; } event = this.buildDto(request,event); From a4e25e813c538fd60af35a048c55bc93eed662f6 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Mon, 20 Mar 2023 22:24:09 +0800 Subject: [PATCH 33/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flyingbook/strategy/operate/ApprovalCallbackOperate.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java index 5226840..be20ca7 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -113,6 +113,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { if (objects.size() == 1){ return; } + log.info("APPROVAL_INFO_DETAIL:{}",objects.toString()); request.setInstanceRespBody(approvalInfoDetail); String approvalName = approvalInfoDetail.getApprovalName(); request.setApproveName(approvalName); From 0480422d216701e7c8252f45f89ec129a79a8084 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Mon, 20 Mar 2023 23:31:12 +0800 Subject: [PATCH 34/37] =?UTF-8?q?=E7=BC=93=E5=AD=98=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strategy/callback/MultidimensionalTableCallback.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java index 1188ac7..99c2c0a 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.concurrent.TimeUnit; /** * @author yuxiangyong @@ -88,13 +89,13 @@ public class MultidimensionalTableCallback extends CallbackAbstract { event = JSONObject.parseObject(eventStr, Event.class); } //如果已经存在处理中的就不需要操作数据库了 - if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus())) { + if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus()) && event.getNumbers() < 3) { continue; } event = this.buildDto(request, event,recordId); if (event.getId() == null) { eventService.insertEvent(event); - redisTemplate.opsForValue().set(cacheKey, JSONObject.toJSONString(event)); + redisTemplate.opsForValue().set(cacheKey, JSONObject.toJSONString(event),1, TimeUnit.MINUTES); } else { updateEventList.add(event.getId()); } From 6ec0e9ce29a2d32a833ded5b3d4850fe1aa58d52 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Tue, 21 Mar 2023 20:35:40 +0800 Subject: [PATCH 35/37] =?UTF-8?q?=E7=94=A8=E6=88=B7id=E8=BD=AC=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flyingbook/LarkHelper/LarkUserHelper.java | 47 +++++++++++++++++++ .../domain/lark/LarkUserRequest.java | 21 +++++++++ .../operate/ApprovalCallbackOperate.java | 35 ++++++++++---- 3 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkUserHelper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkUserRequest.java diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkUserHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkUserHelper.java new file mode 100644 index 0000000..b72edc3 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkUserHelper.java @@ -0,0 +1,47 @@ +package com.ruoyi.flyingbook.LarkHelper; + +import com.lark.oapi.service.approval.v4.model.GetInstanceRespBody; +import com.lark.oapi.service.contact.v3.model.GetUserReq; +import com.lark.oapi.service.contact.v3.model.GetUserResp; +import com.lark.oapi.service.contact.v3.model.GetUserRespBody; +import com.ruoyi.flyingbook.domain.lark.LarkApprovalRequest; +import com.ruoyi.flyingbook.domain.lark.LarkUserRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + + +/** + * @author yuxiangyong + * @create 2023-03-12 18:10 + */ +@Slf4j +@Component +public class LarkUserHelper extends LarkHelper{ + + static String openId = "ou_cd09481727e91fce1f12b7b0ed1500d2"; + + public static void main(String[] args) throws Exception { + LarkUserHelper bk = new LarkUserHelper(); + GetUserRespBody userRespBody = bk.getUserInfoDetail(new LarkUserRequest(appId, secret, openId)); +// userRespBody.getUser().getName(); + System.out.println(userRespBody); + } + + + /** + * 获取行详情 + * @return + */ + public GetUserRespBody getUserInfoDetail(LarkUserRequest request) { + try { + GetUserResp getUserResp = buildClient(request).contact().user().get(GetUserReq.newBuilder().userId(request.getOpenId()).build()); + if (getUserResp.getCode() == 0){ + return getUserResp.getData(); + }else { + throw new RuntimeException(getUserResp.getMsg()); + } + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkUserRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkUserRequest.java new file mode 100644 index 0000000..4893ce5 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkUserRequest.java @@ -0,0 +1,21 @@ +package com.ruoyi.flyingbook.domain.lark; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author yuxiangyong + * @create 2023-03-18 1:05 + */ +@Data +@NoArgsConstructor +public class LarkUserRequest extends LarkRequest{ + + + private String openId; + + public LarkUserRequest(String appId, String appSecret, String openId) { + super(appId, appSecret); + this.openId = openId; + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java index be20ca7..df2dcb8 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -4,12 +4,15 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.lark.oapi.service.approval.v4.model.GetInstanceRespBody; import com.lark.oapi.service.bitable.v1.model.CreateAppTableRecordRespBody; +import com.lark.oapi.service.contact.v3.model.GetUserRespBody; import com.ruoyi.common.enums.*; import com.ruoyi.flyingbook.LarkHelper.LarkApprovalHelper; import com.ruoyi.flyingbook.LarkHelper.LarkTableHelper; +import com.ruoyi.flyingbook.LarkHelper.LarkUserHelper; import com.ruoyi.flyingbook.domain.*; import com.ruoyi.flyingbook.domain.lark.LarkApprovalRequest; import com.ruoyi.flyingbook.domain.lark.LarkTableRequest; +import com.ruoyi.flyingbook.domain.lark.LarkUserRequest; import com.ruoyi.flyingbook.service.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -33,6 +36,8 @@ import java.util.Map; @Component("ApprovalCallbackOperate") public class ApprovalCallbackOperate extends LarkAbstract { + @Autowired + protected LarkUserHelper larkUserHelper; @Autowired protected LarkTableHelper larkTableHelper; @Autowired @@ -110,10 +115,10 @@ public class ApprovalCallbackOperate extends LarkAbstract { LarkApprovalRequest detailRequest = new LarkApprovalRequest(request.getAppId(), request.getAppSecret(), event.getRecordId()); GetInstanceRespBody approvalInfoDetail = larkApprovalHelper.getApprovalInfoDetail(detailRequest); JSONArray objects = JSONArray.parseArray(approvalInfoDetail.getForm()); - if (objects.size() == 1){ + if (objects.size() == 1) { return; } - log.info("APPROVAL_INFO_DETAIL:{}",objects.toString()); + log.info("APPROVAL_INFO_DETAIL:{}", objects.toString()); request.setInstanceRespBody(approvalInfoDetail); String approvalName = approvalInfoDetail.getApprovalName(); request.setApproveName(approvalName); @@ -124,7 +129,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { @Override protected void businessProcessing(RequestVo request) { - if (request.getInstanceRespBody() == null){ + if (request.getInstanceRespBody() == null) { return; } for (Map.Entry entry : request.getTableRelationMap().entrySet()) { @@ -150,7 +155,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { String[] split = entry.getKey().split("@"); String toColName = split[0]; String path = split[1]; - result.put(entry.getValue(), recursiveValue(bodyMap.get(toColName), path)); + result.put(entry.getValue(), recursiveValue(bodyMap.get(toColName), path,request)); } return result; } @@ -165,11 +170,25 @@ public class ApprovalCallbackOperate extends LarkAbstract { * @param key * @return */ - private Object recursiveValue(JSONObject record, String key) { + private Object recursiveValue(JSONObject record, String key,RequestVo request) { + if (record == null){ + return null; + } String[] split = key.split(","); int index = 0; for (index = 0; index < split.length; index++) { - String k = split[index]; + String k = split[index].trim(); + if (k.startsWith("##") && k.endsWith("${user}")) { + k = k.replace("##", "").replace("${user}", ""); + List list = new ArrayList<>(); + JSONArray jsonArray = record.getJSONArray(k); + for (int i = 0; i < jsonArray.size(); i++) { + String openId = jsonArray.getString(i); + GetUserRespBody userInfoDetail = larkUserHelper.getUserInfoDetail(new LarkUserRequest(request.getAppId(), request.getAppSecret(), openId)); + list.add(userInfoDetail.getUser().getName()); + } + return String.join(",", list); + } if (k.startsWith("##")) { k = k.replace("##", ""); List list = new ArrayList<>(); @@ -183,7 +202,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { for (int j = index + 1; j < split.length; j++) { keyList.add(split[j]); } - Object o = recursiveValue(jsonArray.getJSONObject(i), String.join(",", keyList)); + Object o = recursiveValue(jsonArray.getJSONObject(i), String.join(",", keyList),request); list.add(String.valueOf(o)); } } @@ -195,7 +214,7 @@ public class ApprovalCallbackOperate extends LarkAbstract { break; } } - return record.get(split[index]); + return record.getString(split[index].trim()); } protected void send(RequestVo request) { From a7bdc615465ce08ed3a586b3ca7a5996c83f3944 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Tue, 21 Mar 2023 22:25:31 +0800 Subject: [PATCH 36/37] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operate/ApprovalCallbackOperate.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java index df2dcb8..1f26fec 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -20,10 +20,9 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; /** @@ -210,13 +209,24 @@ public class ApprovalCallbackOperate extends LarkAbstract { } else if (k.startsWith("#")) { k = k.replace("#", ""); record = record.getJSONObject(k); - } else { + } else if (k.endsWith("${time}")){ + String time = record.getString(k.replace("${time}", "").trim()); + if (time.contains("T")){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + return sdf.parse(time.replace("T", " ").substring(0, time.indexOf("+"))).getTime(); + } catch (ParseException e) { + throw new RuntimeException(e.getMessage()); + } + } + }else { break; } } return record.getString(split[index].trim()); } + protected void send(RequestVo request) { Map body = getBody(request); request.setOperateInfo(String.valueOf(body)); From 3852edade803202120fd26e0ba9d40fc82a6280f Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Tue, 21 Mar 2023 23:03:02 +0800 Subject: [PATCH 37/37] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E9=80=89?= =?UTF-8?q?=E5=8D=95=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strategy/operate/ApprovalCallbackOperate.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java index 1f26fec..01fd48f 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/ApprovalCallbackOperate.java @@ -187,8 +187,16 @@ public class ApprovalCallbackOperate extends LarkAbstract { list.add(userInfoDetail.getUser().getName()); } return String.join(",", list); - } - if (k.startsWith("##")) { + }else if (k.startsWith("##") && k.endsWith("${checkbox}")) { + k = k.replace("##", "").replace("${checkbox}", ""); + List list = new ArrayList<>(); + JSONArray jsonArray = record.getJSONArray(k); + for (int i = 0; i < jsonArray.size(); i++) { + String param = jsonArray.getString(i); + list.add(param); + } + return list; + }else if (k.startsWith("##")) { k = k.replace("##", ""); List list = new ArrayList<>(); JSONArray jsonArray = record.getJSONArray(k);