pruple_boy 2 gadi atpakaļ
vecāks
revīzija
1f8a2ec95e
22 mainītis faili ar 248 papildinājumiem un 169 dzēšanām
  1. 0 2
      mjava-shanghaishiwei/src/main/java/com/malk/shanghaishiwei/controller/SHHWController.java
  2. 5 1
      mjava-shanghaishiwei/src/main/java/com/malk/shanghaishiwei/server/HTR.java
  3. 6 1
      mjava-shanghaishiwei/src/main/java/com/malk/shanghaishiwei/service/impl/HTImplService.java
  4. 10 0
      mjava-shanghaishiwei/src/main/resources/application-prod.yml
  5. 10 0
      mjava-shanghaishiwei/target/classes/application-prod.yml
  6. 17 2
      mjava-xiding/src/main/java/com/malk/xiding/controller/GSController.java
  7. 39 26
      mjava-xiding/src/main/java/com/malk/xiding/controller/XDController.java
  8. 12 14
      mjava-xiding/src/main/java/com/malk/xiding/schedule/XDScheduleTask.java
  9. 32 7
      mjava-xiding/src/main/java/com/malk/xiding/service/impl/GSImplClient.java
  10. 12 2
      mjava-xiding/src/main/java/com/malk/xiding/service/impl/XDImplService.java
  11. 1 2
      mjava-xiding/src/main/resources/application-prod.yml
  12. 1 2
      mjava-xiding/target/classes/application-prod.yml
  13. BIN
      mjava-xiding/target/mjava-xiding.jar.original
  14. 12 17
      mjava-xintianlong/src/main/java/com/malk/xintianlong/controller/HSController.java
  15. 11 0
      mjava-xintianlong/src/main/resources/application-prod.yml
  16. 11 0
      mjava-xintianlong/target/classes/application-prod.yml
  17. 62 0
      mjava-xintianlong/target/generated-sources/java/com/malk/xintianlong/repository/entity/primary/QHSApproveRecordPo.java
  18. 1 1
      mjava/src/main/java/com/malk/service/aliwork/YDService.java
  19. 2 2
      mjava/src/main/java/com/malk/service/aliwork/impl/YDServiceImpl.java
  20. 1 0
      mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient_Workflow.java
  21. 3 0
      mjava/src/main/java/com/malk/service/h3yun/impl/CYImplClient.java
  22. 0 90
      mjava/target/classes/META-INF/spring-configuration-metadata.json

+ 0 - 2
mjava-shanghaishiwei/src/main/java/com/malk/shanghaishiwei/controller/SHHWController.java

@@ -55,8 +55,6 @@ public class SHHWController {
                 McException.exceptionAccess("code 不合法");
                 break;
         }
-
-
         return McR.success();
     }
 

+ 5 - 1
mjava-shanghaishiwei/src/main/java/com/malk/shanghaishiwei/server/HTR.java

@@ -7,6 +7,7 @@ import com.malk.server.common.VenR;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.Arrays;
 import java.util.Map;
 
 /**
@@ -29,7 +30,10 @@ public class HTR extends VenR {
      */
     @Override
     public void assertSuccess() {
-        McException.assertException(ObjectUtil.isNotNull(errorCode) || !isSuccess, errorCode, errorMessage, "SHHT");
+        // prd 合同接口分为3次推送, 先推送合同, 再推送条款, 最后推送附件, 未避免其他报错导致合同重新推送报错因此过滤
+        if (!Arrays.asList("合同编号不能重复", "该日期已存在相同的条款").contains(errorMessage)) {
+            McException.assertException(ObjectUtil.isNotNull(errorCode) || !isSuccess, errorCode, errorMessage, "SHHT");
+        }
     }
 
     /**

+ 6 - 1
mjava-shanghaishiwei/src/main/java/com/malk/shanghaishiwei/service/impl/HTImplService.java

@@ -2,6 +2,7 @@ package com.malk.shanghaishiwei.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.malk.Util.UtilDateTime;
 import com.malk.Util.UtilFile;
 import com.malk.Util.UtilMap;
 import com.malk.Util.UtilString;
@@ -17,6 +18,7 @@ import org.springframework.stereotype.Service;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -71,16 +73,19 @@ public class HTImplService implements HTService {
             return "";
         }
         List<String> fileNames = new ArrayList<>();
+        // prd: 合同接口文件名称不能重复, 添加创建时间标识, 兼容多个附件场景
+        int index = 1;
         for (Map attachment : attachments) {
             File file = cyClient.saveFromTemporaryUrl(ddClient.getAccessToken(), attachment);
             String fileName = UtilMap.getString(attachment, "FileName");
             String fileType = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
-            fileName = origionContractCode + "_" + fileName;
+            fileName = origionContractCode + "_" + UtilDateTime.format(new Date(), "yyyyMMddHHmmss") + "_" + index + "_" + fileName;
             Map body = UtilMap.map("origionContractCode, fileType, fileName", origionContractCode, fileType, fileName);
             body.put("contractType", 1); // 采购合同
             body.put("Scanning", UtilFile.fileConvertToByteArray(file));
             htClient.addAttachmentContract(body);
             fileNames.add(fileName); // 拼接与氚云记录, 服务删除逻辑
+            index++;
         }
         // 兼容后补盖章附件
         String updateNames = String.join("; ", fileNames);

+ 10 - 0
mjava-shanghaishiwei/src/main/resources/application-prod.yml

@@ -17,6 +17,16 @@ spring:
   jpa:
     database: MYSQL
     database-platformw: org.hibernate.dialect.MySQL57Dialect
+  # 数据库版本
+  flyway:
+    enabled: false                      #  需要配置 jpa.hibernate.ddl-auto 为 none. 否则 flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
+    encoding: UTF-8
+    locations: classpath:db/migration   # 迁移sql脚本文件存放路径,默认db/migration
+    sql-migration-prefix: V             # 迁移sql脚本文件名称的前缀,默认V
+    sql-migration-separator: __         # 迁移sql脚本文件名称的分隔符,默认2个下划线__
+    sql-migration-suffixes: .sql        # 迁移sql脚本文件名称的后缀
+    validate-on-migrate: true           # 迁移时是否进行校验,默认true
+    baseline-on-migrate: true           # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
 
 # dingtalk
 dingtalk:

+ 10 - 0
mjava-shanghaishiwei/target/classes/application-prod.yml

@@ -17,6 +17,16 @@ spring:
   jpa:
     database: MYSQL
     database-platformw: org.hibernate.dialect.MySQL57Dialect
+  # 数据库版本
+  flyway:
+    enabled: false                      #  需要配置 jpa.hibernate.ddl-auto 为 none. 否则 flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
+    encoding: UTF-8
+    locations: classpath:db/migration   # 迁移sql脚本文件存放路径,默认db/migration
+    sql-migration-prefix: V             # 迁移sql脚本文件名称的前缀,默认V
+    sql-migration-separator: __         # 迁移sql脚本文件名称的分隔符,默认2个下划线__
+    sql-migration-suffixes: .sql        # 迁移sql脚本文件名称的后缀
+    validate-on-migrate: true           # 迁移时是否进行校验,默认true
+    baseline-on-migrate: true           # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
 
 # dingtalk
 dingtalk:

+ 17 - 2
mjava-xiding/src/main/java/com/malk/xiding/controller/GSController.java

@@ -1,7 +1,11 @@
 package com.malk.xiding.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.malk.Util.UtilMap;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
 import com.malk.xiding.service.GSClient;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,10 +49,21 @@ public class GSController {
     }
 
 
+    @Autowired
+    private YDClient ydClient;
+
     @PostMapping("test")
     McR test() {
 
-        gsClient.exceptionMonthReport();
-        return McR.success();
+        // 不执行更新: 月度工时未全部确认
+        long count = ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-TD966Z81I9ODTCY66GH345S03VW03JJF6EQLL5")
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lm5n9tjp", "2023-11")))
+                .instanceStatus("RUNNING")
+                .build(), YDConf.FORM_QUERY.retrieve_search_process).getTotalCount();
+        if (count != 0) {
+            return null;
+        }
+        return McR.success(count);
     }
 }

+ 39 - 26
mjava-xiding/src/main/java/com/malk/xiding/controller/XDController.java

@@ -1,14 +1,13 @@
 package com.malk.xiding.controller;
 
+import com.malk.Util.UtilDateTime;
 import com.malk.server.common.McR;
 import com.malk.server.fxiaoke.FXKConf;
-import com.malk.service.dingtalk.DDClient;
-import com.malk.service.dingtalk.DDClient_Attendance;
-import com.malk.service.dingtalk.DDClient_Contacts;
-import com.malk.service.dingtalk.DDService;
+import com.malk.service.dingtalk.*;
 import com.malk.service.fxiaoke.FXKClient;
 import com.malk.xiding.repository.dao.XdDdApproveRecordDao2;
 import com.malk.xiding.repository.dao.XdDdFxkRelationDao;
+import com.malk.xiding.server.XDConf;
 import com.malk.xiding.service.XDService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,6 +16,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
 /**
  * 错误抛出与拦截详见CatchException
  */
@@ -51,28 +55,35 @@ public class XDController {
 
     @PostMapping("test3")
     McR test3(@RequestParam String name) {
-//        Date sTime = UtilDateTime.parseDateTime("2023-07-01" + " 00:00:00");
-//        Date eTime = UtilDateTime.parseDateTime("2023-05-31" + " 23:59:59");
 
-//        List<Map> records = fxkClient.getAttendance_All(fxkClient.getAccessToken(), fxkConf.getCorpId(), sTime.getTime(), eTime.getTime(), Arrays.asList(relationDao.findByName(name).getIdFxxk()));
-//        log.info("xxxx, {}", records.size());
-//
-//        Date tTime = UtilDateTime.parseDateTime("2023-05-04" + " 04:11:00");
-//
-//        // 时区测试 @Temporal & @JsonFormat
-//        Date check = UtilDateTime.parseDateTime(UtilDateTime.formatDate(new Date(tTime.getTime() - (tTime.getHours() + 1) * 60 * 60 * 1000)) + " 18:00:00");
-//        log.error("xxxx, {}", JSON.parseObject(JSON.toJSONString(records.get(0)), XdFxkDdAttendancePo.class));
-//
-//        log.info("xxxx, {}, {}", check, UtilDateTime.formatDateTime(new Date(tTime.getTime() - (tTime.getHours() + 1) * 60 * 60 * 1000)));
-//        return McR.success(JSON.parseArray(JSON.toJSONString(records), XdFxkDdAttendancePo.class));
-//        return McR.success(JSON.parseObject(JSON.toJSONString(records.get(0)), XdFxkDdAttendancePo.class));
+        Date sTime = UtilDateTime.parseDateTime("2023-11-27" + " 00:00:00");
+        Date eTime = UtilDateTime.parseDateTime("2023-11-27" + " 23:59:59");
 
-//        return McR.success(approveRecordDao2.findAllByEndTimeAfterAndTypeAndMarketing(sTime, "出差", true, PageRequest.of(0, Integer.MAX_VALUE)));
-        return McR.success();
+        //List<Map> records = fxkClient.getAttendance_All(fxkClient.getAccessToken(), fxkConf.getCorpId(), sTime.getTime(), eTime.getTime(), Arrays.asList(relationDao.findByName(name).getIdFxxk()));
+        List<Map> records = fxkClient.getAttendance_All(fxkClient.getAccessToken(), fxkConf.getCorpId(), sTime.getTime(), eTime.getTime(), Arrays.asList("FSUID_036E8023543AEF11F6991181FA3FCEA0"));
+        log.info("xxxx, {}", records.size());
+
+        return McR.success(records);
     }
 
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+
     @PostMapping("test1")
     McR test1() {
+
+        log.info("###### [XD]同步审批单开始 ######");
+        long endTime = new Date().getTime() - 0 * 24 * 60 * 60 * 1000L;
+        long startTime = endTime - 30 * 24 * 60 * 60 * 1000L;
+        xdService.syncApprove(startTime, endTime, XDConf.TMP_CODE_CC, "出差");
+//        xdService.syncApprove(startTime, endTime, XDConf.TMP_CODE_WC, "外出");
+
+//        log.info("同步{}审批单: {} ~ {}", XDConf.TMP_CODE_CC, new Date(startTime), new Date(endTime));
+//        // 同步审批通过审批单 & 人员信息 [差集]
+//        Map extInfo = UtilMap.map("statuses, userIds", Arrays.asList("COMPLETED"), Arrays.asList("170652273426439677"));
+//        List<String> dataList = ddClient_workflow.getInstanceIds_all(ddClient.getAccessToken(), XDConf.TMP_CODE_CC, startTime, endTime, extInfo);
+
+
 //        Date eTime = UtilDateTime.parseDateTime(UtilDateTime.formatDate(new Date()) + " 23:59:59");
 //        Date sTime = UtilDateTime.parseDateTime(UtilDateTime.formatDate(new Date()) + " 11:00:00");
 //
@@ -88,8 +99,9 @@ public class XDController {
 
     @PostMapping("test11")
     McR test() {
-//        long startTime = UtilDateTime.parseDateTime("2023-08-27" + " 00:00:00").getTime();
-//        long endTime = UtilDateTime.parseDateTime("2023-08-31" + " 23:59:59").getTime();
+
+//        long startTime = UtilDateTime.parseDateTime("2023-10-09" + " 00:00:00").getTime();
+//        long endTime = UtilDateTime.parseDateTime("2023-10-09" + " 23:59:00").getTime();
 ////        xdService.syncApprove(startTime, endTime, XDConf.TMP_CODE_CC, "出差");
 //        xdService.syncApprove(startTime, endTime, XDConf.TMP_CODE_WC, "外出");
         return McR.success();
@@ -97,10 +109,11 @@ public class XDController {
 
     @PostMapping("test2")
     McR test2() {
-//        Date sTime = UtilDateTime.parseDateTime("2023-08-04" + " 00:00:00");
-//        Date eTime = UtilDateTime.parseDateTime("2023-08-10" + " 23:59:59");
-//        xdService.syncAttendance(0, sTime, eTime);
-//        xdService.syncAttendanceForCC(0, sTime, eTime);
+        for (int i = 1; i <= 14; i++) {
+            Date sTime = UtilDateTime.parseDateTime("2024-01-" + i + " 00:00:00");
+            Date eTime = UtilDateTime.parseDateTime("2024-01-" + i + " 23:59:59");
+            xdService.syncAttendance(0, sTime, eTime);
+        }
         return McR.success();
     }
 

+ 12 - 14
mjava-xiding/src/main/java/com/malk/xiding/schedule/XDScheduleTask.java

@@ -35,9 +35,9 @@ public class XDScheduleTask {
 
     /**
      * [定时同步审批单]
-     * 每天8点, 15点: 流程搜索按照发起和结束时间, 兼容性同步15内审批单
+     * 每天同步[错开高峰]: 流程搜索按照发起和结束时间, 兼容性同步15内审批单
      */
-    @Scheduled(cron = "0 0 8,15 1/1 * ?")
+    @Scheduled(cron = "0 0 2,6,23 1/1 * ?")
     public void Time_Period_1() {
         try {
             log.info("###### [XD]同步审批单开始 ######");
@@ -69,9 +69,9 @@ public class XDScheduleTask {
     }
 
     /**
-     * prd [2023-07] 外出保留之前纷享销客同步机制, 出差18点同步, 自动上传
+     * prd [2023-07] 外出保留之前纷享销客同步机制, 出差18-22点同步, 自动上传
      */
-    @Scheduled(cron = "0 5 18 * * ?")
+    @Scheduled(cron = "0 5 18,20,22 * * ?")
     public void Time_Period_3() {
         log.info("###### [XD]出差同步考勤开始 ######");
         Date now = new Date();
@@ -109,9 +109,9 @@ public class XDScheduleTask {
     }
 
     /**
-     * 每月3号 9.30 推送月度工时确认审批
+     * 每月4号 9.30 推送月度工时确认审批
      */
-    @Scheduled(cron = "0 30 9 3 * ? ")
+    @Scheduled(cron = "0 30 9 4 * ? ")
     public void Time_Period_5() {
         try {
             gsClient.collectMonthReport();
@@ -128,9 +128,9 @@ public class XDScheduleTask {
     }
 
     /**
-     * 每月10~20 9.30 推送月度异常工时审批
+     * 每月10~31 9.30 推送月度异常工时审批
      */
-    @Scheduled(cron = "0 30 9 10-20 * ? ")
+    @Scheduled(cron = "0 30 9 10-31 * ? ")
     public void Time_Period_6() {
         String ymText = UtilDateTime.formatLocal(LocalDate.now().minusMonths(1L), "yyyy-MM");
         Map condition = UtilMap.map("textField_lnb18vw9", ymText);
@@ -142,18 +142,16 @@ public class XDScheduleTask {
                 if (!"是".equals(form.get("radioField_lnb18vwa")) || "是".equals(form.get("radioField_lnb18vwb"))) {
                     return null;
                 }
-                // 不执行更新: 月度工时未全部确认
+                boolean isOper = gsClient.exceptionMonthReport();
+
+                // 不执行更新: 月度工时未全部确认 [12.19 异常上报为增量, 当月度全部确认完毕停止任务]
                 long count = ydClient.queryData(YDParam.builder()
                         .formUuid("FORM-TD966Z81I9ODTCY66GH345S03VW03JJF6EQLL5")
                         .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lm5n9tjp", ymText)))
                         .instanceStatus("RUNNING")
                         .build(), YDConf.FORM_QUERY.retrieve_search_process).getTotalCount();
-                if (count != 0) {
-                    return null;
-                }
-                boolean isOper = gsClient.exceptionMonthReport();
                 // 薪资有导入记录, 执行更新状态
-                if (isOper) {
+                if (isOper && count == 0) {
                     return UtilMap.map("radioField_lnb18vwb", "是");
                 }
             }

+ 32 - 7
mjava-xiding/src/main/java/com/malk/xiding/service/impl/GSImplClient.java

@@ -43,7 +43,7 @@ public class GSImplClient implements GSClient {
         List<Map> dataList = ydService.queryAllFormData(YDParam.builder()
                 .formUuid("FORM-L8966281J9RDFKMOEEUDP92ITHFF3YL1JCULL0")
                 .searchFieldJson(JSON.toJSONString(UtilMap.map("dateField_llucjaqc", Arrays.asList(sStart, sEnd))))
-                .build())
+                .build(), false)
                 .stream().map(item -> (Map) item.get("formData")).collect(Collectors.toList());
         // 按照人员拼装数据, 人员ID唯一性过滤
         List<Map> formList = dataList.stream().filter(UtilMc.distinctByKey(item -> item.get("textField_lm4nch8r"))).collect(Collectors.toList());
@@ -96,7 +96,7 @@ public class GSImplClient implements GSClient {
         List<Map> dataList_xz = ydService.queryAllFormData(YDParam.builder()
                 .formUuid("FORM-3J866L81SSMDFKAGDVFJRDUK3TUW37K70MOLL9")
                 .searchFieldJson(JSON.toJSONString(UtilMap.map("dateField_lluli8zb", Arrays.asList(sStart, sEnd))))
-                .build())
+                .build(), false)
                 .stream().map(item -> (Map) item.get("formData")).collect(Collectors.toList());
         // 无固定ip, 轮询机制
         if (dataList_xz.size() == 0) {
@@ -106,9 +106,9 @@ public class GSImplClient implements GSClient {
         List<Map> dataList_hz = ydService.queryAllFormData(YDParam.builder()
                 .formUuid("FORM-TD966Z81I9ODTCY66GH345S03VW03JJF6EQLL5")
                 .searchFieldJson(JSON.toJSONString(UtilMap.map("dateField_llqe7fg9", Arrays.asList(sStart, sEnd))))
-                .build())
+                .build(), true)
                 .stream().map(item -> {
-                    item.putAll((Map) item.get("formData"));
+                    item.putAll((Map) item.get("data"));
                     return item; // 保留 formInstanceId
                 }).collect(Collectors.toList());
         for (Map data : dataList_xz) {
@@ -117,6 +117,10 @@ public class GSImplClient implements GSClient {
             Optional optional = dataList_hz.stream().filter(item -> userId.equals(item.get("textField_lm5pchfd"))).findAny();
             if (optional.isPresent()) {
                 Map form = (Map) optional.get();
+                // 未审批通过, 先过滤, 避免修改冲突 [拒绝已关闭]
+                if (!"agree".equals(form.get("approvedResult"))) {
+                    continue;
+                }
                 // 考勤工时不等于上报工时, 触发异常
                 if (attendanceHour != UtilMap.getFloat(form, "numberField_lm5pnmvg")) {
                     long total = ydClient.queryData(YDParam.builder()
@@ -129,11 +133,12 @@ public class GSImplClient implements GSClient {
                     }
                     Map formData = UtilMap.map("dateField_llu8im27, employeeField_llu8im2a, textField_llujr4wm, textField_llujr4wn, numberField_lm5qn2sf, textField_lm5n9tjp, textField_lm5pchfd, numberField_lm5ntjsu", "dateField_llqe7fg9, employeeField_llqe7fgd_id, textField_llugjn6g, textField_llugjn6i, numberField_lm5qn2sf, textField_lm5n9tjp, textField_lm5pchfd, numberField_lm5pnmvg", form);
                     formData.put("numberField_llu8im2e", attendanceHour);
+                    log.info("异常记录, {}", JSON.toJSONString(formData));
                     List<Map> details = (List<Map>) form.get("tableField_llqe7fgb");
                     if (details.size() == 50) {
                         details = ydService.queryDetails(YDParam.builder()
                                 .formUuid("FORM-TD966Z81I9ODTCY66GH345S03VW03JJF6EQLL5")
-                                .formInstanceId(form.get("formInstanceId").toString())
+                                .formInstanceId(form.get("processInstanceId").toString())
                                 .tableFieldId("tableField_llqe7fgb")
                                 .build());
                     }
@@ -148,6 +153,26 @@ public class GSImplClient implements GSClient {
                             .build();
                     ydClient.operateData(ydParam, YDConf.FORM_OPERATION.start);
                 }
+            } else {
+                String ymDate = UtilDateTime.format(new Date(UtilMap.getLong(data, "dateField_lluli8zb")), "yyyy-MM");
+                String tUserId = ((List<String>) data.get("employeeField_llpxvy5d_id")).get(0);
+                long total = ydClient.queryData(YDParam.builder()
+                        .formUuid("FORM-8Y866XB1G4NDRF8RCHWJRB5EQPI13TD3I8ULLT")
+                        .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lm5n9tjp, textField_lm5pchfd", ymDate, userId)))
+                        .build(), YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
+                // 重复发起过滤
+                if (total > 0) {
+                    continue;
+                }
+                // 若未填报工时 - 直接发起异常
+                Map formData = UtilMap.map("dateField_llu8im27, employeeField_llu8im2a, textField_llujr4wm, textField_llujr4wn, numberField_llu8im2e", "dateField_lluli8zb, employeeField_llpxvy5d_id, textField_llpxvy5k, textField_llpxvy5l, numberField_llpxvy5i", data);
+                formData.putAll(UtilMap.map("textField_lm5n9tjp, textField_lm5pchfd, numberField_lm5ntjsu", ymDate, tUserId, ""));
+                YDParam ydParam = YDParam.builder()
+                        .formUuid("FORM-8Y866XB1G4NDRF8RCHWJRB5EQPI13TD3I8ULLT")
+                        .processCode("TPROC--8Y866XB1G4NDRF8RCHWJRB5EQPI13UD3I8ULLU")
+                        .formDataJson(JSON.toJSONString(formData))
+                        .build();
+                ydClient.operateData(ydParam, YDConf.FORM_OPERATION.start);
             }
         }
         return true;
@@ -164,7 +189,7 @@ public class GSImplClient implements GSClient {
             List<Map> dataList = ydService.queryAllFormData(YDParam.builder()
                     .formUuid("FORM-L8966281J9RDFKMOEEUDP92ITHFF3YL1JCULL0")
                     .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lm4nch8r, textField_lm7cfak9", userId, date)))
-                    .build())
+                    .build(), false)
                     .stream().map(item -> (Map) item.get("formData")).collect(Collectors.toList());
             if (dataList.size() == 0) {
                 continue;
@@ -190,7 +215,7 @@ public class GSImplClient implements GSClient {
         List<Map> dataList = ydService.queryAllFormData(YDParam.builder()
                 .formUuid("FORM-IH966T61S6ND3ZHX6WEK2DFHHWLD3W44DMOLL0")
                 .searchFieldJson(JSON.toJSONString(conditions))
-                .build());
+                .build(), false);
         // 推送内容
         long timestamp = new Date().getTime();
         String type = isAdmin ? "异常完成提醒" : "工时填报提醒";

+ 12 - 2
mjava-xiding/src/main/java/com/malk/xiding/service/impl/XDImplService.java

@@ -79,6 +79,12 @@ public class XDImplService implements XDService {
         List<String> syncList = dataList.stream().filter(item -> !poList.contains(item)).collect(Collectors.toList());
         log.info("[{}] 实例列表, dataList = {}, poList = {}, syncList = {}", type, dataList.size(), poList.size(), syncList.size());
         syncList.forEach(instanceId -> {
+            // prd 1.23 避免限流, 已调整定时任务错峰执行
+            try {
+                Thread.sleep(400);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
             Map record = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), instanceId);
             if (!"agree".equals(record.get("result"))) {
                 return;
@@ -127,8 +133,12 @@ public class XDImplService implements XDService {
                 .build();
         // prd 2023-07 出差考勤同步仅适用于营销中心以及其子部门
         if (type.equals("出差")) {
-            // 离职人员同步已过滤
-            approveRecordPo.setMarketing(ddService.matchDepartment(ddClient.getAccessToken(), userId, Arrays.asList(37263540L)));
+            // 离职人员同步过滤
+            try {
+                approveRecordPo.setMarketing(ddService.matchDepartment(ddClient.getAccessToken(), userId, Arrays.asList(37263540L)));
+            } catch (McException e) {
+                log.error(e.getMessage(), e);  // 记录错误日志
+            }
         }
         ddApproveRecordDao.save(approveRecordPo);
         log.info("同步出差和人员信息, {}, {}", userPo, approveRecordPo);

+ 1 - 2
mjava-xiding/src/main/resources/application-prod.yml

@@ -1,6 +1,6 @@
 # 环境配置
 server:
-  port: 9001
+  port: 9001 #9014
 
 # condition
 spel:
@@ -28,7 +28,6 @@ spring:
     validate-on-migrate: true           # 迁移时是否进行校验,默认true
     baseline-on-migrate: true           # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
 
-
 # dingtalk
 dingtalk:
   agentId: 2572507894

+ 1 - 2
mjava-xiding/target/classes/application-prod.yml

@@ -1,6 +1,6 @@
 # 环境配置
 server:
-  port: 9001
+  port: 9001 #9014
 
 # condition
 spel:
@@ -28,7 +28,6 @@ spring:
     validate-on-migrate: true           # 迁移时是否进行校验,默认true
     baseline-on-migrate: true           # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
 
-
 # dingtalk
 dingtalk:
   agentId: 2572507894

BIN
mjava-xiding/target/mjava-xiding.jar.original


+ 12 - 17
mjava-xintianlong/src/main/java/com/malk/xintianlong/controller/HSController.java

@@ -62,8 +62,8 @@ public class HSController {
 
         // 组件数据格式化
         data.put("corpTypeName", HSConf.SUB_CORP_DD.get(data.get("corpType")));
-        Map ruleForm = UtilMap.map("corpTypeName, orderCode, proposerDate, purchaseType, goods", "公司主体, 请购单号, 请购日期, 采购类型, 采购明细");
-        Map ruleDetail = UtilMap.map("name, size, num, remark, price", "物品名称, 规格, 数量, 备注, 单价");
+        Map ruleForm = UtilMap.map("corpTypeName, orderCode, proposerDate, purchaseType, department, goods", "公司主体, 请购单号, 请购日期, 采购类型, 申请部门, 采购明细");
+        Map ruleDetail = UtilMap.map("name, size, num, remark, price, price, supplier", "物品名称, 规格, 数量, 备注, 最近入库单价(元/吨), 采购单价(元/吨), 供应商");
 
         // 推送钉钉审批
         List<Map> formValues = DDFormComponentDto.formatComponentValues(data, ruleForm, ruleDetail);
@@ -156,7 +156,7 @@ public class HSController {
         // 推送钉钉审批
         Map ruleForm = UtilMap.map("corpTypeName, orderCode, proposerCodeDing, proposerDate, consignee, salesmanCodeDing, attachmentId, test", "公司主体, 指定书号, 制单人, 制单日期, 要货单位, 业务员, 附件, 单选框");
         List<Map> formValues = DDFormComponentDto.formatComponentValues(data, ruleForm, null);
-        String processInstanceId = ddClient_workflow.doProcessInstances(ddClient.getAccessToken(), userId, HSConf.PRODUCT_CODE_DD, formValues, UtilMap.map("dept_id", DDConf.TOP_DEPARTMENT));
+        String processInstanceId = ddClient_workflow.doProcessInstances(ddClient.getAccessToken(), userId, "PROC-BEA7B05C-1BFD-4194-A241-354611378D74", formValues, UtilMap.map("dept_id", DDConf.TOP_DEPARTMENT));
 
         // 保存推送记录
         HSApproveRecordPo po = JSON.parseObject(JSON.toJSONString(data), HSApproveRecordPo.class);
@@ -181,7 +181,6 @@ public class HSController {
         List<HSApproveRecordPo> list = hsApproveRecordDao.findAllByApproveResult("process");
         log.info("同步数量, {}", list.size());
         for (HSApproveRecordPo po : list) {
-            log.info("xxx, {}", po);
             Map rsp = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), po.getProcessInstanceId());
             if (Arrays.asList("RUNNING", "NEW").contains(rsp.get("status"))) {
                 continue;
@@ -193,7 +192,6 @@ public class HSController {
                 hsService.syncApproveResult2Hs(po.getProcessInstanceId(), "agree".equals(String.valueOf(rsp.get("result"))) ? "agree" : "refuse");
             }
         }
-
 //        log.info("申购单审批回调, {}", data);
 //        McException.assertParamException_Null(data, "processInstanceId", "approveResult");
 //        String processInstanceId = data.get("processInstanceId");
@@ -269,7 +267,6 @@ public class HSController {
         return McR.success(ddr_new);
     }
 
-
 //    @Qualifier("primaryHJDao")
 //    @Autowired
 //    private HSViewDao hsOrderPlanDao_HJ;
@@ -420,18 +417,16 @@ public class HSController {
     @PostMapping("test")
     McR test() {
 
-//        approveRecordDao.save(HSApproveRecordPo.builder()
-//                .corpType("01")
-//                .processInstanceId("test1")
-//                .formType("ts")
-//                .orderCode("xx")
-//                .approveResult("xx")
-//                .proposerCode("x")
-//                .build());
-
+        // 组件数据格式化
+        Map data = UtilMap.map("f1, f2", "test", 100);
+        data.put("row", Arrays.asList(UtilMap.map("r1, r2, r3, r4, r5", "row1", 100, 99, 1, 2), UtilMap.map("r1, r2, r3, r4, r5", "row2", 200, 101, 4, 5)));
 
-//        return McR.success(approveRecordDao.findAllByOrderCodeIn(Arrays.asList("2023-03-014")));
+        // 推送钉钉审批
+        Map ruleDetail = UtilMap.map("row", UtilMap.map("r1, r2, r3, r4, r5", "单行输入框, 数字输入框, 公式计算, 数字1, 数字2"));
+        Map ruleForm = UtilMap.map("f1, f2, row", "单行输入框, 数字输入框, 明细");
+        List<Map> formValues = DDFormComponentDto.formatComponentValues(data, ruleForm, ruleDetail);
+        String processInstanceId = ddClient_workflow.doProcessInstances(ddClient.getAccessToken(), "0953580166-275995889", "PROC-BEA7B05C-1BFD-4194-A241-354611378D74", formValues, UtilMap.map("dept_id", DDConf.TOP_DEPARTMENT));
 
-        return McR.success(ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), "wiwad6IWSgq1SiWQ2Nayhw06381687920077"));
+        return McR.success(processInstanceId);
     }
 }

+ 11 - 0
mjava-xintianlong/src/main/resources/application-prod.yml

@@ -19,6 +19,17 @@ spring:
   jpa:
     database: MYSQL
     database-platform: org.hibernate.dialect.MySQL57Dialect
+  # 数据库版本
+  flyway:
+    enabled: false                      #  需要配置 jpa.hibernate.ddl-auto 为 none. 否则 flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
+    encoding: UTF-8
+    locations: classpath:db/migration   # 迁移sql脚本文件存放路径,默认db/migration
+    sql-migration-prefix: V             # 迁移sql脚本文件名称的前缀,默认V
+    sql-migration-separator: __         # 迁移sql脚本文件名称的分隔符,默认2个下划线__
+    sql-migration-suffixes: .sql        # 迁移sql脚本文件名称的后缀
+    validate-on-migrate: true           # 迁移时是否进行校验,默认true
+    baseline-on-migrate: true           # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
+
   # sql_server
 #  datasource:
 #    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

+ 11 - 0
mjava-xintianlong/target/classes/application-prod.yml

@@ -19,6 +19,17 @@ spring:
   jpa:
     database: MYSQL
     database-platform: org.hibernate.dialect.MySQL57Dialect
+  # 数据库版本
+  flyway:
+    enabled: false                      #  需要配置 jpa.hibernate.ddl-auto 为 none. 否则 flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
+    encoding: UTF-8
+    locations: classpath:db/migration   # 迁移sql脚本文件存放路径,默认db/migration
+    sql-migration-prefix: V             # 迁移sql脚本文件名称的前缀,默认V
+    sql-migration-separator: __         # 迁移sql脚本文件名称的分隔符,默认2个下划线__
+    sql-migration-suffixes: .sql        # 迁移sql脚本文件名称的后缀
+    validate-on-migrate: true           # 迁移时是否进行校验,默认true
+    baseline-on-migrate: true           # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
+
   # sql_server
 #  datasource:
 #    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

+ 62 - 0
mjava-xintianlong/target/generated-sources/java/com/malk/xintianlong/repository/entity/primary/QHSApproveRecordPo.java

@@ -0,0 +1,62 @@
+package com.malk.xintianlong.repository.entity.primary;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QHSApproveRecordPo is a Querydsl query type for HSApproveRecordPo
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QHSApproveRecordPo extends EntityPathBase<HSApproveRecordPo> {
+
+    private static final long serialVersionUID = -856519298L;
+
+    public static final QHSApproveRecordPo hSApproveRecordPo = new QHSApproveRecordPo("hSApproveRecordPo");
+
+    public final com.malk.base.QBasePo _super = new com.malk.base.QBasePo(this);
+
+    public final StringPath approveResult = createString("approveResult");
+
+    public final StringPath corpType = createString("corpType");
+
+    //inherited
+    public final DateTimePath<java.util.Date> createTime = _super.createTime;
+
+    public final StringPath formType = createString("formType");
+
+    public final StringPath hsResponse = createString("hsResponse");
+
+    //inherited
+    public final NumberPath<Long> id = _super.id;
+
+    public final StringPath orderCode = createString("orderCode");
+
+    public final StringPath processInstanceId = createString("processInstanceId");
+
+    public final StringPath proposerCode = createString("proposerCode");
+
+    public final StringPath remark = createString("remark");
+
+    //inherited
+    public final DateTimePath<java.util.Date> updateTime = _super.updateTime;
+
+    public QHSApproveRecordPo(String variable) {
+        super(HSApproveRecordPo.class, forVariable(variable));
+    }
+
+    public QHSApproveRecordPo(Path<? extends HSApproveRecordPo> path) {
+        super(path.getType(), path.getMetadata());
+    }
+
+    public QHSApproveRecordPo(PathMetadata metadata) {
+        super(HSApproveRecordPo.class, metadata);
+    }
+
+}
+

+ 1 - 1
mjava/src/main/java/com/malk/service/aliwork/YDService.java

@@ -21,7 +21,7 @@ public interface YDService {
     /**
      * 查询全部 [主表]
      */
-    List<Map> queryAllFormData(YDParam YDParam);
+    List<Map> queryAllFormData(YDParam YDParam, boolean isProcess);
 
     /**
      * 全表复制 [镜像] todo, 明细超过20条未处理, 组件替换和忽略未处理

+ 2 - 2
mjava/src/main/java/com/malk/service/aliwork/impl/YDServiceImpl.java

@@ -59,7 +59,7 @@ public class YDServiceImpl implements YDService {
      * 查询全部 [主表]
      */
     @Override
-    public List<Map> queryAllFormData(YDParam ydParam) {
+    public List<Map> queryAllFormData(YDParam ydParam, boolean isProcess) {
         float pageSize = YDConf.PAGE_SIZE_LIMIT;
         // 查询数据量
         ydParam.setPageSize(1);
@@ -70,7 +70,7 @@ public class YDServiceImpl implements YDService {
         ydParam.setPageSize((int) pageSize);
         for (int page = 1; page <= Math.ceil(totalCount / pageSize); page++) {
             ydParam.setCurrentPage(page);
-            dataList.addAll((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData());
+            dataList.addAll((List<Map>) ydClient.queryData(ydParam, isProcess ? YDConf.FORM_QUERY.retrieve_search_process : YDConf.FORM_QUERY.retrieve_search_form).getData());
         }
         return dataList;
     }

+ 1 - 0
mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient_Workflow.java

@@ -49,6 +49,7 @@ public class DDImplClient_Workflow implements DDClient_Workflow {
      */
     @Override
     public Map getProcessInstanceId(String access_token, String processInstanceId) {
+
         Map header = DDConf.initTokenHeader(access_token);
         Map body = UtilMap.map("processInstanceId", processInstanceId);
         DDR_New ddr = DDR_New.doGet("https://api.dingtalk.com/v1.0/workflow/processInstances", header, body);

+ 3 - 0
mjava/src/main/java/com/malk/service/h3yun/impl/CYImplClient.java

@@ -39,6 +39,9 @@ public class CYImplClient implements CYClient {
     @Autowired
     private FilePath filePath;
 
+    /**
+     * 储存氚云附件到本地, 保留文件名称与格式
+     */
     @Override
     public File saveFromTemporaryUrl(String accessToken, Map attachment) {
         String fileUrl = getTemporaryUrls(accessToken, UtilMap.getString(attachment, "FileId"));

+ 0 - 90
mjava/target/classes/META-INF/spring-configuration-metadata.json

@@ -35,21 +35,6 @@
       "type": "com.malk.server.common.FilePath$Path",
       "sourceType": "com.malk.server.common.FilePath$Path"
     },
-    {
-      "name": "file.path",
-      "type": "com.malk.server.common.FilePath$Path",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.path",
-      "type": "com.malk.server.common.FilePath$Path",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.path",
-      "type": "com.malk.server.common.FilePath$Path",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
     {
       "name": "file.source",
       "type": "com.malk.server.common.FilePath$Source",
@@ -60,21 +45,6 @@
       "type": "com.malk.server.common.FilePath$Source",
       "sourceType": "com.malk.server.common.FilePath$Source"
     },
-    {
-      "name": "file.source",
-      "type": "com.malk.server.common.FilePath$Source",
-      "sourceType": "com.malk.server.common.FilePath$Source"
-    },
-    {
-      "name": "file.source",
-      "type": "com.malk.server.common.FilePath$Source",
-      "sourceType": "com.malk.server.common.FilePath$Source"
-    },
-    {
-      "name": "file.source",
-      "type": "com.malk.server.common.FilePath$Source",
-      "sourceType": "com.malk.server.common.FilePath$Source"
-    },
     {
       "name": "fxiaoke",
       "type": "com.malk.server.fxiaoke.FXKConf",
@@ -199,36 +169,6 @@
       "type": "java.lang.String",
       "sourceType": "com.malk.server.common.FilePath$Path"
     },
-    {
-      "name": "file.path.file",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.path.file",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.path.file",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.path.image",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.path.image",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.path.image",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
     {
       "name": "file.path.image",
       "type": "java.lang.String",
@@ -239,36 +179,6 @@
       "type": "java.lang.String",
       "sourceType": "com.malk.server.common.FilePath$Path"
     },
-    {
-      "name": "file.path.tmp",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.path.tmp",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.path.tmp",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Path"
-    },
-    {
-      "name": "file.source.fonts",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Source"
-    },
-    {
-      "name": "file.source.fonts",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Source"
-    },
-    {
-      "name": "file.source.fonts",
-      "type": "java.lang.String",
-      "sourceType": "com.malk.server.common.FilePath$Source"
-    },
     {
       "name": "file.source.fonts",
       "type": "java.lang.String",