Browse Source

象屿待办推送验证

malk 3 weeks ago
parent
commit
6d1508c28d

+ 7 - 0
mjava-hake/pom.xml

@@ -30,6 +30,13 @@
             <artifactId>okhttp</artifactId>
             <version>4.9.3</version>
         </dependency>
+
+        <!-- ppExt: 钉钉 Stream 回调 -->
+        <dependency>
+            <groupId>com.dingtalk.open</groupId>
+            <artifactId>dingtalk-stream</artifactId>
+            <version>1.1.0</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 50 - 1
mjava-hake/src/main/java/com/malk/hake/Boot.java

@@ -1,6 +1,15 @@
 package com.malk.hake;
 
+import com.alibaba.fastjson.JSONObject;
+import com.dingtalk.open.app.api.GenericEventListener;
+import com.dingtalk.open.app.api.OpenDingTalkStreamClientBuilder;
+import com.dingtalk.open.app.api.message.GenericOpenDingTalkEvent;
+import com.dingtalk.open.app.api.security.AuthClientCredential;
+import com.dingtalk.open.app.stream.protocol.event.EventAckStatus;
 import com.querydsl.jpa.impl.JPAQueryFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.Bean;
@@ -14,14 +23,54 @@ import javax.persistence.EntityManager;
  * 若是无需数据库模块, 配置无效地址也可启动, 引入mjava不支持直接 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) 配置
  * 需要配置 jpa.hibernate.ddl-auto 为 none. 标识对表没有任何操作. 若不设置为 none, flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
  */
+@Slf4j
 @EnableJpaAuditing
 @SpringBootApplication(scanBasePackages = {"com.malk"})
 public class Boot {
 
-    public static void main(String... args) {
+    public static void main(String... args) throws Exception {
+
         SpringApplication.run(Boot.class, args);
     }
 
+    /// ppExt: 钉钉 Stream 接入: 仅需要 dingtalk-stream 依赖, 但点击注册不会回传, 应用发布后注册的事件才会回调 --
+    @Bean
+    public void init() {
+        log.info("starting dingtalk stream client...}");
+        try {
+            OpenDingTalkStreamClientBuilder
+                    .custom()
+//                .credential(new AuthClientCredential("${app.appKey}", "${app.appSecret}"))
+                    .credential(new AuthClientCredential("dingjykifqwvw84ejysw", "lpACaGiBgOV55I_0Zmk19Ns3YfMRzgqdc4CUjy2hvLwJ6Gb3sQxjPNuWARsr1gTy"))
+                    //注册事件监听
+                    .registerAllEventListener(new GenericEventListener() {
+                        public EventAckStatus onEvent(GenericOpenDingTalkEvent event) {
+                            try {
+                                //事件唯一Id
+                                String eventId = event.getEventId();
+                                //事件类型
+                                String eventType = event.getEventType();
+                                //事件产生时间
+                                Long bornTime = event.getEventBornTime();
+                                //获取事件体
+                                JSONObject bizData = event.getData();
+                                //处理事件
+//                            process(bizData);
+                                log.error("receive event, eventId={}, eventType={}, bornTime={}, data={}", eventId, eventType, bornTime, bizData);
+                                return EventAckStatus.SUCCESS;
+                            } catch (Exception e) {
+                                //消费失败
+                                log.error("process event error, eventId={}, eventType={}, bornTime={}, data={}", event.getEventId(), event.getEventType(), event.getEventBornTime(), event.getData(), e);
+                                return EventAckStatus.LATER;
+                            }
+                        }
+                    })
+                    .build().start();
+        } catch (Exception e) {
+            log.error("start dingtalk stream client error", e);
+        }
+    }
+
     /**
      * 让Spring管理JPAQueryFactory [不使用Qualifier详见mjava-Boot]
      */

+ 1 - 1
mjava-hake/src/main/java/com/malk/hake/service/impl/HKImplClient_ML.java

@@ -32,7 +32,7 @@ public class HKImplClient_ML implements HKClient_ML {
     // monitor接口ip [fixme 马哈使用test环境, 新建环境变量没有mjava继承文件
     String _getEnvApi(String path) {
         if (UtilEnv.getActiveProfile().equals(UtilEnv.ENV_TEST)) {
-            return "http://172.19.10.4:10001/api/public" + path;
+            return "http://172.19.10.4:10002/api/public" + path;
         }
 //        return "http://hawkfiltration.fortiddns.com:10001/api/public" + path; // 10001 测试
         return "http://hawkfiltration.fortiddns.com:10002/api/public" + path; // 10002 生产

+ 3 - 2
mjava-hake/src/main/resources/application-dev.yml

@@ -16,7 +16,7 @@ spring:
       connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
     driver-class-name: com.mysql.cj.jdbc.Driver
     username: root
-    password: mu123
+    password: ide123
     url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
   jpa:
     database: MYSQL
@@ -53,4 +53,5 @@ aliwork:
 ## aliwork-马来
 #aliwork:
 #  appType: "APP_QJOL2IQW1DTH37FXPGSY"
-#  systemToken: "E3A66E810VPOPE2LCXHUJ6O6CWA12VWLSO81MOG"
+#  systemToken: "E3A66E810VPOPE2LCXHUJ6O6CWA12VWLSO81MOG"
+

+ 5 - 5
mjava-mcli/pom.xml

@@ -78,11 +78,11 @@
         </dependency>
 
         <!-- 文档审阅, 转换依赖  -->
-        <dependency>
-            <groupId>e-iceblue</groupId>
-            <artifactId>spire.doc.free</artifactId>
-            <version>3.9.0</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>e-iceblue</groupId>-->
+<!--            <artifactId>spire.doc.free</artifactId>-->
+<!--            <version>3.9.0</version>-->
+<!--        </dependency>-->
     </dependencies>
 
     <build>

+ 22 - 0
mjava-suodisi/src/main/java/com/malk/suodisi/controller/DDController.java

@@ -0,0 +1,22 @@
+package com.malk.suodisi.controller;
+
+import com.malk.controller.DDCallbackController;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 钉钉事件回调 3_1
+ * -
+ * [子项目直接继承即可有调用, 无需实现]
+ * -
+ * 注解 @RequestMapping 路径不能重复 [主子项目属同一个项目];
+ * 获取项目回调请求地址, https://mc.cloudpure.cn/frp/xxx/dd/callback [调试代理: frp + nginx]
+ */
+@Slf4j
+@RestController
+@RequestMapping("/dd")
+public class DDController extends DDCallbackController {
+
+
+}

+ 52 - 0
mjava-suodisi/src/main/java/com/malk/suodisi/controller/HLController.java

@@ -0,0 +1,52 @@
+package com.malk.suodisi.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McException;
+import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.service.aliwork.YDClient;
+import com.malk.suodisi.server.XYR;
+import com.malk.utils.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+/**
+ * 错误抛出与拦截详见 CatchException
+ */
+@Slf4j
+@RestController
+@RequestMapping("/hl")
+public class HLController {
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private DDConf ddConf;
+
+    /**
+     * 动态审批人
+     */
+    @PostMapping("/invoice/hl")
+    McR HL_invoice(@RequestBody Map data, HttpServletResponse response, HttpServletRequest request) {
+
+        Map dataMain = new HashMap();
+        List<Map> dataList = new ArrayList();
+        String fileName = "HL invoice";
+
+        UtilExcel.exportMapAndListByTemplate(response, dataMain, dataList, Map.class, fileName, "HL2025 invoice list.xls");
+        return  McR.success();
+    }
+}
+
+

+ 1 - 1
mjava-suodisi/src/main/java/com/malk/suodisi/controller/SDSController.java

@@ -22,7 +22,7 @@ import java.util.*;
  */
 @Slf4j
 @RestController
-@RequestMapping
+@RequestMapping("/suodisi")
 public class SDSController {
 
     @Autowired

+ 111 - 0
mjava-suodisi/src/main/java/com/malk/suodisi/controller/XYController.java

@@ -0,0 +1,111 @@
+package com.malk.suodisi.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McException;
+import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.service.aliwork.YDClient;
+import com.malk.suodisi.server.XYR;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilMap;
+import com.malk.utils.UtilServlet;
+import com.sun.org.apache.bcel.internal.generic.NEW;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/**
+ * 错误抛出与拦截详见 CatchException
+ */
+@Slf4j
+@RestController
+@RequestMapping("/xy")
+public class XYController {
+
+    final static String XY_sys = "XYDING";
+    final static String XY_secure = "51d7cbff-806f-4bc9-aca8-7a26fdd6327c";
+
+    private static Map<Integer, String> DD_category = new HashMap<>();
+
+    static {
+        DD_category.put(0, "钉钉,宜搭");
+        DD_category.put(1, "钉钉,待办");
+    }
+
+    private static String getXyUrl(String path) {
+        return "https://xyapiuat.xiangyu.cn/xmxyg/todo/epi" + path;
+    }
+
+    /**
+     * 创建象屿统一待办
+     * - prd
+     * 1. 待办创建, 更新均需要传递全部参数 (目前仅会校验审批时间不能小于历史数据)
+     * 2. 接收人存在多人时, 统一待办会自动拆分为多个 (待办中心以 业务单据号 + 用户域账号)
+     *
+     * @param category       待办分类
+     * @param optType        操作类型:1待办、2已办、3待阅
+     * @param busNo          业务单据号
+     * @param title          待办标题
+     * @param currentStatus  待办进度
+     * @param pcUrl          待办PC端地址
+     * @param appUrl         待办移动端地址
+     * @param createDateTime 创建时间
+     * @param creator        创建人域账号(钉钉工号)
+     * @param creatorName    创建人姓名
+     * @param receivers      接收人姓名
+     * @param receiverNames  接收人域账号(钉钉工号)
+     * @param keywords       关键字字段
+     */
+    private void syncXyTodo(String category, int optType, String busNo, String title, String currentStatus, String pcUrl, String appUrl,
+                              String createDateTime, String creator, String creatorName, String receivers, String receiverNames, List<String> keywords) {
+
+        Map body = UtilMap.map("sysCode, secureCode, busType, optType, isSupportBatch, receiveDateTime", XY_sys, XY_secure, category, optType, false, UtilDateTime.formatDateTime(new Date()));
+        body.putAll(UtilMap.map("busNo, title, currentStatus, pcUrl, appUrl, createDateTime", busNo, title, currentStatus, pcUrl, appUrl, createDateTime));
+        body.putAll(UtilMap.map("creator, creatorName, receivers, receiverNames, keywords", creator, creatorName, receivers, receiverNames, keywords));
+
+        XYR r = (XYR) UtilHttp.doPost(getXyUrl("/push"), null, body, XYR.class);
+
+        log.info("创建统一待办, {}", r);
+
+    }
+
+    /**
+     * 宜搭待办
+     */
+    @PostMapping("/sync")
+    McR sdsUpdate(HttpServletRequest request) {
+
+        Map data = UtilServlet.getParamMap(request);
+        log.info("宜搭待办, {}", JSON.toJSONString(data));
+        int optType = UtilMap.getInt(data, "optType");
+        String busNo = UtilMap.getString(data, "busNo");
+        String title = UtilMap.getString(data, "title");
+        String currentStatus = UtilMap.getString(data, "currentStatus");
+        String pcUrl = UtilMap.getString(data, "pcUrl");
+        String appUrl = UtilMap.getString(data, "appUrl");
+        String createDateTime = UtilDateTime.formatDateTime(new Date(UtilMap.getLong(data, "createDateTime")));
+        String creator = UtilMap.getString(data, "creator");
+        String creatorName = UtilMap.getString(data, "creatorName");
+        String receivers = UtilMap.getString(data, "receivers");
+        String receiverNames = UtilMap.getString(data, "receiverNames");
+        String keywords = UtilMap.getString(data, "keywords");
+
+        syncXyTodo(DD_category.get(0), optType, busNo, title, currentStatus, pcUrl, appUrl, createDateTime,creator , creatorName,receivers, receiverNames, Arrays.asList(keywords));
+
+        // Todo 查询宜搭审批记录, 完成回调, 完成更新
+
+        return McR.success();
+    }
+
+}
+
+

+ 30 - 0
mjava-suodisi/src/main/java/com/malk/suodisi/server/XYR.java

@@ -0,0 +1,30 @@
+package com.malk.suodisi.server;
+
+import com.malk.server.common.McException;
+import com.malk.server.common.VenR;
+import lombok.Data;
+
+/**
+ * 返回数据_阿里云
+ */
+@Data
+public class XYR<T> extends VenR {
+
+    private boolean result;
+
+    private String code;
+
+    private String message;
+
+    private String description;
+
+    private T data;
+
+    /**
+     * 断言错误信息
+     */
+    @Override
+    public void assertSuccess() {
+        McException.assertException(!result, code, message + " >>> " + description, "象屿统一待办");
+    }
+}

+ 27 - 8
mjava-suodisi/src/main/resources/application-dev.yml

@@ -2,7 +2,7 @@
 server:
   port: 9001
   servlet:
-    context-path: /api/suodisi
+    context-path: /api
 
 # condition
 spel:
@@ -37,15 +37,34 @@ logging:
   file:
     path: /Users/malk/server/_Tool/var/mjava/log
 
+## 索迪斯
+
+## dingtalk
+#dingtalk:
+#  agentId: 1963716187
+#  appKey: ding8qyulwwmad6j7k6c
+#  appSecret: e_hRHuubw-Xi0OuPJOYdXSElVzOC0IPgMrHQTBuAM9BqW-DFnrcsSyBHi7Me3xSv
+#  corpId: ding321c72787fffc78b35c2f4657eb6378f
+#  aesKey:
+#  token:
+#  operator: "095358016629044412"   # 牧语[开头需要转一下字符串], OA管理员账号
+#
+## aliwork
+#aliwork:
+#  appType: APP_YH7W0E5637YUBU5UJ837
+#  systemToken: IC766WA11EW8BMOPBEZZMBA4MPUQ214JDL7FLC9
+
+
+## 厦门象屿 - 股份门户
 # dingtalk
 dingtalk:
-  agentId: 1963716187
-  appKey: ding8qyulwwmad6j7k6c
-  appSecret: e_hRHuubw-Xi0OuPJOYdXSElVzOC0IPgMrHQTBuAM9BqW-DFnrcsSyBHi7Me3xSv
-  corpId: ding321c72787fffc78b35c2f4657eb6378f
-  aesKey:
-  token:
-  operator: "095358016629044412"   # 牧语[开头需要转一下字符串], OA管理员账号
+  agentId: 4091040619
+  appKey: ding7mjaj6fjhuzyij8k
+  appSecret: j9L0F3yzN4gpdMDpuCxW0dVSOwFHEfmrPUMtNXFu5IWvQDu0qGdfZ9-R3SO_LBa5
+  corpId: dingb68b6b0ff271114ff2c783f7214b6d69
+  aesKey: n7HjQmK8EKFWgEZyU13FQtbIeFcKueRsh82DhaMWvmu
+  token: JjrmLlIUrBCBFhGEnX3xaK7vXobGwd
+  operator: ""   # 林壹[开头需要转一下字符串], OA管理员账号
 
 # aliwork
 aliwork:

BIN
mjava-suodisi/src/main/resources/templates/HL2025 invoice list.xls


+ 1 - 1
mjava/src/main/java/com/malk/utils/UtilExcel.java

@@ -237,7 +237,7 @@ public class UtilExcel {
         InputStream inputStream = UtilFile.readPackageResource("templates/" + templateName);
         UtilExcel.setResponseHeader(response, fileName, ".xlsx");
         ExcelWriter workBook = EasyExcel.write(response.getOutputStream(), dtoClass).withTemplate(inputStream).build();
-        WriteSheet sheet = EasyExcel.writerSheet().build();
+        WriteSheet sheet = EasyExcel.writerSheet("HL2025001").build();
         // 先单组数据填充,再多组数据填充
         workBook.fill(dataMain, sheet);
         workBook.fill(dataList, sheet);