浏览代码

Merge remote-tracking branch 'origin/master'

“lqy 1 月之前
父节点
当前提交
63b6adfe4b
共有 50 个文件被更改,包括 4043 次插入79 次删除
  1. 2 2
      mjava-boyang/src/main/java/com/malk/boyang/controller/BoyangController.java
  2. 1 1
      mjava-boyang/src/main/java/com/malk/boyang/service/BoyangService.java
  3. 40 13
      mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java
  4. 1 1
      mjava-boyang/src/main/resources/application-dev.yml
  5. 1 1
      mjava-boyang/src/main/resources/application.yml
  6. 5 5
      mjava-boyang/src/test/java/com/malk/boyang/EqbTest.java
  7. 1 1
      mjava-demo/src/main/java/com/malk/xzkj/DemoApplication.java
  8. 2 2
      mjava-huagao/pom.xml
  9. 150 0
      mjava-huagao/src/main/java/com/malk/huagao/controller/HgEqbController.java
  10. 6 0
      mjava-huagao/src/main/java/com/malk/huagao/schedule/KdScheduleTask.java
  11. 1 1
      mjava-huagao/src/main/java/com/malk/huagao/schedule/ScheduleTask.java
  12. 12 0
      mjava-huagao/src/main/java/com/malk/huagao/service/EqbService.java
  13. 2 0
      mjava-huagao/src/main/java/com/malk/huagao/service/KdHuaGaoService.java
  14. 905 0
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/EqbServiceImpl.java
  15. 190 0
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdHuaGaoServiceImpl.java
  16. 39 1
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/McProjectServiceImpl.java
  17. 270 0
      mjava-huagao/src/main/java/com/malk/huagao/utils/HTTPHelper.java
  18. 7 0
      mjava-huagao/src/main/resources/application-dev.yml
  19. 6 0
      mjava-huagao/src/main/resources/application-prod.yml
  20. 72 0
      mjava-huagao/src/main/resources/application-prod2.yml
  21. 1397 0
      mjava-huagao/src/test/java/com/malk/huagao/EqbTest.java
  22. 5 0
      mjava-huagao/src/test/java/com/malk/huagao/KdTest.java
  23. 2 2
      mjava-huagao/src/test/java/com/malk/huagao/YyYdTest.java
  24. 5 2
      mjava-kabeiyi/src/main/java/com/malk/kabeiyi/controller/KabeiyiController.java
  25. 75 0
      mjava-lianan/pom.xml
  26. 61 0
      mjava-lianan/src/main/java/com/malk/lianan/AesUtil.java
  27. 17 0
      mjava-lianan/src/main/java/com/malk/lianan/LianAnApplication.java
  28. 127 0
      mjava-lianan/src/main/java/com/malk/lianan/RSASignatureUtil.java
  29. 6 0
      mjava-lianan/src/main/java/com/malk/lianan/RsaUtil.java
  30. 147 0
      mjava-lianan/src/main/java/com/malk/lianan/TestUtil.java
  31. 51 0
      mjava-lianan/src/main/java/com/malk/lianan/controller/LianAnBudgetController.java
  32. 27 0
      mjava-lianan/src/main/java/com/malk/lianan/controller/LianAnGyPayController.java
  33. 35 0
      mjava-lianan/src/main/resources/application-dev.yml
  34. 15 0
      mjava-lianan/src/main/resources/application.yml
  35. 16 0
      mjava-lianan/src/main/resources/cer/ICBC_CZY__SIGN_TEST.cer
  36. 61 0
      mjava-lianan/src/main/resources/logback-spring.xml
  37. 226 0
      mjava-lingmingguangzi/src/test/java/com/malk/lingmingguangzi/YdTest.java
  38. 8 0
      mjava-tonglibo/src/main/java/com/malk/tonglibo/controller/machineController.java
  39. 1 1
      mjava-xzkj/src/main/java/com/malk/xzkj/XzkjApplication.java
  40. 1 1
      mjava-xzkj/src/main/java/com/malk/xzkj/config/TXYConf.java
  41. 4 7
      mjava-xzkj/src/main/java/com/malk/xzkj/controller/IVController.java
  42. 1 1
      mjava-xzkj/src/main/java/com/malk/xzkj/model/McInvoiceDto.java
  43. 1 1
      mjava-xzkj/src/main/java/com/malk/xzkj/model/McInvoiceKind.java
  44. 1 1
      mjava-xzkj/src/main/java/com/malk/xzkj/service/IvYdService.java
  45. 1 1
      mjava-xzkj/src/main/java/com/malk/xzkj/service/TXYInvoice.java
  46. 2 2
      mjava-xzkj/src/main/java/com/malk/xzkj/service/impl/IvYdServiceImpl.java
  47. 3 3
      mjava-xzkj/src/main/java/com/malk/xzkj/service/impl/TXYImplInvoice.java
  48. 1 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/controller/ZwErpController.java
  49. 3 3
      mjava-zhiwei/src/main/java/com/malk/zhiwei/schedule/ScheduleTask.java
  50. 30 26
      mjava-zhiwei/src/main/java/com/malk/zhiwei/service/impl/ZwServiceImpl.java

+ 2 - 2
mjava-boyang/src/main/java/com/malk/boyang/controller/BoyangController.java

@@ -65,8 +65,8 @@ public class BoyangController {
             eventList.put(info, System.currentTimeMillis());
             //签署开始回写签署详情地址
             if ("SIGN_FLOW_START".equals(callBackDesc)) {
-                String signPreUrl = UtilMap.getString(callBackProcessVO, "signPreUrl");
-                boyangService.start(processInstanceId,signPreUrl);
+//                String signPreUrl = UtilMap.getString(callBackProcessVO, "signPreUrl");
+                boyangService.start(processInstanceId,signFlowId);
             }
             //签署完成回写审批单
             if ("SIGN_FLOW_FINISH".equals(callBackDesc)) {

+ 1 - 1
mjava-boyang/src/main/java/com/malk/boyang/service/BoyangService.java

@@ -13,5 +13,5 @@ public interface BoyangService {
 
     McR getOrganization(String name);
 
-    void start(String processInstanceId, String signPreUrl);
+    void start(String processInstanceId,String signFlowId);
 }

+ 40 - 13
mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java

@@ -11,10 +11,6 @@ import com.malk.service.dingtalk.*;
 import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.*;
-import okio.BufferedSink;
-import okio.Okio;
-import okio.Sink;
 import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.codec.digest.HmacAlgorithms;
 import org.apache.commons.codec.digest.HmacUtils;
@@ -27,7 +23,6 @@ import org.springframework.stereotype.Service;
 import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.text.MessageFormat;
 import java.util.*;
 
 @Slf4j
@@ -60,13 +55,28 @@ public class BoyangServiceImpl implements BoyangService {
     @Value("${dingtalk.parentDentryUuid}")
     private String parentDentryUuid;
 
-    //测试环境
+    /*//测试环境
     final static String projectId = "1000004";// 应用ID
     final static String secret = "96Uh7CR83NkN3TA6";// 应用密钥
     final static String businessTypeCode = "889726e889ab84fea3514748d6df565c";// 钉钉对接测试业务模板
     final static String organizationCode = "b60a9c18b8cc4ecc80e30f36b4267a68";// 宁波博洋家纺集团有限公司
     final static String host = "http://122.227.225.202:9011/";// 接口调用域名
     final static String intranet_host = "http://11.0.11.62/";// 接口调用域名(内网)
+    final static String signerUser = "wangze";// 签署人
+    final static String uploadFileUrlHost = "http://11.0.11.62:8199/";// 返回的上传文件url host*/
+
+    //正式环境
+    final static String projectId = "1000003";// 应用ID
+    final static String secret = "5V6xsY3q8JWZ9Qik";// 应用密钥
+    final static String businessTypeCode = "f5e84fdb04ef4ead57f37e2a60729066";// 钉钉OA对接业务模板
+    final static String organizationCode = "0c8dd6496e7f4d228ec033aeef95a526";// 宁波博洋家纺集团有限公司
+    final static String host = "https://dzqz.beyond-it-service.com/";// 接口调用域名
+    final static String intranet_host = "http://11.0.11.82/";// 接口调用域名(内网)
+    final static String signerUser = "22060093";// 签署人
+    final static String uploadFileUrlHost = "http://11.0.11.82:8199/";// 返回的上传文件url host
+
+
+
 
     @Override
     public McR eSignSubmit(Map map) {
@@ -263,7 +273,7 @@ public class BoyangServiceImpl implements BoyangService {
         for (int i = 0; i < companyList.size(); i++) {
             Map<String, Object> signer = new HashMap<>();
             signer.put("userType", "1");
-            signer.put("userCode", "wangze");
+            signer.put("userCode", signerUser);
             signer.put("organizationCode", UtilMap.getString(companyList.get(i),"key"));
             signer.put("signNode", 1);
             signer.put("signMode", "0");
@@ -316,7 +326,7 @@ public class BoyangServiceImpl implements BoyangService {
                 String signedFileName = fileName.substring(0, suffixIndex) + "(已签署)" + fileName.substring(suffixIndex);
 
                 //todo 1、评论签署后附件下载链接
-//                    comment(processInstanceId,userId,"接口测试 "+ fileName + "已签署,签署文件下载地址:" + signDownloadOuterUrl,null);
+//                    comment(processInstanceId,userId,"接口测试 "+ "已签署,签署文件下载地址:" + signDownloadOuterUrl,null);
 
 
 
@@ -326,7 +336,7 @@ public class BoyangServiceImpl implements BoyangService {
                 //todo 签署后文件上传到钉盘
                 Map dentry = uploadDdFile(spaceId, parentDentryUuid, downloadPath + signedFileName, operatorUnionId);
                 //todo 审批单添加评论
-                comment(processInstanceId,originatorUserId,"接口测试 "+ fileName + "已签署",Arrays.asList(dentry));
+                comment(processInstanceId,originatorUserId,fileName + "已签署",Arrays.asList(dentry));
             }
         } catch (Exception e) {
             throw new RuntimeException(e);
@@ -360,18 +370,26 @@ public class BoyangServiceImpl implements BoyangService {
             }
         }
 
+        //options按label排序
+        options.sort(Comparator.comparing(m -> UtilMap.getString(m, "label")));
+
         return McR.success(options);
     }
 
     @Override
-    public void start(String processInstanceId, String signPreUrl) {
+    public void start(String processInstanceId,String signFlowId) {
         try {
             Map result = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), processInstanceId);
             String originatorUserId = UtilMap.getString(result, "originatorUserId");
 
+            //获取签署地址列表
+            Map eqbData = (Map) eqbGet(host + "/esign-signs/v1/signFlow/signUrls?signFlowId=" + signFlowId);
+            Map signUrlInfo = ((List<Map>) UtilMap.getList(eqbData, "signUrlInfos")).get(0);
+
+            String signUrlShort = UtilMap.getString(signUrlInfo, "signUrlShort");
+
             //审批单添加评论
-            String signPreUrl2 = signPreUrl.replace(intranet_host, host);
-            comment(processInstanceId,originatorUserId,"签署预览地址:" + signPreUrl2,null);
+            comment(processInstanceId,originatorUserId,"签署地址:" + signUrlShort,null);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
@@ -556,7 +574,8 @@ public class BoyangServiceImpl implements BoyangService {
 
             String url = UtilMap.getString(data, "url");
 
-            url = url.replace("http://11.0.11.62:8199/",host);
+            url = url.replace(uploadFileUrlHost,host);
+
 
             //2、上传文件到指定链接
             Map<String,Object> body = new HashMap<>();
@@ -606,7 +625,9 @@ public class BoyangServiceImpl implements BoyangService {
             header.put("Content-Type", contentType);
 
             // 发送GET请求
+            log.info("eqb请求入参,url:{},header:{}",url,header);
             String resultStr = HTTPHelper.sendGet(url, header, "UTF-8");
+            log.info("eqb请求响应:{}",resultStr);
             Map result = (Map) JSONObject.parse(resultStr);
 
             isSuccess(result);
@@ -637,8 +658,12 @@ public class BoyangServiceImpl implements BoyangService {
             header.put("Accept", "*/*");
             header.put("Content-Type", "application/json; charset=UTF-8");
 
+            log.info("eqb请求入参,url:{},reqBodyData:{},header:{}",url,reqBodyData,header);
+
             String resultStr = HTTPHelper.sendPOST(url, reqBodyData, header, "UTF-8");
 
+            log.info("eqb请求响应:{}",resultStr);
+
             Map result = (Map) JSONObject.parse(resultStr);
 
             isSuccess(result);
@@ -662,7 +687,9 @@ public class BoyangServiceImpl implements BoyangService {
             header.put("X-timevale-signature", reqSignature);
             header.put("Accept", "*/*");
 
+            log.info("eqb请求入参,url:{},filePath:{},body:{},header:{}",url,filePath,body,header);
             String resultStr = HTTPHelper.uploadFile(url,  "file", filePath, body,  header, "UTF-8");
+            log.info("eqb请求响应:{}",resultStr);
 
             Map result = (Map) JSONObject.parse(resultStr);
 

+ 1 - 1
mjava-boyang/src/main/resources/application-dev.yml

@@ -21,7 +21,7 @@ dingtalk:
   token:
   operator: "065965353428672133" #潘麒卿
   operatorUnionId: AfZv5MOJ80W2STOhUbbOcAiEiE #潘麒卿
-  downloadPath: d:\\
+  downloadPath: C:\\Users\\EDY\\Desktop\\项目\\博洋家纺\\files\\
   spaceId: 27829762189 #钉盘-e签宝
   parentDentryUuid: y20BglGWO23pGpLOsaALnnz98A7depqY #钉盘-e签宝-签署后文件
 

+ 1 - 1
mjava-boyang/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: dev
+    active: prod
   servlet:
     multipart:
       max-file-size: 100MB

+ 5 - 5
mjava-boyang/src/test/java/com/malk/boyang/EqbTest.java

@@ -39,26 +39,26 @@ public class EqbTest {
 
     //测试环境
     // 应用ID
-    final static String projectId = "1000004";
+    /*final static String projectId = "1000004";
     // 应用密钥
     final static String secret = "96Uh7CR83NkN3TA6";
     // 接口调用域名
-    final static String host = "http://122.227.225.202:9011/";
+    final static String host = "http://122.227.225.202:9011/";*/
 
     //===============================================================================================
 
     //正式环境
-    /*// 应用ID
+    // 应用ID
     final static String projectId = "1000003";
     // 应用密钥
     final static String secret = "5V6xsY3q8JWZ9Qik";
     // 接口调用域名
-    final static String host = "https://dzqz.beyond-it-service.com/";*/
+    final static String host = "https://dzqz.beyond-it-service.com/";
 
 
     /*public static void main(String[] args) {
         // 请求签名鉴权-POST请求
-        testPost(projectId, secret, host);
+//        testPost(projectId, secret, host);
 
         // 请求签名鉴权-GET请求
 //        testGet(projectId, secret, host);

+ 1 - 1
mjava-demo/src/main/java/com/malk/xzkj/DemoApplication.java

@@ -1,4 +1,4 @@
-package com.malk.xzkj;
+package com.malk.lianan;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;

+ 2 - 2
mjava-huagao/pom.xml

@@ -7,7 +7,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.2.0.RELEASE</version> <!-- 使用最新的稳定版或其他适用版本 -->
+        <version>2.7.18</version> <!-- 使用最新的稳定版或其他适用版本 -->
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
 
@@ -67,7 +67,7 @@
         <dependency>
             <groupId>com.malk</groupId>
             <artifactId>base</artifactId>
-            <version>1.1-SNAPSHOT</version>
+            <version>1.3</version>
             <scope>compile</scope>
         </dependency>
         <dependency>

+ 150 - 0
mjava-huagao/src/main/java/com/malk/huagao/controller/HgEqbController.java

@@ -0,0 +1,150 @@
+package com.malk.huagao.controller;
+
+import org.springframework.core.io.UrlResource;
+import org.springframework.core.io.Resource;
+import com.alibaba.fastjson.JSON;
+import com.malk.huagao.service.EqbService;
+import com.malk.server.common.McR;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@RestController
+@RequestMapping("/eqb")
+public class HgEqbController {
+    @Autowired
+    private EqbService eqbService;
+
+    @Value(value = "${eqb.downloadFilePath}")
+    private String fileStoragePath;
+
+
+    @PostMapping("/sign")
+    public McR sign(@RequestBody Map map){
+        return eqbService.sign(map);
+    }
+
+    // 使用ConcurrentHashMap保证线程安全
+    private final ConcurrentMap<String, Long> eventList = new ConcurrentHashMap<>();
+    // 记录最后一次清理时间
+    private volatile long lastCleanTime = System.currentTimeMillis();
+    // 清理间隔时间(毫秒)
+    private static final long CLEAN_INTERVAL = 60_000;
+
+
+    @PostMapping("/callback")
+    public McR callback(@RequestBody Map map){
+        System.out.println(map);
+
+        log.info("e签宝回调: {}", JSON.toJSONString(map));
+
+        //签署回调通知:SIGN_MISSON_COMPLETE   事件订阅-签署流程完成:SIGN_FLOW_FINISH
+        String action = UtilMap.getString(map, "action");
+        String signFlowId = UtilMap.getString(map, "signFlowId");//e签宝签署流程id
+
+        String info = action + "-" + signFlowId;
+
+        // 定期清理过期记录
+        cleanExpiredEvents();
+
+        if (isCallbackProcessed(info)){
+            log.info("info:{},重复回调,不做处理",info);
+        }else {
+            eventList.put(info, System.currentTimeMillis());
+            //签署回调结束
+            if ("SIGN_MISSON_COMPLETE".equals(action)) {
+                int signResult = UtilMap.getInt(map, "signResult");//2 - 签署完成,4 - 拒签
+                if (2 == signResult) {
+                    String processInstanceId = UtilMap.getString(map, "customBizNum");//宜搭审批实例id
+                    //自动同意审批节点
+                    eqbService.autoAgree(signFlowId,processInstanceId);
+                }
+            }
+        }
+
+        return McR.success();
+    }
+
+    @GetMapping("/files/{fileId}")
+    public ResponseEntity<Resource> getFileResource(
+            @PathVariable String fileId,
+            @RequestParam(defaultValue = "download") String option) throws IOException {
+
+        // 根据fileId获取实际文件路径,这里简化处理,实际可能需要从数据库查询
+        Path filePath = Paths.get(fileStoragePath).resolve(fileId).normalize();
+
+        // 检查文件是否存在
+        if (!Files.exists(filePath)) {
+            return ResponseEntity.notFound().build();
+        }
+
+        // 创建Resource对象
+        Resource resource =  new UrlResource(filePath.toUri());
+
+        // 根据选项设置响应头
+        HttpHeaders headers = new HttpHeaders();
+        if ("preview".equalsIgnoreCase(option)) {
+            // 预览模式 - 尝试确定内容类型
+            String contentType = Files.probeContentType(filePath);
+            // 强制修正 PDF 的 Content-Type
+            if (filePath.toString().toLowerCase().endsWith(".pdf")) {
+                contentType = "application/pdf";
+            } else if (contentType == null) {
+                contentType = "application/octet-stream";
+            }
+            headers.setContentType(MediaType.parseMediaType(contentType));
+            headers.add("Content-Disposition", "inline; filename=\"" + resource.getFilename() + "\"");
+            headers.add("X-Content-Type-Options", "nosniff"); // 防止浏览器忽略 Content-Type
+        } else {
+            // 下载模式 - 默认处理
+            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+            headers.add("Content-Disposition", "attachment; filename=\"" + resource.getFilename() + "\"");
+        }
+
+        return ResponseEntity.ok()
+                .headers(headers)
+                .contentLength(resource.contentLength())
+                .body(resource);
+    }
+
+    /**
+     * 检查并清理过期事件
+     */
+    private void cleanExpiredEvents() {
+        long currentTime = System.currentTimeMillis();
+        // 只在达到清理间隔时执行清理
+        if (currentTime - lastCleanTime > CLEAN_INTERVAL) {
+            synchronized (this) {
+                // 双重检查,避免重复清理
+                if (currentTime - lastCleanTime > CLEAN_INTERVAL) {
+                    long expirationTime = currentTime - TimeUnit.MINUTES.toMillis(1);
+                    eventList.entrySet().removeIf(entry -> entry.getValue() < expirationTime);
+                    lastCleanTime = currentTime;
+                }
+            }
+        }
+    }
+
+    /**
+     * 检查该回调事件在一分钟内是否处理过
+     */
+    private boolean isCallbackProcessed(String detail) {
+        return eventList.containsKey(detail);
+    }
+
+}

+ 6 - 0
mjava-huagao/src/main/java/com/malk/huagao/schedule/KdScheduleTask.java

@@ -48,4 +48,10 @@ public class KdScheduleTask {
     public void syncDLVNotice(){
         kdHuaGaoService.syncDLVNotice(null);
     }
+
+    //每天00:02定时同步采购订单
+    @Scheduled(cron = "0 2 0 * * ?")
+    public void syncPUROrder(){
+        kdHuaGaoService.syncPUROrder();
+    }
 }

+ 1 - 1
mjava-huagao/src/main/java/com/malk/huagao/schedule/ScheduleTask.java

@@ -44,7 +44,7 @@ public class ScheduleTask {
     /**
      *
      */
-//    @Scheduled(cron = "0 5 2 1 * ?")
+    @Scheduled(cron = "0 5 2 1 * ?")
     public void syncMonths() {
         log.info("考勤同步-月度");
         LocalDateTime startTime = LocalDate.now().minusMonths(1).atTime(LocalTime.MIN);

+ 12 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/EqbService.java

@@ -0,0 +1,12 @@
+package com.malk.huagao.service;
+
+import com.malk.server.common.McR;
+
+import java.util.Map;
+
+public interface EqbService {
+
+    void autoAgree(String signFlowId,String processInstanceId);
+
+    McR sign(Map map);
+}

+ 2 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/KdHuaGaoService.java

@@ -12,4 +12,6 @@ public interface KdHuaGaoService {
     void syncPendingProducts();
 
     void syncDLVNotice(String userId);
+
+    void syncPUROrder();
 }

+ 905 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/impl/EqbServiceImpl.java

@@ -0,0 +1,905 @@
+package com.malk.huagao.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.huagao.service.EqbService;
+import com.malk.huagao.utils.HTTPHelper;
+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.service.dingtalk.DDClient;
+import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilMap;
+import org.apache.commons.codec.binary.Base64;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Service
+public class EqbServiceImpl implements EqbService {
+    @Autowired
+    private YDConf ydConf;
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private DDClient ddClient;
+
+    // 应用ID
+    final static String appId = "5112033166";
+    // 应用密钥(AppSecret)
+    final static String appKey = "c0641a1f648a68a7014be5a490f0159a";
+    // e签宝接口调用域名(正式环境)
+    final static String host = "https://openapi.esign.cn";
+
+    //正式环境模板id 经销商模板
+    final static String jxs_templateId = "6a23f76742d74b858cdc2259a5d5c32f";
+    //正式环境模板id 其他客户模板
+    final static String qtkh_templateId = "8b7fef2257bc4093ada330dbf7c874c5";
+    //正式环境模板id 采购订单模板
+    final static String cgdd_templateId = "a0827f8946994ebfbed7f44e6b8a6ed8";
+
+    @Value(value = "${eqb.downloadFilePath}")
+    private String downloadFilePath;
+
+    @Value(value = "${server.host}")
+    private String serverHost;
+
+    @Value(value = "${eqb.signatoryPsnId}")
+    private String signatoryPsnId;
+
+    @Value(value = "${dingtalk.atUserId}")
+    private String atUserId;
+
+
+
+    @Async
+    @Override
+    public void autoAgree(String signFlowId,String processInstanceId) {
+        MDC.put("MDC_KEY_PID","1003");
+
+        //1、签署后文件回写宜搭
+        Map fileInfo = downloadSignedFile(signFlowId);
+        String fileId = UtilMap.getString(fileInfo, "fileId");
+        String fileName = UtilMap.getString(fileInfo, "fileName");
+
+        String downloadUrl = serverHost + "/huagao/eqb/files/" + fileId + ".pdf?option=download";
+        String previewUrl = serverHost + "/huagao/eqb/files/" + fileId + ".pdf?option=preview";
+
+        //更新宜搭实例签署后文件
+        Map formData = new HashMap();
+        Map file = new HashMap();
+        file.put("downloadUrl",downloadUrl);
+        file.put("name",fileName);
+        file.put("previewUrl",previewUrl);
+        file.put("url",downloadUrl);
+        file.put("ext","pdf");
+
+        formData.put("attachmentField_mj8dt3g2",Arrays.asList(file));
+
+        ydClient.operateData(YDParam.builder()
+                .updateFormDataJson(JSONObject.toJSONString(formData))
+                .formInstanceId(processInstanceId)
+                .build(), YDConf.FORM_OPERATION.update);
+
+        //2、自动同意宜搭审批节点
+        String activityId = "node_ockpz6phx73";//审批节点id【e签宝签署(系统节点,禁止删除!)】
+        long taskId = 0;
+        String userId = "";//审批人id
+
+        //获取审批记录
+        List<Map> result = (List<Map>) ydClient.queryData(YDParam.builder()
+                .processInstanceId(processInstanceId)
+                .build(), YDConf.FORM_QUERY.retrieve_approval_record).getResult();
+        for (Map approveInfo : result) {
+            if (activityId.equals(UtilMap.getString(approveInfo, "activityId"))){
+                //获取taskId
+                taskId = UtilMap.getLong(approveInfo, "taskId");
+                userId = UtilMap.getString(approveInfo, "operatorUserId");
+                break;
+            }
+        }
+
+        //审批
+        Map body = new HashMap();
+        body.put("outResult","AGREE");//AGREE:同意 DISAGREE:拒绝。
+        body.put("appType",ydConf.getAppType());
+        body.put("systemToken",ydConf.getSystemToken());
+        body.put("remark","e签宝签署完成,自动通过");//审批意见
+        body.put("processInstanceId",processInstanceId);//审批实例id
+        body.put("userId",userId);//用户userid
+        body.put("taskId",taskId);//任务id
+
+        UtilHttp.doPost("https://api.dingtalk.com/v1.0/yida/tasks/execute", ddClient.initTokenHeader(), null,body);
+    }
+
+    @Override
+    public McR sign(Map map) {
+        MDC.put("MDC_KEY_PID","1003");
+        //1、查询宜搭实例详情
+        String formInstId = UtilMap.getString(map, "formInstId");
+
+        Map formData = ydClient.queryData(YDParam.builder()
+                .formInstanceId(formInstId)
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        String type = UtilMap.getString(formData, "selectField_mj89qndi");//用印文件类型
+
+        String fileName = UtilMap.getString(formData, "textField_meqr38kq");//用印文件名称
+
+        JSONObject reqBodyObj = new JSONObject();
+
+        List<Map> components = new ArrayList<>();
+
+
+        switch (type){
+            case "销售合同-经销商":
+                getJxsObj(formData, components, reqBodyObj, fileName);
+                break;
+            case "销售合同-其他客户":
+                getQtkhObj(formData,components,reqBodyObj,fileName);
+                break;
+            case "采购订单":
+                getCgddObj(formData,components,reqBodyObj,fileName);
+                break;
+            default:break;
+        }
+
+        //2、填充模板生成文件
+        Map result = eqbPost("/v3/files/create-by-doc-template", reqBodyObj);
+
+        String fileId = UtilMap.getString(result,"fileId");
+
+        //文档转换pdf需时间
+        try {
+            Thread.sleep(3000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+
+        //3、基于文件发起签署
+        JSONObject reqBodyObj2 = new JSONObject();
+        //设置待签署文件信息
+        Map docs = new HashMap();
+        docs.put("fileId", fileId);
+        reqBodyObj2.put("docs", Arrays.asList(docs));
+
+        //签署流程配置项
+        Map signFlowConfig = new HashMap();
+        signFlowConfig.put("signFlowTitle",fileName);
+        signFlowConfig.put("autoFinish",true);
+        signFlowConfig.put("notifyUrl",serverHost + "/huagao/eqb/callback");//回调地址
+        reqBodyObj2.put("signFlowConfig",signFlowConfig);
+
+        //签署方信息
+        Map signer = new HashMap();
+        signer.put("signerType",1);//签署方类型,0 - 个人,1 - 企业/机构,2 - 法定代表人,3 - 经办人
+
+        Map orgSignerInfo = new HashMap();
+        orgSignerInfo.put("orgId","a5ec8fb7d8cc4276bd486824df0ec640");//华高机构id
+        //企业/机构经办人信息
+        Map transactorInfo = new HashMap();
+        transactorInfo.put("psnId",signatoryPsnId);//陈伟东
+        orgSignerInfo.put("transactorInfo",transactorInfo);
+        signer.put("orgSignerInfo",orgSignerInfo);
+
+        /*Map psnSignerInfo = new HashMap();
+        psnSignerInfo.put("psnId",signatoryPsnId);//陈伟东
+        signer.put("psnSignerInfo",psnSignerInfo);*/
+
+        Map signField = new HashMap();
+        signField.put("fileId",fileId);
+        signField.put("customBizNum",formInstId);
+        Map normalSignFieldConfig = new HashMap();
+        normalSignFieldConfig.put("freeMode",true);
+            /*normalSignFieldConfig.put("autoSign",true);
+            normalSignFieldConfig.put("signFieldStyle",1);
+            Map signFieldPosition = new HashMap();
+            signFieldPosition.put("positionPage",1);
+            normalSignFieldConfig.put("signFieldPosition",signFieldPosition);*/
+        signField.put("normalSignFieldConfig",normalSignFieldConfig);
+        signer.put("signFields",Arrays.asList(signField));
+
+        reqBodyObj2.put("signers",Arrays.asList(signer));
+
+        Map result2 = eqbPost("/v3/sign-flow/create-by-file", reqBodyObj2);
+
+        String signFlowId = UtilMap.getString(result2, "signFlowId");
+
+
+        //4、回写签署地址
+        JSONObject reqBodyObj3 = new JSONObject();
+        Map operator = new HashMap();
+        operator.put("psnId", signatoryPsnId);
+        reqBodyObj3.put("operator", operator);
+        Map result3 = eqbPost("/v3/sign-flow/" + signFlowId + "/sign-url", reqBodyObj3);
+
+        String shortUrl = UtilMap.getString(result3, "shortUrl");
+
+        ydClient.operateData(YDParam.builder()
+                .formInstanceId(formInstId)
+                .content("签署地址:"+shortUrl)
+                .userId("yida_pub_account")
+                .atUserId(atUserId)//陈伟东
+                .build(), YDConf.FORM_OPERATION.remarks);
+
+
+        return McR.success();
+    }
+
+    private void getJxsObj(Map formData,List<Map> components,JSONObject reqBodyObj,String fileName){
+        String dgdbh = UtilMap.getString(formData, "textField_mjas1rkm");//订购单编号
+        String xf = UtilMap.getString(formData, "textField_mjaukh2p");//需方
+        String xfdz = UtilMap.getString(formData, "textareaField_mf50cbqt");//需方地址
+        String xfdh = UtilMap.getString(formData, "textField_mf50cbqw");//需方电话
+        String xfjbr = UtilMap.getString(formData, "textField_mj8dt3fj");//需方经办人
+        String gfdh = UtilMap.getString(formData, "textField_mjau7ffr");//供方电话
+        String gfjbr = UtilMap.getString(formData, "textField_mjauqjr9");//供方经办人
+        long ddrq = UtilMap.getLong(formData, "dateField_mj8dt3fa");//订单日期
+        String ghkjxybh = UtilMap.getString(formData, "textField_mjas1rkn");//供货框架协议编号
+        Double jehj = UtilMap.getDouble(formData, "numberField_me1335n7");//金额合计
+        String jehjdx = UtilMap.getString(formData, "textField_mf50cbvj");//金额合计大写
+        String fktj = UtilMap.getString(formData, "radioField_mf50cbu7");//付款条件
+        String xfnsrsbh = UtilMap.getString(formData, "textField_mf50cbuj");//需方纳税人识别号
+        String xfkhyh = UtilMap.getString(formData, "textField_mf50cbup");//需方开户银行
+        String xfzh = UtilMap.getString(formData, "textField_mf50cbuk");//需方账号
+
+        List<Map> xshtmxList = UtilMap.getList(formData, "tableField_mf50cbre");//销售合同明细
+        List<Map> jhdzList = UtilMap.getList(formData, "tableField_mj8dt3fk");//交货地址
+
+        //订购单编号
+        Map jxsComponent = new HashMap();
+        jxsComponent.put("componentKey", "dgdbh");
+        jxsComponent.put("componentValue", dgdbh);
+
+        //需方
+        Map jxsComponent2 = new HashMap();
+        jxsComponent2.put("componentKey", "xf");
+        jxsComponent2.put("componentValue", xf);
+
+        //需方地址
+        Map jxsComponent3 = new HashMap();
+        jxsComponent3.put("componentKey", "xfdz");
+        jxsComponent3.put("componentValue", xfdz);
+
+        //需方电话
+        Map jxsComponent4 = new HashMap();
+        jxsComponent4.put("componentKey", "xfdh");
+        jxsComponent4.put("componentValue", xfdh);
+
+        //需方经办人
+        Map jxsComponent5 = new HashMap();
+        jxsComponent5.put("componentKey", "xfjbr");
+        jxsComponent5.put("componentValue", xfjbr);
+
+        //供方电话
+        Map jxsComponent6 = new HashMap();
+        jxsComponent6.put("componentKey", "gfdh");
+        jxsComponent6.put("componentValue", gfdh);
+
+        //供方经办人
+        Map jxsComponent7 = new HashMap();
+        jxsComponent7.put("componentKey", "gfjbr");
+        jxsComponent7.put("componentValue", gfjbr);
+
+        //订单日期
+        Map jxsComponent8 = new HashMap();
+        jxsComponent8.put("componentKey", "ddrq");
+        jxsComponent8.put("componentValue", ddrq);
+
+        //供货框架协议编号
+        Map jxsComponent9 = new HashMap();
+        jxsComponent9.put("componentKey", "ghkjxybh");
+        jxsComponent9.put("componentValue", ghkjxybh);
+
+        //金额合计
+        Map jxsComponent10 = new HashMap();
+        jxsComponent10.put("componentKey", "jehj");
+        jxsComponent10.put("componentValue", jehj);
+
+        //金额合计大写
+        Map jxsComponent11 = new HashMap();
+        jxsComponent11.put("componentKey", "jehjdx");
+        jxsComponent11.put("componentValue", jehjdx);
+
+        //付款条件
+        Map jxsComponent12 = new HashMap();
+        if ("款到发货".equals(fktj)){
+            jxsComponent12.put("componentKey", "xkhh");
+            jxsComponent12.put("componentValue", true);
+        }else {
+            jxsComponent12.put("componentKey", "qt");
+            jxsComponent12.put("componentValue", true);
+        }
+
+        //需方纳税人识别号
+        Map jxsComponent13 = new HashMap();
+        jxsComponent13.put("componentKey", "xfnsrsbh");
+        jxsComponent13.put("componentValue", xfnsrsbh);
+
+        //需方开户银行
+        Map jxsComponent14 = new HashMap();
+        jxsComponent14.put("componentKey", "xfkhyh");
+        jxsComponent14.put("componentValue", xfkhyh);
+
+        //需方账号
+        Map jxsComponent15 = new HashMap();
+        jxsComponent15.put("componentKey", "xfzh");
+        jxsComponent15.put("componentValue", xfzh);
+
+        //销售合同明细
+        List<Map> xshtmx = new ArrayList<>();
+        xshtmx.add(getRowMap(false));
+        for (int i = 0; i < xshtmxList.size(); i++) {
+            String cpmc = UtilMap.getString(xshtmxList.get(i), "textField_mf50cbrf");//产品名称
+            String cpxh = UtilMap.getString(xshtmxList.get(i), "textField_mf50cbrg");//产品型号
+            String dw = UtilMap.getString(xshtmxList.get(i), "textField_mf50cbrh");//单位
+            String xssl = UtilMap.getString(xshtmxList.get(i), "numberField_mfbx1pr4");//销售数量
+            double lsdj = UtilMap.getDouble(xshtmxList.get(i), "numberField_mf50cbri");//零售单价
+            double pfyhdj = UtilMap.getDouble(xshtmxList.get(i), "numberField_mf50cbrj");//批发优惠单价
+            String zbq = UtilMap.getString(xshtmxList.get(i), "textField_mjas1rkx");//质保期
+
+            if (i == 0){
+                xshtmx.add(getRowMap(false,i+1,cpmc,cpxh,dw,lsdj,pfyhdj,zbq));
+            }else {
+                xshtmx.add(getRowMap(true,i+1,cpmc,cpxh,dw,lsdj,pfyhdj,zbq));
+            }
+        }
+        Map jxsComponent16 = new HashMap();
+        jxsComponent16.put("componentKey", "xshtmx");
+        jxsComponent16.put("componentValue", JSONObject.toJSONString(xshtmx));
+
+        //交货地址
+        List<Map> jhdz = new ArrayList<>();
+        jhdz.add(getRowMap(false));
+        for (int i = 0; i < jhdzList.size(); i++) {
+            String shdz = UtilMap.getString(jhdzList.get(i), "textField_mj8dt3fl");//收货地址
+            String shr = UtilMap.getString(jhdzList.get(i), "textField_mj8dt3fm");//收货人
+            String shrlxdh = UtilMap.getString(jhdzList.get(i), "textField_mj8dt3fn");//收货人联系电话
+
+            if (i == 0){
+                jhdz.add(getRowMap(false,i+1,shdz,shr,shrlxdh));
+            }else {
+                jhdz.add(getRowMap(true,i+1,shdz,shr,shrlxdh));
+            }
+        }
+        Map jxsComponent17 = new HashMap();
+        jxsComponent17.put("componentKey", "jhdz");
+        jxsComponent17.put("componentValue", JSONObject.toJSONString(jhdz));
+
+        Map jxsComponent19 = new HashMap();
+        jxsComponent19.put("componentKey", "xf2");
+        jxsComponent19.put("componentValue", xf);
+
+        Map jxsComponent20 = new HashMap();
+        jxsComponent20.put("componentKey", "xfdz2");
+        jxsComponent20.put("componentValue", xfdz);
+
+        components.add(jxsComponent);
+        components.add(jxsComponent2);
+        components.add(jxsComponent3);
+        components.add(jxsComponent4);
+        components.add(jxsComponent5);
+        components.add(jxsComponent6);
+        components.add(jxsComponent7);
+        components.add(jxsComponent8);
+        components.add(jxsComponent9);
+        components.add(jxsComponent10);
+        components.add(jxsComponent11);
+        components.add(jxsComponent12);
+        components.add(jxsComponent13);
+        components.add(jxsComponent14);
+        components.add(jxsComponent15);
+        components.add(jxsComponent16);
+        components.add(jxsComponent17);
+        components.add(jxsComponent19);
+        components.add(jxsComponent20);
+
+        if (!"款到发货".equals(fktj)){
+            Map jxsComponent18 = new HashMap();
+            jxsComponent18.put("componentKey", "qtnr");
+            jxsComponent18.put("componentValue", fktj);
+            components.add(jxsComponent18);
+        }
+
+        // 构建请求Body体
+        reqBodyObj.put("docTemplateId", jxs_templateId);
+        reqBodyObj.put("fileName", fileName+".pdf");
+        reqBodyObj.put("components", components);
+    }
+
+    private void getQtkhObj(Map formData, List<Map> components, JSONObject reqBodyObj, String fileName){
+        String htbh = UtilMap.getString(formData, "textField_mjb71q95");//合同编号
+        String jf = UtilMap.getString(formData, "textField_mjaukh2p");//甲方
+        double xsze = UtilMap.getDouble(formData, "numberField_mjb71qac");//销售总额
+        String fkfs = UtilMap.getString(formData, "textField_mjb886fw");//付款方式
+        String jfnsrsbh = UtilMap.getString(formData, "textField_mjb71q9w");//甲方纳税人识别号
+        String spyx = UtilMap.getString(formData, "textField_mjb71q9y");//收票邮箱
+        String jfdb = UtilMap.getString(formData, "textField_mjb886fx");//甲方代表
+        String yfdb = UtilMap.getString(formData, "textField_mj8dt3fj");//乙方代表
+
+        List<Map> xshtmxList = UtilMap.getList(formData, "tableField_mjb71qab");//销售合同明细
+
+        //订购单编号
+        Map jxsComponent = new HashMap();
+        jxsComponent.put("componentKey", "htbh");
+        jxsComponent.put("componentValue", htbh);
+
+        //甲方
+        Map jxsComponent2 = new HashMap();
+        jxsComponent2.put("componentKey", "jf");
+        jxsComponent2.put("componentValue", jf);
+
+        //销售总额
+        Map jxsComponent3 = new HashMap();
+        jxsComponent3.put("componentKey", "xsze");
+        jxsComponent3.put("componentValue", xsze);
+
+        //付款方式
+        Map jxsComponent4 = new HashMap();
+        jxsComponent4.put("componentKey", "fkfs");
+        jxsComponent4.put("componentValue", fkfs);
+
+        //甲方纳税人识别号
+        Map jxsComponent5 = new HashMap();
+        jxsComponent5.put("componentKey", "jfnsrsbh");
+        jxsComponent5.put("componentValue", jfnsrsbh);
+
+        //收票邮箱
+        Map jxsComponent6 = new HashMap();
+        jxsComponent6.put("componentKey", "spyx");
+        jxsComponent6.put("componentValue", spyx);
+
+        //甲方代表
+        Map jxsComponent7 = new HashMap();
+        jxsComponent7.put("componentKey", "jfdb");
+        jxsComponent7.put("componentValue", jfdb);
+
+        //乙方代表
+        Map jxsComponent8 = new HashMap();
+        jxsComponent8.put("componentKey", "yfdb");
+        jxsComponent8.put("componentValue", yfdb);
+
+        //销售合同明细
+        List<Map> xshtmx = new ArrayList<>();
+        xshtmx.add(getRowMap(false));
+        for (int i = 0; i < xshtmxList.size(); i++) {
+            String cpmc = UtilMap.getString(xshtmxList.get(i), "textField_mjb71qa4");//产品名称
+            String cpxh = UtilMap.getString(xshtmxList.get(i), "textField_mjb71qa5");//产品型号
+            String dw = UtilMap.getString(xshtmxList.get(i), "textField_mjb71qa6");//单位
+            String xssl = UtilMap.getString(xshtmxList.get(i), "numberField_mjb71qa7");//销售数量
+            double hsdj = UtilMap.getDouble(xshtmxList.get(i), "numberField_mjb71qa8");//含税单价
+            int zbq = UtilMap.getInt(xshtmxList.get(i), "numberField_mjb71qaw");//质保期
+            String smzs = UtilMap.getString(xshtmxList.get(i), "textField_mjb71qam");//扫描张数
+            double jshj = UtilMap.getDouble(xshtmxList.get(i), "numberField_mjb71qan");//价税合计
+            double zke = UtilMap.getDouble(xshtmxList.get(i), "numberField_mjb71qao");//折扣额
+            String bz = UtilMap.getString(xshtmxList.get(i), "textField_mjb71qaq");//备注
+
+            if (i == 0){
+                xshtmx.add(getRowMap(false,cpmc,cpxh,dw,xssl,hsdj,zbq+"年",smzs,jshj,zke,bz));
+            }else {
+                xshtmx.add(getRowMap(true,cpmc,cpxh,dw,xssl,hsdj,zbq+"年",smzs,jshj,zke,bz));
+            }
+        }
+        Map jxsComponent9 = new HashMap();
+        jxsComponent9.put("componentKey", "xshtmx");
+        jxsComponent9.put("componentValue", JSONObject.toJSONString(xshtmx));
+
+        //甲方
+        Map jxsComponent10 = new HashMap();
+        jxsComponent10.put("componentKey", "jf2");
+        jxsComponent10.put("componentValue", jf);
+
+        //甲方
+        Map jxsComponent11 = new HashMap();
+        jxsComponent11.put("componentKey", "jf3");
+        jxsComponent11.put("componentValue", jf);
+
+
+        components.add(jxsComponent);
+        components.add(jxsComponent2);
+        components.add(jxsComponent3);
+        components.add(jxsComponent4);
+        components.add(jxsComponent5);
+        components.add(jxsComponent6);
+        components.add(jxsComponent7);
+        components.add(jxsComponent8);
+        components.add(jxsComponent9);
+        components.add(jxsComponent10);
+        components.add(jxsComponent11);
+
+        // 构建请求Body体
+        reqBodyObj.put("docTemplateId", qtkh_templateId);
+        reqBodyObj.put("fileName", fileName+".pdf");
+        reqBodyObj.put("components", components);
+    }
+
+    private void getCgddObj(Map formData,List<Map> components,JSONObject reqBodyObj,String fileName){
+        String cgddbh = UtilMap.getString(formData, "textField_mj9msq4v");//采购订单编号
+        long date = UtilMap.getLong(formData, "dateField_mj8dt3g6");//签订日期
+        String yf = UtilMap.getString(formData, "textField_mj8dt3g7");//乙方
+        String yfdz = UtilMap.getString(formData, "textField_mj8dt3gt");//乙方地址
+        String yflxr = UtilMap.getString(formData, "textField_mj8dt3g8");//乙方联系人
+        String yfdh = UtilMap.getString(formData, "textField_mj8dt3g9");//乙方电话
+        String nsrsbh = UtilMap.getString(formData, "textField_mj8dt3gs");//乙方纳税人识别号
+        String khyh = UtilMap.getString(formData, "textField_mj8dt3gq");//乙方开户银行
+        String zh = UtilMap.getString(formData, "textField_mj8dt3gr");//乙方账号
+        String zlyq = UtilMap.getString(formData, "textField_mj8dt3gn");//质量要求
+        String jsfs = UtilMap.getString(formData, "textField_mj8dt3go");//结算方式及付款期限
+        String bz = UtilMap.getString(formData, "textareaField_mj9msq4w");//备注
+        List<Map> cgmx = UtilMap.getList(formData, "tableField_mizdd3qf");//采购明细
+        double zjyf = UtilMap.getDouble(formData, "numberField_mj9msq4x");//总计应付
+        String jflxr = UtilMap.getString(formData, "textField_mjb2kuhf");//甲方联系人
+        String jflxdh = UtilMap.getString(formData, "textField_mjb2kuhh");//甲方联系电话
+
+        //订单编号
+        Map component = new HashMap();
+        component.put("componentKey", "ddbh");
+        component.put("componentValue", cgddbh);
+
+        //签订日期
+        Map component2 = new HashMap();
+        component2.put("componentKey", "qdrq");
+        component2.put("componentValue", date);
+
+        //乙方
+        Map component3 = new HashMap();
+        component3.put("componentKey", "yf");
+        component3.put("componentValue", yf);
+
+        //乙方联系人
+        Map component4 = new HashMap();
+        component4.put("componentKey", "yflxr");
+        component4.put("componentValue", yflxr);
+
+        //乙方联系电话
+        Map component5 = new HashMap();
+        component5.put("componentKey", "yflxdh");
+        component5.put("componentValue", yfdh);
+
+        //备注
+        Map component6 = new HashMap();
+        component6.put("componentKey", "bz");
+        component6.put("componentValue", bz);
+
+        //销售合同明细
+        List<Map> cghtmx = new ArrayList<>();
+        cghtmx.add(getRowMap(false));
+        for (int i = 0; i < cgmx.size(); i++) {
+            String wlbm = UtilMap.getString(cgmx.get(i), "textField_mizdd3qg");//物料编码
+            String wlmc = UtilMap.getString(cgmx.get(i), "textField_mizdd3qh");//物料名称
+            String ggxh = UtilMap.getString(cgmx.get(i), "textField_mizdd3qi");//规格型号
+            String cgdw = UtilMap.getString(cgmx.get(i), "textField_mizdd3qj");//采购单位
+            double cgsl = UtilMap.getDouble(cgmx.get(i), "numberField_mizdd3ql");//采购数量
+            double hsdj = UtilMap.getDouble(cgmx.get(i), "numberField_mizdd3qs");//含税单价
+            double jshj = UtilMap.getDouble(cgmx.get(i), "numberField_mizdd3qx");//价税合计
+            long jhrq = UtilMap.getLong(cgmx.get(i), "dateField_mizdd3qp");//交货日期
+            //时间戳转化为年月日
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            String jhrqStr = sdf.format(new Date(jhrq));
+
+            String mxbz = UtilMap.getString(cgmx.get(i), "textField_mizdd3r0");//备注
+
+            if (i == 0){
+                cghtmx.add(getRowMap(false,i+1,wlbm,wlmc,null,ggxh,cgsl,cgdw,hsdj,jshj,jhrqStr,mxbz));
+            }else {
+                cghtmx.add(getRowMap(true,i+1,wlbm,wlmc,null,ggxh,cgsl,cgdw,hsdj,jshj,jhrqStr,mxbz));
+            }
+        }
+        Map component7 = new HashMap();
+        component7.put("componentKey", "cgmx");
+        component7.put("componentValue", JSONObject.toJSONString(cghtmx));
+
+        //总计应付
+        Map component8 = new HashMap();
+        component8.put("componentKey", "zjyf");
+        component8.put("componentValue", zjyf);
+
+        //质量要求
+        Map component9 = new HashMap();
+        component9.put("componentKey", "zlyq");
+        component9.put("componentValue", zlyq);
+
+        //结算方式及付款期限
+        Map component10 = new HashMap();
+        component10.put("componentKey", "jsfs");
+        component10.put("componentValue", jsfs);
+
+        //乙方
+        Map component11 = new HashMap();
+        component11.put("componentKey", "yf2");
+        component11.put("componentValue", yf);
+
+        //乙方开户银行
+        Map component12 = new HashMap();
+        component12.put("componentKey", "yfkhyh");
+        component12.put("componentValue", khyh);
+
+        //乙方账号
+        Map component13 = new HashMap();
+        component13.put("componentKey", "yfzh");
+        component13.put("componentValue", zh);
+
+        //乙方纳税人识别号
+        Map component14 = new HashMap();
+        component14.put("componentKey", "yfnsrsbh");
+        component14.put("componentValue", nsrsbh);
+
+        //乙方地址
+        Map component15 = new HashMap();
+        component15.put("componentKey", "yfdz");
+        component15.put("componentValue", yfdz);
+
+        //甲方联系人
+        Map component16 = new HashMap();
+        component16.put("componentKey", "jflxr");
+        component16.put("componentValue", jflxr);
+
+        //甲方联系电话
+        Map component17 = new HashMap();
+        component17.put("componentKey", "jflxdh");
+        component17.put("componentValue", jflxdh);
+
+        components.add(component);
+        components.add(component2);
+        components.add(component3);
+        components.add(component4);
+        components.add(component5);
+        components.add(component6);
+        components.add(component7);
+        components.add(component8);
+        components.add(component9);
+        components.add(component10);
+        components.add(component11);
+        components.add(component12);
+        components.add(component13);
+        components.add(component14);
+        components.add(component15);
+        components.add(component16);
+        components.add(component17);
+
+        // 构建请求Body体
+        reqBodyObj.put("docTemplateId", cgdd_templateId);
+        reqBodyObj.put("fileName", fileName+".pdf");
+        reqBodyObj.put("components", components);
+    }
+
+    /***
+     * e签宝post请求
+     */
+    public static Map eqbPost(String postUrl,JSONObject reqBodyObj) {
+        // 完整的请求地址
+        String postAllUrl = host + postUrl;
+
+        try {
+            // 请求Body体数据
+            String reqBodyData = reqBodyObj.toString();
+            // 对请求Body体内的数据计算ContentMD5
+            String contentMD5 = doContentMD5(reqBodyData);
+            System.out.println("请求body数据:"+reqBodyData);
+            System.out.println("body的md5值:"+ contentMD5);
+
+            // 构建待签名字符串
+            String method = "POST";
+            String accept = "*/*";
+            String contentType = "application/json";
+            String url = postUrl;
+            String date = "";
+            String headers = "";
+
+            StringBuffer sb = new StringBuffer();
+            sb.append(method).append("\n").append(accept).append("\n").append(contentMD5).append("\n")
+                    .append(contentType).append("\n").append(date).append("\n");
+            if ("".equals(headers)) {
+                sb.append(headers).append(url);
+            } else {
+                sb.append(headers).append("\n").append(url);
+            }
+
+            // 构建参与请求签名计算的明文
+            String plaintext = sb.toString();
+            // 计算请求签名值
+            String reqSignature = doSignatureBase64(plaintext, appKey);
+            System.out.println("计算请求签名值:"+reqSignature);
+
+            // 获取时间戳(精确到毫秒)
+            long timeStamp = timeStamp();
+
+            // 构建请求头
+            LinkedHashMap<String, String> header = new LinkedHashMap<String, String>();
+            header.put("X-Tsign-Open-App-Id", appId);
+            header.put("X-Tsign-Open-Auth-Mode", "Signature");
+            header.put("X-Tsign-Open-Ca-Timestamp", String.valueOf(timeStamp));
+            header.put("Accept", accept);
+            header.put("Content-Type", contentType);
+            header.put("X-Tsign-Open-Ca-Signature", reqSignature);
+            header.put("Content-MD5", contentMD5);
+
+            // 发送POST请求
+            String result = HTTPHelper.sendPOST(postAllUrl, reqBodyData, header, "UTF-8");
+
+            System.out.println("请求返回信息: " + result);
+
+            Map resultObj =(Map) JSONObject.parse(result);
+
+            Map data = UtilMap.getMap(resultObj, "data");
+
+            return data;
+        } catch (Exception e) {
+            e.printStackTrace();
+            String msg = MessageFormat.format("请求签名鉴权方式调用接口出现异常: {0}", e.getMessage());
+            System.out.println(msg);
+            throw new RuntimeException(e);
+        }
+    }
+
+    private Map downloadSignedFile(String signFlowId){
+        // 计算签名拼接的url
+        String postUrl = "/v3/sign-flow/" + signFlowId + "/file-download-url";
+
+        Map result = eqbPost(postUrl, new JSONObject());
+
+        List<Map> files =(List<Map>) UtilMap.getList(result, "files");
+
+        String downloadUrl = UtilMap.getString(files.get(0), "downloadUrl");
+        String fileName = UtilMap.getString(files.get(0), "fileName");
+        UUID fileId = UUID.randomUUID();
+
+        String downloadPath = downloadFilePath + fileId + ".pdf";
+
+        downloadFile(downloadUrl,downloadPath);
+
+        Map result2 = new HashMap();
+        result2.put("downloadPath",downloadPath);
+        result2.put("fileName",fileName);
+        result2.put("fileId",fileId);
+
+        return result2;
+    }
+
+    //文件下载到本地
+    private void downloadFile(String downloadUri,String downloadPath){
+        try {
+            URL url = new URL(downloadUri);
+
+            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
+            int responseCode = httpConn.getResponseCode();
+
+            // 检查HTTP响应代码是否为200
+            if (responseCode == HttpURLConnection.HTTP_OK) {
+                InputStream inputStream = httpConn.getInputStream();
+                FileOutputStream outputStream = new FileOutputStream(downloadPath);
+
+                byte[] buffer = new byte[4096];
+                int bytesRead = -1;
+
+                while ((bytesRead = inputStream.read(buffer)) != -1) {
+                    outputStream.write(buffer, 0, bytesRead);
+                }
+
+                outputStream.close();
+                inputStream.close();
+            } else {
+                System.out.println("无法下载文件。HTTP响应代码: " + responseCode);
+            }
+            httpConn.disconnect();
+        }catch (Exception e){
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    /***
+     *
+     * @param str 待计算的消息
+     * @return MD5计算后摘要值的Base64编码(ContentMD5)
+     * @throws Exception 加密过程中的异常信息
+     */
+    public static String doContentMD5(String str) throws Exception {
+        byte[] md5Bytes = null;
+        MessageDigest md5 = null;
+        String contentMD5 = null;
+        try {
+            md5 = MessageDigest.getInstance("MD5");
+            // 计算md5函数
+            md5.update(str.getBytes("UTF-8"));
+            // 获取文件MD5的二进制数组(128位)
+            md5Bytes = md5.digest();
+            // 把MD5摘要后的二进制数组md5Bytes使用Base64进行编码(而不是对32位的16进制字符串进行编码)
+            contentMD5 = new String(Base64.encodeBase64(md5Bytes), "UTF-8");
+        } catch (NoSuchAlgorithmException e) {
+            String msg = MessageFormat.format("不支持此算法: {0}", e.getMessage());
+            Exception ex = new Exception(msg);
+            ex.initCause(e);
+            throw ex;
+        } catch (UnsupportedEncodingException e) {
+            String msg = MessageFormat.format("不支持的字符编码: {0}", e.getMessage());
+            Exception ex = new Exception(msg);
+            ex.initCause(e);
+            throw ex;
+        }
+        return contentMD5;
+    }
+
+    /***
+     * 计算请求签名值
+     *
+     * @param message 待计算的消息
+     * @param secret 密钥
+     * @return HmacSHA256计算后摘要值的Base64编码
+     * @throws Exception 加密过程中的异常信息
+     */
+    public static String doSignatureBase64(String message, String secret) throws Exception {
+        String algorithm = "HmacSHA256";
+        Mac hmacSha256;
+        String digestBase64 = null;
+        try {
+            hmacSha256 = Mac.getInstance(algorithm);
+            byte[] keyBytes = secret.getBytes("UTF-8");
+            byte[] messageBytes = message.getBytes("UTF-8");
+            hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm));
+            // 使用HmacSHA256对二进制数据消息Bytes计算摘要
+            byte[] digestBytes = hmacSha256.doFinal(messageBytes);
+            // 把摘要后的结果digestBytes使用Base64进行编码
+            digestBase64 = new String(Base64.encodeBase64(digestBytes), "UTF-8");
+        } catch (NoSuchAlgorithmException e) {
+            String msg = MessageFormat.format("不支持此算法: {0}", e.getMessage());
+            Exception ex = new Exception(msg);
+            ex.initCause(e);
+            throw ex;
+        } catch (UnsupportedEncodingException e) {
+            String msg = MessageFormat.format("不支持的字符编码: {0}", e.getMessage());
+            Exception ex = new Exception(msg);
+            ex.initCause(e);
+            throw ex;
+        } catch (InvalidKeyException e) {
+            String msg = MessageFormat.format("无效的密钥规范: {0}", e.getMessage());
+            Exception ex = new Exception(msg);
+            ex.initCause(e);
+            throw ex;
+        }
+        return digestBase64;
+    }
+
+
+    /***
+     * 获取时间戳(毫秒级)
+     *
+     * @return 毫秒级时间戳,如 1578446909000
+     */
+    public static long timeStamp() {
+        long timeStamp = System.currentTimeMillis();
+        return timeStamp;
+    }
+
+    private static Map getRowMap(boolean insertRow,Object... columnValues) {
+        Map row = new HashMap();
+
+        for (int i = 0; i < columnValues.length; i++) {
+            row.put("column" + (i + 1), columnValues[i]);
+        }
+
+        Map result = new HashMap();
+        result.put("row",row);
+        result.put("insertRow",insertRow);
+
+        return result;
+    }
+}

文件差异内容过多而无法显示
+ 190 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdHuaGaoServiceImpl.java


+ 39 - 1
mjava-huagao/src/main/java/com/malk/huagao/service/impl/McProjectServiceImpl.java

@@ -1,19 +1,31 @@
 package com.malk.huagao.service.impl;
 
 import com.malk.core.McProject;
+import com.malk.huagao.service.HuaGaoService;
 import com.malk.huagao.service.McProjectService;
 import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilDateTime;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.Environment;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Arrays;
+import java.util.List;
+
 @Slf4j
 @Service
 public class McProjectServiceImpl implements McProjectService {
+    @Autowired
+    private Environment environment;
 
     @Autowired
-    private YDClient ydClient;
+    private HuaGaoService huaGaoService;
 
     @Override
     public void init() {
@@ -22,5 +34,31 @@ public class McProjectServiceImpl implements McProjectService {
         McProject.addYida("1002",new String[] {"APP_YONR16SZSUIZCKXJUNSY","TNA66KB1AEDXKQHQ8IJBG53BDW7Q27TM33HDMADI"});//数据分析看板
         McProject.addYida("1003",new String[] {"APP_VQDMMWS6OR1VHL8VMFD3","XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2"});//华高CRM
         log.info("项目加载完毕:1001,1002,1003");
+
+        // 生产环境2专属逻辑
+        if (isProdEnvironment()) {
+            executeProductionMethod();
+        }
+    }
+
+    private boolean isProdEnvironment() {
+        String[] activeProfiles = environment.getActiveProfiles();
+        for (String profile : activeProfiles) {
+            if ("prod2".equals(profile)) {
+                return true;
+            }
+        }
+        return false;
+    }
+    @Profile("prod2")
+    private void executeProductionMethod() {
+        log.info("异常重启考勤同步-周度");
+        LocalDateTime startTime = LocalDate.now().minusWeeks(1).atTime(LocalTime.MIN);
+        LocalDateTime endTime = LocalDate.now().atTime(LocalTime.MIN);
+        try {
+            huaGaoService.syncKqData(startTime, endTime);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 }

+ 270 - 0
mjava-huagao/src/main/java/com/malk/huagao/utils/HTTPHelper.java

@@ -0,0 +1,270 @@
+package com.malk.huagao.utils;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HTTPHelper {
+    // slf4j日志记录器
+    private static final Logger LOG = LoggerFactory.getLogger(HTTPHelper.class);
+
+    /***
+     * 向指定URL发送GET方法的请求
+     *
+     * @param apiUrl
+     * @param data
+     * @param projectId
+     * @param signature
+     * @param encoding
+     * @return
+     * @throws Exception
+     */
+    public static String sendGet(String apiUrl, HashMap<String, Object> param,
+                                 LinkedHashMap<String, String> headers, String encoding) throws Exception {
+        // 获得响应内容
+        String http_RespContent = null;
+        HttpURLConnection httpURLConnection = null;
+        int http_StatusCode = 0;
+        String http_RespMessage = null;
+        try {
+            // 实际请求完整Url
+            StringBuffer fullUrl = new StringBuffer();
+            if (null != param) {
+                if (0 != param.size()) {
+                    StringBuffer params = new StringBuffer();
+                    for (Entry<String, Object> entry : param.entrySet()) {
+                        params.append(entry.getKey());
+                        params.append("=");
+                        params.append(entry.getValue().toString());
+                        params.append("&");
+                    }
+                    if (params.length() > 0) {
+                        params.deleteCharAt(params.lastIndexOf("&"));
+                    }
+                    fullUrl.append(apiUrl).append((params.length() > 0) ? "?" + params.toString() : "");
+                } else {
+                    fullUrl.append(apiUrl);
+                }
+            } else {
+                fullUrl.append(apiUrl);
+            }
+
+            LOG.info(">>>> 实际请求Url: " + fullUrl.toString());
+
+            // 建立连接
+            URL url = new URL(fullUrl.toString());
+            httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+            // HTTP请求方式
+            httpURLConnection.setRequestMethod("GET");
+            // 设置Headers
+            if (null != headers) {
+                for (String key : headers.keySet()) {
+                    httpURLConnection.setRequestProperty(key, headers.get(key));
+                }
+            }
+            // 连接会话
+            httpURLConnection.connect();
+            // 获得响应状态(HTTP状态码)
+            http_StatusCode = httpURLConnection.getResponseCode();
+            // 获得响应消息(HTTP状态码描述)
+            http_RespMessage = httpURLConnection.getResponseMessage();
+            // 获得响应内容
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+                // 返回响应结果
+                http_RespContent = getResponseContent(httpURLConnection);
+            } else {
+                // 返回非200状态时响应结果
+                http_RespContent = getErrorResponseContent(httpURLConnection);
+                String msg =
+                        MessageFormat.format("请求失败: Http状态码 = {0} , {1}", http_StatusCode, http_RespMessage);
+                LOG.info(msg);
+            }
+        } catch (UnknownHostException e) {
+            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
+            Exception ex = new Exception(message);
+            ex.initCause(e);
+            throw ex;
+        } catch (MalformedURLException e) {
+            String message = MessageFormat.format("格式错误的URL: {0}", e.getMessage());
+            Exception ex = new Exception(message);
+            ex.initCause(e);
+            throw ex;
+        } catch (IOException e) {
+            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
+            Exception ex = new Exception(message);
+            ex.initCause(e);
+            throw ex;
+        } catch (Exception e) {
+            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
+            Exception ex = new Exception(message);
+            ex.initCause(e);
+            throw ex;
+        } finally {
+            if (null != httpURLConnection) {
+                httpURLConnection.disconnect();
+            }
+        }
+        return http_RespContent;
+    }
+
+    /***
+     * 向指定URL发送POST方法的请求
+     *
+     * @param apiUrl
+     * @param data
+     * @param projectId
+     * @param signature
+     * @param encoding
+     * @return
+     * @throws Exception
+     */
+    public static String sendPOST(String apiUrl, String data, LinkedHashMap<String, String> headers,
+                                  String encoding) throws Exception {
+        // 获得响应内容
+        String http_RespContent = null;
+        HttpURLConnection httpURLConnection = null;
+        int http_StatusCode = 0;
+        String http_RespMessage = null;
+        try {
+            // 建立连接
+            URL url = new URL(apiUrl);
+            httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+            // HTTP请求方式
+            httpURLConnection.setRequestMethod("POST");
+            // 设置Headers
+            if (null != headers) {
+                for (String key : headers.keySet()) {
+                    httpURLConnection.setRequestProperty(key, headers.get(key));
+                }
+            }
+            // 连接会话
+            httpURLConnection.connect();
+            // 建立输入流,向指向的URL传入参数
+            DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
+            // 设置请求参数
+            dos.write(data.getBytes(encoding));
+            dos.flush();
+            dos.close();
+            // 获得响应状态(HTTP状态码)
+            http_StatusCode = httpURLConnection.getResponseCode();
+            // 获得响应消息(HTTP状态码描述)
+            http_RespMessage = httpURLConnection.getResponseMessage();
+            // 获得响应内容
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+                // 返回响应结果
+                http_RespContent = getResponseContent(httpURLConnection);
+            } else {
+                // 返回非200状态时响应结果
+                http_RespContent = getErrorResponseContent(httpURLConnection);
+                String msg =
+                        MessageFormat.format("请求失败: Http状态码 = {0} , {1}", http_StatusCode, http_RespMessage);
+                LOG.info(msg);
+            }
+        } catch (UnknownHostException e) {
+            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
+            Exception ex = new Exception(message);
+            ex.initCause(e);
+            throw ex;
+        } catch (MalformedURLException e) {
+            String message = MessageFormat.format("格式错误的URL: {0}", e.getMessage());
+            Exception ex = new Exception(message);
+            ex.initCause(e);
+            throw ex;
+        } catch (IOException e) {
+            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
+            Exception ex = new Exception(message);
+            ex.initCause(e);
+            throw ex;
+        } catch (Exception e) {
+            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
+            Exception ex = new Exception(message);
+            ex.initCause(e);
+            throw ex;
+        } finally {
+            if (null != httpURLConnection) {
+                httpURLConnection.disconnect();
+            }
+        }
+        return http_RespContent;
+    }
+
+    /***
+     * 读取HttpResponse响应内容
+     *
+     * @param httpURLConnection
+     * @return
+     * @throws UnsupportedEncodingException
+     * @throws IOException
+     */
+    private static String getResponseContent(HttpURLConnection httpURLConnection)
+            throws UnsupportedEncodingException, IOException {
+        StringBuffer contentBuffer = null;
+        BufferedReader responseReader = null;
+        try {
+            contentBuffer = new StringBuffer();
+            String readLine = null;
+            responseReader =
+                    new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
+            while ((readLine = responseReader.readLine()) != null) {
+                contentBuffer.append(readLine);
+            }
+        } finally {
+            if (null != responseReader) {
+                responseReader.close();
+            }
+        }
+        return contentBuffer.toString();
+    }
+
+    /***
+     * 读取HttpResponse响应内容
+     *
+     * @param httpURLConnection
+     * @return
+     * @throws UnsupportedEncodingException
+     * @throws IOException
+     */
+    private static String getErrorResponseContent(HttpURLConnection httpURLConnection)
+            throws UnsupportedEncodingException, IOException {
+        StringBuffer contentBuffer = null;
+        BufferedReader responseReader = null;
+        try {
+            contentBuffer = new StringBuffer();
+            String readLine = null;
+            responseReader =
+                    new BufferedReader(new InputStreamReader(httpURLConnection.getErrorStream(), "UTF-8"));
+            while ((readLine = responseReader.readLine()) != null) {
+                contentBuffer.append(readLine);
+            }
+        } finally {
+            if (null != responseReader) {
+                responseReader.close();
+            }
+        }
+        return contentBuffer.toString();
+    }
+}

+ 7 - 0
mjava-huagao/src/main/resources/application-dev.yml

@@ -2,6 +2,7 @@ server:
   port: 7708
   servlet:
     context-path: /huagao
+  host: https://33d4c762.r23.cpolar.top
 
 enable:
   scheduling: false
@@ -38,6 +39,7 @@ dingtalk:
   aesKey:
   token:
   operator:
+  atUserId: 15959870735792794 #陈伟东
 
 # aliwork
 aliwork:
@@ -64,5 +66,10 @@ kingdee:
   # 允许的最大读取延时,单位为秒
   # X-KDApi-RequestTimeout: 120
 
+eqb:
+  downloadFilePath: C:\\Users\\EDY\\Desktop\\项目\\华高\\电子签\\files\\
+  signatoryPsnId: c3fb35cb7e574baf97ed9f8917c6327b #签署人 陈伟东
+
+
 
 

+ 6 - 0
mjava-huagao/src/main/resources/application-prod.yml

@@ -2,6 +2,7 @@ server:
   port: 7708
   servlet:
     context-path: /huagao
+  host: http://mes.huagaochina.com:7708
 
 enable:
   scheduling: true
@@ -38,6 +39,7 @@ dingtalk:
   aesKey:
   token:
   operator:
+  atUserId: 15959870735792794 #陈伟东
 
 # aliwork
 aliwork:
@@ -63,3 +65,7 @@ kingdee:
   # X-KDApi-ConnectTimeout: 120
   # 允许的最大读取延时,单位为秒
   # X-KDApi-RequestTimeout: 120
+
+eqb:
+  downloadFilePath: /home/server/huagao/files/
+  signatoryPsnId: c3fb35cb7e574baf97ed9f8917c6327b #签署人 陈伟东

+ 72 - 0
mjava-huagao/src/main/resources/application-prod2.yml

@@ -0,0 +1,72 @@
+#异常重启 生产环境2
+server:
+  port: 7708
+  servlet:
+    context-path: /huagao
+    host: http://mes.huagaochina.com:7708
+
+enable:
+  scheduling: true
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/huagao/log/
+  level:
+    com.malk.*: info
+
+spring:
+  datasource:
+    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+    #trustServerCertificate=true 临时绕过证书验证的风险
+    url: jdbc:sqlserver://113.45.187.194:1433;databaseName=dingding;encrypt=true;trustServerCertificate=true;
+    username: hgdd
+    password: hgdd@2025
+
+mybatis-plus:
+  configuration:
+    #开启驼峰命名自动映射
+    map-underscore-to-camel-case: true
+    #开启日志打印
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  type-aliases-package: com.malk.huagao.entity
+  #扫描mapper文件
+  mapper-locations: classpath:mapper/*.xml
+
+# dingtalk
+dingtalk:
+  agentId: 3254218465
+  appKey: dingdhgwe3g6xrifq3iz
+  appSecret: xO9uBMFGvv79UAqv8HBPZQVXLBbLhf8ueX28Vtn_de-4ME7-K9wBRVFihCGFoeX4
+  corpId:
+  aesKey:
+  token:
+  operator:
+  atUserId: 15959870735792794 #陈伟东
+
+# aliwork
+aliwork:
+  appType: APP_BWPT6ET90UEE8IBEY9GJ
+  systemToken: 37766HD145ST2RBB9S4D37J2WMNU293GASC8M6Q
+
+kingdee:
+  # 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 626cda24137359
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: dingding
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 322503_566rSdHtylkb4+XoW1XoRdVGSqW85LOs
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: 7eaf6845da0540e6b8f328541b36dff6
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://113.45.187.194:81/k3cloud/
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120
+
+eqb:
+  downloadFilePath: /home/server/huagao/files/
+  signatoryPsnId: c3fb35cb7e574baf97ed9f8917c6327b #签署人 陈伟东

文件差异内容过多而无法显示
+ 1397 - 0
mjava-huagao/src/test/java/com/malk/huagao/EqbTest.java


+ 5 - 0
mjava-huagao/src/test/java/com/malk/huagao/KdTest.java

@@ -227,6 +227,11 @@ public void test50() throws Exception {
         System.out.println("aaa"+JSONObject.toJSONString(aaa));
     }
 
+    @Test
+    public void test10(){
+        kdHuaGaoService.syncPUROrder();
+    }
+
     private IdentifyInfo initIden(){
         //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
         //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。

+ 2 - 2
mjava-huagao/src/test/java/com/malk/huagao/YyYdTest.java

@@ -114,8 +114,8 @@ public class YyYdTest {
 
     @Test
     public void test3() {
-        LocalDateTime startTime= LocalDate.now().minusDays(2).atTime(LocalTime.MIN);
-        LocalDateTime endTime= LocalDate.now().minusDays(1).atTime(LocalTime.MIN);
+        LocalDateTime startTime= LocalDate.now().minusDays(6).atTime(LocalTime.MIN);
+        LocalDateTime endTime= LocalDate.now().minusDays(4).atTime(LocalTime.MIN);
 //        LocalDateTime endTime= LocalDate.now().atTime(LocalTime.MIN);
 
         huaGaoService.syncKqData(startTime,endTime);

+ 5 - 2
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/controller/KabeiyiController.java

@@ -77,12 +77,15 @@ public class KabeiyiController {
         return kabeiyiService.ocr(downloadUrl,name,type);
     }
 
+
+    //============================================== 发货量分析接口停用 =====================================================
+
     //每天0点定时同步出库单信息
-    @Scheduled(cron = "0 0 0 * * ?")
+    /*@Scheduled(cron = "0 0 0 * * ?")
     @GetMapping("getSaleoutInfo")
     public McR getSaleoutInfo(){
         return kabeiyiService.getSaleoutInfo();
-    }
+    }*/
 
 
     //============================================== 一期接口停用 =====================================================

+ 75 - 0
mjava-lianan/pom.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.18</version> <!-- 使用最新的稳定版或其他适用版本 -->
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.malk</groupId>
+    <artifactId>mjava-lianan</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.30</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>lianan</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 61 - 0
mjava-lianan/src/main/java/com/malk/lianan/AesUtil.java

@@ -0,0 +1,61 @@
+package com.malk.lianan;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.crypto.Mode;
+import cn.hutool.crypto.Padding;
+import cn.hutool.crypto.symmetric.AES;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+
+public class AesUtil {
+
+    /**
+     * AES CBC 加密
+     * @param content 明文内容
+     * @param key 密钥(需要16/24/32字节)
+     * @return Base64编码的密文
+     */
+    public static String encrypt(String content, String key) {
+        // 1. 创建AES对象,指定CBC模式,PKCS5Padding填充
+        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding,
+                key.getBytes(StandardCharsets.UTF_8));
+
+        // 2. 设置IV(这里使用密钥的前16字节,但实际应该用随机IV)
+        // 注意:实际项目中IV应该是随机的,每次加密都不同
+        byte[] ivBytes = key.getBytes(StandardCharsets.UTF_8);
+        if (ivBytes.length > 16) {
+            ivBytes = Arrays.copyOf(ivBytes, 16);
+        } else if (ivBytes.length < 16) {
+            // 填充到16字节
+            ivBytes = Arrays.copyOf(ivBytes, 16);
+            Arrays.fill(ivBytes, ivBytes.length, 16, (byte)0);
+        }
+        aes.setIv(ivBytes);
+
+        // 3. 加密并返回Base64
+        byte[] encrypted = aes.encrypt(content, StandardCharsets.UTF_8);
+        return Base64.encode(encrypted);
+    }
+
+    /**
+     * 解密
+     */
+    public static String decrypt(String base64Content, String key) {
+        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding,
+                key.getBytes(StandardCharsets.UTF_8));
+
+        byte[] ivBytes = key.getBytes(StandardCharsets.UTF_8);
+        if (ivBytes.length > 16) {
+            ivBytes = Arrays.copyOf(ivBytes, 16);
+        } else if (ivBytes.length < 16) {
+            ivBytes = Arrays.copyOf(ivBytes, 16);
+            Arrays.fill(ivBytes, ivBytes.length, 16, (byte)0);
+        }
+        aes.setIv(ivBytes);
+
+        byte[] decoded = Base64.decode(base64Content);
+        return aes.decryptStr(decoded, StandardCharsets.UTF_8);
+    }
+
+}

+ 17 - 0
mjava-lianan/src/main/java/com/malk/lianan/LianAnApplication.java

@@ -0,0 +1,17 @@
+package com.malk.lianan;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+@EnableScheduling
+public class LianAnApplication {
+    public static void main(String[] args) {
+        try {
+            SpringApplication.run(LianAnApplication.class,args);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}

+ 127 - 0
mjava-lianan/src/main/java/com/malk/lianan/RSASignatureUtil.java

@@ -0,0 +1,127 @@
+package com.malk.lianan;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.asymmetric.Sign;
+import cn.hutool.crypto.asymmetric.SignAlgorithm;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * RSA签名工具类(基于Hutool)
+ * 支持异常处理、日志记录、参数校验
+ */
+public class RSASignatureUtil {
+    
+    private static final Logger logger = LoggerFactory.getLogger(RSASignatureUtil.class);
+    
+    // 默认使用SHA256withRSA
+    private static final SignAlgorithm DEFAULT_ALGORITHM = SignAlgorithm.SHA256withRSA;
+    
+    /**
+     * 生成签名(带完整错误处理)
+     */
+    public static String signSafe(String data, String privateKeyBase64) {
+        return signSafe(data, privateKeyBase64, DEFAULT_ALGORITHM);
+    }
+    
+    public static String signSafe(String data, String privateKeyBase64, SignAlgorithm algorithm) {
+        // 参数校验
+        if (StrUtil.isBlank(data)) {
+            logger.warn("签名数据为空");
+            return null;
+        }
+        
+        if (StrUtil.isBlank(privateKeyBase64)) {
+            logger.error("私钥为空");
+            return null;
+        }
+        
+        try {
+            // 使用Hutool的签名工具
+            Sign sign = SecureUtil.sign(algorithm, privateKeyBase64, null);
+            String signature = sign.signHex(data, StandardCharsets.UTF_8);
+            
+            logger.debug("签名成功,数据长度: {}, 签名长度: {}", 
+                        data.length(), signature.length());
+            return signature;
+            
+        } catch (Exception e) {
+            logger.error("签名失败 - 数据: {}, 算法: {}, 错误: {}", 
+                        StrUtil.subPre(data, 100), // 只记录前100字符
+                        algorithm.getValue(),
+                        ExceptionUtil.getMessage(e));
+            return null;
+        }
+    }
+    
+    /**
+     * 验证签名(带完整错误处理)
+     */
+    public static boolean verifySafe(String data, String signatureBase64, String publicKeyBase64) {
+        return verifySafe(data, signatureBase64, publicKeyBase64, DEFAULT_ALGORITHM);
+    }
+    
+    public static boolean verifySafe(String data, String signatureBase64, 
+                                    String publicKeyBase64, SignAlgorithm algorithm) {
+        // 参数校验
+        if (StrUtil.isBlank(data)) {
+            logger.warn("验证数据为空");
+            return false;
+        }
+        
+        if (StrUtil.isBlank(signatureBase64)) {
+            logger.warn("签名为空");
+            return false;
+        }
+        
+        if (StrUtil.isBlank(publicKeyBase64)) {
+            logger.error("公钥为空");
+            return false;
+        }
+        
+        try {
+            // 使用Hutool的签名工具
+            Sign sign = SecureUtil.sign(algorithm, null, publicKeyBase64);
+            boolean isValid = sign.verify(
+                data.getBytes(StandardCharsets.UTF_8),
+                Base64.decode(signatureBase64)
+            );
+            
+            logger.debug("签名验证结果: {}", isValid ? "通过" : "失败");
+            return isValid;
+            
+        } catch (Exception e) {
+            logger.error("签名验证失败 - 数据长度: {}, 算法: {}, 错误: {}", 
+                        data.length(),
+                        algorithm.getValue(),
+                        ExceptionUtil.getMessage(e));
+            return false;
+        }
+    }
+    
+    /**
+     * 批量验证签名
+     */
+    public static boolean verifyBatch(String[] dataArray, String[] signatureArray, 
+                                     String publicKeyBase64) {
+        if (dataArray == null || signatureArray == null || 
+            dataArray.length != signatureArray.length) {
+            logger.error("批量验证参数无效");
+            return false;
+        }
+        
+        for (int i = 0; i < dataArray.length; i++) {
+            if (!verifySafe(dataArray[i], signatureArray[i], publicKeyBase64)) {
+                logger.error("第 {} 个签名验证失败", i + 1);
+                return false;
+            }
+        }
+        
+        logger.info("批量签名验证成功,共验证 {} 个签名", dataArray.length);
+        return true;
+    }
+}

+ 6 - 0
mjava-lianan/src/main/java/com/malk/lianan/RsaUtil.java

@@ -0,0 +1,6 @@
+package com.malk.lianan;
+
+public class RsaUtil {
+
+
+}

文件差异内容过多而无法显示
+ 147 - 0
mjava-lianan/src/main/java/com/malk/lianan/TestUtil.java


+ 51 - 0
mjava-lianan/src/main/java/com/malk/lianan/controller/LianAnBudgetController.java

@@ -0,0 +1,51 @@
+package com.malk.lianan.controller;
+
+import cn.hutool.crypto.digest.MD5;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.server.common.McR;
+import com.malk.utils.PublicUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+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;
+
+@RestController
+@RequestMapping("/budget/")
+@Slf4j
+public class LianAnBudgetController {
+
+    private static String SIGN_KEY="be56e057f20f883e";
+
+    @PostMapping("datasync")
+    public McR dataSync(@RequestBody JSONObject param){
+        log.info("全面预算接口:{}",param);
+        if(PublicUtil.isNull(param,"timestamp","sign","msgType","data")){
+            return McR.error("201","参数校验不通过!");
+        }
+        if(!signCheck(param)){
+            return McR.error("202","签名校验不通过!");
+        }
+        String msgType = param.getString("msgType");
+        if("T01".equals(msgType)){
+            log.info("科目数据:{}",param.get("data"));
+        }else if("T02".equals(msgType)){
+            log.info("产品数据:{}",param.get("data"));
+        }else if("T03".equals(msgType)){
+            log.info("项目数据:{}",param.get("data"));
+        }else if("Y01".equals(msgType)){
+            log.info("预算数据:{}",param.get("data"));
+        }else{
+            return McR.error("203","msgType错误!");
+        }
+        return McR.success();
+    }
+
+    private static boolean signCheck(JSONObject param){
+        String data=SIGN_KEY+param.getString("timestamp")+param.getString("data");
+        MD5 md5 = new MD5();
+        String digestHex = md5.digestHex(data);
+        return digestHex.equals(param.getString("sign"));
+    }
+}

+ 27 - 0
mjava-lianan/src/main/java/com/malk/lianan/controller/LianAnGyPayController.java

@@ -0,0 +1,27 @@
+package com.malk.lianan.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.server.common.McR;
+import com.malk.utils.PublicUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/gypay/")
+@Slf4j
+public class LianAnGyPayController {
+
+    @PostMapping("callback")
+    public McR callback(@RequestBody JSONObject param){
+        log.info("callback:{}",param);
+        return McR.success();
+    }
+
+    @GetMapping("test")
+    public McR test(String id){
+        log.info("test:{}",id);
+        return McR.success();
+    }
+
+}

+ 35 - 0
mjava-lianan/src/main/resources/application-dev.yml

@@ -0,0 +1,35 @@
+server:
+  port: 9003
+  servlet:
+    context-path: /api/lianan
+
+spring:
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/lianan/log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: 2691784047
+  appKey: dinghbynhnd2dbgypmsa
+  appSecret: Kl5Xw8x0TlEIlvcJuUkYZD18UTTShJmfdKrAIpY8oX-Q_tazyUKA28nQh7dG5-mq
+  corpId:
+  aesKey:
+  token:
+
+
+# teambition
+teambition:
+  AppID:
+  AppSecret:
+  TenantId:
+  OperatorId:    # 公共账号, 需要有操作权限 [牧语]
+# aliwork
+aliwork:
+  appType:
+  systemToken:
+

+ 15 - 0
mjava-lianan/src/main/resources/application.yml

@@ -0,0 +1,15 @@
+spring:
+  profiles:
+    active: dev
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+  http:
+    enabled: false
+
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      id-type: auto

+ 16 - 0
mjava-lianan/src/main/resources/cer/ICBC_CZY__SIGN_TEST.cer

@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICmDCCAgGgAwIBAgIEAq6v0jANBgkqhkiG9w0BAQUFADB+MREwDwYDVQQGDAgo
+5Lit5Zu9KTERMA8GA1UECAwIKOW5v+S4nCkxETAPBgNVBAcMCCjlub/lt54pMRcw
+FQYDVQQKDA4o5Lq65rCR57uE57uHKTEXMBUGA1UECwwOKOS6uuawkeWNleS9jSkx
+ETAPBgNVBAMMCCjlvKDkuIkpMCAXDTIxMDgwNTA5MzAzNloYDzIxMjEwNzEyMDkz
+MDM2WjB+MREwDwYDVQQGDAgo5Lit5Zu9KTERMA8GA1UECAwIKOW5v+S4nCkxETAP
+BgNVBAcMCCjlub/lt54pMRcwFQYDVQQKDA4o5Lq65rCR57uE57uHKTEXMBUGA1UE
+CwwOKOS6uuawkeWNleS9jSkxETAPBgNVBAMMCCjlvKDkuIkpMIGfMA0GCSqGSIb3
+DQEBAQUAA4GNADCBiQKBgQCmudhlkVXrFP1DB0r11LvVpy8nYVO9sR2tYLXCkQxX
+E4HR2VlihCO43B2v/Ep3tlny4l/OX++AQX4sJpO8vAnCRmNIAgXKXAfvre1HTSkJ
+f9vb8G9sf4UsZX2bLEOtH4wOO7Osv8Za98WzBHBRrqESI91Z4GSE0/8ucMp6V7EZ
+5wIDAQABoyEwHzAdBgNVHQ4EFgQUBsYJEnvf2AxVqDtEm8Wl6SMvFh0wDQYJKoZI
+hvcNAQEFBQADgYEAAeDqJsLkkADrht3MiQ35D4J9ka29VWY+bw153OhrC9MGga+O
+BfLP/jyO3kBoG39I/2eyajrF7UMsxfRrsaGx705xWtqhSpeXsfxYO1hIDrXBlQKy
+hj5PAScDSZ5FB3atuhQw5M2BLbVuqn9nTGJiV3RUGqjq+OqgLKnTkm7Sn7A=
+-----END CERTIFICATE-----

+ 61 - 0
mjava-lianan/src/main/resources/logback-spring.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="false" scanPeriod="60 seconds">
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/home/server/log/"/>
+    <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
+
+    <!-- 定义控制台输出 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 指定日志文件的名称 -->
+        <!--<file>${FileNamePattern}/info.log</file>-->
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${FileNamePattern}/info-%i.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>30MB</MaxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <Key>processid</Key>
+            <DefaultValue>sys</DefaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${processid}"
+                      class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <FileNamePattern>
+                        ${FileNamePattern}/${processid}.log
+                    </FileNamePattern>
+                </rollingPolicy>
+                <layout class="ch.qos.logback.classic.PatternLayout">
+                    <Pattern>
+                        %d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n
+                    </Pattern>
+                </layout>
+            </appender>
+        </sift>
+    </appender>
+
+
+    <!-- 日志输出级别 -->
+    <logger name="org.springframework" level="debug"  additivity="false"/>
+    <logger name="com.malk.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

文件差异内容过多而无法显示
+ 226 - 0
mjava-lingmingguangzi/src/test/java/com/malk/lingmingguangzi/YdTest.java


+ 8 - 0
mjava-tonglibo/src/main/java/com/malk/tonglibo/controller/machineController.java

@@ -135,6 +135,14 @@ public class machineController {
         return result;
     }
 
+    private String getValue(List list,int index){
+        if(index >= list.size()){
+            return "";
+        }else{
+            return list.get(index).toString();
+        }
+    }
+
     private String safeGet(List<String> list, int index) {
         if (list == null) {
             return "";

+ 1 - 1
mjava-xzkj/src/main/java/com/malk/xzkj/XzkjApplication.java

@@ -1,4 +1,4 @@
-package com.malk.xzkj;
+package com.malk.lianan;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;

+ 1 - 1
mjava-xzkj/src/main/java/com/malk/xzkj/config/TXYConf.java

@@ -1,4 +1,4 @@
-package com.malk.xzkj.config;
+package com.malk.lianan.config;
 
 import com.malk.utils.UtilMap;
 import lombok.Data;

+ 4 - 7
mjava-xzkj/src/main/java/com/malk/xzkj/controller/IVController.java

@@ -1,10 +1,8 @@
-package com.malk.xzkj.controller;
+package com.malk.lianan.controller;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
-import com.malk.xzkj.model.McInvoiceDto;
-import com.malk.xzkj.model.McInvoiceKind;
-import com.malk.xzkj.config.TXYConf;
+import com.malk.lianan.model.McInvoiceDto;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.FilePath;
@@ -12,10 +10,9 @@ import com.malk.server.common.McException;
 import com.malk.server.common.McR;
 import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
-import com.malk.service.aliwork.YDService;
 import com.malk.utils.*;
-import com.malk.xzkj.service.IvYdService;
-import com.malk.xzkj.service.TXYInvoice;
+import com.malk.lianan.service.IvYdService;
+import com.malk.lianan.service.TXYInvoice;
 import com.spire.pdf.PdfCompressionLevel;
 import com.spire.pdf.PdfDocument;
 import com.spire.pdf.PdfPageBase;

+ 1 - 1
mjava-xzkj/src/main/java/com/malk/xzkj/model/McInvoiceDto.java

@@ -1,4 +1,4 @@
-package com.malk.xzkj.model;
+package com.malk.lianan.model;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.malk.base.BaseDto;

+ 1 - 1
mjava-xzkj/src/main/java/com/malk/xzkj/model/McInvoiceKind.java

@@ -1,4 +1,4 @@
-package com.malk.xzkj.model;
+package com.malk.lianan.model;
 
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;

+ 1 - 1
mjava-xzkj/src/main/java/com/malk/xzkj/service/IvYdService.java

@@ -1,4 +1,4 @@
-package com.malk.xzkj.service;
+package com.malk.lianan.service;
 
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;

+ 1 - 1
mjava-xzkj/src/main/java/com/malk/xzkj/service/TXYInvoice.java

@@ -1,4 +1,4 @@
-package com.malk.xzkj.service;
+package com.malk.lianan.service;
 
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 

+ 2 - 2
mjava-xzkj/src/main/java/com/malk/xzkj/service/impl/IvYdServiceImpl.java

@@ -1,11 +1,11 @@
-package com.malk.xzkj.service.impl;
+package com.malk.lianan.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.service.aliwork.YDClient;
 import com.malk.utils.UtilMap;
-import com.malk.xzkj.service.IvYdService;
+import com.malk.lianan.service.IvYdService;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;

+ 3 - 3
mjava-xzkj/src/main/java/com/malk/xzkj/service/impl/TXYImplInvoice.java

@@ -1,11 +1,11 @@
-package com.malk.xzkj.service.impl;
+package com.malk.lianan.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.malk.server.common.McException;
 import com.malk.utils.UtilMap;
 import com.malk.utils.UtilNumber;
-import com.malk.xzkj.config.TXYConf;
-import com.malk.xzkj.service.TXYInvoice;
+import com.malk.lianan.config.TXYConf;
+import com.malk.lianan.service.TXYInvoice;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 import com.tencentcloudapi.common.profile.ClientProfile;

+ 1 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/controller/ZwErpController.java

@@ -46,6 +46,7 @@ public class ZwErpController {
             serarchParam.put("textField_mdwr7jnh",param.get("saleCode"));
             serarchParam.put("textField_mdwpe4m7",param.get("noticeCode"));
             serarchParam.put("textField_mdwr7jni",param.get("code"));
+            serarchParam.put("textField_mdqsatd4",param.get("prod"));
             ydClient.operateData(YDParam.builder().formUuid("FORM-54A845D217A64108BC2B288F6F0BE622BR5C")
                     .searchCondition(JSONObject.toJSONString(serarchParam))
                     .formDataJson(JSONObject.toJSONString(formData)).build(), YDConf.FORM_OPERATION.upsert);

+ 3 - 3
mjava-zhiwei/src/main/java/com/malk/zhiwei/schedule/ScheduleTask.java

@@ -56,10 +56,10 @@ public class ScheduleTask {
 
             if("销售订单".equals(type)){
                 JSONObject jsonObject=zwService.saveSaleOrder(formData);
-                comp(formInstanceId,"同步完成!",JSONObject.toJSONString(jsonObject),null);
+                comp(formInstanceId,"同步完成!",JSONObject.toJSONString(jsonObject.getJSONObject("result")),jsonObject);
             }else if("发货单".equals(type)){
                 JSONObject jsonObject=zwService.saveDeliveryOrder(formData);
-                comp(formInstanceId,"同步完成!",JSONObject.toJSONString(jsonObject),null);
+                comp(formInstanceId,"同步完成!",JSONObject.toJSONString(jsonObject.getJSONObject("result")),jsonObject);
             }else if("产品同步".equals(type)){
                 zwService.syncProduct(UtilMap.getString(formData,"textField_mcefftng"),UtilMap.getString(formData,"textField_mdr1v1di"));
                 comp(formInstanceId,"同步完成!","",null);
@@ -74,8 +74,8 @@ public class ScheduleTask {
 
     @Scheduled(cron = "0 0 1 * * ?")
     public void syncProd() {
+        zwService.syncProduct("","PILOT2024");
         zwService.syncProduct("","PILOT2023");
-//        zwService.syncProduct("","PILOT2024");
     }
 
     private void processing(String id){

+ 30 - 26
mjava-zhiwei/src/main/java/com/malk/zhiwei/service/impl/ZwServiceImpl.java

@@ -105,18 +105,13 @@ public class ZwServiceImpl implements ZwService {
         String data=JSONObject.toJSONString(dataObj);
         log.info("入参:{}",data);
         // 调用接口
-        JSONObject result=saveSaleOrder(UtilMap.getString(formData,"textField_mcefftni"),UtilMap.getString(formData,"textField_mdr1v1di"));
+        JSONObject result=saveSaleOrder(data,UtilMap.getString(formData,"textField_mdr1v1di"));
         JSONArray codes=result.getJSONArray("page");
-        for (int i = 0; i < list.size(); i++) {
-            Map tempMap=new HashMap();
-            tempMap.put("textField_mdqsatd4",UtilMap.getString(list.get(i),"textField_mdqs9oqa"));
-            tempMap.put("textField_mdwpe4m6","合同");
-            if(codes.size() >= i){
-                tempMap.put("textField_mdqsatd5",codes.getJSONObject(i).getString("CODE"));
-            }
-            ydClient.operateData(YDParam.builder().formUuid("FORM-E999482BC03547D89A435F5441A46F1ANR0R").formDataJson(JSONObject.toJSONString(tempMap)).build(), YDConf.FORM_OPERATION.create);
-        }
-        return result;
+        String id=codes.getJSONObject(0).getString("CODE");
+        JSONObject result1=new JSONObject();
+        result1.put("textField_me17f355",id); // erp单号
+        result1.put("result",result);
+        return result1;
     }
 
     private static JSONObject saveDeliveryOrder(String data,String erpPilot){
@@ -155,17 +150,22 @@ public class ZwServiceImpl implements ZwService {
         log.info("入参:{}",data);
         JSONObject result=saveDeliveryOrder(data,UtilMap.getString(formData,"textField_mdr1v1di"));
         JSONArray codes=result.getJSONArray("page");
-        for (int i = 0; i < list.size(); i++) {
-            Map tempMap=new HashMap();
-            tempMap.put("textField_mdqsatd4",UtilMap.getString(list.get(i),"textField_mdqs9oqa"));
-            tempMap.put("textField_mdwpe4m6","发货");
-            tempMap.put("textField_mdwpe4m7",UtilMap.getString(formData,"textField_mdwqclqh"));
-            if(codes.size() >= i){
-                tempMap.put("textField_mdqsatd5",codes.getJSONObject(i).getString("CODE"));
-            }
-            ydClient.operateData(YDParam.builder().formUuid("FORM-E999482BC03547D89A435F5441A46F1ANR0R").formDataJson(JSONObject.toJSONString(tempMap)).build(), YDConf.FORM_OPERATION.create);
-        }
-        return result;
+        String id=codes.getJSONObject(0).getString("CODE");
+        JSONObject result1=new JSONObject();
+        result1.put("textField_me17f355",id); // erp单号
+        result1.put("result",result);
+        return result1;
+//        for (int i = 0; i < list.size(); i++) {
+//            Map tempMap=new HashMap();
+//            tempMap.put("textField_mdqsatd4",UtilMap.getString(list.get(i),"textField_mdqs9oqa"));
+//            tempMap.put("textField_mdwpe4m6","发货");
+//            tempMap.put("textField_mdwpe4m7",UtilMap.getString(formData,"textField_mdwqclqh"));
+//            if(codes.size() >= i){
+//                tempMap.put("textField_mdqsatd5",codes.getJSONObject(i).getString("CODE"));
+//            }
+//            ydClient.operateData(YDParam.builder().formUuid("FORM-E999482BC03547D89A435F5441A46F1ANR0R").formDataJson(JSONObject.toJSONString(tempMap)).build(), YDConf.FORM_OPERATION.create);
+//        }
+//        return result;
         // 调用接口
     }
 
@@ -180,10 +180,14 @@ public class ZwServiceImpl implements ZwService {
         for (int i = 0; i < data.size(); i++) {
             JSONObject dataObj = data.getJSONObject(i);
             String productId=UtilMap.getString(dataObj,"CODE");
-            Map saveMap=UtilMap.map("textField_mcijetil, textField_l43jpnsf, textField_l43jpnsh",productId,dataObj.getString("CNAME"),dataObj.getString("SPEC"));
-            ydClient.operateData(YDParam.builder().formUuid("FORM-4A7B1A62CCFC4D758AB98ADE3F97D40COYO2")
-                    .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mcijetil", productId)))
-                    .formDataJson(JSONObject.toJSONString(saveMap)).build(), YDConf.FORM_OPERATION.upsert);
+            Map saveMap=UtilMap.map("textField_mcijetil, textField_l43jpnsf, textField_l43jpnsh","selectField_me6qde0j",productId,dataObj.getString("CNAME"),dataObj.getString("SPEC"),erpPilot);
+            try {
+                ydClient.operateData(YDParam.builder().formUuid("FORM-4A7B1A62CCFC4D758AB98ADE3F97D40COYO2")
+                        .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mcijetil", productId)))
+                        .formDataJson(JSONObject.toJSONString(saveMap)).build(), YDConf.FORM_OPERATION.upsert);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
         }
     }
 }