diff --git a/README.md b/README.md
index 69cd4fb..b865e74 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,7 @@
Java 1.8
## flowable
+
表结构
act_hi_identitylink 审批任务信息
diff --git a/pom.xml b/pom.xml
index 1d1091d..cb370af 100644
--- a/pom.xml
+++ b/pom.xml
@@ -215,6 +215,11 @@
ruoyi-flowable
${ruoyi.version}
+
+ com.ruoyi
+ ruoyi-flyingbook
+ 3.4.1-SNAPSHOT
+
org.flowable
@@ -274,6 +279,7 @@
ruoyi-generator
ruoyi-common
ruoyi-flowable
+ ruoyi-flyingbook
pom
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"]
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 c813a74..7ed1c4d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -18,6 +18,5 @@ public class RuoYiApplication
{
// System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(RuoYiApplication.class, args);
- log.info("=========================cd auto deploy success=========");
}
}
diff --git a/ruoyi-admin/src/main/resources/banner.txt b/ruoyi-admin/src/main/resources/banner.txt
index 0931cb8..7e847a0 100644
--- a/ruoyi-admin/src/main/resources/banner.txt
+++ b/ruoyi-admin/src/main/resources/banner.txt
@@ -21,4 +21,5 @@ Spring Boot Version: ${spring-boot.version}
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
-////////////////////////////////////////////////////////////////////
\ No newline at end of file
+////////////////////////////////////////////////////////////////////
+ log.info("=========================cd auto deploy success=========");
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-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..993bfff
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/RedisConstants.java
@@ -0,0 +1,24 @@
+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("multiple tabular feedback".replaceAll(" ","").toUpperCase());
+ }
+
+ /**
+ * 多维表格回调时间缓存key
+ */
+ 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-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-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..dcfa3e1
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateStatus.java
@@ -0,0 +1,31 @@
+package com.ruoyi.common.enums;
+
+/**
+ * 用户状态
+ *
+ * @author ruoyi
+ */
+public enum EventOperateStatus {
+
+ /**
+ *
+ */
+ PENDING("PENDING", "未处理"),
+ SUCCESS("SUCCESS", "处理完成");
+
+ 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/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-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 bf82ff0..0000000
Binary files a/ruoyi-flyingbook/.mvn/wrapper/maven-wrapper.jar and /dev/null differ
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..26b17c9 100644
--- a/ruoyi-flyingbook/pom.xml
+++ b/ruoyi-flyingbook/pom.xml
@@ -3,14 +3,12 @@
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
+ 3.4.1-SNAPSHOT
ruoyi-flyingbook
- 0.0.1-SNAPSHOT
ruoyi-flyingbook
Demo project for Spring Boot
@@ -39,7 +37,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 +61,5 @@
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
- org.projectlombok
- lombok
-
-
-
-
-
-
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/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java
new file mode 100644
index 0000000..7f9a2a0
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTokenHelper.java
@@ -0,0 +1,138 @@
+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.springframework.stereotype.Component;
+
+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
+@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) {
+ 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) || "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