LianAnGyServiceImpl.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  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. String requestNo = gyPost("T0022", data);
  106. ydClient.operateData(YDParam.builder()
  107. .formInstanceId(formInstId)
  108. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mmolqml1",requestNo)))
  109. .build(), YDConf.FORM_OPERATION.update);
  110. return McR.success();
  111. }
  112. @Override
  113. public McR retryPay(Map map) {
  114. String formInstId = UtilMap.getString(map, "formInstId");
  115. Map formData = ydClient.queryData(YDParam.builder()
  116. .formInstanceId(formInstId)
  117. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  118. String fkdwmc = UtilMap.getString(formData, "textField_mjzgymw0");//付款单位名称
  119. String fkfyhzh = UtilMap.getString(formData, "textField_mjqroqxb");//付款方银行账号
  120. String skdwmc = UtilMap.getString(formData, "textField_mjzgprn9");//收款单位名称
  121. String skfyhzh = UtilMap.getString(formData, "textField_mjqpry6t");//收款方银行账号
  122. //时间戳转化为yyyy-MM-dd
  123. long fkrq = UtilMap.getLong(formData, "dateField_mkdsowjd");
  124. String fkrqStr = DateUtil.format(new Date(fkrq), "yyyy-MM-dd");
  125. //支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
  126. String payChannel = UtilMap.getString(formData, "selectField_mjm87v3v");
  127. String payChannelValue = "";
  128. switch (payChannel){
  129. case "直联支付":payChannelValue = "1";break;
  130. case "线下支付":payChannelValue = "2";break;
  131. default:break;
  132. }
  133. String whetherUrgent = UtilMap.getString(formData, "radioField_mkdsowje");//是否加急 1.是 2.否(为空,默认: 2)
  134. String whetherUrgentValue = "";
  135. switch (whetherUrgent){
  136. case "是":whetherUrgentValue = "1";break;
  137. case "否":whetherUrgentValue = "2";break;
  138. default:break;
  139. }
  140. String payAmount = UtilMap.getDouble(formData, "numberField_mjqt1xrt").toString();
  141. String fymx = UtilMap.getString(formData, "textareaField_mjsl53kh");//费用明细
  142. String purpose = UtilMap.getString(formData, "selectField_mjzgprmw");//付款类型 用途
  143. int retryNum = UtilMap.getInt(formData, "numberField_mkf5q51o");//重试次数
  144. Map item = new HashMap();
  145. item.put("BillsPayOrderNo",formInstId+"_"+retryNum);//外部系统单据编号
  146. item.put("PaymentDate",fkrqStr);//付款日期(期望支付日期)
  147. item.put("PayType","1");//付款类型 默认1.单笔付款,表示一对一(对公/对私)支付
  148. item.put("BusinessTypeCode",GYPAY_API_TYPE_NO);//业务类型编号
  149. item.put("BusinessTypeName",GYPAY_API_TYPE_NAME);//业务类型名称
  150. item.put("PayOrgName",fkdwmc);//付款单位名称
  151. item.put("PayAccountNo",fkfyhzh);//付款方银行账号
  152. item.put("PayChannel",payChannelValue);//支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
  153. item.put("PayAmount",payAmount);//付款金额
  154. item.put("PayCurrencyType","CNY");//币种(为空,默认: CNY 有付款账号时,不能为 空)
  155. item.put("PayCurrencyName","人民币");//币种名称(为空,默认:人民币, 有付款账号时,不能为空)
  156. item.put("WhetherUrgent",whetherUrgentValue);//是否加急 1.是 2.否
  157. item.put("Remark",fymx);//附言
  158. item.put("PayUse",purpose);//摘要长度上限20
  159. item.put("Purpose",purpose);
  160. Map paymentRec = new HashMap();
  161. paymentRec.put("ReceiveAccountNo",skfyhzh);
  162. paymentRec.put("ReceiveAccountName",skdwmc);
  163. paymentRec.put("ReceiveCurrencyCode","CNY");
  164. paymentRec.put("ReceiveCurrencyName","人民币");
  165. item.put("PaymentRec",paymentRec);
  166. Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
  167. //工银-单笔付款
  168. String requestNo = gyPost("T0002", data);
  169. //回写请求号
  170. ydClient.operateData(YDParam.builder()
  171. .formInstanceId(formInstId)
  172. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mmolqml1",requestNo)))
  173. .build(), YDConf.FORM_OPERATION.update);
  174. return McR.success();
  175. }
  176. @Async
  177. @Override
  178. public void callback(Map result) {
  179. String resultCode = UtilMap.getString(result, "ResultCode");
  180. String resultMsg = UtilMap.getString(result, "ResultMsg");
  181. Map resultInfo = ((List<Map>) UtilMap.getList(result, "ResultSet")).get(0);
  182. String[] split = UtilMap.getString(resultInfo, "BillsPayOrderNo").split("_");
  183. boolean isRetry = false;
  184. if (split.length > 1) {
  185. isRetry = true;
  186. }
  187. String billsPayOrderNo = split[0];//外部系统单据编号 格式:实例id/实例id_重试次数
  188. if ("0000".equals(resultCode)) {
  189. //付款单生成成功 财资云支付结果
  190. String payStatus = UtilMap.getString(resultInfo, "PayStatus");//业务状态:1-支付中,2-支付成功,3-支付失败,4- 已退款,5-部分支付成功,6-部分退款,10-未知
  191. String payStatusName = getPayStatusName(payStatus);//业务状态名称
  192. String relPaymentDate = UtilMap.getString(resultInfo, "RelPaymentDate");//实际付款日期(部分付款有成功时为最大支付日期)
  193. String failReasons = UtilMap.getString(resultInfo, "FailReasons");
  194. String relBillsCode = UtilMap.getString(resultInfo, "RelBillsCode");//工银实际单据号
  195. //更新付款单信息
  196. ydClient.operateData(YDParam.builder()
  197. .formInstanceId(billsPayOrderNo)
  198. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mkp4wc2q, textareaField_mjs6mcgf, textField_mkp5mn5l","生成成功","",relBillsCode)))
  199. .build(), YDConf.FORM_OPERATION.update);
  200. log.info("ResultMsg:{},PayStatusName:{},实际付款日期:{}",resultMsg, payStatusName,relPaymentDate);
  201. List<Map> batchList = (List<Map>) UtilMap.getList(resultInfo, "BatchList");
  202. if (batchList != null && !batchList.isEmpty()) {
  203. //有付款明细
  204. for (Map map : batchList) {
  205. String billsPayOrderNo2 = UtilMap.getString(map, "BillsPayOrderNo");
  206. String payStatus2 = UtilMap.getString(map, "PayStatus");
  207. String PayStatusName2 = getPayStatusName(payStatus2);
  208. String relPaymentDate2 = UtilMap.getString(map, "RelPaymentDate");
  209. String failReasons2 = UtilMap.getString(resultInfo, "FailReasons");
  210. //查询付款明细
  211. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  212. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mjs6mcfn, textField_mk128ce5", billsPayOrderNo, billsPayOrderNo2)))
  213. .formUuid("FORM-2D646B4D1C1F4628A0DEA1072656901143Y9").build(), YDConf.FORM_QUERY.retrieve_list).getData();
  214. //付款明细逐条更新 防止集成自动化并发
  215. for (Map datum : data) {
  216. String detailFormInstId = UtilMap.getString(datum, "formInstanceId");
  217. ydClient.operateData(YDParam.builder()
  218. .formInstanceId(detailFormInstId)
  219. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mjs6mcgg, dateField_mkdm7y7c, textareaField_mjs6mcgf",PayStatusName2, Strings.isNotBlank(relPaymentDate2) ? DateUtil.parse(relPaymentDate2, "yyyy-MM-dd").getTime() : null,failReasons2)))
  220. .build(), YDConf.FORM_OPERATION.update);
  221. try {
  222. Thread.sleep(3000);
  223. } catch (InterruptedException e) {
  224. throw new RuntimeException(e);
  225. }
  226. }
  227. }
  228. }else {
  229. //无付款明细
  230. if (isRetry){
  231. //重试付款
  232. ydClient.operateData(YDParam.builder()
  233. .formInstanceId(billsPayOrderNo)
  234. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mjs6mcgg, dateField_mkdm7y7c, textareaField_mjs6mcgf",payStatusName,DateUtil.parse(relPaymentDate, "yyyy-MM-dd").getTime(),failReasons)))
  235. .build(), YDConf.FORM_OPERATION.update);
  236. }else {
  237. //首次付款
  238. ydClient.operateData(YDParam.builder()
  239. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mjs6mcfn", billsPayOrderNo)))
  240. .formUuid("FORM-2D646B4D1C1F4628A0DEA1072656901143Y9")
  241. .formDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mjs6mcgg, dateField_mkdm7y7c, textareaField_mjs6mcgf",payStatusName,DateUtil.parse(relPaymentDate, "yyyy-MM-dd").getTime(),failReasons)))
  242. .build(), YDConf.FORM_OPERATION.upsert);
  243. }
  244. }
  245. }else {
  246. //付款单生成失败
  247. String failReasons = UtilMap.getString(resultInfo, "FailReasons");
  248. log.info("ResultMsg:{},FailReasons:{}",resultMsg, failReasons);
  249. ydClient.operateData(YDParam.builder()
  250. .formInstanceId(billsPayOrderNo)
  251. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mkp4wc2q, textareaField_mjs6mcgf","生成失败",failReasons)))
  252. .build(), YDConf.FORM_OPERATION.update);
  253. }
  254. }
  255. @Override
  256. public McR salaryPay(Map map) {
  257. String formInstId = UtilMap.getString(map, "formInstId");
  258. Map item = new HashMap();
  259. Map formData = ydClient.queryData(YDParam.builder()
  260. .formInstanceId(formInstId)
  261. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  262. String fkgs = UtilMap.getString(formData, "textField_mjzgymw0");//付款公司
  263. String fkfyhzh = UtilMap.getString(formData, "textField_mjzgymw1");//付款方银行账号
  264. int retryNUM = UtilMap.getInt(formData, "numberField_mkp4wc2r");//重试次数
  265. if (retryNUM > 0){
  266. item.put("BillsPayOrderNo",formInstId + "_" + retryNUM);//外部系统单据编号
  267. }else {
  268. item.put("BillsPayOrderNo",formInstId);//外部系统单据编号
  269. }
  270. item.put("PayType","2");//外部系统单据编号
  271. //时间戳转化为yyyy-MM-dd
  272. long fkrq = UtilMap.getLong(formData, "dateField_mkdsowjd");
  273. String fkrqStr = DateUtil.format(new Date(fkrq), "yyyy-MM-dd");
  274. item.put("PaymentDate",fkrqStr);//付款日期(期望支付日期)
  275. item.put("BusinessTypeCode",GYPAY_API_TYPE_NO);//业务类型编号
  276. item.put("BusinessTypeName",GYPAY_API_TYPE_NAME);//业务类型名称
  277. item.put("PayOrgName",fkgs);//付款单位名称
  278. item.put("PayAccountNo",fkfyhzh);//付款方银行账号
  279. String payChannel = UtilMap.getString(formData, "selectField_mjm87v3v");
  280. String payChannelValue = "";
  281. //支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
  282. switch (payChannel){
  283. case "直联支付":payChannelValue = "1";break;
  284. case "线下支付":payChannelValue = "2";break;
  285. default:break;
  286. }
  287. item.put("PayChannel",payChannelValue);
  288. item.put("PayAmount",UtilMap.getDouble(formData, "numberField_mjmc84h7").toString());//合计付款金额
  289. item.put("PayCurrencyType","CNY");//币种(为空,默认: CNY 有付款账号时,不能为 空)
  290. item.put("PayCurrencyName","人民币");//币种名称(为空,默认:人民币, 有付款账号时,不能为空)
  291. String whetherUrgent = UtilMap.getString(formData, "radioField_mkdsowje");
  292. item.put("WhetherUrgent","是".equals(whetherUrgent) ? 1 : 2);//是否加急 1.是 2.否
  293. String note = UtilMap.getString(formData, "textareaField_mkdsowjj");//备注
  294. item.put("Remark",note);//备注
  295. String payUse = UtilMap.getString(formData, "textareaField_mjmc84h9");//费用明细
  296. item.put("PayUse","工资");//摘要长度上限20
  297. item.put("Purpose","工资");
  298. List<Map> batchPrivateRecList = new ArrayList<>();
  299. List<Map> details = UtilMap.getList(formData, "tableField_mjqqlln3");
  300. for (Map detail : details) {
  301. String billsPayOrderNo = UtilMap.getString(detail,"textField_mkns6lx6");//收款方单据编号
  302. String privateAmount = UtilMap.getDouble(detail,"numberField_mjqt1xrt").toString();//付款金额
  303. String receiveAccountNo = UtilMap.getString(detail,"textField_mjqpry6r");//收款方银行账号
  304. String receiveAccountName = UtilMap.getString(detail,"textField_mjqpry6s");//收款方账户名称
  305. String receiveBranchCode = UtilMap.getString(detail,"textField_mkdeg10p");//收款方开户行行号(收款方开户行行号、行名至少填写一项)
  306. String receiveBranchName = UtilMap.getString(detail,"textField_mjqpry6u");//收款方开户行行号(收款方开户行行号、行名至少填写一项)
  307. Map paymentRec = new HashMap();
  308. paymentRec.put("BillsPayOrderNo",billsPayOrderNo);
  309. paymentRec.put("PrivateAmount",privateAmount);
  310. paymentRec.put("ReceiveAccountNo",receiveAccountNo);
  311. paymentRec.put("ReceiveAccountName",receiveAccountName);
  312. paymentRec.put("ReceiveBranchCode",receiveBranchCode);
  313. paymentRec.put("ReceiveBranchName",receiveBranchName);
  314. batchPrivateRecList.add(paymentRec);
  315. }
  316. item.put("BatchPrivateRecList",batchPrivateRecList);
  317. Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
  318. String requestNo = gyPost("T0003", data);
  319. //回写请求号
  320. ydClient.operateData(YDParam.builder()
  321. .formInstanceId(formInstId)
  322. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mmolqml1",requestNo)))
  323. .build(), YDConf.FORM_OPERATION.update);
  324. return McR.success();
  325. }
  326. @Override
  327. public McR reimburse(Map map) {
  328. String formInstId = UtilMap.getString(map, "formInstId");
  329. Map item = new HashMap();
  330. Map formData = ydClient.queryData(YDParam.builder()
  331. .formInstanceId(formInstId)
  332. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  333. String fkgs = UtilMap.getString(formData, "textField_mjzgymw0");//付款公司
  334. String fkfyhzh = UtilMap.getString(formData, "textField_mjzgymw1");//付款方银行账号
  335. int retryNUM = UtilMap.getInt(formData, "numberField_mkp4wc2r");//重试次数
  336. if (retryNUM > 0){
  337. item.put("BillsPayOrderNo",formInstId + "_" + retryNUM);//外部系统单据编号
  338. }else {
  339. item.put("BillsPayOrderNo",formInstId);//外部系统单据编号
  340. }
  341. //时间戳转化为yyyy-MM-dd
  342. long fkrq = UtilMap.getLong(formData, "dateField_mkdsowjd");
  343. String fkrqStr = DateUtil.format(new Date(fkrq), "yyyy-MM-dd");
  344. item.put("PaymentDate",fkrqStr);//付款日期(期望支付日期)
  345. item.put("BusinessTypeCode",GYPAY_API_TYPE_NO);//业务类型编号
  346. item.put("BusinessTypeName",GYPAY_API_TYPE_NAME);//业务类型名称
  347. item.put("PayOrgName",fkgs);//付款单位名称
  348. item.put("PayAccountNo",fkfyhzh);//付款方银行账号
  349. String payChannel = UtilMap.getString(formData, "selectField_mjm87v3v");
  350. String payChannelValue = "";
  351. //支付方式 1.直联支付 2.线下支付 3.全额支付 4.差额支付
  352. switch (payChannel){
  353. case "直联支付":payChannelValue = "1";break;
  354. case "线下支付":payChannelValue = "2";break;
  355. default:break;
  356. }
  357. item.put("PayChannel",payChannelValue);
  358. item.put("SumPayAmount",UtilMap.getDouble(formData, "numberField_mkdsowjo").toString());//合计付款金额
  359. item.put("PayCurrencyType","CNY");//币种(为空,默认: CNY 有付款账号时,不能为 空)
  360. item.put("PayCurrencyName","人民币");//币种名称(为空,默认:人民币, 有付款账号时,不能为空)
  361. String whetherUrgent = UtilMap.getString(formData, "radioField_mkdsowje");
  362. item.put("WhetherUrgent","是".equals(whetherUrgent) ? 1 : 2);//是否加急 1.是 2.否
  363. String note = UtilMap.getString(formData, "textareaField_mkdsowjj");//备注
  364. item.put("Note",note);//备注
  365. List<Map> paymentRecList = new ArrayList<>();
  366. List<Map> details = UtilMap.getList(formData, "tableField_mjm9e1zc");
  367. for (Map detail : details) {
  368. String billsPayOrderNo = UtilMap.getString(detail,"textField_mk1278lu");//收款方单据编号
  369. String privateAmount = UtilMap.getDouble(detail,"numberField_mjm9e1zl").toString();//付款金额
  370. String receiveAccountNo = UtilMap.getString(detail,"textField_mjm9e1zf");//收款方银行账号
  371. String receiveAccountName = UtilMap.getString(detail,"textField_mjm9e1zg");//收款方账户名称
  372. String payUse = UtilMap.getString(detail,"textareaField_mjsl53kh");//费用明细
  373. Map paymentRec = new HashMap();
  374. paymentRec.put("BillsPayOrderNo",billsPayOrderNo);
  375. paymentRec.put("PrivateAmount",privateAmount);
  376. paymentRec.put("ReceiveAccountNo",receiveAccountNo);
  377. paymentRec.put("ReceiveAccountName",receiveAccountName);
  378. paymentRec.put("PayUse","报销");//摘要长度上限20
  379. paymentRec.put("Purpose","报销");
  380. paymentRecList.add(paymentRec);
  381. }
  382. item.put("PaymentRecList",paymentRecList);
  383. Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
  384. String requestNo = gyPost("T0022", data);
  385. //回写请求号
  386. ydClient.operateData(YDParam.builder()
  387. .formInstanceId(formInstId)
  388. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mmolqml1",requestNo)))
  389. .build(), YDConf.FORM_OPERATION.update);
  390. return McR.success();
  391. }
  392. private String gyPost(String MesgNo,Map<String,Object> data){
  393. log.info("data:{}",data);
  394. Map<String,Object> head = new HashMap<>();
  395. head.put("MesgNo",MesgNo);
  396. head.put("TenantId",GYPAY_API_TENANT_ID);
  397. head.put("Timestamp", UtilDateTime.getLocalDateTimeTimeStamp());
  398. head.put("SystemNo",GYPAY_API_SYS_ID);
  399. head.put("SystemName",GYPAY_API_SYS_NAME);
  400. String requestNo = IdUtil.nanoId(6);
  401. head.put("RequestNo", requestNo);
  402. Map<String,Object> body = new HashMap<>();
  403. String encrypt = AesUtil.encrypt(JSON.toJSONString(data),GYPAY_API_AES_KEY);
  404. body.put("Data", encrypt);
  405. String signed= RsaUtil.sign(JSONObject.toJSONString(data).getBytes(),GYPAY_API_PRI_KEY);
  406. body.put("Sign", signed);
  407. Map<String,Object> Cmscloud = new HashMap<>();
  408. Cmscloud.put("Head",head);
  409. Cmscloud.put("Body",body);
  410. String indata=JSONObject.toJSONString(UtilMap.map("Cmscloud",Cmscloud));
  411. System.out.println(indata);
  412. String result= HttpUtil.createPost(GYPAY_API_URL).body(indata).execute().body();
  413. System.out.println(result);
  414. JSONObject resultjson=JSONObject.parseObject(result);
  415. JSONObject resultBody = resultjson.getJSONObject("Cmscloud").getJSONObject("Body");
  416. String resultData=AesUtil.decrypt(resultBody.getString("Data"),GYPAY_API_AES_KEY);
  417. System.out.println(resultData);
  418. // Map resultMap = (Map) JSONObject.parse(resultData);
  419. return requestNo;
  420. }
  421. private String getPayStatusName(String payStatus){
  422. //业务状态:1-支付中,2-支付成功,3-支付失败,4- 已退款,5-部分支付成功,6-部分退款,10-未知
  423. String payStatusName = "";
  424. switch (payStatus){
  425. case "1": payStatusName = "支付中"; break;
  426. case "2": payStatusName = "支付成功"; break;
  427. case "3": payStatusName = "支付失败"; break;
  428. case "4": payStatusName = "已退款"; break;
  429. case "5": payStatusName = "部分支付成功"; break;
  430. case "6": payStatusName = "部分退款"; break;
  431. case "10": payStatusName = "未知"; break;
  432. default: payStatusName = "未知"; break;
  433. }
  434. return payStatusName;
  435. }
  436. }