Explorar o código

Merge remote-tracking branch 'origin/master'

“lqy hai 1 mes
pai
achega
33703c193e

+ 51 - 5
mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java

@@ -325,19 +325,42 @@ public class BoyangServiceImpl implements BoyangService {
 
                 String signedFileName = fileName.substring(0, suffixIndex) + "(已签署)" + fileName.substring(suffixIndex);
 
-                //todo 1、评论签署后附件下载链接
+                //todo 方案1、评论签署后附件下载链接
 //                    comment(processInstanceId,userId,"接口测试 "+ "已签署,签署文件下载地址:" + signDownloadOuterUrl,null);
 
 
 
-                //todo 2、评论签署后附件
-                //todo 签署后文件下载到本地
+                //方案2、评论签署后附件
+                //签署后文件下载到本地
                 downloadFile(signDownloadOuterUrl,downloadPath + signedFileName);
-                //todo 签署后文件上传到钉盘
+                //签署后文件上传到钉盘
                 Map dentry = uploadDdFile(spaceId, parentDentryUuid, downloadPath + signedFileName, operatorUnionId);
-                //todo 审批单添加评论
+                //审批单添加评论
                 comment(processInstanceId,originatorUserId,fileName + "已签署",Arrays.asList(dentry));
             }
+
+            //自动通过节点
+            List<Map> tasks = UtilMap.getList(result, "tasks");
+            for (Map task : tasks) {
+                String activityId = UtilMap.getString(task, "activityId");
+                //e签宝签署节点id:f0e3_8ef9
+                if ("f0e3_8ef9".equals(activityId)){
+                    long taskId = UtilMap.getLong(task, "taskId");
+                    String userId = UtilMap.getString(task, "userId");
+
+                    Map body = new HashMap();
+                    body.put("processInstanceId",processInstanceId);
+                    body.put("remark","签署完成自动通过");
+                    body.put("result","agree");
+                    body.put("actionerUserId",userId);
+                    body.put("taskId",taskId);
+
+                    UtilHttp.doPost("https://api.dingtalk.com/v1.0/workflow/processInstances/execute", ddClient.initTokenHeader(), null, body);
+
+                    return;
+                }
+            }
+
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
@@ -390,6 +413,29 @@ public class BoyangServiceImpl implements BoyangService {
 
             //审批单添加评论
             comment(processInstanceId,originatorUserId,"签署地址:" + signUrlShort,null);
+
+            //自动通过节点
+            List<Map> tasks = UtilMap.getList(result, "tasks");
+            for (Map task : tasks) {
+                String activityId = UtilMap.getString(task, "activityId");
+                //e签宝设置签署区节点id:802c_7eaf
+                if ("802c_7eaf".equals(activityId)){
+                    long taskId = UtilMap.getLong(task, "taskId");
+                    String userId = UtilMap.getString(task, "userId");
+
+                    Map body = new HashMap();
+                    body.put("processInstanceId",processInstanceId);
+                    body.put("remark","签署区设置完成自动通过");
+                    body.put("result","agree");
+                    body.put("actionerUserId",userId);
+                    body.put("taskId",taskId);
+
+                    UtilHttp.doPost("https://api.dingtalk.com/v1.0/workflow/processInstances/execute", ddClient.initTokenHeader(), null, body);
+
+                    return;
+                }
+            }
+
         } catch (Exception e) {
             throw new RuntimeException(e);
         }

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

@@ -144,6 +144,8 @@ public class EqbServiceImpl implements EqbService {
 
         String fileName = UtilMap.getString(formData, "textField_meqr38kq");//用印文件名称
 
+        String signType = UtilMap.getString(formData, "radioField_mk0s5sf9");//签章类型
+
         JSONObject reqBodyObj = new JSONObject();
 
         List<Map> components = new ArrayList<>();
@@ -189,6 +191,7 @@ public class EqbServiceImpl implements EqbService {
         reqBodyObj2.put("signFlowConfig",signFlowConfig);
 
         //签署方信息
+        //我方
         Map signer = new HashMap();
         signer.put("signerType",1);//签署方类型,0 - 个人,1 - 企业/机构,2 - 法定代表人,3 - 经办人
 
@@ -219,6 +222,56 @@ public class EqbServiceImpl implements EqbService {
 
         reqBodyObj2.put("signers",Arrays.asList(signer));
 
+        //他方
+        String jbr = "";
+        String jbrdh = "";
+        String orgName = "";
+        if ("双方签章".equals(signType)){
+            switch (type){
+                case "销售合同-经销商":
+                    jbr = UtilMap.getString(formData, "textField_mk0s5sfa");//需方经办人
+                    jbrdh = UtilMap.getString(formData, "textField_mf50cbqw");//需方经办人电话
+                    orgName = UtilMap.getString(formData, "textField_mjaukh2p");//需方名称
+                    break;
+                case "销售合同-其他客户":
+                    jbr = UtilMap.getString(formData, "textField_mk0s5sfh");//需方经办人
+                    jbrdh = UtilMap.getString(formData, "textField_mk0s5sfg");//需方经办人电话
+                    orgName = UtilMap.getString(formData, "textField_mjaukh2p");//需方名称
+                    break;
+                case "采购订单":
+                    jbr = UtilMap.getString(formData, "textField_mj8dt3g8");//供方经办人
+                    jbrdh = UtilMap.getString(formData, "textField_mj8dt3g9");//供方经办人电话
+                    orgName = UtilMap.getString(formData, "textField_mj8dt3g7");//供方名称
+                    break;
+                default:break;
+            }
+
+            Map signer2 = new HashMap();
+            signer2.put("signerType",1);//签署方类型,0 - 个人,1 - 企业/机构,2 - 法定代表人,3 - 经办人
+
+            Map orgSignerInfo2 = new HashMap();
+            orgSignerInfo2.put("orgName",orgName);//对方机构名称
+            //企业/机构经办人信息
+            Map transactorInfo2 = new HashMap();
+            transactorInfo2.put("psnAccount",jbrdh);//经办人账号标识,手机号或邮箱,必须配合psnName(经办人姓名)传入
+            Map psnInfo = new HashMap();
+            psnInfo.put("psnName",jbr);//经办人姓名
+            transactorInfo2.put("psnInfo",psnInfo);
+            orgSignerInfo2.put("transactorInfo",transactorInfo2);
+            signer2.put("orgSignerInfo",orgSignerInfo2);
+
+            Map signField2 = new HashMap();
+            signField2.put("fileId",fileId);
+            signField2.put("customBizNum",formInstId);
+            Map normalSignFieldConfig2 = new HashMap();
+            normalSignFieldConfig2.put("freeMode",true);
+
+            signField2.put("normalSignFieldConfig",normalSignFieldConfig2);
+            signer2.put("signFields",Arrays.asList(signField2));
+
+            reqBodyObj2.put("signers",Arrays.asList(signer,signer2));
+        }
+
         Map result2 = eqbPost("/v3/sign-flow/create-by-file", reqBodyObj2);
 
         String signFlowId = UtilMap.getString(result2, "signFlowId");
@@ -240,6 +293,23 @@ public class EqbServiceImpl implements EqbService {
                 .atUserId(atUserId)//陈伟东
                 .build(), YDConf.FORM_OPERATION.remarks);
 
+        if ("双方签章".equals(signType)){
+            JSONObject reqBodyObj4 = new JSONObject();
+            Map operator2 = new HashMap();
+            operator2.put("psnAccount", jbrdh);
+            reqBodyObj4.put("operator", operator2);
+            reqBodyObj4.put("needLogin", true);
+            Map result4 = eqbPost("/v3/sign-flow/" + signFlowId + "/sign-url", reqBodyObj4);
+
+            String shortUrl2 = UtilMap.getString(result4, "shortUrl");
+
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(formInstId)
+                    .content("对方签署地址:"+shortUrl2)
+                    .userId("yida_pub_account")
+                    .build(), YDConf.FORM_OPERATION.remarks);
+        }
+
 
         return McR.success();
     }

+ 5 - 1
mjava-lianan/pom.xml

@@ -45,7 +45,11 @@
             <artifactId>lombok</artifactId>
             <version>1.18.30</version>
         </dependency>
-
+        <dependency>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <groupId>org.bouncycastle</groupId>
+            <version>1.70</version>
+        </dependency>
     </dependencies>
 
     <build>

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

@@ -1,6 +1,45 @@
 package com.malk.lianan;
 
+import cn.hutool.core.codec.Base64;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.security.spec.PKCS8EncodedKeySpec;
+
 public class RsaUtil {
 
+    private final static String KEY_RSA = "RSA";
+    private final static String KEY_RSA_SIGNATURE = "SHA256WithRSA";
+    private static BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
+
+    public static String sign(byte[] data, String privateKey) {
+        String str = "";
+        try {
+// 解密由 base64 编码的私钥
+            byte[] bytes = decryptBase64(privateKey);
+// 构造 PKCS8EncodedKeySpec 对象
+            PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(bytes);
+// 指定的加密算法
+            KeyFactory factory = KeyFactory.getInstance(KEY_RSA,bouncyCastleProvider);
+// 取私钥对象
+            PrivateKey key = factory.generatePrivate(pkcs);
+// 用私钥对信息生成数字签名
+            Signature signature =Signature.getInstance(KEY_RSA_SIGNATURE,bouncyCastleProvider);
+            signature.initSign(key);
+            signature.update(data);
+            str = encryptBase64(signature.sign());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return str;
+    }
+    public static byte[] decryptBase64(String key) throws Exception {
+        return Base64.decode(key);
+    }
+    public static String encryptBase64(byte[] key) throws Exception {
+        return new String(Base64.encode(key));
+    }
 
 }

+ 7 - 6
mjava-lianan/src/main/java/com/malk/lianan/TestUtil.java

@@ -3,6 +3,7 @@ package com.malk.lianan;
 import cn.hutool.core.codec.Base64;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.Mode;
 import cn.hutool.crypto.Padding;
@@ -111,7 +112,7 @@ public class TestUtil {
         head.put("Timestamp", UtilDateTime.getLocalDateTimeTimeStamp());
         head.put("SystemNo",GYPAY_API_SYS_ID);
         head.put("SystemName",GYPAY_API_SYS_NAME);
-        head.put("RequestNo","12150007");
+        head.put("RequestNo", IdUtil.nanoId(6));
         Map<String,Object> body = new HashMap<>();
         Map<String,Object> item = new HashMap<>();
         item.put("AcctNo",GYPAY_API_ACCOUNT_NO);
@@ -125,7 +126,7 @@ public class TestUtil {
         log.info("encrypt:{},{}","",encrypt);
         //解密
         body.put("Data", encrypt);
-        String signed=RSASignatureUtil.signSafe(JSONObject.toJSONString(data),GYPAY_API_PRI_KEY);
+        String signed=RsaUtil.sign(JSONObject.toJSONString(data).getBytes(),GYPAY_API_PRI_KEY);
         body.put("Sign", signed);
 
         Map<String,Object> Cmscloud = new HashMap<>();
@@ -164,12 +165,12 @@ public class TestUtil {
         item.put("NextTag",1);
 
         Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
-        System.out.println(JSON.toJSONString(data));
-        String encrypt = AesUtil.encrypt(JSON.toJSONString(data),GYPAY_API_AES_KEY);
+        String dataStr = JSON.toJSONString(data);
+        System.out.println(dataStr);
+        String encrypt = AesUtil.encrypt(dataStr,GYPAY_API_AES_KEY);
         log.info("encrypt:{},{}","",encrypt);
-        //解密
         body.put("Data", encrypt);
-        String signed=RSASignatureUtil.signSafe(encrypt,GYPAY_API_PRI_KEY);
+        String signed=RsaUtil.sign(dataStr.getBytes(),GYPAY_API_PRI_KEY);
         body.put("Sign", signed);
 
         Map<String,Object> Cmscloud = new HashMap<>();

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

@@ -14,9 +14,9 @@ logging:
 
 # dingtalk
 dingtalk:
-  agentId: 2691784047
-  appKey: dinghbynhnd2dbgypmsa
-  appSecret: Kl5Xw8x0TlEIlvcJuUkYZD18UTTShJmfdKrAIpY8oX-Q_tazyUKA28nQh7dG5-mq
+  agentId: 4133525536
+  appKey: ding8x2uxxm58xz1x9oa
+  appSecret: x1P5rXTUa9ThrfXRbB1ujLlPQa86Ldm7YQ62hcKkdxPVSpyS86vE3ICZV0L6JXKg
   corpId:
   aesKey:
   token:
@@ -30,6 +30,6 @@ teambition:
   OperatorId:    # 公共账号, 需要有操作权限 [牧语]
 # aliwork
 aliwork:
-  appType:
-  systemToken:
+  appType: APP_SHFYYZC42VXVVNZVOTLO
+  systemToken: 69G66AB1QAM1CZPQN13WT9MHRP5D3TFE78IJM3L71