LianAnGyServiceImpl.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. package com.malk.lianan.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.IdUtil;
  4. import cn.hutool.http.HttpUtil;
  5. import com.alibaba.fastjson.JSON;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.malk.lianan.utils.AesUtil;
  8. import com.malk.lianan.utils.RsaUtil;
  9. import com.malk.lianan.service.LianAnGyPayService;
  10. import com.malk.server.aliwork.YDConf;
  11. import com.malk.server.aliwork.YDParam;
  12. import com.malk.server.common.McR;
  13. import com.malk.service.aliwork.YDClient;
  14. import com.malk.utils.UtilDateTime;
  15. import com.malk.utils.UtilMap;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.apache.logging.log4j.util.Strings;
  18. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.scheduling.annotation.Async;
  21. import org.springframework.stereotype.Service;
  22. import java.util.*;
  23. @Service
  24. @Slf4j
  25. public class LianAnGyServiceImpl implements LianAnGyPayService {
  26. // 测试环境数据
  27. private final static String GYPAY_API_URL="http://sk-uat.tech.dccnet.com.cn:8343/api/dtxg"; // 财资云服务的地址
  28. private final static String GYPAY_API_SYS_ID="NBLASY"; // 接入系统编号
  29. private final static String GYPAY_API_SYS_NAME="宁波联安商业"; // 接入系统名称
  30. private final static String GYPAY_API_TENANT_ID="TN100123"; // 商户号
  31. private final static String GYPAY_API_TENANT_NAME="org_01"; // 付款单位名称
  32. private final static String GYPAY_API_ACCOUNT_NO="123456"; // 付款单位账号
  33. private final static String GYPAY_API_TYPE_NO="YW21081817205273002001"; // 业务类型编号
  34. private final static String GYPAY_API_TYPE_NAME="bt_sett"; // 业务类型名称
  35. private final static String GYPAY_API_PUB_KEY="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCns/4GnEfTQtKhOBxZz57F8IZvKalhvX7iOZz2M7amfsO4jsiPNNbgHqKjX4hzyIeAmCmFqLDZMDIM2a4y/oNC/ikZl2yHcYexRT/xTgbR+EM2dDQqfUjDGDD3XsXRbmVbSvvKg8OhLwd4jRTHOGooetg8IP4SC66dPreJlNBVywIDAQAB";
  36. private final static String GYPAY_API_PRI_KEY="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKez/gacR9NC0qE4HFnPnsXwhm8pqWG9fuI5nPYztqZ+w7iOyI801uAeoqNfiHPIh4CYKYWosNkwMgzZrjL+g0L+KRmXbIdxh7FFP/FOBtH4QzZ0NCp9SMMYMPdexdFuZVtK+8qDw6EvB3iNFMc4aih62Dwg/hILrp0+t4mU0FXLAgMBAAECgYBcRYmgY36Ve6/eqrvWoojOig+9vCOJNrVIjcCSKlP1+cuAkXdCbCVKPTDpSRgP9Kaxl4dJFk7vwTfYoDDbt/PKFX277V6bdkjMwNclwniilSU+QMEpmu71HeaXBAiRm5TLEflhcxV2Wy5D0VyBLnPWodH1rGjtfiO6V9SbQf8bGQJBANF5RJ+Ie/+dgAYm/L4Mb3f+Pb/yipUuHcqSZlfd/eMJDtEcp7xcvNFRivbl6IcXvncvL1uInkGdriOe3nmqti0CQQDM86LS8PsseuaVdpt7HCKivub0mI/wcvZ8mUVZZ4jFibPNsSKl1+QreGk/e2QrkyOySC5e2lf5HOEGC/lREm7XAkAL5K/BwxUPQVkIgGQvQjN+A6Br6pB1weWNH9zRtlf48QW3V8IqTrWlyNR0Cj+2k+GLkNFGiC48GYDOovGMxOWNAkEAqCDNV4H8ana/pajQz2M7PoqgZ9Kncba9YWVSsI7wciwOZhSDucyrDsYOgNc2S1C/Hcd80q8HMAJyzkUQV2NprQJACwsH8IEEE/kwSesQlb8fa+ugr+tNnFVPj1xqM4kPD5Dj3XP7B8KWUwL4a4/Y1S6BtoqCL4CAfuEHTw7MlUA2NA==";
  37. private final static String GYPAY_API_AES_KEY="d2a1b3173e494c38";
  38. private final static String GYPAY_API_SIGN_PUB_KEY="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmudhlkVXrFP1DB0r11LvVpy8nYVO9sR2tYLXCkQxXE4HR2VlihCO43B2v/Ep3tlny4l/OX++AQX4sJpO8vAnCRmNIAgXKXAfvre1HTSkJf9vb8G9sf4UsZX2bLEOtH4wOO7Osv8Za98WzBHBRrqESI91Z4GSE0/8ucMp6V7EZ5wIDAQAB";
  39. private final static String KEY_RSA = "RSA";
  40. private final static String KEY_RSA_SIGNATURE = "SHA256WithRSA";
  41. private static BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
  42. private static final String SHA256WithRSA = "SHA256WithRSA";
  43. private static final String X509 = "X.509";
  44. private final static String[] purpose = new String[]{"工资","奖金","报销","补贴","社保","货款","佣金","租金","稿费","公积金","养老金","助学金","劳务费","演出费","福利费","代返还","企业年金","保险理赔","保费退还","付保险款","副食补贴","纳税退还","基金撤销","基金赎回","基金分红","员工安家费","校内奖学金","国家助学金","励志奖学金","保险到期还款","个人贷款转存","期货交易保证金","继承或赠与款项","证券交易结算资金","个人小件商品付款","债券投资本金和收益","信托投资本金和收益","期货投资本金和收益","其他投资本金和收益","农、副、矿产品收购款","个人债权或产权转让收益","服务费","养老保险","失业保险","工伤保险","医保代发","运输费","工会费","外服工资","集团内付款","遗属生活费","风沙费","调节金","培训费","独生子女费","押金","咨询费","慰问金","劳模津贴","体检费","补助","报刊费","电话费","交通费"};
  45. @Autowired
  46. private YDClient ydClient;
  47. @Override
  48. public McR pay(Map map) {
  49. String formInstId = UtilMap.getString(map, "formInstId");
  50. Map item = new HashMap();
  51. Map formData = ydClient.queryData(YDParam.builder()
  52. .formInstanceId(formInstId)
  53. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  54. String fkgs = UtilMap.getString(formData, "textField_mjzgymw0");//付款公司
  55. String fkfyhzh = UtilMap.getString(formData, "textField_mjzgymw1");//付款方银行账号
  56. int retryNUM = UtilMap.getInt(formData, "numberField_mkp4wc2r");//重试次数
  57. if (retryNUM > 0){
  58. item.put("BillsPayOrderNo",formInstId + "_" + retryNUM);//外部系统单据编号
  59. }else {
  60. item.put("BillsPayOrderNo",formInstId);//外部系统单据编号
  61. }
  62. //时间戳转化为yyyy-MM-dd
  63. long fkrq = UtilMap.getLong(formData, "dateField_mkdsowjd");
  64. String fkrqStr = DateUtil.format(new Date(fkrq), "yyyy-MM-dd");
  65. item.put("PaymentDate",fkrqStr);//付款日期(期望支付日期)
  66. item.put("BusinessTypeCode",GYPAY_API_TYPE_NO);//业务类型编号
  67. item.put("BusinessTypeName",GYPAY_API_TYPE_NAME);//业务类型名称
  68. item.put("PayOrgName",fkgs);//付款单位名称
  69. item.put("PayAccountNo",fkfyhzh);//付款方银行账号
  70. String payChannel = UtilMap.getString(formData, "selectField_mjm87v3v");
  71. String payChannelValue = "";
  72. //支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
  73. switch (payChannel){
  74. case "直联支付":payChannelValue = "1";break;
  75. case "线下支付":payChannelValue = "2";break;
  76. default:break;
  77. }
  78. item.put("PayChannel",payChannelValue);
  79. item.put("SumPayAmount",UtilMap.getDouble(formData, "numberField_mkdsowjo").toString());//合计付款金额
  80. item.put("PayCurrencyType","CNY");//币种(为空,默认: CNY 有付款账号时,不能为 空)
  81. item.put("PayCurrencyName","人民币");//币种名称(为空,默认:人民币, 有付款账号时,不能为空)
  82. String whetherUrgent = UtilMap.getString(formData, "radioField_mkdsowje");
  83. item.put("WhetherUrgent","是".equals(whetherUrgent) ? 1 : 2);//是否加急 1.是 2.否
  84. String note = UtilMap.getString(formData, "textareaField_mkdsowjj");//备注
  85. item.put("Note",note);//备注
  86. List<Map> paymentRecList = new ArrayList<>();
  87. List<Map> details = UtilMap.getList(formData, "tableField_mjsl53ki");
  88. for (Map detail : details) {
  89. String billsPayOrderNo = UtilMap.getString(detail,"textField_mk129s2t");//收款方单据编号
  90. String privateAmount = UtilMap.getDouble(detail,"numberField_mjsl53ke").toString();//付款金额
  91. String receiveAccountNo = UtilMap.getString(detail,"textField_mjsl53kd");//收款方银行账号
  92. String receiveAccountName = UtilMap.getString(detail,"textField_mjsl53kb");//收款方账户名称
  93. String payUse = UtilMap.getString(detail,"textareaField_mjsl53kh");//费用明细
  94. Map paymentRec = new HashMap();
  95. paymentRec.put("BillsPayOrderNo",billsPayOrderNo);
  96. paymentRec.put("PrivateAmount",privateAmount);
  97. paymentRec.put("ReceiveAccountNo",receiveAccountNo);
  98. paymentRec.put("ReceiveAccountName",receiveAccountName);
  99. paymentRec.put("PayUse","付款");//摘要长度上限20
  100. paymentRec.put("Purpose","付款");
  101. paymentRecList.add(paymentRec);
  102. }
  103. item.put("PaymentRecList",paymentRecList);
  104. Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
  105. Map result = gyPost("T0022", data);
  106. return McR.success();
  107. }
  108. @Override
  109. public McR retryPay(Map map) {
  110. String formInstId = UtilMap.getString(map, "formInstId");
  111. Map formData = ydClient.queryData(YDParam.builder()
  112. .formInstanceId(formInstId)
  113. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  114. String fkdwmc = UtilMap.getString(formData, "textField_mjzgymw0");//付款单位名称
  115. String fkfyhzh = UtilMap.getString(formData, "textField_mjqroqxb");//付款方银行账号
  116. String skdwmc = UtilMap.getString(formData, "textField_mjzgprn9");//收款单位名称
  117. String skfyhzh = UtilMap.getString(formData, "textField_mjqpry6t");//收款方银行账号
  118. //时间戳转化为yyyy-MM-dd
  119. long fkrq = UtilMap.getLong(formData, "dateField_mkdsowjd");
  120. String fkrqStr = DateUtil.format(new Date(fkrq), "yyyy-MM-dd");
  121. //支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
  122. String payChannel = UtilMap.getString(formData, "selectField_mjm87v3v");
  123. String payChannelValue = "";
  124. switch (payChannel){
  125. case "直联支付":payChannelValue = "1";break;
  126. case "线下支付":payChannelValue = "2";break;
  127. default:break;
  128. }
  129. String whetherUrgent = UtilMap.getString(formData, "radioField_mkdsowje");//是否加急 1.是 2.否(为空,默认: 2)
  130. String whetherUrgentValue = "";
  131. switch (whetherUrgent){
  132. case "是":whetherUrgentValue = "1";break;
  133. case "否":whetherUrgentValue = "2";break;
  134. default:break;
  135. }
  136. String payAmount = UtilMap.getDouble(formData, "numberField_mjqt1xrt").toString();
  137. String fymx = UtilMap.getString(formData, "textareaField_mjsl53kh");//费用明细
  138. String purpose = UtilMap.getString(formData, "selectField_mjzgprmw");//付款类型 用途
  139. int retryNum = UtilMap.getInt(formData, "numberField_mkf5q51o");//重试次数
  140. Map item = new HashMap();
  141. item.put("BillsPayOrderNo",formInstId+"_"+retryNum);//外部系统单据编号
  142. item.put("PaymentDate",fkrqStr);//付款日期(期望支付日期)
  143. item.put("PayType","1");//付款类型 默认1.单笔付款,表示一对一(对公/对私)支付
  144. item.put("BusinessTypeCode",GYPAY_API_TYPE_NO);//业务类型编号
  145. item.put("BusinessTypeName",GYPAY_API_TYPE_NAME);//业务类型名称
  146. item.put("PayOrgName",fkdwmc);//付款单位名称
  147. item.put("PayAccountNo",fkfyhzh);//付款方银行账号
  148. item.put("PayChannel",payChannelValue);//支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
  149. item.put("PayAmount",payAmount);//付款金额
  150. item.put("PayCurrencyType","CNY");//币种(为空,默认: CNY 有付款账号时,不能为 空)
  151. item.put("PayCurrencyName","人民币");//币种名称(为空,默认:人民币, 有付款账号时,不能为空)
  152. item.put("WhetherUrgent",whetherUrgentValue);//是否加急 1.是 2.否
  153. item.put("Remark",fymx);//附言
  154. item.put("PayUse",purpose);//摘要长度上限20
  155. item.put("Purpose",purpose);
  156. Map paymentRec = new HashMap();
  157. paymentRec.put("ReceiveAccountNo",skfyhzh);
  158. paymentRec.put("ReceiveAccountName",skdwmc);
  159. paymentRec.put("ReceiveCurrencyCode","CNY");
  160. paymentRec.put("ReceiveCurrencyName","人民币");
  161. item.put("PaymentRec",paymentRec);
  162. Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
  163. //工银-单笔付款
  164. Map result = gyPost("T0002", data);
  165. return McR.success();
  166. }
  167. @Async
  168. @Override
  169. public void callback(Map result) {
  170. String resultCode = UtilMap.getString(result, "ResultCode");
  171. String resultMsg = UtilMap.getString(result, "ResultMsg");
  172. Map resultInfo = ((List<Map>) UtilMap.getList(result, "ResultSet")).get(0);
  173. String[] split = UtilMap.getString(resultInfo, "BillsPayOrderNo").split("_");
  174. boolean isRetry = false;
  175. if (split.length > 1) {
  176. isRetry = true;
  177. }
  178. String billsPayOrderNo = split[0];//外部系统单据编号 格式:实例id/实例id_重试次数
  179. if ("0000".equals(resultCode)) {
  180. //付款单生成成功 财资云支付结果
  181. String payStatus = UtilMap.getString(resultInfo, "PayStatus");//业务状态:1-支付中,2-支付成功,3-支付失败,4- 已退款,5-部分支付成功,6-部分退款,10-未知
  182. String payStatusName = getPayStatusName(payStatus);//业务状态名称
  183. String relPaymentDate = UtilMap.getString(resultInfo, "RelPaymentDate");//实际付款日期(部分付款有成功时为最大支付日期)
  184. String failReasons = UtilMap.getString(resultInfo, "FailReasons");
  185. String relBillsCode = UtilMap.getString(resultInfo, "RelBillsCode");//工银实际单据号
  186. //更新付款单信息
  187. ydClient.operateData(YDParam.builder()
  188. .formInstanceId(billsPayOrderNo)
  189. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mkp4wc2q, textareaField_mjs6mcgf, textField_mkp5mn5l","生成成功","",relBillsCode)))
  190. .build(), YDConf.FORM_OPERATION.update);
  191. log.info("ResultMsg:{},PayStatusName:{},实际付款日期:{}",resultMsg, payStatusName,relPaymentDate);
  192. List<Map> batchList = (List<Map>) UtilMap.getList(resultInfo, "BatchList");
  193. if (batchList != null && !batchList.isEmpty()) {
  194. //有付款明细
  195. for (Map map : batchList) {
  196. String billsPayOrderNo2 = UtilMap.getString(map, "BillsPayOrderNo");
  197. String payStatus2 = UtilMap.getString(map, "PayStatus");
  198. String PayStatusName2 = getPayStatusName(payStatus2);
  199. String relPaymentDate2 = UtilMap.getString(map, "RelPaymentDate");
  200. String failReasons2 = UtilMap.getString(resultInfo, "FailReasons");
  201. //查询付款明细
  202. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  203. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mjs6mcfn, textField_mk128ce5", billsPayOrderNo, billsPayOrderNo2)))
  204. .formUuid("FORM-2D646B4D1C1F4628A0DEA1072656901143Y9").build(), YDConf.FORM_QUERY.retrieve_list).getData();
  205. //付款明细逐条更新 防止集成自动化并发
  206. for (Map datum : data) {
  207. String detailFormInstId = UtilMap.getString(datum, "formInstanceId");
  208. ydClient.operateData(YDParam.builder()
  209. .formInstanceId(detailFormInstId)
  210. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mjs6mcgg, dateField_mkdm7y7c, textareaField_mjs6mcgf",PayStatusName2, Strings.isNotBlank(relPaymentDate2) ? DateUtil.parse(relPaymentDate2, "yyyy-MM-dd").getTime() : null,failReasons2)))
  211. .build(), YDConf.FORM_OPERATION.update);
  212. try {
  213. Thread.sleep(3000);
  214. } catch (InterruptedException e) {
  215. throw new RuntimeException(e);
  216. }
  217. }
  218. }
  219. }else {
  220. //无付款明细
  221. if (isRetry){
  222. //重试付款
  223. ydClient.operateData(YDParam.builder()
  224. .formInstanceId(billsPayOrderNo)
  225. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mjs6mcgg, dateField_mkdm7y7c, textareaField_mjs6mcgf",payStatusName,DateUtil.parse(relPaymentDate, "yyyy-MM-dd").getTime(),failReasons)))
  226. .build(), YDConf.FORM_OPERATION.update);
  227. }else {
  228. //首次付款
  229. ydClient.operateData(YDParam.builder()
  230. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mjs6mcfn", billsPayOrderNo)))
  231. .formUuid("FORM-2D646B4D1C1F4628A0DEA1072656901143Y9")
  232. .formDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mjs6mcgg, dateField_mkdm7y7c, textareaField_mjs6mcgf",payStatusName,DateUtil.parse(relPaymentDate, "yyyy-MM-dd").getTime(),failReasons)))
  233. .build(), YDConf.FORM_OPERATION.upsert);
  234. }
  235. }
  236. }else {
  237. //付款单生成失败
  238. String failReasons = UtilMap.getString(resultInfo, "FailReasons");
  239. log.info("ResultMsg:{},FailReasons:{}",resultMsg, failReasons);
  240. ydClient.operateData(YDParam.builder()
  241. .formInstanceId(billsPayOrderNo)
  242. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mkp4wc2q, textareaField_mjs6mcgf","生成失败",failReasons)))
  243. .build(), YDConf.FORM_OPERATION.update);
  244. }
  245. }
  246. @Override
  247. public McR salaryPay(Map map) {
  248. String formInstId = UtilMap.getString(map, "formInstId");
  249. Map item = new HashMap();
  250. Map formData = ydClient.queryData(YDParam.builder()
  251. .formInstanceId(formInstId)
  252. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  253. String fkgs = UtilMap.getString(formData, "textField_mjzgymw0");//付款公司
  254. String fkfyhzh = UtilMap.getString(formData, "textField_mjzgymw1");//付款方银行账号
  255. int retryNUM = UtilMap.getInt(formData, "numberField_mkp4wc2r");//重试次数
  256. if (retryNUM > 0){
  257. item.put("BillsPayOrderNo",formInstId + "_" + retryNUM);//外部系统单据编号
  258. }else {
  259. item.put("BillsPayOrderNo",formInstId);//外部系统单据编号
  260. }
  261. item.put("PayType","2");//外部系统单据编号
  262. //时间戳转化为yyyy-MM-dd
  263. long fkrq = UtilMap.getLong(formData, "dateField_mkdsowjd");
  264. String fkrqStr = DateUtil.format(new Date(fkrq), "yyyy-MM-dd");
  265. item.put("PaymentDate",fkrqStr);//付款日期(期望支付日期)
  266. item.put("BusinessTypeCode",GYPAY_API_TYPE_NO);//业务类型编号
  267. item.put("BusinessTypeName",GYPAY_API_TYPE_NAME);//业务类型名称
  268. item.put("PayOrgName",fkgs);//付款单位名称
  269. item.put("PayAccountNo",fkfyhzh);//付款方银行账号
  270. String payChannel = UtilMap.getString(formData, "selectField_mjm87v3v");
  271. String payChannelValue = "";
  272. //支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
  273. switch (payChannel){
  274. case "直联支付":payChannelValue = "1";break;
  275. case "线下支付":payChannelValue = "2";break;
  276. default:break;
  277. }
  278. item.put("PayChannel",payChannelValue);
  279. item.put("PayAmount",UtilMap.getDouble(formData, "numberField_mjmc84h7").toString());//合计付款金额
  280. item.put("PayCurrencyType","CNY");//币种(为空,默认: CNY 有付款账号时,不能为 空)
  281. item.put("PayCurrencyName","人民币");//币种名称(为空,默认:人民币, 有付款账号时,不能为空)
  282. String whetherUrgent = UtilMap.getString(formData, "radioField_mkdsowje");
  283. item.put("WhetherUrgent","是".equals(whetherUrgent) ? 1 : 2);//是否加急 1.是 2.否
  284. String note = UtilMap.getString(formData, "textareaField_mkdsowjj");//备注
  285. item.put("Remark",note);//备注
  286. String payUse = UtilMap.getString(formData, "textareaField_mjmc84h9");//费用明细
  287. item.put("PayUse","工资");//摘要长度上限20
  288. item.put("Purpose","工资");
  289. List<Map> batchPrivateRecList = new ArrayList<>();
  290. List<Map> details = UtilMap.getList(formData, "tableField_mjqqlln3");
  291. for (Map detail : details) {
  292. String billsPayOrderNo = UtilMap.getString(detail,"textField_mkns6lx6");//收款方单据编号
  293. String privateAmount = UtilMap.getDouble(detail,"numberField_mjqt1xrt").toString();//付款金额
  294. String receiveAccountNo = UtilMap.getString(detail,"textField_mjqpry6r");//收款方银行账号
  295. String receiveAccountName = UtilMap.getString(detail,"textField_mjqpry6s");//收款方账户名称
  296. String receiveBranchCode = UtilMap.getString(detail,"textField_mkdeg10p");//收款方开户行行号(收款方开户行行号、行名至少填写一项)
  297. String receiveBranchName = UtilMap.getString(detail,"textField_mjqpry6u");//收款方开户行行号(收款方开户行行号、行名至少填写一项)
  298. Map paymentRec = new HashMap();
  299. paymentRec.put("BillsPayOrderNo",billsPayOrderNo);
  300. paymentRec.put("PrivateAmount",privateAmount);
  301. paymentRec.put("ReceiveAccountNo",receiveAccountNo);
  302. paymentRec.put("ReceiveAccountName",receiveAccountName);
  303. paymentRec.put("ReceiveBranchCode",receiveBranchCode);
  304. paymentRec.put("ReceiveBranchName",receiveBranchName);
  305. batchPrivateRecList.add(paymentRec);
  306. }
  307. item.put("BatchPrivateRecList",batchPrivateRecList);
  308. Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
  309. Map result = gyPost("T0003", data);
  310. return McR.success();
  311. }
  312. @Override
  313. public McR reimburse(Map map) {
  314. String formInstId = UtilMap.getString(map, "formInstId");
  315. Map item = new HashMap();
  316. Map formData = ydClient.queryData(YDParam.builder()
  317. .formInstanceId(formInstId)
  318. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  319. String fkgs = UtilMap.getString(formData, "textField_mjzgymw0");//付款公司
  320. String fkfyhzh = UtilMap.getString(formData, "textField_mjzgymw1");//付款方银行账号
  321. int retryNUM = UtilMap.getInt(formData, "numberField_mkp4wc2r");//重试次数
  322. if (retryNUM > 0){
  323. item.put("BillsPayOrderNo",formInstId + "_" + retryNUM);//外部系统单据编号
  324. }else {
  325. item.put("BillsPayOrderNo",formInstId);//外部系统单据编号
  326. }
  327. //时间戳转化为yyyy-MM-dd
  328. long fkrq = UtilMap.getLong(formData, "dateField_mkdsowjd");
  329. String fkrqStr = DateUtil.format(new Date(fkrq), "yyyy-MM-dd");
  330. item.put("PaymentDate",fkrqStr);//付款日期(期望支付日期)
  331. item.put("BusinessTypeCode",GYPAY_API_TYPE_NO);//业务类型编号
  332. item.put("BusinessTypeName",GYPAY_API_TYPE_NAME);//业务类型名称
  333. item.put("PayOrgName",fkgs);//付款单位名称
  334. item.put("PayAccountNo",fkfyhzh);//付款方银行账号
  335. String payChannel = UtilMap.getString(formData, "selectField_mjm87v3v");
  336. String payChannelValue = "";
  337. //支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
  338. switch (payChannel){
  339. case "直联支付":payChannelValue = "1";break;
  340. case "线下支付":payChannelValue = "2";break;
  341. default:break;
  342. }
  343. item.put("PayChannel",payChannelValue);
  344. item.put("SumPayAmount",UtilMap.getDouble(formData, "numberField_mkdsowjo").toString());//合计付款金额
  345. item.put("PayCurrencyType","CNY");//币种(为空,默认: CNY 有付款账号时,不能为 空)
  346. item.put("PayCurrencyName","人民币");//币种名称(为空,默认:人民币, 有付款账号时,不能为空)
  347. String whetherUrgent = UtilMap.getString(formData, "radioField_mkdsowje");
  348. item.put("WhetherUrgent","是".equals(whetherUrgent) ? 1 : 2);//是否加急 1.是 2.否
  349. String note = UtilMap.getString(formData, "textareaField_mkdsowjj");//备注
  350. item.put("Note",note);//备注
  351. List<Map> paymentRecList = new ArrayList<>();
  352. List<Map> details = UtilMap.getList(formData, "tableField_mjm9e1zc");
  353. for (Map detail : details) {
  354. String billsPayOrderNo = UtilMap.getString(detail,"textField_mk1278lu");//收款方单据编号
  355. String privateAmount = UtilMap.getDouble(detail,"numberField_mjm9e1zl").toString();//付款金额
  356. String receiveAccountNo = UtilMap.getString(detail,"textField_mjm9e1zf");//收款方银行账号
  357. String receiveAccountName = UtilMap.getString(detail,"textField_mjm9e1zg");//收款方账户名称
  358. String payUse = UtilMap.getString(detail,"textareaField_mjsl53kh");//费用明细
  359. Map paymentRec = new HashMap();
  360. paymentRec.put("BillsPayOrderNo",billsPayOrderNo);
  361. paymentRec.put("PrivateAmount",privateAmount);
  362. paymentRec.put("ReceiveAccountNo",receiveAccountNo);
  363. paymentRec.put("ReceiveAccountName",receiveAccountName);
  364. paymentRec.put("PayUse","报销");//摘要长度上限20
  365. paymentRec.put("Purpose","报销");
  366. paymentRecList.add(paymentRec);
  367. }
  368. item.put("PaymentRecList",paymentRecList);
  369. Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
  370. Map result = gyPost("T0022", data);
  371. return McR.success();
  372. }
  373. private Map gyPost(String MesgNo,Map<String,Object> data){
  374. log.info("data:{}",data);
  375. Map<String,Object> head = new HashMap<>();
  376. head.put("MesgNo",MesgNo);
  377. head.put("TenantId",GYPAY_API_TENANT_ID);
  378. head.put("Timestamp", UtilDateTime.getLocalDateTimeTimeStamp());
  379. head.put("SystemNo",GYPAY_API_SYS_ID);
  380. head.put("SystemName",GYPAY_API_SYS_NAME);
  381. head.put("RequestNo", IdUtil.nanoId(6));
  382. Map<String,Object> body = new HashMap<>();
  383. String encrypt = AesUtil.encrypt(JSON.toJSONString(data),GYPAY_API_AES_KEY);
  384. body.put("Data", encrypt);
  385. String signed= RsaUtil.sign(JSONObject.toJSONString(data).getBytes(),GYPAY_API_PRI_KEY);
  386. body.put("Sign", signed);
  387. Map<String,Object> Cmscloud = new HashMap<>();
  388. Cmscloud.put("Head",head);
  389. Cmscloud.put("Body",body);
  390. String indata=JSONObject.toJSONString(UtilMap.map("Cmscloud",Cmscloud));
  391. System.out.println(indata);
  392. String result= HttpUtil.createPost(GYPAY_API_URL).body(indata).execute().body();
  393. System.out.println(result);
  394. JSONObject resultjson=JSONObject.parseObject(result);
  395. JSONObject resultBody = resultjson.getJSONObject("Cmscloud").getJSONObject("Body");
  396. String resultData=AesUtil.decrypt(resultBody.getString("Data"),GYPAY_API_AES_KEY);
  397. System.out.println(resultData);
  398. Map resultMap = (Map) JSONObject.parse(resultData);
  399. return resultMap;
  400. }
  401. private String getPayStatusName(String payStatus){
  402. //业务状态:1-支付中,2-支付成功,3-支付失败,4- 已退款,5-部分支付成功,6-部分退款,10-未知
  403. String payStatusName = "";
  404. switch (payStatus){
  405. case "1": payStatusName = "支付中"; break;
  406. case "2": payStatusName = "支付成功"; break;
  407. case "3": payStatusName = "支付失败"; break;
  408. case "4": payStatusName = "已退款"; break;
  409. case "5": payStatusName = "部分支付成功"; break;
  410. case "6": payStatusName = "部分退款"; break;
  411. case "10": payStatusName = "未知"; break;
  412. default: payStatusName = "未知"; break;
  413. }
  414. return payStatusName;
  415. }
  416. }