wzy 1 week ago
parent
commit
c7ca0beaeb

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;
+    }
 }