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> 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/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-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..6d63018 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/consumer/LarkApplicationRunner.java @@ -0,0 +1,99 @@ +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.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; + +/** + * @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 = 10000; + + @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 eventList = eventMapper.queryEventList(EventOperateStatus.PENDING.getCode(), AppType.APPROVAL.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 new file mode 100644 index 0000000..3920637 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventController.java @@ -0,0 +1,46 @@ +package com.ruoyi.flyingbook.controller; + +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 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; + + +@Slf4j +@RestController +public class EventController extends BaseController { + + @Autowired + private MultidimensionalTableCallback multidimensionalTableCallback; + + //3. 创建路由处理器 + @PostMapping("/approval") + public String event(@RequestBody JSONObject jsonObject) { + String result = ""; + if (jsonObject == null) { + 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); + } + if (jsonObject.containsKey("challenge")) { + result = jsonObject.getString("challenge"); + log.info("/event/test1/approval request:{} challenge:{}", jsonObject.toJSONString(), result); + } + LarkRequest larkRequest = new LarkRequest(); + larkRequest.setMessage(result); + multidimensionalTableCallback.execute(larkRequest); + return result; + } +} + diff --git a/ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventControllers.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java similarity index 95% rename from ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventControllers.java rename to ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java index 5fc9b87..5d649e0 100644 --- a/ruoyi-flyingbook/src/main/java/com/flyingbook/controller/EventControllers.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/EventControllers.java @@ -1,4 +1,8 @@ -package com.flyingbook.controller; +package com.ruoyi.flyingbook.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,7 +27,9 @@ 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 public class EventControllers { @@ -167,11 +173,13 @@ public class EventControllers { private ServletAdapter servletAdapter; //3. 创建路由处理器 - @RequestMapping("/webhook/events") + @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)); } 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 new file mode 100644 index 0000000..8f9cd41 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/Event.java @@ -0,0 +1,36 @@ +package com.ruoyi.flyingbook.domain; + +import lombok.Data; +import com.ruoyi.common.core.domain.BaseEntity; + + +/** + * 【请填写功能名称】对象 event + * + * @author ruoyi + * @date 2023-03-15 + */ +@Data +public class Event extends BaseEntity { + private static final long serialVersionUID = 1L; + + private Long id; + private String appId; + /** + * @see com.ruoyi.common.enums.AppType + */ + private String type; + private String appToken; + private String tableId; + private String recordId; + private Long numbers; + /** + * @see com.ruoyi.common.enums.EventOperateStatus + */ + private String operateStatus; + /** + * @see com.ruoyi.common.enums.FlagStatus + */ + private Long flag; + +} 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 new file mode 100644 index 0000000..ecf17b4 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/EventLog.java @@ -0,0 +1,49 @@ +package com.ruoyi.flyingbook.domain; + +import lombok.Data; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 【请填写功能名称】对象 event_log + * + * @author ruoyi + * @date 2023-03-15 + */ +@Data +public class EventLog extends BaseEntity { + private static final long serialVersionUID = 1L; + + public EventLog() { + } + + public EventLog(Long eventId, String operateType, String operateInfo) { + this.eventId = eventId; + this.operateType = operateType; + 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"); + } + + private Long id; + private Long eventId; + /** + * @see com.ruoyi.common.enums.EventOperateType + */ + private String operateType; + private String operateInfo; + private String errorCode; + private String errorMessage; + +} 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 new file mode 100644 index 0000000..3ca60ed --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyRelation.java @@ -0,0 +1,28 @@ +package com.ruoyi.flyingbook.domain; + +import lombok.Data; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * @author ruoyi + * @date 2023-03-15 + */ +@Data +public class LarkCompanyRelation extends BaseEntity { + private static final long serialVersionUID = 1L; + + private Long id; + private Long companyId; + private String companyName; + private String appId; + private String secret; + /** + * @see com.ruoyi.common.enums.AppType + */ + private String appType; + /** + * @see com.ruoyi.common.enums.FlagStatus + */ + private Long flag; + +} 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..7a1cfa3 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkRequest.java @@ -0,0 +1,56 @@ +package com.ruoyi.flyingbook.domain; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.enums.EventOperateType; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author yuxiangyong + * @create 2023-03-12 16:00 + */ +@Data +public class LarkRequest { + + /** + * 通用信息,不可修改不可删除 + */ + private String token; + private String appId; + private String fromAppToken; + private String toAppToken; + private String errorCode; + private String errorMessage; + + + /** + * ApprovalCallback 用参数 + */ + private Long eventId; + private String message; + private String eventType; + + /** + * MultidimensionalTableOperate 用参数 + */ + private JSONObject record; + private Long companyRelationId; + private Long tableRelationId; + private String fromTableId; + private String toTableId; + private String fromRecordId; + private String toRecordId; + private String operateType; + private String callBackMessage; + private Event event; + private EventOperateType eventOperateType; + private String operateInfo; + /** + * 表关系 + */ + 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 new file mode 100644 index 0000000..1ad7b24 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRelation.java @@ -0,0 +1,27 @@ +package com.ruoyi.flyingbook.domain; + +import lombok.Data; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 lark_table_relation + * + * @author ruoyi + * @date 2023-03-15 + */ +@Data +public class LarkTableRelation extends BaseEntity { + private static final long serialVersionUID = 1L; + + private Long id; + private Long larkCompanyRelationId; + private String fromAppToken; + private String fromTableId; + private String toAppToken; + private String toTableId; + /** + * @see com.ruoyi.common.enums.FlagStatus + */ + private Long flag; + +} 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..ed8c836 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkTableRowRelation.java @@ -0,0 +1,53 @@ +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; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 【请填写功能名称】对象 lark_table_row_relation + * + * @author ruoyi + * @date 2023-03-15 + */ +@Data +public class LarkTableRowRelation extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + + public LarkTableRowRelation() { + } + + 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.setCreateTime(new Date()); + this.setCreateBy("System"); + this.flag = FlagStatus.OK.getCode(); + } + + /** $column.columnComment */ + private Long id; + private Long tableRelationId; + private String fromId; + private String toId; + /** + * @see com.ruoyi.common.enums.TableDetailRelationTypeEnum + */ + private String type; + private String subType; + /** + * @see com.ruoyi.common.enums.FlagStatus + */ + private Long flag; + +} 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/mapper/EventLogMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventLogMapper.java new file mode 100644 index 0000000..af10514 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventLogMapper.java @@ -0,0 +1,63 @@ +package com.ruoyi.flyingbook.mapper; + + +import com.ruoyi.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/ruoyi/flyingbook/mapper/EventMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java new file mode 100644 index 0000000..67ae9b0 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/EventMapper.java @@ -0,0 +1,69 @@ +package com.ruoyi.flyingbook.mapper; + + +import com.ruoyi.flyingbook.domain.Event; +import org.apache.ibatis.annotations.Param; + +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); + + 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/mapper/LarkCompanyRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkCompanyRelationMapper.java new file mode 100644 index 0000000..64ad41a --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkCompanyRelationMapper.java @@ -0,0 +1,63 @@ +package com.ruoyi.flyingbook.mapper; + + +import com.ruoyi.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/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java new file mode 100644 index 0000000..227fb05 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.flyingbook.mapper; + + +import com.ruoyi.flyingbook.domain.LarkTableRelation; +import org.apache.ibatis.annotations.Param; + +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/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java new file mode 100644 index 0000000..bbb2ebd --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRowRelationMapper.java @@ -0,0 +1,66 @@ +package com.ruoyi.flyingbook.mapper; + + +import com.ruoyi.flyingbook.domain.LarkTableRowRelation; +import org.apache.ibatis.annotations.Param; + +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); + + public List queryListByTableRelationIdList(@Param("tableRelationIdList") List tableRelationIdList); +} 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 new file mode 100644 index 0000000..5ee0d25 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventLogService.java @@ -0,0 +1,63 @@ +package com.ruoyi.flyingbook.service; + + +import com.ruoyi.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/ruoyi/flyingbook/service/IEventService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java new file mode 100644 index 0000000..41a32c3 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IEventService.java @@ -0,0 +1,65 @@ +package com.ruoyi.flyingbook.service; + + +import com.ruoyi.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); + + public int updateStatus(Long id,String status,Long numbsers); +} 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 new file mode 100644 index 0000000..eb6fc7f --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkCompanyRelationService.java @@ -0,0 +1,65 @@ +package com.ruoyi.flyingbook.service; + + +import com.ruoyi.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); + + public LarkCompanyRelation getByAppIdAndType(String appId,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 new file mode 100644 index 0000000..23e28b6 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRelationService.java @@ -0,0 +1,65 @@ +package com.ruoyi.flyingbook.service; + + +import com.ruoyi.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/ruoyi/flyingbook/service/ILarkTableRowRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java new file mode 100644 index 0000000..c091c57 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkTableRowRelationService.java @@ -0,0 +1,65 @@ +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); + + public List queryListByTableRelationIdList(List tableRelationIdList); +} 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 new file mode 100644 index 0000000..827a50c --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventLogServiceImpl.java @@ -0,0 +1,97 @@ +package com.ruoyi.flyingbook.service.impl; + +import java.util.List; + +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; + +/** + * 【请填写功能名称】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/ruoyi/flyingbook/service/impl/EventServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java new file mode 100644 index 0000000..3fc23a7 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/EventServiceImpl.java @@ -0,0 +1,103 @@ +package com.ruoyi.flyingbook.service.impl; + + +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; + +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); + } + + @Override + 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/service/impl/LarkCompanyRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java new file mode 100644 index 0000000..9d63681 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkCompanyRelationServiceImpl.java @@ -0,0 +1,120 @@ +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; +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; + +/** + * 【请填写功能名称】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); + } + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + @Override + public LarkCompanyRelation getByAppIdAndType(String appId,String appType) + { + if (StringUtils.isEmpty(appId) || StringUtils.isEmpty(appType)){ + return null; + } + LarkCompanyRelation relation = new LarkCompanyRelation(); + relation.setAppId(appId); + 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/LarkTableRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRelationServiceImpl.java new file mode 100644 index 0000000..36ad050 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRelationServiceImpl.java @@ -0,0 +1,100 @@ +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; +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/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..e512141 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkTableRowRelationServiceImpl.java @@ -0,0 +1,107 @@ +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.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +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); + } + + @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 new file mode 100644 index 0000000..9bd706c --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/LarkOperateAbstract.java @@ -0,0 +1,76 @@ +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; + +/** + * @author yuxiangyong + * @create 2023-03-12 15:58 + */ +@Slf4j +public abstract class LarkOperateAbstract{ + + public String execute(LarkRequest request){ + try { + //参数校验逻辑 + if (!check(request)){ + //构建返回对象 + return buildResult(request); + } + //对入参进行预处理,例如解密 + preOperate(request); + //真正的业务处理逻辑 + businessProcessing(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); + } + + /** + * 由子类实现自己的校验逻辑,并输出对应的日志 + * 默认校验通过 + */ + protected Boolean check(LarkRequest request){ + return Boolean.TRUE; + } + + /** + * 由子类实现自己的预处理逻辑 + */ + protected abstract void preOperate(LarkRequest request); + + /** + * 实际业务处理阶段 + * @param request 请求参数 + */ + protected abstract void businessProcessing(LarkRequest request); + + /** + * 业务处理完成后的附加操作 + */ + protected void endHandle(LarkRequest request){}; + + /** + * 具体的返回内容 + */ + protected abstract String buildResult(LarkRequest request); + + protected abstract String getName(); + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/CallbackAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/CallbackAbstract.java new file mode 100644 index 0000000..deca072 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/CallbackAbstract.java @@ -0,0 +1,14 @@ +package com.ruoyi.flyingbook.strategy.callback; + +import com.ruoyi.flyingbook.strategy.LarkOperateAbstract; +import lombok.extern.slf4j.Slf4j; + +/** + * @author yuxiangyong + * @create 2023-03-12 15:58 + */ +@Slf4j +public abstract class CallbackAbstract extends LarkOperateAbstract { + + +} 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 new file mode 100644 index 0000000..77377ea --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/callback/MultidimensionalTableCallback.java @@ -0,0 +1,158 @@ +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; +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; +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 MultidimensionalTableCallback 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) { + 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.setFromAppToken(event.getString("file_token")); + 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"); + if (StringUtils.isBlank(recordId)) { + return; + } + request.setFromRecordId(recordId); + + JSONObject header = jsonObject.getJSONObject("header"); + if (header == null) { + return; + } + String appId = header.getString("app_id"); + request.setAppId(appId); + request.setEventType(header.getString("event_type")); + } + + @Override + protected void businessProcessing(LarkRequest 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); + } + //如果已经存在处理中的就不需要操作数据库了 + if (event != null && EventOperateStatus.PENDING.getCode().equals(event.getOperateStatus())){ + return; + } + 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()); + } + + @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 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); + } + return null; + } + + private Event buildDto(LarkRequest request,Event event){ + event = event == null ? new Event() :event; + event.setFlag(FlagStatus.OK.getCode()); + event.setAppToken(request.getFromAppToken()); + event.setTableId(request.getFromTableId()); + 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/operate/LarkAbstract.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java new file mode 100644 index 0000000..1c46e52 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/LarkAbstract.java @@ -0,0 +1,29 @@ +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(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 new file mode 100644 index 0000000..777ac99 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/strategy/operate/MultidimensionalTableOperate.java @@ -0,0 +1,261 @@ +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; +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("MultidimensionalTableOperate") +public class MultidimensionalTableOperate 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/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) { + LarkTableRelation tableRelation = new LarkTableRelation(); + tableRelation.setLarkCompanyRelationId(request.getCompanyRelationId()); + 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> 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); + } + } + if (tableColRelationMap.isEmpty()) { + String errorMessage = String.format("tableId:{} 列关系未配置", request.getEvent().getTableId()); + log.error("iLarkTableRowRelationService.queryListByTableRelationIdList:{}", errorMessage); + throw new RuntimeException(errorMessage); + } + request.setTableRowRelationMap(tableRowRelationMap); + 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()); + 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(); + 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"); + Map rowMap = request.getTableRowRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>()); + 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<>(); + JSONObject record = request.getRecord(); + 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.getKey()); + if (!colRelation.containsKey(key)) { + continue; + } + result.put(colRelation.get(key), entry.getValue()); + } + Map> map = new HashMap<>(); + map.put("fields", result); + return map; + } + + 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); + 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); + } + } + 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); + } + } + + @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/resources/mapper/EventLogMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml new file mode 100644 index 0000000..ec36349 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventLogMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + 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, + operate_type, + operate_info, + error_code, + error_message, + remark, + create_by, + create_time, + update_by, + update_time, + + + #{eventId}, + #{operateType}, + #{operateInfo}, + #{errorCode}, + #{errorMessage}, + #{remark}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update event_log + + event_id = #{eventId}, + operate_type = #{operateType}, + operate_info = #{operateInfo}, + error_code = #{errorCode}, + error_message = #{errorMessage}, + remark = #{remark}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + 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..0849919 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/EventMapper.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + select id, + app_id, + `type`, + app_token, + table_id, + record_id, + numbers, + operate_status, + create_by, + create_time, + update_by, + update_time, + flag, + remark + from event + + + + + + + + insert into event + + app_id, + `type`, + app_token, + table_id, + record_id, + numbers, + operate_status, + create_by, + create_time, + update_by, + update_time, + flag, + remark, + + + #{appId}, + #{type}, + #{appToken}, + #{tableId}, + #{recordId}, + #{numbers}, + #{operateStatus}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update event + + app_id = #{appId}, + `type` = #{type}, + app_token = #{appToken}, + table_id = #{tableId}, + record_id = #{recordId}, + numbers = #{numbers}, + operate_status = #{operateStatus}, + 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} + + + + + + + update event + set operate_status = #{status}, + numbers = #{numbers} + 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 new file mode 100644 index 0000000..cf35671 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkCompanyRelationMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + 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}, + 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..2833f24 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + insert into lark_table_relation + + 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, + + + #{larkCompanyRelationId}, + #{fromAppToken}, + #{fromTableId}, + #{toAppToken}, + #{toTableId}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update lark_table_relation + + lark_company_relation_id = #{larkCompanyRelationId}, + from_app_token = #{fromAppToken}, + from_table_id = #{fromTableId}, + to_app_token = #{toAppToken}, + to_table_id = #{toTableId}, + 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-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml new file mode 100644 index 0000000..e14809c --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRowRelationMapper.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + insert into lark_table_row_relation + + table_relation_id, + from_id, + to_id, + type, + sub_type, + create_by, + create_time, + update_by, + update_time, + flag, + remark, + + + #{tableRelationId}, + #{fromId}, + #{toId}, + #{type}, + #{subType}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update lark_table_row_relation + + table_relation_id = #{tableRelationId}, + from_id = #{fromId}, + to_id = #{toId}, + type = #{type}, + sub_type = #{subType}, + 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 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..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 @@ -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", diff --git a/sql/lark.sql b/sql/lark.sql new file mode 100644 index 0000000..5b17f29 --- /dev/null +++ b/sql/lark.sql @@ -0,0 +1,91 @@ +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', + `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删除)', + `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 '操作类型', + `operate_info` text 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 '唯一主键', + `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对应的唯一密钥', + `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已删除)', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +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_app_token` varchar(255) DEFAULT NULL, + `from_table_id` varchar(255) DEFAULT NULL COMMENT '来源表', + `to_app_token` varchar(255) DEFAULT NULL, + `to_table_id` 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; + + +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;