Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master'

lfx 1 settimana fa
parent
commit
29c8061b00

+ 7 - 0
mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java

@@ -40,6 +40,9 @@ public class BoyangServiceImpl implements BoyangService {
     @Autowired
     private DDClient_Personnel ddClient_personnel;
 
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+
     @Value("${dingtalk.downloadPath}")
     private String downloadPath;
 
@@ -344,6 +347,10 @@ public class BoyangServiceImpl implements BoyangService {
             Map result = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), processInstanceId);
             String originatorUserId = UtilMap.getString(result, "originatorUserId");
 
+            /*Map userInfo = ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), originatorUserId);
+
+            String originatorUserIdUnionid = UtilMap.getString(userInfo, "unionid");*/
+
             // 获取签署流程进度详情
             Map data = (Map) eqbGet(host + "/esign-signs/v1/signFlow/signDetail?signFlowId=" + signFlowId);
             List<Map> signFiles = UtilMap.getList(data, "signFiles");

+ 105 - 4
mjava-boyang/src/test/java/com/malk/boyang/DdTest.java

@@ -1,8 +1,11 @@
 package com.malk.boyang;
 
+import cn.hutool.core.date.DateUtil;
 import com.malk.boyang.service.BoyangService;
 import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Contacts;
+import com.malk.service.dingtalk.DDClient_Workflow;
 import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
@@ -16,12 +19,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -36,6 +37,12 @@ public class DdTest {
     @Autowired
     private BoyangService boyangService;
 
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+
     @Test
     public void test(){
         try {
@@ -88,5 +95,99 @@ public class DdTest {
     public void test2(){
         boyangService.eSignSubmit(UtilMap.map("processInstanceId","9L_PKi71S8W3kL_nftFpXw01161764152519"));
     }
+
+    @Test
+    //上传钉盘附件
+    public void testUpload() {
+        //获取当前时间戳
+        long beginTimestamp = System.currentTimeMillis();
+        System.out.println("开始上传附件:" + DateUtil.format(new Date(beginTimestamp), "yyyy-MM-dd HH:mm:ss"));
+
+        //文件
+        File file = new File("C:\\Users\\EDY\\Pictures\\2.png");
+
+        //获取文件上传信息
+        Map param = new HashMap();
+        param.put("unionId","5PK3cMYhiStn7HDoNabweEgiEiE");//wzy
+        Map body = new HashMap();
+        body.put("protocol","HEADER_SIGNATURE");
+        body.put("multipart",false);
+
+        Map header = UtilMap.map("x-acs-dingtalk-access-token","5747a3e5c3823be0bd982dccdf78289e");
+
+        DDR_New ddr = (DDR_New) UtilHttp.doPost("https://api.dingtalk.com/v1.0/storage/spaces/" + "27105381865" + "/files/uploadInfos/query", header, param, body, DDR_New.class);
+        String uploadKey = ddr.getUploadKey();
+        Map headerSignatureInfo = ddr.getHeaderSignatureInfo();
+        Map<String,String> headers = (Map<String,String>) headerSignatureInfo.get("headers");
+        List<String> resourceUrls = (List<String>) headerSignatureInfo.get("resourceUrls");
+        String resourceUrl = resourceUrls.get(0);
+
+        Map dentry = new HashMap();
+        //使用OSS的header加签方式上传文件
+        try {
+            URL url = new URL(resourceUrl);
+            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
+            if (headers != null) {
+                for (Map.Entry<String, String> entry : headers.entrySet()) {
+                    connection.setRequestProperty(entry.getKey(), entry.getValue());
+                }
+            }
+            connection.setDoOutput(true);
+            connection.setRequestMethod("PUT");
+            connection.setUseCaches(false);
+            connection.setReadTimeout(10000);
+            connection.setConnectTimeout(10000);
+            connection.connect();
+            OutputStream out = connection.getOutputStream();
+            InputStream is = new FileInputStream(file);
+            byte[] b =new byte[1024];
+            int temp;
+            while ((temp=is.read(b))!=-1){
+                out.write(b,0,temp);
+            }
+            out.flush();
+            out.close();
+            int responseCode = connection.getResponseCode();
+            connection.disconnect();
+            if (responseCode == 200) {
+                System.out.println("上传成功");
+            } else {
+                System.out.println("上传失败");
+            }
+            //提交文件
+            Map body2 = new HashMap();
+            Map option = new HashMap();
+            option.put("conflictStrategy","OVERWRITE");
+            body2.put("uploadKey",uploadKey);
+            body2.put("name",file.getName());
+            body2.put("option",option);
+
+//            param.put("unionId","58FDG7fqGyXrGziPavPO4kQiEiE");//lqy
+
+            DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://api.dingtalk.com/v2.0/storage/spaces/files/"+ "DEN7dx2rn0JbYn37a7acrVMGjLRb3o1v" +"/commit", header, param, body2, DDR_New.class);
+            dentry = ddrNew.getDentry();
+
+        }catch (IOException e){
+            log.info("上传文件异常:{}",e);
+        }
+
+        long endTimestamp = System.currentTimeMillis();
+        System.out.println("上传文件结束:" + DateUtil.format(new Date(endTimestamp), "yyyy-MM-dd HH:mm:ss"));
+        System.out.println("上传文件耗时:" + (endTimestamp - beginTimestamp)/1000.0 + "s");
+        System.out.println(dentry);
+    }
+
+    @Test
+    public void test3() {
+        Map result = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), "yY-nxf1UTUWxEUXnjDv7Yg01161768554568");
+        String originatorUserId = UtilMap.getString(result, "originatorUserId");
+
+        Map userInfo = ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), originatorUserId);
+
+        String originatorUserIdUnionid = UtilMap.getString(userInfo, "unionid");
+
+        System.out.println(originatorUserIdUnionid);
+
+    }
 }
 

File diff suppressed because it is too large
+ 28 - 17
mjava-lianan/src/main/java/com/malk/lianan/controller/LianAnGyPayController.java


+ 2 - 0
mjava-lianan/src/main/java/com/malk/lianan/service/LianAnGyPayService.java

@@ -10,4 +10,6 @@ public interface LianAnGyPayService {
     McR retryPay(Map map);
 
     void callback(Map result);
+
+    McR salaryPay(Map map);
 }

+ 174 - 10
mjava-lianan/src/main/java/com/malk/lianan/service/impl/LianAnGyServiceImpl.java

@@ -17,6 +17,7 @@ import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -65,7 +66,13 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
         String fkgs = UtilMap.getString(formData, "textField_mjzgymw0");//付款公司
         String fkfyhzh = UtilMap.getString(formData, "textField_mjzgymw1");//付款方银行账号
 
-        item.put("BillsPayOrderNo",formInstId);//外部系统单据编号
+        int retryNUM = UtilMap.getInt(formData, "numberField_mkp4wc2r");//重试次数
+
+        if (retryNUM > 0){
+            item.put("BillsPayOrderNo",formInstId + "_" + retryNUM);//外部系统单据编号
+        }else {
+            item.put("BillsPayOrderNo",formInstId);//外部系统单据编号
+        }
 
         //时间戳转化为yyyy-MM-dd
         long fkrq = UtilMap.getLong(formData, "dateField_mkdsowjd");
@@ -101,7 +108,7 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
             String privateAmount = UtilMap.getDouble(detail,"numberField_mjsl53ke").toString();//付款金额
             String receiveAccountNo = UtilMap.getString(detail,"textField_mjsl53kd");//收款方银行账号
             String receiveAccountName = UtilMap.getString(detail,"textField_mjsl53kb");//收款方账户名称
-            String payUse = UtilMap.getString(detail,"textareaField_mjsl53kh");//用途:不得有非法字符,包括 ' " : %
+            String payUse = UtilMap.getString(detail,"textareaField_mjsl53kh");//费用明细
 
             Map paymentRec = new HashMap();
             paymentRec.put("BillsPayOrderNo",billsPayOrderNo);
@@ -109,7 +116,7 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
             paymentRec.put("ReceiveAccountNo",receiveAccountNo);
             paymentRec.put("ReceiveAccountName",receiveAccountName);
             paymentRec.put("PayUse",payUse);
-            paymentRec.put("Purpose","租金");
+            paymentRec.put("Purpose",payUse);
 
             paymentRecList.add(paymentRec);
         }
@@ -159,23 +166,27 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
             default:break;
         }
 
-        String note = UtilMap.getString(formData, "textareaField_mkdsowjj");//备注
+        String payAmount = UtilMap.getDouble(formData, "numberField_mjqt1xrt").toString();
+
+        String payUse = UtilMap.getString(formData, "textareaField_mjsl53kh");//摘要
 
         int retryNum = UtilMap.getInt(formData, "numberField_mkf5q51o");//重试次数
 
         Map item = new HashMap();
         item.put("BillsPayOrderNo",formInstId+"_"+retryNum);//外部系统单据编号
         item.put("PaymentDate",fkrqStr);//付款日期(期望支付日期)
+        item.put("PayType","1");//付款类型 默认1.单笔付款,表示一对一(对公/对私)支付
         item.put("BusinessTypeCode",GYPAY_API_TYPE_NO);//业务类型编号
         item.put("BusinessTypeName",GYPAY_API_TYPE_NAME);//业务类型名称
         item.put("PayOrgName",fkdwmc);//付款单位名称
         item.put("PayAccountNo",fkfyhzh);//付款方银行账号
         item.put("PayChannel",payChannelValue);//支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
-        item.put("SumPayAmount",UtilMap.getDouble(formData, "numberField_mkdsowjo").toString());//合计付款金额
+        item.put("PayAmount",payAmount);//付款金额
         item.put("PayCurrencyType","CNY");//币种(为空,默认: CNY 有付款账号时,不能为 空)
         item.put("PayCurrencyName","人民币");//币种名称(为空,默认:人民币, 有付款账号时,不能为空)
         item.put("WhetherUrgent",whetherUrgentValue);//是否加急 1.是 2.否
-        item.put("Note",note);//备注
+        item.put("PayUse",payUse);
+        item.put("Purpose",payUse);
 
         Map paymentRec = new HashMap();
         paymentRec.put("ReceiveAccountNo",skfyhzh);
@@ -192,36 +203,172 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
         return McR.success();
     }
 
+    @Async
     @Override
     public void callback(Map result) {
         String resultCode = UtilMap.getString(result, "ResultCode");
         String resultMsg = UtilMap.getString(result, "ResultMsg");
         Map resultInfo = ((List<Map>) UtilMap.getList(result, "ResultSet")).get(0);
-        String billsPayOrderNo = UtilMap.getString(resultInfo, "BillsPayOrderNo");//外部系统单据编号
+        String[] split = UtilMap.getString(resultInfo, "BillsPayOrderNo").split("_");
+        boolean isRetry = false;
+        if (split.length > 1) {
+            isRetry = true;
+        }
+        String billsPayOrderNo = split[0];//外部系统单据编号  格式:实例id/实例id_重试次数
 
         if ("0000".equals(resultCode)) {
+            //付款单生成成功 财资云支付结果
             String payStatus = UtilMap.getString(resultInfo, "PayStatus");//业务状态:1-支付中,2-支付成功,3-支付失败,4- 已退款,5-部分支付成功,6-部分退款,10-未知
-            String PayStatusName = UtilMap.getString(resultInfo, "PayStatusName");//业务状态名称
+            String payStatusName = getPayStatusName(payStatus);//业务状态名称
             String relPaymentDate = UtilMap.getString(resultInfo, "RelPaymentDate");//实际付款日期(部分付款有成功时为最大支付日期)
+            String failReasons = UtilMap.getString(resultInfo, "FailReasons");
+
+            String relBillsCode = UtilMap.getString(resultInfo, "RelBillsCode");//工银实际单据号
+
+            //更新付款单信息
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(billsPayOrderNo)
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mkp4wc2q, textareaField_mjs6mcgf, textField_mkp5mn5l","生成成功","",relBillsCode)))
+                    .build(), YDConf.FORM_OPERATION.update);
 
-            log.info("ResultMsg:{},PayStatusName:{},实际付款日期:{}",resultMsg, PayStatusName,relPaymentDate);
+            log.info("ResultMsg:{},PayStatusName:{},实际付款日期:{}",resultMsg, payStatusName,relPaymentDate);
 
             List<Map> batchList = (List<Map>) UtilMap.getList(resultInfo, "BatchList");
+
             if (batchList != null && !batchList.isEmpty()) {
+                //有付款明细
                 for (Map map : batchList) {
                     String billsPayOrderNo2 = UtilMap.getString(map, "BillsPayOrderNo");
                     String payStatus2 = UtilMap.getString(map, "PayStatus");
+                    String PayStatusName2 = getPayStatusName(payStatus2);
                     String relPaymentDate2 = UtilMap.getString(map, "RelPaymentDate");
-
+                    String failReasons2 = UtilMap.getString(resultInfo, "FailReasons");
+
+                    //更新付款明细
+                    ydClient.operateData(YDParam.builder()
+                            .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mjs6mcfn, textField_mk128ce5", billsPayOrderNo, billsPayOrderNo2)))
+                            .formUuid("FORM-2D646B4D1C1F4628A0DEA1072656901143Y9")
+                            .formDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mjs6mcgg, dateField_mkdm7y7c, textareaField_mjs6mcgf",PayStatusName2,DateUtil.parse(relPaymentDate2, "yyyy-MM-dd").getTime(),failReasons2)))
+                            .build(), YDConf.FORM_OPERATION.upsert);
+                }
+            }else {
+                //无付款明细
+                if (isRetry){
+                    //重试付款
+                    ydClient.operateData(YDParam.builder()
+                            .formInstanceId(billsPayOrderNo)
+                            .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mjs6mcgg, dateField_mkdm7y7c, textareaField_mjs6mcgf",payStatusName,DateUtil.parse(relPaymentDate, "yyyy-MM-dd").getTime(),failReasons)))
+                            .build(), YDConf.FORM_OPERATION.update);
+                }else {
+                    //首次付款
+                    ydClient.operateData(YDParam.builder()
+                            .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mjs6mcfn", billsPayOrderNo)))
+                            .formUuid("FORM-2D646B4D1C1F4628A0DEA1072656901143Y9")
+                            .formDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mjs6mcgg, dateField_mkdm7y7c, textareaField_mjs6mcgf",payStatusName,DateUtil.parse(relPaymentDate, "yyyy-MM-dd").getTime(),failReasons)))
+                            .build(), YDConf.FORM_OPERATION.upsert);
                 }
+
             }
 
         }else {
+            //付款单生成失败
             String failReasons = UtilMap.getString(resultInfo, "FailReasons");
             log.info("ResultMsg:{},FailReasons:{}",resultMsg, failReasons);
+
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(billsPayOrderNo)
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mkp4wc2q, textareaField_mjs6mcgf","生成失败",failReasons)))
+                    .build(), YDConf.FORM_OPERATION.update);
+
         }
     }
 
+    @Override
+    public McR salaryPay(Map map) {
+        String formInstId = UtilMap.getString(map, "formInstId");
+
+        Map item = new HashMap();
+
+        Map formData = ydClient.queryData(YDParam.builder()
+                .formInstanceId(formInstId)
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        String fkgs = UtilMap.getString(formData, "textField_mjzgymw0");//付款公司
+        String fkfyhzh = UtilMap.getString(formData, "textField_mjzgymw1");//付款方银行账号
+
+        int retryNUM = UtilMap.getInt(formData, "numberField_mkp4wc2r");//重试次数
+
+        if (retryNUM > 0){
+            item.put("BillsPayOrderNo",formInstId + "_" + retryNUM);//外部系统单据编号
+        }else {
+            item.put("BillsPayOrderNo",formInstId);//外部系统单据编号
+        }
+
+        item.put("PayType","2");//外部系统单据编号
+
+        //时间戳转化为yyyy-MM-dd
+        long fkrq = UtilMap.getLong(formData, "dateField_mkdsowjd");
+        String fkrqStr = DateUtil.format(new Date(fkrq), "yyyy-MM-dd");
+        item.put("PaymentDate",fkrqStr);//付款日期(期望支付日期)
+        item.put("BusinessTypeCode",GYPAY_API_TYPE_NO);//业务类型编号
+        item.put("BusinessTypeName",GYPAY_API_TYPE_NAME);//业务类型名称
+        item.put("PayOrgName",fkgs);//付款单位名称
+        item.put("PayAccountNo",fkfyhzh);//付款方银行账号
+        String payChannel = UtilMap.getString(formData, "selectField_mjm87v3v");
+        String payChannelValue = "";
+        //支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
+        switch (payChannel){
+            case "直联支付":payChannelValue = "1";break;
+            case "线下支付":payChannelValue = "2";break;
+            default:break;
+        }
+        item.put("PayChannel",payChannelValue);
+        item.put("PayAmount",UtilMap.getDouble(formData, "numberField_mjmc84h7").toString());//合计付款金额
+        item.put("PayCurrencyType","CNY");//币种(为空,默认: CNY 有付款账号时,不能为 空)
+
+        item.put("PayCurrencyName","人民币");//币种名称(为空,默认:人民币, 有付款账号时,不能为空)
+        String whetherUrgent = UtilMap.getString(formData, "radioField_mkdsowje");
+        item.put("WhetherUrgent","是".equals(whetherUrgent) ? 1 : 2);//是否加急 1.是 2.否
+        String note = UtilMap.getString(formData, "textareaField_mkdsowjj");//备注
+        item.put("Remark",note);//备注
+        String payUse = UtilMap.getString(formData, "textareaField_mjmc84h9");//费用明细
+        item.put("PayUse",payUse);
+        item.put("Purpose","工资");
+
+        List<Map> batchPrivateRecList = new ArrayList<>();
+
+        List<Map> details = UtilMap.getList(formData, "tableField_mjqqlln3");
+        for (Map detail : details) {
+            String billsPayOrderNo = UtilMap.getString(detail,"textField_mkns6lx6");//收款方单据编号
+            String privateAmount = UtilMap.getDouble(detail,"numberField_mjqt1xrt").toString();//付款金额
+            String receiveAccountNo = UtilMap.getString(detail,"textField_mjqpry6r");//收款方银行账号
+            String receiveAccountName = UtilMap.getString(detail,"textField_mjqpry6s");//收款方账户名称
+            String receiveBranchCode = UtilMap.getString(detail,"textField_mkdeg10p");//收款方开户行行号(收款方开户行行号、行名至少填写一项)
+            String receiveBranchName = UtilMap.getString(detail,"textField_mjqpry6u");//收款方开户行行号(收款方开户行行号、行名至少填写一项)
+
+            Map paymentRec = new HashMap();
+            paymentRec.put("BillsPayOrderNo",billsPayOrderNo);
+            paymentRec.put("PrivateAmount",privateAmount);
+            paymentRec.put("ReceiveAccountNo",receiveAccountNo);
+            paymentRec.put("ReceiveAccountName",receiveAccountName);
+            paymentRec.put("ReceiveBranchCode",receiveBranchCode);
+            paymentRec.put("ReceiveBranchName",receiveBranchName);
+
+
+
+            batchPrivateRecList.add(paymentRec);
+        }
+
+        item.put("BatchPrivateRecList",batchPrivateRecList);
+
+        Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
+
+        Map result = gyPost("T0003", data);
+
+
+        return McR.success();
+    }
+
     private Map gyPost(String MesgNo,Map<String,Object> data){
         log.info("data:{}",data);
 
@@ -260,4 +407,21 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
 
         return resultMap;
     }
+
+    private String getPayStatusName(String payStatus){
+        //业务状态:1-支付中,2-支付成功,3-支付失败,4- 已退款,5-部分支付成功,6-部分退款,10-未知
+        String payStatusName = "";
+        switch (payStatus){
+            case "1": payStatusName = "支付中"; break;
+            case "2": payStatusName = "支付成功"; break;
+            case "3": payStatusName = "支付失败"; break;
+            case "4": payStatusName = "已退款"; break;
+            case "5": payStatusName = "部分支付成功"; break;
+            case "6": payStatusName = "部分退款"; break;
+            case "10": payStatusName = "未知"; break;
+            default: payStatusName = "未知"; break;
+        }
+
+        return payStatusName;
+    }
 }