|
@@ -0,0 +1,332 @@
|
|
|
+package com.malk.dali.service.Impl;
|
|
|
+
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.core.util.XmlUtil;
|
|
|
+import cn.hutool.http.HttpRequest;
|
|
|
+import cn.hutool.json.JSONObject;
|
|
|
+import cn.hutool.json.XML;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.malk.dali.service.PayService;
|
|
|
+import com.malk.server.aliwork.YDConf;
|
|
|
+import com.malk.server.aliwork.YDParam;
|
|
|
+import com.malk.server.common.McException;
|
|
|
+import com.malk.service.aliwork.YDClient;
|
|
|
+import com.malk.utils.UtilHttp;
|
|
|
+import com.malk.utils.UtilMap;
|
|
|
+import lombok.SneakyThrows;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.sql.*;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Random;
|
|
|
+
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class PayServiceImpl implements PayService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private YDClient ydClient;
|
|
|
+
|
|
|
+ private static final String API = "http://27.115.15.66:8098/BisOutWeb/payCenter/dealReq.srv";
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 不做错误拦截
|
|
|
+ * @param tradeCode
|
|
|
+ * @param condition
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private JSONObject _doPosts(String tradeCode, Map condition) {
|
|
|
+
|
|
|
+ // xml请求格式数据处理
|
|
|
+ Map head = UtilMap.map("erpSysCode, custNo, tradeName", "XYYGLXT", "300200632", tradeCode);
|
|
|
+ Map body = UtilMap.map("head, map", head, condition);
|
|
|
+ String data = XmlUtil.mapToXmlStr(body, "body");
|
|
|
+ log.info("请求入参, {}", XML.toJSONObject(data));
|
|
|
+
|
|
|
+ /// prd 财资固定格式, xml头数据前需要添加类型code, 且不能换行
|
|
|
+ data = "0000012001" + tradeCode + data;
|
|
|
+ String rsp = HttpRequest.post(API).body(data).execute().body();
|
|
|
+ JSONObject result = XML.toJSONObject(rsp);
|
|
|
+ log.info("请求响应, {}", result);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 付款状态同步
|
|
|
+ * @param
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void syncPayStatus() {
|
|
|
+ // 查询付款账户 (获取跟付款申请表,查询状态为付款中的数据)
|
|
|
+ YDParam ydParam = YDParam.builder()
|
|
|
+ .formUuid("FORM-6L966171YHZA0OJOAUKWG89JTZA635EV3Y1ILR")
|
|
|
+ .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lr08rrpc", "付款中")))
|
|
|
+ .build();
|
|
|
+ //获取所有 状态为付款中的数据
|
|
|
+ List<Map> dataList = (List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData();
|
|
|
+
|
|
|
+ dataList.forEach(item -> {
|
|
|
+ log.info("formInstanceId:{}",item.get("formInstanceId"));
|
|
|
+ String payState = "";
|
|
|
+ String payMsg = "";
|
|
|
+ String payDate = "";
|
|
|
+ //formInstanceId
|
|
|
+ //获取erpReqNo 和实例ID 循环去获取付款状态
|
|
|
+ JSONObject rsp = _doPosts("BY0003", (Map) UtilMap.map("erpReqNo, billCode, erpBatchNo", null,((Map) item.get("formData")).get("textField_lra9fqfv").toString(),null));
|
|
|
+ //获取头部信息
|
|
|
+ JSONObject head = rsp.getJSONObject("body").getJSONObject("head");
|
|
|
+ //判断retMsg retCode =2 时,仅代表查询失败
|
|
|
+ if ("2".equals(head.getStr("retCode"))){
|
|
|
+ //失败信息
|
|
|
+ payMsg = head.getStr("retMsg");
|
|
|
+
|
|
|
+ // 更新跟踪单状态
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId((String) item.get("formInstanceId"))
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_loeg6mse, textareaField_loeg6msh",((Map) item.get("formData")).get("textField_lra9fqfv").toString(),payMsg))).build(), YDConf.FORM_OPERATION.update);
|
|
|
+
|
|
|
+ }else{
|
|
|
+ JSONObject state = rsp.getJSONObject("body").getJSONObject("loopData").getJSONObject("row");
|
|
|
+ log.info("state:{}",state);
|
|
|
+ /**
|
|
|
+ * 00付款成功
|
|
|
+ * 01付款待提交
|
|
|
+ * 02付款流程中
|
|
|
+ * 03等待银行结果
|
|
|
+ * 95付款已删除
|
|
|
+ * 96付款已打回
|
|
|
+ * 98付款失败
|
|
|
+ * 99其他状态
|
|
|
+ */
|
|
|
+ payState = state.getStr("payState");
|
|
|
+ payMsg = state.getStr("payMsg");
|
|
|
+ payDate = state.getStr("payTime");
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ Date StrPayDate = null;
|
|
|
+ try {
|
|
|
+ StrPayDate= sdf.parse(payDate);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("未获取到付款时间,付款信息:{}",payMsg);
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ //获取付款成功的
|
|
|
+ if (payState.equals("00")) {
|
|
|
+
|
|
|
+ payMsg = "付款成功";
|
|
|
+
|
|
|
+ String sqly = ((Map) item.get("formData")).get("selectField_lqalbx96").toString(); //申请来源
|
|
|
+ String guid = ((Map) item.get("formData")).get("textField_li1y52yh").toString(); //PayGUID
|
|
|
+ String BillCode = ((Map) item.get("formData")).get("textField_lra9fqfv").toString(); //结算流水号
|
|
|
+
|
|
|
+ //数据来源明源云则回写
|
|
|
+ if ("明源ERP".equals(sqly)){
|
|
|
+ //付款成功的更新Erp状态
|
|
|
+ String erpRsp = UtilHttp.doPost("https://gateway.dslink.net.cn/api/webhook/E185908E63CF407B911FA870642A39A5",
|
|
|
+ null,null, UtilMap.map("PayGUID, BillCode, StrPayDate",guid,BillCode,StrPayDate),new HashMap());
|
|
|
+ //通过 http status 判定, 200 即为成功
|
|
|
+ Map result = (Map) JSON.parse(erpRsp);
|
|
|
+ Boolean status = (Boolean) result.get("status");
|
|
|
+ if (status) {
|
|
|
+ log.info("回写ERP成功{}",result);
|
|
|
+ }else{
|
|
|
+ log.info("回写ERP失败{}",result);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 更新付款申请单状态
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId((String) item.get("formInstanceId"))
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lr08rrpc, textField_lof4wiqt, textField_lxlt9ptd", "付款成功","凭证未生成",payDate)))
|
|
|
+ .build(), YDConf.FORM_OPERATION.update);
|
|
|
+
|
|
|
+
|
|
|
+ // 更新跟踪单状态
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId(((Map) item.get("formData")).get("textField_lr0ct6da").toString())
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_loeg6mse, textField_loeg6msg",((Map) item.get("formData")).get("textField_lra9fqfv").toString(),payMsg)))
|
|
|
+ .build(), YDConf.FORM_OPERATION.update);
|
|
|
+
|
|
|
+ }
|
|
|
+ //付款已删除 付款已打回 付款失败跟踪单 其他状态
|
|
|
+ else if (payState.equals("95")||payState.equals("96")||payState.equals("98")||payState.equals("99")){
|
|
|
+
|
|
|
+ // 更新付款申请单状态
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId((String) item.get("formInstanceId"))
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lr08rrpc, textField_lraevvod", "待付款",((Map) item.get("formData")).get("textField_lra9fqfv").toString()+"-"+new Random().nextInt(1000))))
|
|
|
+ .build(), YDConf.FORM_OPERATION.update);
|
|
|
+
|
|
|
+ // 更新跟踪单状态
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId(((Map) item.get("formData")).get("textField_lr0ct6da").toString())
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_loeg6mse, textField_loeg6msg",((Map) item.get("formData")).get("textField_lra9fqfv").toString(),payMsg)))
|
|
|
+ .build(), YDConf.FORM_OPERATION.update);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步付款银行信息
|
|
|
+ * @param map
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ @Override
|
|
|
+ public void syncPayBankInfo(Map map) {
|
|
|
+ //根据企业源系统业务编码 查询付款账号表信息
|
|
|
+ YDParam ydParam = YDParam.builder()
|
|
|
+ .formUuid("FORM-OS566L91HS1B78LW7GMUQ6AQA6C9288Y2W1IL4")
|
|
|
+ .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lmhlzvdl", map.get("code"))))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ List<Map> mapList = (List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData();
|
|
|
+ Map fkmap = (Map) mapList.get(0).get("formData");
|
|
|
+ log.info("fkmap:{}",fkmap);
|
|
|
+ //根据收款账户 查询收款信息
|
|
|
+ YDParam ydParam2 = YDParam.builder()
|
|
|
+ .formUuid("FORM-NO9667913LKF3GE09L0EHA3YMDGU3GF9NEEOLX1")
|
|
|
+ .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_li1w31c2", map.get("account"))))
|
|
|
+ .build();
|
|
|
+ List<Map> mapList1 = (List<Map>) ydClient.queryData(ydParam2, YDConf.FORM_QUERY.retrieve_search_form).getData();
|
|
|
+ Map skmap = (Map) mapList1.get(0).get("formData");
|
|
|
+ log.info("skmap:{}",skmap);
|
|
|
+ //收款联行银行号 付款银行联行号 收款银行实例 企业编码 付款银行简称 付款账户名称 付款开户行 付款银行账号 直连方式
|
|
|
+ ydClient.operateData(YDParam.builder().formInstId(map.get("formInstId").toString())
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lr7tmvy9, textField_lr7tmvy8, textField_lr7tmvya, textField_lmhln79w, " +
|
|
|
+ "selectField_lqalbx97, textField_li1y52z5, textField_li1y52z4, selectField_li1y52z3, textField_li1y52z2",
|
|
|
+ skmap.get("selectField_lof5vr7d"),fkmap.get("textField_li1w31c4"),mapList1.get(0).get("formInstanceId"),fkmap.get("textField_lmhln79w"),
|
|
|
+ fkmap.get("textField_li1w31c5"),fkmap.get("textField_li1w31c1"),fkmap.get("textField_li1w31c3"),fkmap.get("textField_li1w31c2"),fkmap.get("selectField_li1w31c8"))))
|
|
|
+ .build(), YDConf.FORM_OPERATION.update);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发起付款
|
|
|
+ * @param data
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void payMent(Map data) {
|
|
|
+
|
|
|
+ // 付款: payerAccNo, payerCorpName; 领款: payeeAccNo, payeeAccName, payeeBankName, payeeBankCode; 金额: payMoney, payPurpose, erpReqNo
|
|
|
+ JSONObject rsp = _doPosts("BY0001", data);
|
|
|
+ JSONObject head = rsp.getJSONObject("body").getJSONObject("head");
|
|
|
+ McException.assertAccessException(!"交易成功".equals(head.get("retMsg")),head.get("retMsg").toString());
|
|
|
+ if ("交易成功".equals(head.get("retMsg"))){
|
|
|
+ JSONObject objectMap = rsp.getJSONObject("body").getJSONObject("map");
|
|
|
+ String billCode = (String) objectMap.get("billCode");
|
|
|
+ // 更新付款申请单状态
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId(data.get("formInstId").toString())
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lra9fqfv, textareaField_lraa9mhe, textField_lr08rrpc", billCode,head.get("retMsg"),"付款中"))).build(), YDConf.FORM_OPERATION.update);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handWorkPayment(Map data) {
|
|
|
+ log.info("手工付款单{}",data);
|
|
|
+ //根据实例ID更新付款申请单的付款时间
|
|
|
+ long dateFiled = Long.parseLong(data.get("date").toString());
|
|
|
+ if (ObjectUtil.isNotEmpty(dateFiled)){
|
|
|
+ String dateStr = DateUtil.date(dateFiled).toString("yyyy-MM-dd");
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId(data.get("formInstId").toString())
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lxlt9ptd",dateStr))).build(), YDConf.FORM_OPERATION.update);
|
|
|
+ }
|
|
|
+ log.info("付款日期:{}",data.get("date").toString());
|
|
|
+
|
|
|
+ //根据实例ID 查询付款申请单
|
|
|
+ YDParam ydParam = YDParam.builder()
|
|
|
+ .formInstId(data.get("formInstId").toString())
|
|
|
+ .build();
|
|
|
+ Map formData = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id).getFormData();
|
|
|
+ log.info("formData{}",formData);
|
|
|
+
|
|
|
+ //数据来源明源云则回写
|
|
|
+ if ("明源ERP".equals(formData.get("selectField_lqalbx96"))){
|
|
|
+ //付款成功的更新Erp状态
|
|
|
+ String erpRsp = UtilHttp.doPost("https://gateway.dslink.net.cn/api/webhook/E185908E63CF407B911FA870642A39A5",
|
|
|
+ null,null, UtilMap.map("PayGUID, BillCode, StrPayDate",formData.get("textField_li1y52yh"),"", formData.get("textField_lxlt9ptd")),new HashMap());
|
|
|
+
|
|
|
+ //通过 http status 判定, 200 即为成功
|
|
|
+ Map result = (Map) JSON.parse(erpRsp);
|
|
|
+ Boolean status = (Boolean) result.get("status");
|
|
|
+ if (status) {
|
|
|
+ log.info("回写ERP成功{}",result);
|
|
|
+ }else{
|
|
|
+ log.info("回写ERP失败{}",result);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //配置客户的sqlist URL
|
|
|
+// private static final String SQLITE_URL ="jdbc:sqlite:D:/JavaSpace/fbi.dll";
|
|
|
+ private static final String SQLITE_URL ="jdbc:sqlite:D:/FASTBI/FBI/fbi.dll";
|
|
|
+ /**
|
|
|
+ * 同步凭证状态
|
|
|
+ * @param formInstId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void synProofStatus(String formInstId) {
|
|
|
+
|
|
|
+ //查询凭证实例ID 状态:1成功 2失败 失败信息
|
|
|
+ Connection connection = null;
|
|
|
+ Statement statement = null;
|
|
|
+ try {
|
|
|
+ // 加载SQLite的JDBC驱动程序
|
|
|
+ Class.forName("org.sqlite.JDBC");
|
|
|
+ //创建链接
|
|
|
+ connection = DriverManager.getConnection(SQLITE_URL);
|
|
|
+ // 创建Statement对象
|
|
|
+ statement = connection.createStatement();
|
|
|
+ // 执行查询语句
|
|
|
+ String sql = "SELECT * FROM rest_drrecord WHERE instance_id ='" + formInstId + "' and status = 1 order by id desc";
|
|
|
+ ResultSet rowsAffected = statement.executeQuery(sql);
|
|
|
+
|
|
|
+ if (rowsAffected.next()) {
|
|
|
+ int status = rowsAffected.getInt("status");
|
|
|
+ //凭证号
|
|
|
+ String flag = rowsAffected.getString("record_id");
|
|
|
+ if (status == 1){
|
|
|
+ // 更新付款申请单凭证状态
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId(formInstId)
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lof4wiqt, textField_lof4wiqr","凭证已生成",flag)))
|
|
|
+ .build(), YDConf.FORM_OPERATION.update);
|
|
|
+ log.info("凭证已生成:{}",rowsAffected.getString("note"));
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ log.info("未查询到对应生成凭证成功数据!");
|
|
|
+ }
|
|
|
+ } catch (ClassNotFoundException | SQLException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ // 关闭连接和资源
|
|
|
+ try {
|
|
|
+ if (statement != null) {
|
|
|
+ statement.close();
|
|
|
+ }
|
|
|
+ if (connection != null) {
|
|
|
+ connection.close();
|
|
|
+ }
|
|
|
+ } catch (SQLException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|