注:如果没有与银行合作,银行是不会提供开发文档与测试账号的,请确保合作后看以下内容,否则看了也没用,因为重要的详细信息都在银行提供的文档中,我写的只是实际开发的代码;
查询银行到账信息代码示例:
介绍:此业务我是用时间定时器做的,每30秒获取银行到账的明细,并存入数据库;
开发前请认真阅读银行给的开发文档,按文档要求安装和配置前置机;
我们只需要把请求发送给前置机,由前置机与银行交互然后返回我们,前置机装在我们公司本地局域网中,所以数据可不加密,前置机会加密与银行交互;
获取到银行账信息的数据有两种情况,一种是数据量很小 2K以内的数据银行会以拼接url的方式返回;如果数据超出2k需要自己发送下载文件的请求,请求完毕后需要关闭文件,所有我们需要解析两种数据,具体详细银行会有对接文档参考;
【可先看文章最下面的简要】
1.配置文件:
conf/MortgageBankofjiangsucainfo.properties
#-------------------------江苏银行配置表------银行业务 编码GBK-------http://cron.qqe2.com/-------http://www.shnydb.com/-----
#xxxx公司银行账号
ACNO = 32280xxxxxxxxxx
#账号对应的户名
ACNAME = xxxxxxxxxx
#交易码 ;查询账户明细(200xxx交易)
TR_CODE_QUERY = 200xxx
#交易码 ;对外支付(300xxx交易)
TR_CODE_PAY = 300xxx
#渠道标识
CHANNEL = 5
#文件标识 0-报文,1-文件
FILE_FLAG = 0
#前置机IP
FRONT_END_PROCESSOR_IP = 192.168.x.xxx
#前置机交易端口
DEAL_PROT = 10xxx
#前置机文件端口
FILE_PROT = 20xxx
#日期模板
DATETEMPLATE = yyyyMMdd
#时间模板
TIMETEMPLATE = HHmmss
#币种 (人民币)
CUR_CODE = 01
#收款户名 测试付款用
REV_ACNAME = xxx
#定时获取到账信息;
JIANGSUBANK_GETACCOUNTINFO_TIME = 0/120 * * * * ?
#每间隔 N 时间获取一次数据,这里的时间与定时器 JIANGSUBANK_GETACCOUNTINFO_TIME 的时间保持一致(单位秒)
JIANGSUBANK_GETACCOUNTINFO_RUNTIME = 120
#未防止获取的数据丢失,每天晚上 23点50分 定时 触发一次获取当天所有银行到账数据;晚上23:58分执行 * 58 23 * * ?
All_A_DAY_JIANGSUBANK_GETACCOUNTINFO_TIME = * 58 23 * * ?
SpringMVC.xml加载配置文件
<bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<!--<array>-->
<value>classpath:conf/MortgageBankofjiangsucainfo.properties</value>
<!--</array>-->
</property>
com.tcwl.vsmp.mortgage.common.MortgageBankofjiangsucainfoConstant.java
package com.tcwl.vsmp.mortgage.common;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 江苏银行业务常量定义类
*
* 银行业务 编码GBK
*/
@Component
public class MortgageBankofjiangsucainfoConstant {
/*public static*/
/*======================银行=======================*/
/**
* 请求头
* @throws Exception
*/
// tr_code 交易码 ;查询账户明细 200110 MortgageBankofjiangsucainfoConstant.TR_CODE_QUERY
public static String TR_CODE_QUERY ;
//交易码 ;对外支付(300001交易) MortgageBankofjiangsucainfoConstant.TR_CODE_PAY
public static String TR_CODE_PAY;
//cms_corp_no 现金管理客户号 企业不需要赋值,由银企前置机进行赋值。 MortgageBankofjiangsucainfoConstant.CMS_CORP_NO
public static String CMS_CORP_NO = "";
//user_no 用户号 企业不需要赋值,由银企前置机进行赋值。MortgageBankofjiangsucainfoConstant.USER_NO
public static String USER_NO = "";
//org_code 机构号 企业不需要赋值,由银企前置机进行赋值。MortgageBankofjiangsucainfoConstant.ORG_CODE
public static String ORG_CODE = "";
//serial_no 交易流水号 送空,由现金管理系统产生 MortgageBankofjiangsucainfoConstant.SERIAL_NO
public static String SERIAL_NO = "";
//req_no 请求号 企业ERP的流水号 MortgageBankofjiangsucainfoConstant.REQ_NO
public static String REQ_NO = "";
//channel 渠道标识 ERP送‘5’ MortgageBankofjiangsucainfoConstant.CHANNEL
public static String CHANNEL ;
//sign 签名标识 0-报文未签名 ; 1-报文已签名; 企业送空,由银企前置进行传送. MortgageBankofjiangsucainfoConstant.SIGN
public static String SIGN = "";
//file_flag 文件标识0-报文1-文件 MortgageBankofjiangsucainfoConstant.FILE_FLAG
public static String FILE_FLAG;
//reserved 保留字段
public static String RESERVED = "";
/**
* 请求体
* @throws Exception
*/
//坦程自己公司账号 MortgageBankofjiangsucainfoConstant.ACNO
public static String ACNO;
//自己公司账号对应的户名 MortgageBankofjiangsucainfoConstant.ACNAME
public static String ACNAME ;
//cur_code 币种 01 -人民币 MortgageBankofjiangsucainfoConstant.CUR_CODE
public static String CUR_CODE ;
/**
* 请求IP地址
*/
//前置机ip MortgageBankofjiangsucainfoConstant.FRONT_END_PROCESSOR_IP
public static String FRONT_END_PROCESSOR_IP;
//前置机交易端口prot MortgageBankofjiangsucainfoConstant.DEAL_PROT
public static String DEAL_PROT ;
//前置机文件端口prot MortgageBankofjiangsucainfoConstant.FILE_PROT
public static String FILE_PROT;
//日期模板 MortgageBankofjiangsucainfoConstant.DATETEMPLATE
public static String DATETEMPLATE ;
//时间模板 MortgageBankofjiangsucainfoConstant.TIME_TEMPLATE
public static String TIME_TEMPLATE ;
/* ============================操作状态================================================*/
//操作状态【非金鑫获取的数据,由自己写入】 0为未操作,1为操作,数据库默认为0,MortgageBankofjiangsucainfoConstant.STSTUS_NO
public static Integer STSTUS_NO = 0;
public static Integer STSTUS_YES = 1;
@Value("#{prop.TR_CODE_QUERY}")
public void setTrCodeQuery(String trCodeQuery) {
TR_CODE_QUERY = trCodeQuery;
}
@Value("#{prop.TR_CODE_PAY}")
public void setTrCodePay(String trCodePay) {
TR_CODE_PAY = trCodePay;
}
public void setCmsCorpNo(String cmsCorpNo) {
CMS_CORP_NO = cmsCorpNo;
}
public void setUserNo(String userNo) {
USER_NO = userNo;
}
public void setOrgCode(String orgCode) {
ORG_CODE = orgCode;
}
public void setSerialNo(String serialNo) {
SERIAL_NO = serialNo;
}
public void setReqNo(String reqNo) {
REQ_NO = reqNo;
}
@Value("#{prop.CHANNEL}")
public void setCHANNEL(String CHANNEL) {
MortgageBankofjiangsucainfoConstant.CHANNEL = CHANNEL;
}
public void setSIGN(String SIGN) {
MortgageBankofjiangsucainfoConstant.SIGN = SIGN;
}
@Value("#{prop.FILE_FLAG}")
public void setFileFlag(String fileFlag) {
FILE_FLAG = fileFlag;
}
public void setRESERVED(String RESERVED) {
MortgageBankofjiangsucainfoConstant.RESERVED = RESERVED;
}
@Value("#{prop.ACNO}")
public void setACNO(String ACNO) {
MortgageBankofjiangsucainfoConstant.ACNO = ACNO;
}
@Value("#{prop.CUR_CODE}")
public void setCurCode(String curCode) {
CUR_CODE = curCode;
}
//自己公司账号对应的户名
@Value("#{prop.ACNAME}")
public void setAcName(String acName) {
ACNAME = acName;
}
@Value("#{prop.FRONT_END_PROCESSOR_IP}")
public void setFrontEndProcessorIp(String frontEndProcessorIp) {
FRONT_END_PROCESSOR_IP = frontEndProcessorIp;
}
@Value("#{prop.DEAL_PROT}")
public void setDealProt(String dealProt) {
DEAL_PROT = dealProt;
}
@Value("#{prop.FILE_PROT}")
public void setFilePort(String filePort) {
FILE_PROT = filePort;
}
@Value("#{prop.DATETEMPLATE}")
public void setDATETEMPLATE(String DATETEMPLATE) {
MortgageBankofjiangsucainfoConstant.DATETEMPLATE = DATETEMPLATE;
}
@Value("#{prop.TIMETEMPLATE}")
public void setTimeTemplate(String timeTemplate) {
TIME_TEMPLATE = timeTemplate;
}
}
2.工具类
发送工具
com.tcwl.vsmp.weizhang.util.HttpClientUtil.java
package com.tcwl.vsmp.weizhang.util;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import com.tcwl.vsmp.weizhang.vo.KeyValueObject;
/**
* <p>Title: TSP</p>
* <p>Description: 本类用于对外http请求工具类</p>
* <p>Copyright: Copyright (c) 2011 Wuxi Tan Cheng IOT Technology Co., Ltd.</p>
*
* @author lizhijian
* @version 1.0
* <p>2014-3-4</p>
* @since 1.6.0
*/
public class HttpClientUtil
{
/**
*
* @author: 苏凯
* @Title: httpPostWithXml
* @Description: 江苏银行 发送请求 2018-10-24
* @param: @return String 类型,string是请求接口返回的报文信息拼接的字符串
* @return: String
* @throws MalformedURLException,IOException
*
*/
public static BufferedReader httpPostWithXml(String requestBody1,String url,String requestHeader) {
String urlStr = "";
String line = "";
StringBuffer resultSting = new StringBuffer();
BufferedReader br = null;
try {
//urlStr,写在了配置文件中,直接进行获取
//声明URL
URL url1 = new URL(url);
//1.创建链接
URLConnection con = url1.openConnection();
//2.封装报文传输进行传输
String xmlInfo = requestBody1;
byte[] xmlData = xmlInfo.getBytes("GBK");
con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(false);
con.setRequestProperty("Pragma:", "no-cache");
con.setRequestProperty("Cache-Control", "no-cache");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// requestHeader
con.setRequestProperty("Content-length",String.valueOf(xmlData.length));
OutputStreamWriter out = new OutputStreamWriter(
con.getOutputStream());
System.out.println(">>>>>>>>>>接口地址为urlStr=" + urlStr);
System.out.println(">>>>>>>>>>传入的报文xmlInfo=" + xmlInfo);
out.write(new String(xmlInfo.getBytes("GBK")));
/* out.write(new String(xmlInfo.getBytes("GBK")));*/
out.flush();
out.close();
//3.获取返回报文
br = new BufferedReader(new InputStreamReader(
con.getInputStream(),"gbk"));
/*br = new BufferedReader(new InputStreamReader(
con.getInputStream(),"ISO-8859-1"));*/
//对返回值报文进行打印
/* for (line = br.readLine(); line != null; line = br.readLine()) {
//对返回的报文进行结果判断<RspCode>0000</RspCode>
System.out.println(">>>>>>>>>>>>>>>>>>>返回的结果报文内容为:---------"+line);
//对返回的报文进行拼接,然后返回给业务层,在业务层进行判断
resultSting.append(line);
}*/
System.out.println(">>>>>>>>>>>>>>>>>>>返回的结果报文内容为resultSting.toString():---------"+resultSting.toString());
return br;
/*return resultSting.toString();*/
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return br;
}
/**
*
* @author: 苏凯
* @Title: httpPostWithXml
* @Description: 江苏银行获取返回文件的大小
* @param: String sizeUrl
* @return: BufferedReader
* @throws MalformedURLException,IOException
* http://127.0.0.1:20010/?00SIZE FILENAME
*
*/
public static BufferedReader getFileSizeForJiangSu(String sizeUrl) throws Exception {
//声明URL
URL url1 = new URL(sizeUrl);
//1.创建链接
URLConnection con = url1.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(
con.getInputStream(), "gbk"));
return br;
}
/**
*
* @author: 苏凯
* @Title: httpPostWithXml
* @Description: 江苏银行获取返回文件的数据
* @param: String sizeUrl
* @return: BufferedReader
* @throws MalformedURLException,IOException
* http://127.0.0.1:20010/?00GET FILENAME 0 FILELENGTH
*
*/
public static BufferedReader getFileForJiangSu(String fileUrl) throws Exception {
URL url2 = new URL(fileUrl);
//1.创建链接
URLConnection conn = url2.openConnection();
// 发送POST请求必须设置如下两行
/*conn.setDoOutput(true);
conn.setDoInput(true);*/
BufferedReader br = new BufferedReader(new InputStreamReader(
conn.getInputStream(), "gbk"));
return br;
}
/**
*
* @author: 苏凯
* @Title: httpPostWithXml
* @Description: 江苏银行关闭文件;每次下载结束必须关闭,否则偏移量往后偏移1(文件字节大小加1)
* @param: String sizeUrl
* @return: BufferedReader
* @throws MalformedURLException,IOException
* http://127.0.0.1:20010/?00QUIT
* 2018-10-26
*/
public static BufferedReader offFileForJiangSu(String offFileUrl) throws Exception {
URL url = new URL(offFileUrl);
//1.创建链接
URLConnection conn31 = url.openConnection();
conn31.setDoOutput(true);
conn31.setDoInput(true);
//遍历参数,对返回值报文进行打印
String lineT13;
BufferedReader br = new BufferedReader(new InputStreamReader(
conn31.getInputStream(), "gbk"));
return br;
}
}
如果这行报错就把这行注释了
con.setRequestProperty("Pragma:", "no-cache");
【java.lang.IllegalArgumentException: Illegal character(s) in message header field: Pragma:】
XmlAndString互转工具:
com.tcwl.vsmp.mortgage.utils.XmlAndString.java
package com.tcwl.vsmp.mortgage.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
/**
* xml,String互转
* 苏凯
* 2018-10-24
*/
public class XmlAndString {
/**
*
* @param document
* Document对象(读xml生成的)
* @return String字符串
* @throws Throwable
*/
public String xmlToString(Document document) throws Throwable {
TransformerFactory ft = TransformerFactory.newInstance();
Transformer ff = ft.newTransformer();
ff.setOutputProperty("encoding", "GB2312");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ff.transform(new DOMSource(document), new StreamResult(bos));
return bos.toString();
}
/**
* xml形状的str串
* @param
* @return Document 对象
*/
public Document StringTOXml(String str) {
StringBuilder sXML = new StringBuilder();
sXML.append(str);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document doc = null;
try {
/*InputStream is = new ByteArrayInputStream(sXML.toString().getBytes("utf-8"));*/
/* InputStream is = new ByteArrayInputStream(sXML.toString().getBytes());*/
InputStream is = new ByteArrayInputStream(sXML.toString().getBytes("GBK"));
System.out.println("is==null"+is==null);
doc = dbf.newDocumentBuilder().parse(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return doc;
}
/**
*
* @param document
* @return 某个节点的值 前提是需要知道xml格式,知道需要取的节点相对根节点所在位置
*/
public String getNodeValue(Document document, String nodePaht) {
XPathFactory xpfactory = XPathFactory.newInstance();
XPath path = xpfactory.newXPath();
String servInitrBrch = "";
try {
servInitrBrch = path.evaluate(nodePaht, document);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return servInitrBrch;
}
/**
*
* @param document
* @param nodePath
* 需要修改的节点相对根节点所在位置
* @param vodeValue
* 替换的值
*/
public void setNodeValue(Document document, String nodePath, String vodeValue) {
XPathFactory xpfactory = XPathFactory.newInstance();
XPath path = xpfactory.newXPath();
Node node = null;
;
try {
node = (Node) path.evaluate(nodePath, document, XPathConstants.NODE);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
node.setTextContent(vodeValue);
}
public static void main(String[] args) throws Throwable {
// 读取xml文件,生成document对象
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// 文件的位置在工作空间的根目录(位置随意,只要写对就ok)
Document document = builder.parse(new File("a.xml"));
XmlAndString t = new XmlAndString();
// XML————》String
String str = t.xmlToString(document);
System.out.println("str:" + str);
// String ————》XML
Document doc = t.StringTOXml(str);
String nodePath = "/transaction/header/msg/sndMbrCd";
// getNodeValue
String nodeValue = t.getNodeValue(doc, nodePath);
System.out.println("修改前nodeValue:" + nodeValue);
// setNodeValue
t.setNodeValue(doc, nodePath, nodeValue + "hello");
System.out.println("修改后nodeValue:" + t.getNodeValue(doc, nodePath));
}
}
编码查询,utf-8 与 GBK 编码互转工具:
com.tcwl.vsmp.mortgage.utils.EncodeQueryAndTransition,java
package com.tcwl.vsmp.mortgage.utils;
/**
* 编码查询,utf-8 与 GBK 编码互转
* 苏凯
* 2018-10-24
*/
import java.io.UnsupportedEncodingException;
/**
* 编码查询与转换
*/
public class EncodeQueryAndTransition {
//编码转换
/**
* gbk转utf-8
* @param gbk
* @return
* @throws UnsupportedEncodingException
*/
public static byte[] gbk2UtfByte(String gbk)throws UnsupportedEncodingException {
char[]c= gbk.toCharArray();
byte[]fullByte=new byte[3*c.length];
for(int i=0;i<c.length;i++){
String binary=Integer.toBinaryString(c[i]);
StringBuffer sb=new StringBuffer();
int len=16-binary.length();
//前面补零
for(int j=0;j<len;j++){
sb.append("0");
}
sb.append(binary);
//增加位,达到到24位3个字节
sb.insert(0,"1110");
sb.insert(8,"10");
sb.insert(16,"10");
fullByte[i*3]=Integer.valueOf(sb.substring(0,8),2).byteValue();//二进制字符串创建整型
fullByte[i*3+1]=Integer.valueOf(sb.substring(8,16),2).byteValue();
fullByte[i*3+2]=Integer.valueOf(sb.substring(16,24),2).byteValue();
}
//模拟UTF-8编码的网站显示
System.out.println(new String(fullByte,"UTF-8"));
return fullByte;
}
/**
* utf-8 转GBK
* @param gbkStr
* @return
*/
public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
int n = gbkStr.length();
byte[] utfBytes = new byte[3 * n];
int k = 0;
for (int i = 0; i<n;i++){
int m=gbkStr.charAt(i);
if(m<128&&m>=0){
utfBytes[k++]=(byte)m;
continue;
}
utfBytes[k++]=(byte)(0xe0|(m>>12));
utfBytes[k++]=(byte)(0x80|((m>>6)&0x3f));
utfBytes[k++]=(byte)(0x80|(m&0x3f));
}
if(k<utfBytes.length){
byte[]tmp=new byte[k];
System.arraycopy(utfBytes,0,tmp,0,k);
return tmp;
}
return utfBytes;
}
/**
* 编码查询
*/
public static String getEncoding(String str) {
String encode = "GB2312";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是GB2312
String s = encode;
return s; //是的话,返回“GB2312“,以下代码同理
}
} catch (Exception exception) {
}
encode = "ISO-8859-1";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是ISO-8859-1
String s1 = encode;
return s1;
}
} catch (Exception exception1) {
}
encode = "UTF-8";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是UTF-8
String s2 = encode;
return s2;
}
} catch (Exception exception2) {
}
encode = "GBK";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是GBK
String s3 = encode;
return s3;
}
} catch (Exception exception3) {
}
return ""; //如果都不是,说明输入的内容不属于常见的编码格式。
}
}
3.创建数据库表和类
mortgage_bankofjiangsucainfo 表:
CREATE TABLE `tanchengwulian`.`Untitled` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '江苏银行账户到账查询信息 ',
`serial_no` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '平台流水号(C20)',
`acno` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '账号(C35)',
`cur_code` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '货币码(C2)',
`tr_acdt` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '交易日期(C8)',
`tr_time` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '交易时间交易日期(C6)',
`host_serial_no` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '主机流水号(C20)',
`tr_bankno` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '交易行号(C12)',
`acname` varchar(70) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '户名(C70)',
`opp_acno` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '对方账号(C35)',
`opp_cur_code` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '对方货币码(C2)',
`opp_acname` varchar(70) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '对方账号户名(C70)',
`opp_bankname` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '对方账号开户行(C60)',
`opp_bankno` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '对方行号(C12)',
`tr_type` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '交易类别(C1)\r\n1-自身收付款\r\n2-资金归集\r\n3-结息\r\n4-收费\r\n5-资金池划拨户结息或清息\r\n',
`csh_dra_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '钞汇标志(C1)',
`bank_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '他行标志(C1)',
`area_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '同城异地标志(C1)',
`tr_from` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '交易来源(C1)',
`trans_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '发生额标志(C1)',
`old_serial_no` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '被冲销流水号(C12)',
`old_acdt` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '原交易日期(C8)',
`cash_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '现转标志(C1)',
`crdr_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '借贷标志(C1)',
`balance` decimal(16, 2) DEFAULT NULL COMMENT '余额(N16.2)',
`freeze_amt` decimal(16, 2) UNSIGNED ZEROFILL DEFAULT NULL COMMENT '冻结金额(N16.2)',
`cert_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '凭证种类(C20)',
`cert_batchno` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '凭证批次号(C20)',
`cert_no` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '凭证号码(C20)',
`tr_code` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '交易码(C6)',
`user_no` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '柜员号(C10)',
`sub_no` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '传票号(C20)',
`purpose` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '摘要(C30)【订单编号,用这个去loan_table中与bugGood_order_no字段匹配获取交易类型buyGoods_Id】',
`postscript` varchar(70) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '附言(C60)',
`tr_timestamp` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '交易时间戳',
`reserved1` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '备注字段一(C60)',
`reserved2` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '备注字段二(C60)',
`tr_bankname` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '交易行名(C70)',
`bank_no` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '支付系统联行行号(C20)',
`bankname` varchar(70) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '支付系统联行行名(C70)',
`printcount` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '回单打印次数(C8)',
`payamt` decimal(16, 2) DEFAULT NULL COMMENT '借出金额(N16,2)',
`Rcvamt` decimal(16, 2) DEFAULT NULL COMMENT '借入金额(N16,2)',
`amt` decimal(16, 2) DEFAULT NULL COMMENT '交易金额(N16.2)',
`fee_amt` decimal(16, 2) DEFAULT NULL COMMENT '手续费(N16.2)',
`last_bal` decimal(16, 2) DEFAULT NULL COMMENT '上笔余额(N16.2)',
`ststus` int(3) DEFAULT 0 COMMENT '0为未操作,1为操作,数据库默认为0,【非金鑫获取的数据,由自己写入】',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `serial_no_key`(`serial_no`) USING BTREE COMMENT '平台流水号(C20) 必须唯一,不然影响呈现运行'
) ENGINE = InnoDB AUTO_INCREMENT = 713 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
实体类:
com.tcwl.vsmp.mortgage.po.MortgageBankofjiangsucainfo.java
package com.tcwl.vsmp.mortgage.po;
import java.math.BigDecimal;
/**
* 江苏银行账户到账查询信息
* 苏凯
* 2018-10-22
*
* http://cron.qqe2.com/
*/
public class MortgageBankofjiangsucainfo {
private Long id;
/* ============返回参数头head(数据库无对应表和字段)===========================================*/
//交易码
private String tr_code_head;
//现金管理客户号
private String cms_corp_no_head;
//请求号 企业ERP的流水号,原样返回
private String req_no_head;
//交易时间 格式hhmmss
private String tr_time_head;
//交易日期 格式YYYYMMDD
private String tr_acdt_head;
//成功标识; 0- 表示成功 ; 1- 表示通讯机超时 ; 8- 表示主机结果未知 ;其它-交易失败
private String succ_flag_head;
//返回信息
private String ret_info_head;
//返回码 0000表示成功,正常返回
private String ret_code_head;
//返回附加信息
private String ext_info_head;
//保留字段
private String reserved_head;
//文件标识 传送0-报文,1-文件,或为空
private String file_flag_head;
//机构号 公共返回,企业可不用
private String org_code_head;
//
private String total_head;
// 交易流水号 由现金管理系统产生的流水号
private String serial_no_head;
/* ============返回参数身体body (数据库无对应表和字段)==========================================*/
//记录条数;视记录数而定
private String record_num_body;
// 字段数; 视域数而定
private String field_num_body;
//数据域 节点<2K,如果file_flag为1则无该节点
private String serial_record_body;
//文件名 如果file_flag为0则无该节点
private String file_name_body;
/* ===========返回参数body中的 serial_record ; serial_record_body数据域(数据库有对应表和字段) ====================*/
//平台流水号(C20)
private String serial_no;
//账号(C35)
private String acno;
//货币码(C2)
private String cur_code;
//交易日期(C8)
private String tr_acdt;
//交易时间交易日期(C6)
private String tr_time;
//主机流水号(C20)
private String host_serial_no;
//交易行号(C12)
private String tr_bankno;
//户名(C70)
private String acname;
//对方账号(C35)
private String opp_acno;
//对方货币码(C2)
private String opp_cur_code;
//对方账号户名(C70)
private String opp_acname;
//对方账号开户行(C60)
private String opp_bankname;
//对方行号(C12)
private String opp_bankno;
//交易类别(C1)
private String tr_type;
//钞汇标志(C1)
private String csh_dra_flag;
//他行标志(C1)
private String bank_flag;
//同城异地标志(C1)
private String area_flag;
//交易来源(C1)
private String tr_from;
//发生额标志(C1)
private String trans_flag;
//被冲销流水号(C12)
private String old_serial_no;
//原交易日期(C8)
private String old_acdt;
//现转标志(C1)
private String cash_flag;
//借贷标志(C1)
private String crdr_flag;
//余额(N16.2)
private BigDecimal balance;
//冻结金额(N16.2)
private BigDecimal freeze_amt;
//凭证种类(C20)
private String cert_type;
//凭证批次号(C20)
private String cert_batchno;
//凭证号码(C20)
private String cert_no;
//交易码(C6)
private String tr_code;
//柜员号(C10)
private String user_no;
//传票号(C20)
private String sub_no;
//摘要(C30)【订单编号,用这个表MortgageBankofjiangsucainfo的这个purpose去loan_table中与bugGood_order_no字段匹配获取交易类型buyGoods_Id】
private String purpose;
//附言(C60)
private String postscript;
//交易时间戳
private String tr_timestamp;
//备注字段一(C60)
private String reserved1;
//备注字段二(C60)
private String reserved2;
//交易行名(C70)
private String tr_bankname;
//支付系统联行行号(C20)
private String bank_no;
//支付系统联行行名(C70)
private String bankname;
//回单打印次数(C8)
private String printcount;
//借出金额(N16,2)
private BigDecimal payamt;
//借入金额(N16,2)
private BigDecimal rcvamt;
//交易金额(N16.2)
private BigDecimal amt;
//手续费(N16.2)
private BigDecimal fee_amt;
//上笔余额(N16.2)
private BigDecimal last_bal;
//操作状态 ;0为未操作,1为操作,数据库默认为0,【非金鑫获取的数据,由自己写入】
private Integer ststus;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getSerial_no() {
return serial_no;
}
public void setSerial_no(String serial_no) {
this.serial_no = serial_no == null ? null : serial_no.trim();
}
public String getAcno() {
return acno;
}
public void setAcno(String acno) {
this.acno = acno == null ? null : acno.trim();
}
public String getCur_code() {
return cur_code;
}
public void setCur_code(String cur_code) {
this.cur_code = cur_code == null ? null : cur_code.trim();
}
public String getTr_acdt() {
return tr_acdt;
}
public void setTr_acdt(String tr_acdt) {
this.tr_acdt = tr_acdt == null ? null : tr_acdt.trim();
}
public String getTr_time() {
return tr_time;
}
public void setTr_time(String tr_time) {
this.tr_time = tr_time == null ? null : tr_time.trim();
}
public String getHost_serial_no() {
return host_serial_no;
}
public void setHost_serial_no(String host_serial_no) {
this.host_serial_no = host_serial_no == null ? null : host_serial_no.trim();
}
public String getTr_bankno() {
return tr_bankno;
}
public void setTr_bankno(String tr_bankno) {
this.tr_bankno = tr_bankno == null ? null : tr_bankno.trim();
}
public String getAcname() {
return acname;
}
public void setAcname(String acname) {
this.acname = acname == null ? null : acname.trim();
}
public String getOpp_acno() {
return opp_acno;
}
public void setOpp_acno(String opp_acno) {
this.opp_acno = opp_acno == null ? null : opp_acno.trim();
}
public String getOpp_cur_code() {
return opp_cur_code;
}
public void setOpp_cur_code(String opp_cur_code) {
this.opp_cur_code = opp_cur_code == null ? null : opp_cur_code.trim();
}
public String getOpp_acname() {
return opp_acname;
}
public void setOpp_acname(String opp_acname) {
this.opp_acname = opp_acname == null ? null : opp_acname.trim();
}
public String getOpp_bankname() {
return opp_bankname;
}
public void setOpp_bankname(String opp_bankname) {
this.opp_bankname = opp_bankname == null ? null : opp_bankname.trim();
}
public String getOpp_bankno() {
return opp_bankno;
}
public void setOpp_bankno(String opp_bankno) {
this.opp_bankno = opp_bankno == null ? null : opp_bankno.trim();
}
public String getTr_type() {
return tr_type;
}
public void setTr_type(String tr_type) {
this.tr_type = tr_type == null ? null : tr_type.trim();
}
public String getCsh_dra_flag() {
return csh_dra_flag;
}
public void setCsh_dra_flag(String csh_dra_flag) {
this.csh_dra_flag = csh_dra_flag == null ? null : csh_dra_flag.trim();
}
public String getBank_flag() {
return bank_flag;
}
public void setBank_flag(String bank_flag) {
this.bank_flag = bank_flag == null ? null : bank_flag.trim();
}
public String getArea_flag() {
return area_flag;
}
public void setArea_flag(String area_flag) {
this.area_flag = area_flag == null ? null : area_flag.trim();
}
public String getTr_from() {
return tr_from;
}
public void setTr_from(String tr_from) {
this.tr_from = tr_from == null ? null : tr_from.trim();
}
public String getTrans_flag() {
return trans_flag;
}
public void setTrans_flag(String trans_flag) {
this.trans_flag = trans_flag == null ? null : trans_flag.trim();
}
public String getOld_serial_no() {
return old_serial_no;
}
public void setOld_serial_no(String old_serial_no) {
this.old_serial_no = old_serial_no == null ? null : old_serial_no.trim();
}
public String getOld_acdt() {
return old_acdt;
}
public void setOld_acdt(String old_acdt) {
this.old_acdt = old_acdt == null ? null : old_acdt.trim();
}
public String getCash_flag() {
return cash_flag;
}
public void setCash_flag(String cash_flag) {
this.cash_flag = cash_flag == null ? null : cash_flag.trim();
}
public String getCrdr_flag() {
return crdr_flag;
}
public void setCrdr_flag(String crdr_flag) {
this.crdr_flag = crdr_flag == null ? null : crdr_flag.trim();
}
public BigDecimal getBalance() {
return balance;
}
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
public BigDecimal getFreeze_amt() {
return freeze_amt;
}
public void setFreeze_amt(BigDecimal freeze_amt) {
this.freeze_amt = freeze_amt;
}
public String getCert_type() {
return cert_type;
}
public void setCert_type(String cert_type) {
this.cert_type = cert_type == null ? null : cert_type.trim();
}
public String getCert_batchno() {
return cert_batchno;
}
public void setCert_batchno(String cert_batchno) {
this.cert_batchno = cert_batchno == null ? null : cert_batchno.trim();
}
public String getCert_no() {
return cert_no;
}
public void setCert_no(String cert_no) {
this.cert_no = cert_no == null ? null : cert_no.trim();
}
public String getTr_code() {
return tr_code;
}
public void setTr_code(String tr_code) {
this.tr_code = tr_code == null ? null : tr_code.trim();
}
public String getUser_no() {
return user_no;
}
public void setUser_no(String user_no) {
this.user_no = user_no == null ? null : user_no.trim();
}
public String getSub_no() {
return sub_no;
}
public void setSub_no(String sub_no) {
this.sub_no = sub_no == null ? null : sub_no.trim();
}
public String getPurpose() {
return purpose;
}
public void setPurpose(String purpose) {
this.purpose = purpose == null ? null : purpose.trim();
}
public String getPostscript() {
return postscript;
}
public void setPostscript(String postscript) {
this.postscript = postscript == null ? null : postscript.trim();
}
public String getTr_timestamp() {
return tr_timestamp;
}
public void setTr_timestamp(String tr_timestamp) {
this.tr_timestamp = tr_timestamp == null ? null : tr_timestamp.trim();
}
public String getReserved1() {
return reserved1;
}
public void setReserved1(String reserved1) {
this.reserved1 = reserved1 == null ? null : reserved1.trim();
}
public String getReserved2() {
return reserved2;
}
public void setReserved2(String reserved2) {
this.reserved2 = reserved2 == null ? null : reserved2.trim();
}
public String getTr_bankname() {
return tr_bankname;
}
public void setTr_bankname(String tr_bankname) {
this.tr_bankname = tr_bankname == null ? null : tr_bankname.trim();
}
public String getBank_no() {
return bank_no;
}
public void setBank_no(String bank_no) {
this.bank_no = bank_no == null ? null : bank_no.trim();
}
public String getBankname() {
return bankname;
}
public void setBankname(String bankname) {
this.bankname = bankname == null ? null : bankname.trim();
}
public String getPrintcount() {
return printcount;
}
public void setPrintcount(String printcount) {
this.printcount = printcount == null ? null : printcount.trim();
}
public BigDecimal getPayamt() {
return payamt;
}
public void setPayamt(BigDecimal payamt) {
this.payamt = payamt;
}
public BigDecimal getRcvamt() {
return rcvamt;
}
public void setRcvamt(BigDecimal rcvamt) {
this.rcvamt = rcvamt;
}
public BigDecimal getAmt() {
return amt;
}
public void setAmt(BigDecimal amt) {
this.amt = amt;
}
public BigDecimal getFee_amt() {
return fee_amt;
}
public void setFee_amt(BigDecimal fee_amt) {
this.fee_amt = fee_amt;
}
public BigDecimal getLast_bal() {
return last_bal;
}
public void setLast_bal(BigDecimal last_bal) {
this.last_bal = last_bal;
}
public String getTr_code_head() {
return tr_code_head;
}
public void setTr_code_head(String tr_code_head) {
this.tr_code_head = tr_code_head;
}
public String getCms_corp_no_head() {
return cms_corp_no_head;
}
public void setCms_corp_no_head(String cms_corp_no_head) {
this.cms_corp_no_head = cms_corp_no_head;
}
public String getReq_no_head() {
return req_no_head;
}
public void setReq_no_head(String req_no_head) {
this.req_no_head = req_no_head;
}
public String getTr_time_head() {
return tr_time_head;
}
public void setTr_time_head(String tr_time_head) {
this.tr_time_head = tr_time_head;
}
public String getTr_acdt_head() {
return tr_acdt_head;
}
public void setTr_acdt_head(String tr_acdt_head) {
this.tr_acdt_head = tr_acdt_head;
}
public String getSucc_flag_head() {
return succ_flag_head;
}
public void setSucc_flag_head(String succ_flag_head) {
this.succ_flag_head = succ_flag_head;
}
public String getRet_info_head() {
return ret_info_head;
}
public void setRet_info_head(String ret_info_head) {
this.ret_info_head = ret_info_head;
}
public String getRet_code_head() {
return ret_code_head;
}
public void setRet_code_head(String ret_code_head) {
this.ret_code_head = ret_code_head;
}
public String getExt_info_head() {
return ext_info_head;
}
public void setExt_info_head(String ext_info_head) {
this.ext_info_head = ext_info_head;
}
public String getReserved_head() {
return reserved_head;
}
public void setReserved_head(String reserved_head) {
this.reserved_head = reserved_head;
}
public String getFile_flag_head() {
return file_flag_head;
}
public void setFile_flag_head(String file_flag_head) {
this.file_flag_head = file_flag_head;
}
public String getOrg_code_head() {
return org_code_head;
}
public void setOrg_code_head(String org_code_head) {
this.org_code_head = org_code_head;
}
public String getTotal_head() {
return total_head;
}
public void setTotal_head(String total_head) {
this.total_head = total_head;
}
public String getSerial_no_head() {
return serial_no_head;
}
public void setSerial_no_head(String serial_no_head) {
this.serial_no_head = serial_no_head;
}
public String getRecord_num_body() {
return record_num_body;
}
public void setRecord_num_body(String record_num_body) {
this.record_num_body = record_num_body;
}
public String getField_num_body() {
return field_num_body;
}
public void setField_num_body(String field_num_body) {
this.field_num_body = field_num_body;
}
public String getSerial_record_body() {
return serial_record_body;
}
public void setSerial_record_body(String serial_record_body) {
this.serial_record_body = serial_record_body;
}
public String getFile_name_body() {
return file_name_body;
}
public void setFile_name_body(String file_name_body) {
this.file_name_body = file_name_body;
}
public Integer getStstus() {
return ststus;
}
public void setStstus(Integer ststus) {
this.ststus = ststus;
}
@Override
public String toString() {
return "MortgageBankofjiangsucainfo{" +
"id=" + id +
", tr_code_head='" + tr_code_head + '\'' +
", cms_corp_no_head='" + cms_corp_no_head + '\'' +
", req_no_head='" + req_no_head + '\'' +
", tr_time_head='" + tr_time_head + '\'' +
", tr_acdt_head='" + tr_acdt_head + '\'' +
", succ_flag_head='" + succ_flag_head + '\'' +
", ret_info_head='" + ret_info_head + '\'' +
", ret_code_head='" + ret_code_head + '\'' +
", ext_info_head='" + ext_info_head + '\'' +
", reserved_head='" + reserved_head + '\'' +
", file_flag_head='" + file_flag_head + '\'' +
", org_code_head='" + org_code_head + '\'' +
", total_head='" + total_head + '\'' +
", serial_no_head='" + serial_no_head + '\'' +
", record_num_body='" + record_num_body + '\'' +
", field_num_body='" + field_num_body + '\'' +
", serial_record_body='" + serial_record_body + '\'' +
", file_name_body='" + file_name_body + '\'' +
", serial_no='" + serial_no + '\'' +
", acno='" + acno + '\'' +
", cur_code='" + cur_code + '\'' +
", tr_acdt='" + tr_acdt + '\'' +
", tr_time='" + tr_time + '\'' +
", host_serial_no='" + host_serial_no + '\'' +
", tr_bankno='" + tr_bankno + '\'' +
", acname='" + acname + '\'' +
", opp_acno='" + opp_acno + '\'' +
", opp_cur_code='" + opp_cur_code + '\'' +
", opp_acname='" + opp_acname + '\'' +
", opp_bankname='" + opp_bankname + '\'' +
", opp_bankno='" + opp_bankno + '\'' +
", tr_type='" + tr_type + '\'' +
", csh_dra_flag='" + csh_dra_flag + '\'' +
", bank_flag='" + bank_flag + '\'' +
", area_flag='" + area_flag + '\'' +
", tr_from='" + tr_from + '\'' +
", trans_flag='" + trans_flag + '\'' +
", old_serial_no='" + old_serial_no + '\'' +
", old_acdt='" + old_acdt + '\'' +
", cash_flag='" + cash_flag + '\'' +
", crdr_flag='" + crdr_flag + '\'' +
", balance=" + balance +
", freeze_amt=" + freeze_amt +
", cert_type='" + cert_type + '\'' +
", cert_batchno='" + cert_batchno + '\'' +
", cert_no='" + cert_no + '\'' +
", tr_code='" + tr_code + '\'' +
", user_no='" + user_no + '\'' +
", sub_no='" + sub_no + '\'' +
", purpose='" + purpose + '\'' +
", postscript='" + postscript + '\'' +
", tr_timestamp='" + tr_timestamp + '\'' +
", reserved1='" + reserved1 + '\'' +
", reserved2='" + reserved2 + '\'' +
", tr_bankname='" + tr_bankname + '\'' +
", bank_no='" + bank_no + '\'' +
", bankname='" + bankname + '\'' +
", printcount='" + printcount + '\'' +
", payamt=" + payamt +
", rcvamt=" + rcvamt +
", amt=" + amt +
", fee_amt=" + fee_amt +
", last_bal=" + last_bal +
", ststus=" + ststus +
'}';
}
}
接口:
com.tcwl.vsmp.mortgage.service.impl.MortgageBankofjiangsucainfoServiceImpl.java
package com.tcwl.vsmp.mortgage.service.impl;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
import com.tcwl.vsmp.common.BaseController;
import com.tcwl.vsmp.common.ExceptionInfo;
import com.tcwl.vsmp.common.OilConstant;
import com.tcwl.vsmp.customer.po.Customer;
import com.tcwl.vsmp.external.service.HzCapitalService;
import com.tcwl.vsmp.loanmgt.po.LoanTable;
import com.tcwl.vsmp.loanmgt.service.LoanQueryService;
import com.tcwl.vsmp.mortgage.common.MortgageBankofjiangsucainfoConstant;
import com.tcwl.vsmp.mortgage.dao.MortgageBankofjiangsucainfoMapper;
import com.tcwl.vsmp.mortgage.po.MortgageBankofjiangsucainfo;
import com.tcwl.vsmp.mortgage.service.MortgageBankofjiangsucainfoService;
import com.tcwl.vsmp.mortgage.utils.EncodeQueryAndTransition;
import com.tcwl.vsmp.oil.dao.CardApplyDao;
import com.tcwl.vsmp.oil.po.CardApply;
import com.tcwl.vsmp.oil.po.Card_info;
import com.tcwl.vsmp.oil.service.Card_infoService;
import com.tcwl.vsmp.oil.service.OilCardOperationService;
import com.tcwl.vsmp.passcard.common.PassCardConstant;
import com.tcwl.vsmp.passcard.po.stk.ChargeInfo;
import com.tcwl.vsmp.passcard.po.stk.ChargeReq;
import com.tcwl.vsmp.passcard.service.STCPassCardChargeRecordService;
import com.tcwl.vsmp.passcard.util.STCRechargeUtil;
import com.tcwl.vsmp.utils.BatchNumber;
import com.tcwl.vsmp.utils.DateUtil;
import com.tcwl.vsmp.utils.JsonAndBaseUtils;
import com.tcwl.vsmp.utils.RandNumUtils;
import com.tcwl.vsmp.weizhang.util.HttpClientUtil;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.shiro.SecurityUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import quartz.jiangSuBank.JiangSuBank;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 江苏银行账户到账查询信息
* 苏凯
* 2018-10-22
* Service接口实现
*/
@Service
public class MortgageBankofjiangsucainfoServiceImpl implements MortgageBankofjiangsucainfoService{
private static final Logger logger = LoggerFactory.getLogger(JiangSuBank.class);
/* @Autowired
private MortgageBankofjiangsucainfoService mortgageBankofjiangsucainfoService;*/
@Autowired
private STCPassCardChargeRecordService sTCPassCardChargeRecordService;//通行卡表
@Autowired
private HzCapitalService hzCapitalService;
@Autowired
private LoanQueryService loanQueryService;//借款查询表
@Autowired
private Card_infoService card_infoService;//油卡详细
@Autowired
private OilCardOperationService oilCardOperationService;//油卡充值接口
/**
* 车应用Dao.
* 油卡业务
*/
@Autowired
private CardApplyDao cardApplyDao;
/**
* 请求头
* @throws Exception
*/
// tr_code 交易码 C6 M
@Value("#{prop.TR_CODE_QUERY}")
private String tr_code; //查询账户明细 200110
//cms_corp_no 现金管理客户号 C20 M 企业不需要赋值,由银企前置机进行赋值。
private String cms_corp_no = "";
//user_no 用户号 C10 M 企业不需要赋值,由银企前置机进行赋值。
private String user_no = "";
//org_code 机构号 C20 M 企业不需要赋值,由银企前置机进行赋值。
private String org_code = "";
//serial_no 交易流水号 C20 C 送空,由现金管理系统产生
private String serial_no = "";
//req_no 请求号 C40 C 企业ERP的流水号
private String req_no = "";
//tr_acdt 交易日期 C8 M 格式 YYYYMMDD
private String tr_acdt = null;
//tr_time 交易时间 C6 M 格式hhmmss
private String tr_time = null;
//channel 渠道标识 C1 M ERP送‘5’
private String channel ="5";
//sign 签名标识 0-报文未签名 ; 1-报文已签名; 企业送空,由银企前置进行传送.
private String sign = "";
//file_flag 文件标识 0-报文1-文件
private String file_flag = "0";
//reserved 保留字段
private String reserved = "";
/**
* 请求体
* @throws Exception
*/
@Value("#{prop.ACNO}")
//acno 账号 C35 M ,自己公司账号
private String acno;
@Value("#{prop.CUR_CODE}")
//cur_code 币种 C2 M 01 人民币
private String cur_code ;
//start_date 起始日期 C8 M 日期格式:YYYYMMDD ;日期时间段不能超过3个月的时间
private String start_date = "";
//end_date 终止日期 C8 M 日期格式:YYYYMMDD
private String end_date = "";
/**
* 请求地址
*/
@Value("#{prop.FRONT_END_PROCESSOR_IP}")
//前置机ip
private String FRONT_END_PROCESSOR_IP;
@Value("#{prop.DEAL_PROT}")
//前置机交易端口prot
private String DEAL_PROT ;
//前置机文件端口prot MortgageBankofjiangsucainfoConstant.FILE_PROT
@Value("#{prop.FILE_PROT}")
public String FILE_PROT;
@Value("#{prop.DATETEMPLATE}")
//日期模板
private String dateTemplate ;
@Value("#{prop.TIMETEMPLATE}")
//时间模板
private String timeTemplate ;
@Value("#{prop.JIANGSUBANK_GETACCOUNTINFO_RUNTIME}")
//每间隔 N 时间获取一次数据,这里的时间与定时器的时间保持一致(单位换算成秒)
private String runTime;
//当log为false 时查询全天所有的数据
private Boolean log = true;
@Resource
private MortgageBankofjiangsucainfoMapper mortgageBankofjiangsucainfoMapper;
/**
* 根据ID删除数据
* @param id
* @return
*/
@Override
public int deleteByPrimaryKey(Long id)throws Exception {
int i = mortgageBankofjiangsucainfoMapper.deleteByPrimaryKey(id);
return i;
}
/**
* 增加数据
* @param record
* @return
*/
@Override
public int insert(MortgageBankofjiangsucainfo record) throws Exception{
int i = mortgageBankofjiangsucainfoMapper.insert(record);
return i;
}
/**
* 增加数据(Null值不增加)
* @param record
* @return
*/
@Override
public int insertSelective(MortgageBankofjiangsucainfo record) throws Exception{
int i = mortgageBankofjiangsucainfoMapper.insertSelective(record);
return i;
}
/**
* 按主键查询数据
* @param id
* @return
*/
@Override
public MortgageBankofjiangsucainfo selectByPrimaryKey(Long id)throws Exception {
MortgageBankofjiangsucainfo mortgageBankofjiangsucainfo = mortgageBankofjiangsucainfoMapper.selectByPrimaryKey(id);
return mortgageBankofjiangsucainfo;
}
/**
* 按操作状态查询
* @param ststus
* @return
*/
@Override
public List<MortgageBankofjiangsucainfo> selectByStstus(int ststus)throws Exception {
List<MortgageBankofjiangsucainfo> mortgageBankofjiangsucainfos = mortgageBankofjiangsucainfoMapper.selectByStstus(ststus);
return mortgageBankofjiangsucainfos;
}
/**
* 按主键更新数据(Null值不更新)
* @param record
* @return
*/
@Override
public int updateByPrimaryKeySelective(MortgageBankofjiangsucainfo record)throws Exception {
int i = mortgageBankofjiangsucainfoMapper.updateByPrimaryKeySelective(record);
return i;
}
/**
* 按主键更新数据
* @param record
* @return
*/
@Override
public int updateByPrimaryKey(MortgageBankofjiangsucainfo record) throws Exception{
int i = mortgageBankofjiangsucainfoMapper.updateByPrimaryKey(record);
return i;
}
/**
* 获取江苏银行到账信息,存入数据库
* 当getDayInfo为true s时查询当天所有数据;查询完成后需要 成员变量 getDayInfo设为false 不查询当天所有
* 成员变量 int x 控制手动执行获取当天全天银行数据的次数为1次,避免死循环
* 当调用的此getJiangSuBankAccountInfo方法 返回true时 [成员变量 X = 0 与 成员变量getDayInfo = false 值还得设回默认]
* @throws Exception
*/
public synchronized Boolean getJiangSuBankAccountInfo(Boolean getDayInfo,int x) throws Exception{//当log为false 时查询全部
System.out.println("--------------------------------------------log-----------------------------------------------: "+ log);
System.out.println("--------------------------------------------getDayInfo-----------------------------------------------: "+ getDayInfo);
System.out.println("执行江苏银行获取到账信息任务sys!");
//存储到账的信息
List<Map<String, String>> mapList =null ;
try{
//url
String url = "http://" + FRONT_END_PROCESSOR_IP + ":" + DEAL_PROT;
SimpleDateFormat sData = new SimpleDateFormat(dateTemplate);
String data = sData.format(new Date());//当前日期
SimpleDateFormat sTime = new SimpleDateFormat(timeTemplate);
String time = sTime.format(new Date());//当前时间
String line = "";
//tr_acdt 交易日期
tr_acdt = data;
//tr_time 交易时间
tr_time = time;
//start_date 起始日期
start_date = data;
//end_date 终止日期
end_date = data;
System.out.println("tr_acdt:" + tr_acdt + " tr_time:" + tr_time + "start_date:" + start_date + "end_date:" + end_date);
String requestHeader = "application/x-www-form-urlencoded";
//1.设置发送的报文
StringBuilder sb = getStringBuilderWithSetXML();
String requestBody = sb.toString();
System.out.println("0:" + EncodeQueryAndTransition.getEncoding(requestBody));
byte[] requestBodyBytes = requestBody.getBytes();
String requestBody1 = new String(requestBodyBytes, "GBK");
System.out.println("=========requestBody=========" + requestBody);
//2.向银行发送GBK数据,BufferedReader br并收到返回参数如有中文字符用 EncodeQueryAndTransition.getUTF8BytesFromGBKString(String gbkStr)方法 将中文单独转成 GBK
BufferedReader br = HttpClientUtil.httpPostWithXml(requestBody1, url, requestHeader);
System.out.println("1:" + EncodeQueryAndTransition.getEncoding(requestBody));//获取编码格式
//3.收到返回的数据,遍历参数,对返回值报文进行打印
for (line = br.readLine(); line != null; line = br.readLine()) {
//对返回的报文进行结果判断<RspCode>0000</RspCode>
System.out.println(">>>>>>>>>>>>>>>>>>>返回的结果报aaa文内容为:---------" + line);
//对返回的报文进行拼接,然后返回给业务层,在业务层进行判断
System.out.println("line:" + EncodeQueryAndTransition.getEncoding(line));
//4.返回值转换xml 去除00 ,拼接头 <?xml version="1.0" encoding="UTF-8"?>
String lineXML = line.substring(2, (line.length()));
System.out.println("-------------lineXML----------:" + lineXML);
if(lineXML == null){
continue;
}
Document dom = DocumentHelper.parseText(lineXML);
System.out.println("dom==null" + (dom == null));
if(dom == null){
continue;
}
Element root = dom.getRootElement();
if (root == null) {
continue;
}
//应答报头体
Element head = root.element("head");
String tr_code = null; //交易码 C6 M
String cms_corp_no = null; //现金管理客户号 C20 M 公共返回,企业可不用
String user_no = null; //用户号 C10 M 公共返回,企业可不用
String org_code = null; //机构号 C20 M 公共返回,企业可不用
String serial_no = null; //交易流水号 C20 C 由现金管理系统产生的流水号
String req_no = null; //请求号 C40 C 企业ERP的流水号,原样返回
String tr_acdt = null; //交易日期 C8 M 格式YYYYMMDD
String tr_time = null;//交易时间 C6 M 格式hhmmss
String succ_flag = null; //成功标识 C1 M ; 0- 表示成功 1- 表示通讯机超时 8-表示主机结果未知 其它-交易失败
String ret_code = null; //返回码 C4 M 0000表示成功,正常返回
String ret_info = null; //返回信息 C60 M
String ext_info = null; //返回附加信息 C255 C
String file_flag = null; //文件标识 C1 C 传送0-报文 1-文件,或为空
String reserved = null; //保留字段 C60 C
if (head != null) {
Element tr_codeElement = head.element("tr_code");//交易码 C6 M
Element tr_acdtElement = head.element("tr_acdt"); //交易日期 C8 M 格式YYYYMMDD
Element tr_timeElement = head.element("tr_time");//交易时间 C6 M 格式hhmmss
Element file_flagElement = head.element("file_flag");//文件标识 C1 C 传送0-报文1-文件,或为空
Element ret_infoElement = head.element("ret_info");//返回信息 C60 M
Element cms_corp_noElement = head.element("cms_corp_no");//现金管理客户号 C20 M 公共返回,企业可不用
Element user_noElement = head.element("user_no");//用户号 C10 M 公共返回,企业可不用
Element org_codeElement = head.element("org_code"); //机构号 C20 M 公共返回,企业可不用
Element serial_noElement = head.element("serial_no"); //交易流水号 C20 C 由现金管理系统产生的流水号
Element req_noElement = head.element("req_no");//请求号 C40 C 企业ERP的流水号,原样返回
Element succ_flagElement = head.element("succ_flag");//成功标识 C1 M 0- 表示成功 1- 表示通讯机超时 8-表示主机结果未知 其它-交易失败
Element ret_codeElement = head.element("ret_code"); //返回码 C4 M 0000表示成功,正常返回
Element ext_infoElement = head.element("ext_info"); //返回附加信息 C255 C
Element reservedElement = head.element("reserved");//保留字段 C60 C
if (tr_codeElement != null) { //交易码 C6 M
tr_code = tr_codeElement.getText();
}
if (tr_acdtElement != null) {//交易日期 C8 M 格式YYYYMMDD
tr_acdt = tr_acdtElement.getText();
}
if (tr_timeElement != null) { //交易时间 C6 M 格式hhmmss
tr_time = tr_timeElement.getText();
}
if (file_flagElement != null) { //文件标识 C1 C 传送0-报文1-文件,或为空
file_flag = file_flagElement.getText();
}
if (ret_infoElement != null) { //返回信息 C60 M
ret_info = ret_infoElement.getText();
}
if (cms_corp_noElement != null) {
cms_corp_no = cms_corp_noElement.getText();//现金管理客户号 C20 M 公共返回,企业可不用
}
if (user_noElement != null) {
user_no = user_noElement.getText();//用户号 C10 M 公共返回,企业可不用
}
if (org_codeElement != null) {
org_code = org_codeElement.getText(); //机构号 C20 M 公共返回,企业可不用
}
if (serial_noElement != null) {
serial_no = serial_noElement.getText(); //交易流水号 C20 C 由现金管理系统产生的流水号
}
if (req_noElement != null) {
req_no = req_noElement.getText();//请求号 C40 C 企业ERP的流水号,原样返回
}
if (succ_flagElement != null) {
succ_flag = succ_flagElement.getText();//成功标识 C1 M 0- 表示成功 1- 表示通讯机超时 8-表示主机结果未知 其它-交易失败
}
if (ret_codeElement != null) {
ret_code = succ_flagElement.getText(); //返回码 C4 M 0000表示成功,正常返回
}
if (ext_infoElement != null) {
ext_info = ext_infoElement.getText(); //返回附加信息 C255 C
}
if (reservedElement != null) {
reserved = reservedElement.getText();//保留字段 C60 C
}
}
//应答报文体
String record_num = null;
;//记录条数 C35 M 视记录数而定
String field_num = null;
;//字段数 C2 M 视域数而定
String serial_record = null;
;//数据域 C M 节点<2K,如果file_flag为1则无该节点
String file_name = null;
;//文件名 C70 M 如果file_flag为0则无该节点
Element body = root.element("body");
if (body != null) {
Element record_numElement = body.element("record_num");//记录条数 C35 M 视记录数而定
Element field_numElement = body.element("field_num");//字段数 C2 M 视域数而定
Element serial_recordElement = body.element("serial_record");//数据域 C M 节点<2K,如果file_flag为1则无该节点
Element file_nameElement = body.element("file_name");//文件名 C70 M 如果file_flag为0则无该节点
if (record_numElement != null) {
record_num = record_numElement.getText();//记录条数 C35 M 视记录数而定
}
if (field_numElement != null) {
field_num = field_numElement.getText();//字段数 C2 M 视域数而定
}
if (serial_recordElement != null) {
serial_record = serial_recordElement.getText();//数据域 C M 节点<2K,如果file_flag为1则无该节点
}
if (file_nameElement != null) {
file_name = file_nameElement.getText();//文件名 C70 M 如果file_flag为0则无该节点
}
}
// file_flag = null; //文件标识 C1 C 传送0-报文 1-文件,或为空
//从URL中解析数据
if (file_flag != null && "0".equals(file_flag)) {
if (null != field_num) {
System.out.println("record_num:" + record_num);//记录条数视记录数而定
if (serial_record != null) {
List<String> stringList = Arrays.asList(serial_record.split("\\|"));
System.out.println("stringList.size() =" + stringList.size());
List<List<String>> listS = new ArrayList<>();
if (stringList != null && stringList.size() > 0) {
int ii = 0;
List<String> list = null ;
for (int y = 1; y <= ((Integer.parseInt(record_num))+1); y++) {//record_num 返回的数据条数
list = new ArrayList<>();
for (int i = ii; i < Integer.parseInt(field_num) * y; i++) {
list.add(stringList.get(i));
ii = i+1;
}
if(list != null && list.size() > 0){
listS.add(list);
}
}
}
//5.将得到的数据解析到map
mapList = getMapList(listS);
}
}
}
//从文件中解析数据
if (file_flag != null && "1".equals(file_flag)) {
if (file_name != null) {
//获取文件大小
String sizeUrl = "http://" + FRONT_END_PROCESSOR_IP + ":" + FILE_PROT + "/?00SIZE " + file_name;
BufferedReader br1 = HttpClientUtil.getFileSizeForJiangSu(sizeUrl);
System.out.println("br1=====================: " + br1);
String lineT;
String lineTT = null;
//遍历参数,对返回值报文进行打印
for (lineT = br1.readLine(); lineT != null; lineT = br1.readLine()) {
//对返回的报文进行结果判断<RspCode>0000</RspCode>
System.out.println(">>>>>>>>>>>>>>>>>>>返回的结果报lineT文内容为:---------" + lineT);
//对返回的报文进行拼接,然后返回给业务层,在业务层进行判断
System.out.println("lineT:" + EncodeQueryAndTransition.getEncoding(lineT));
lineTT = lineT;
}
//下载文件
if (lineTT != null && 0 < lineTT.length()) {
String lineTT1 = lineTT.replace("00OK", "");
//声明URL
String fileUrl = "http://" + FRONT_END_PROCESSOR_IP + ":" + FILE_PROT + "/?00GET " + file_name + " 0" + lineTT1;
System.out.println("fileUrl :" + fileUrl );
//获取返回的数据文件
BufferedReader br3 = HttpClientUtil.getFileForJiangSu(fileUrl);
String lineT1;
List<List<String>> lineT1List = new ArrayList<>();
//遍历参数,对返回值报文进行打印
for (lineT1 = br3.readLine(); lineT1 != null; lineT1 = br3.readLine()) {
//对返回的报文进行结果判断<RspCode>0000</RspCode>
System.out.println(">>>>>>>>>>>>>>>>>>>返回的结果报lineT1文内容为:---------" + lineT1);
//对返回的报文进行拼接,然后返回给业务层,在业务层进行判断
System.out.println("lineT1:" + EncodeQueryAndTransition.getEncoding(lineT1));
lineT1List.add(Arrays.asList(lineT1.split("\\|")));
}
//5.获取返回的数据;将得到的数据解析到map
mapList = getMapList(lineT1List);
}
/* Thread.sleep(10000);*/
//必须关闭下载文件
//声明URL
String offFileUrl = "http://" + FRONT_END_PROCESSOR_IP + ":" + FILE_PROT + "/?00QUIT";
System.out.println("offFileUrl:" + offFileUrl);
//关闭文件通道
BufferedReader br33 = HttpClientUtil.offFileForJiangSu(offFileUrl);
String lineT13;
//遍历返回的数据
for (lineT13 = br33.readLine(); lineT13 != null; lineT13 = br33.readLine()) {
//对返回的报文进行结果判断<RspCode>0000</RspCode>
System.out.println(">>>>>>>>>>>>>>>>>>>返回的结果报lineT13文内容为:---------" + lineT13);
//对返回的报文进行拼接,然后返回给业务层,在业务层进行判断
System.out.println("lineT13:" + EncodeQueryAndTransition.getEncoding(lineT13));
}
}
} else {//处理
System.out.println("文件中没有返回任何数据!");
}
}
/*==================将数据按查询时间筛选,把之前获取的数据剔除,留最新数据;因为查的是一整天的数据========================*/
List<MortgageBankofjiangsucainfo> mortgageBankofjiangsucainfoList =new ArrayList<>();
if(mapList != null && mapList.size() >0 ) {
for (int i = 0; i < mapList.size(); i++) {
if (log) {
// SimpleDateFormat dateTemplateDf = new SimpleDateFormat(dateTemplate);
String dateTemplateTimeTemplate = dateTemplate + " " + timeTemplate;
SimpleDateFormat dateTemplateTimeTemplateDf = new SimpleDateFormat(dateTemplateTimeTemplate);//交易时间模板
String trAcdt = mapList.get(i).get("tr_acdt");//交易日期
String trTime = mapList.get(i).get("tr_time");//交易时间
System.out.println("===============mapList2===================:" + mapList);
boolean yesorno = false;
String trAcdtTrTime = null;
if (trTime != null && trAcdt != null) {
trAcdtTrTime = trAcdt + " " + trTime;
// 表达式对象
Pattern p = Pattern.compile("^[1-9]\\d{3}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\\s+(20|21|22|23|[0-1]\\d)[0-5]\\d[0-5]\\d$");
// 创建 Matcher 对象
Matcher m = p.matcher(trAcdtTrTime);
// 是否完全匹配
yesorno = m.matches();
}
if (!yesorno) {
continue;
}
if (trAcdtTrTime == null) {
continue;
}
Date dateTemplateTimeTemplateDate = dateTemplateTimeTemplateDf.parse(trAcdtTrTime);
Calendar time1 = Calendar.getInstance();//交易日期与时间
Calendar time2 = Calendar.getInstance();//当前系统日期与时间
Calendar time3 = Calendar.getInstance();//当前系统日期的间隔N时间后的日期与时间
time1.setTime(dateTemplateTimeTemplateDate);//交易日期与时间
// 秒
if (runTime == null) {
continue;
}
time3.add(Calendar.SECOND, -(Integer.parseInt(runTime)));//当前系统日期的间隔N时间后的日期与时间
Date time4 = time1.getTime();//交易日期与时间
Date time5 = time2.getTime();//当前系统日期与时间
Date time6 = time3.getTime();//当前系统日期的间隔N时间后的日期与时间
System.out.println("time4 交易日期与时间 " + dateTemplateTimeTemplateDf.format(time4));
System.out.println("time5 当前系统日期与时间" + dateTemplateTimeTemplateDf.format(time5));
System.out.println("time6 当前系统日期的间隔N时间后的日期与时间" + dateTemplateTimeTemplateDf.format(time6));
System.out.println("(time6.before(time4)" + (time6.before(time4)));
System.out.println("(time6.compareTo(time6)==0)" + (time6.compareTo(time4) == 0));
System.out.println("(time6.before(time4)|| (time4.compareTo(time6)==0) )" + (time6.before(time6) || (time4.compareTo(time6) == 0)));
System.out.println("time4.before(time5)" + time4.before(time5));
System.out.println("(time5.compareTo(time4)==0)==0)" + (time5.compareTo(time4) == 0));
System.out.println("(time4.before(time5) || (time5.compareTo(time4)==0))" + (time4.before(time5) || (time5.compareTo(time4) == 0)));
System.out.println("((time6.before(time4))\n" +
" && (time4.before(time5) || (time5.compareTo(time4)==0)) )" +
"" + (time6.before(time4)
&& (time4.before(time5) || (time5.compareTo(time4) == 0))));
if ((time6.before(time4))
&& (time4.before(time5) || (time5.compareTo(time4) == 0))) {
/* ===========返回参数body中的 serial_record ; serial_record_body数据域(数据库有对应表和字段) ====================*/
//把map 键值数据 转换成实体类封装
MortgageBankofjiangsucainfo mortgageBankofjiangsucainfo = getMortgageBankofjiangsucainfo(mapList, i);
System.out.println("464mortgageBankofjiangsucainfo.toString() " + mortgageBankofjiangsucainfo.toString());
if (mortgageBankofjiangsucainfo != null) {
mortgageBankofjiangsucainfoList.add(mortgageBankofjiangsucainfo);
}
}
/*==================================*/
}else{ //当异常发生时查询当天全部数据, 重复数据会通过唯一键 流水号自动过滤;
MortgageBankofjiangsucainfo mortgageBankofjiangsucainfo = getMortgageBankofjiangsucainfo(mapList, i);
System.out.println("464mortgageBankofjiangsucainfo.toString() " + mortgageBankofjiangsucainfo.toString());
if (mortgageBankofjiangsucainfo != null) {
mortgageBankofjiangsucainfoList.add(mortgageBankofjiangsucainfo);
}
}
}//for
System.out.println("========================mortgageBankofjiangsucainfoList: "+ ToStringBuilder.reflectionToString(mortgageBankofjiangsucainfoList, ToStringStyle.SHORT_PREFIX_STYLE));
System.out.println("mortgageBankofjiangsucainfoList.size():"+mortgageBankofjiangsucainfoList.size());
if(mortgageBankofjiangsucainfoList != null && mortgageBankofjiangsucainfoList.size() >0){
//将获取到的银行到账信息数据写入数据库,重复数据会经过数据库唯一键过滤;(流水号订单号为唯一键)
for (int i = 0; i < mortgageBankofjiangsucainfoList.size(); i++) {
try{
if(mortgageBankofjiangsucainfoList.get(i).getPurpose() != null &&mortgageBankofjiangsucainfoList.get(i).getPurpose().length()>0){
System.out.println("========================mortgageBankofjiangsucainfoList.get(i).toString(): "+mortgageBankofjiangsucainfoList.get(i).toString());
int i1 = insertSelective(mortgageBankofjiangsucainfoList.get(i));
System.out.println("i1====================="+i1);
}
}catch(DuplicateKeyException e){
System.out.println("过滤重复数据,忽略异常:DuplicateKeyException!");
}catch (MySQLIntegrityConstraintViolationException e){
System.out.println("过滤重复数据 忽略异常:MySQLIntegrityConstraintViolationException!");
}catch (NullPointerException e){
System.out.println("过滤重复数据,忽略异常:NullPointerException!");
}
}
}
}// end=====将数据按查询时间筛选,把之前获取的数据剔除,留最新数据;因为查的是一整天的数据
//手动获取当天全天的数据 [getDayInfo 默认false 不查询]
if(getDayInfo){
x++;
if(x == 1){ //控制手动执行获取当天全天银行数据的次数为1次,避免死循环
throw new RuntimeException("获取当天所有银行到账数据!");
}
}
return false;//表示未查询当天一天所有的到账数据;getDayInfo为默认值false
}catch(IllegalArgumentException e5){
e5.printStackTrace();
logger.info(e5.getMessage());
System.out.println("链接前置机异常请检查!");
}catch (DataIntegrityViolationException e){
e.printStackTrace();
logger.info(e.getMessage());
System.out.println("获取的数据字段的长度超过本地数据库所设定的数据字段长度!");
}catch(RuntimeException e3){//手动触发获取当天所有数据
if(x == 1){
log = false;//当异常时,为防止获取的数据遗漏,查询当天一天所有的数据
getJiangSuBankAccountInfo(getDayInfo,x);
log = true;
System.out.println("手动触发获取银行账户信息数据,查询当天所有到账数据!");
//当手动触发查询全天数据一次后需要关闭查询全天的条件,否则会按时时查询全天的数据;getDayInfo需要改为默认值false
return true;
}else{
return false;
}
} catch (Exception e){//不确定异常触发获取当天所有数据
e.printStackTrace();
/* logger.info(e.getMessage());
try {
Thread.sleep((Integer.parseInt(runTime)*50000));
} catch (InterruptedException e1) {
e1.printStackTrace();
}
log = false;//当异常时,为防止获取的数据遗漏,查询当天一天所有的数据
System.out.println("================================有异常未获取到数据,获取全天到账数据!==================================================");*/
/*getJiangSuBankAccountInfo(getDayInfo,x);*/
}finally {
log = true;
}
return false;//表示未查询当天一天所有的到账数据;getDayInfo为默认值false
}
/**
* 获取数据库银行到账表MortgageBankofjiangsucainfo操作字段ststus 为 0 未操作的数据,进行苏通卡或油卡充值,且订单号流水号purpose不为空或null的数据
* @throws Exception
*/
public synchronized void updateMortgageBankofjiangsucainfosByStstusAndRefilMoney() throws Exception {
List<MortgageBankofjiangsucainfo> mortgageBankofjiangsucainfos = selectByStstus(MortgageBankofjiangsucainfoConstant.STSTUS_NO);
if(mortgageBankofjiangsucainfos != null && mortgageBankofjiangsucainfos.size()>0){
for (MortgageBankofjiangsucainfo mortgageBankofjiangsucainfo : mortgageBankofjiangsucainfos) {
//【订单编号,用这个表MortgageBankofjiangsucainfo的这个purpose去loan_table中与bugGood_order_no字段匹配获取交易类型buyGoods_Id】
if(mortgageBankofjiangsucainfo.getPurpose() == null || mortgageBankofjiangsucainfo.getPurpose().length() == 0 ){
continue;
}
LoanTable loanTable = loanQueryService.queryLoanTableByBugGood_order_no(mortgageBankofjiangsucainfo.getPurpose());
//获取 申请类型 处理状态【油卡或苏东卡...】字典id buyGood_Status_Id
if(loanTable == null){
continue;
}
int buyGood_status_id = loanTable.getBuyGood_Status_Id();//申请类型处理状态
if(buyGood_status_id == OilConstant.DEAL_STATUS_OVER){ //字典中67 为已处理 com.tcwl.vsmp.common.OilConstant.DEAL_STATUS_OVER
continue;
}
//申请类型【油卡或通行卡】0:未知 1:油卡 2:通行卡
Integer buyGoods_id = loanTable.getBuyGoods_Id();//获取申请类型
//未知
if(buyGoods_id == null || buyGoods_id == OilConstant.LOAN_TABLE_BUYGOODS_ID_UNKNOWN){//未知
System.out.println("========================818未知充值==========================未知充值======================未知充值====================");
continue;
}
//油卡充值
if(buyGoods_id == OilConstant.LOAN_TABLE_BUYGOODS_ID_OIL_CARD){//1:油卡 card_apply
System.out.println("========================827油卡充值==========================油卡充值======================油卡充值====================");
//油卡充值
updateCardApplyRefill(mortgageBankofjiangsucainfo);
}// end 1:油卡 card_apply
//苏通卡充值
if(buyGoods_id == OilConstant.LOAN_TABLE_BUYGOODS_ID_ACCESS_CARD){//2:通行卡
System.out.println("========================927通行卡充值==========================通行卡充值======================通行卡充值====================");
//苏通卡充值
if (updateStcardrechargerecordRefill(mortgageBankofjiangsucainfo)){
continue;
}
}//end 2:通行卡
}
}
}
/**
* 获取客户信息
* @param cust
* @param customer_code
* @return
* @throws Exception
*/
public Customer getCustomerByCustomer_code(Customer cust, String customer_code) throws Exception {
if(customer_code!= null && customer_code.length() > 0){
List<Customer> custs = sTCPassCardChargeRecordService.getCustomerByStcardrechargerecordWithCustomer_code(customer_code);
if(custs != null && custs.size() >0 ){
cust = custs.get(0);
}
}
return cust;
}
/**
* 把map 键值数据 转换成实体类封装
* @param mapList
* @param i
*/
public synchronized MortgageBankofjiangsucainfo getMortgageBankofjiangsucainfo(List<Map<String, String>> mapList, int i)throws Exception {
MortgageBankofjiangsucainfo mortgageBankofjiangsucainfo = new MortgageBankofjiangsucainfo();
//平台流水号(C20)
if(mapList.get(i).get("serial_no")!= null && mapList.get(i).get("serial_no").length() > 0){
mortgageBankofjiangsucainfo.setSerial_no (mapList.get(i).get("serial_no") );
}
//账号(C35)
if(mapList.get(i).get("acno")!= null && mapList.get(i).get("acno").length() > 0){
mortgageBankofjiangsucainfo.setAcno( mapList.get(i).get("acno") );
}
//货币码(C2)
if(mapList.get(i).get("cur_code")!= null && mapList.get(i).get("cur_code").length() > 0){
mortgageBankofjiangsucainfo.setCur_code( mapList.get(i).get("cur_code") );
}
//交易日期(C8)
if(mapList.get(i).get("tr_acdt")!= null && mapList.get(i).get("tr_acdt").length() > 0){
mortgageBankofjiangsucainfo.setTr_acdt( mapList.get(i).get("tr_acdt") );
}
//交易时间交易日期(C6)
if(mapList.get(i).get("tr_time")!= null && mapList.get(i).get("tr_time").length() > 0){
mortgageBankofjiangsucainfo.setTr_time( mapList.get(i).get("tr_time") );
}
//主机流水号(C20)
if(mapList.get(i).get("host_serial_no")!= null && mapList.get(i).get("host_serial_no").length() > 0){
mortgageBankofjiangsucainfo.setHost_serial_no( mapList.get(i).get("host_serial_no") );
}
//交易行号(C12)
if(mapList.get(i).get("tr_bankno")!= null && mapList.get(i).get("tr_bankno").length() > 0){
mortgageBankofjiangsucainfo.setTr_bankno( mapList.get(i).get("tr_bankno") );
}
//户名(C70)
if(mapList.get(i).get("acname")!= null && mapList.get(i).get("acname").length() > 0){
mortgageBankofjiangsucainfo.setAcname( mapList.get(i).get("acname") );
}
//对方账号(C35)
if(mapList.get(i).get("opp_acno")!= null && mapList.get(i).get("opp_acno").length() > 0){
mortgageBankofjiangsucainfo.setOpp_acno( mapList.get(i).get("opp_acno") );
}
//对方货币码(C2)
if(mapList.get(i).get("opp_cur_code")!= null && mapList.get(i).get("opp_cur_code").length() > 0){
mortgageBankofjiangsucainfo.setOpp_cur_code( mapList.get(i).get("opp_cur_code") );
}
//对方账号户名(C70)
if(mapList.get(i).get("opp_acname")!= null && mapList.get(i).get("opp_acname").length() > 0){
mortgageBankofjiangsucainfo.setOpp_acname( mapList.get(i).get("opp_acname") );
}
//对方账号开户行(C60)
if(mapList.get(i).get("opp_bankname")!= null && mapList.get(i).get("opp_bankname").length() > 0){
mortgageBankofjiangsucainfo.setOpp_bankname( mapList.get(i).get("opp_bankname") );
}
//对方行号(C12)
if(mapList.get(i).get("opp_bankno")!= null && mapList.get(i).get("opp_bankno").length() > 0) {
mortgageBankofjiangsucainfo.setOpp_bankno(mapList.get(i).get("opp_bankno"));
}
//交易类别(C1)
if(mapList.get(i).get("tr_type")!= null && mapList.get(i).get("tr_type").length() > 0){
mortgageBankofjiangsucainfo.setTr_type( mapList.get(i).get("tr_type") );
}
//钞汇标志(C1)
if(mapList.get(i).get("csh_dra_flag")!= null && mapList.get(i).get("csh_dra_flag").length() > 0){
mortgageBankofjiangsucainfo.setCsh_dra_flag( mapList.get(i).get("csh_dra_flag") );
}
//他行标志(C1)
if(mapList.get(i).get("bank_flag")!= null && mapList.get(i).get("bank_flag").length() > 0){
mortgageBankofjiangsucainfo.setBank_flag( mapList.get(i).get("bank_flag") );
}
//同城异地标志(C1)
if(mapList.get(i).get("area_fla")!= null && mapList.get(i).get("area_fla").length() > 0){
mortgageBankofjiangsucainfo.setArea_flag( mapList.get(i).get("area_fla") );
}
//交易来源(C1)
if(mapList.get(i).get("tr_from")!= null && mapList.get(i).get("tr_from").length() > 0){
mortgageBankofjiangsucainfo.setTr_from( mapList.get(i).get("tr_from") );
}
//发生额标志(C1)
if(mapList.get(i).get("trans_flag")!= null && mapList.get(i).get("trans_flag").length() > 0){
mortgageBankofjiangsucainfo.setTrans_flag( mapList.get(i).get("trans_flag") );
}
//被冲销流水号(C12)
if(mapList.get(i).get("old_serial_no")!= null && mapList.get(i).get("old_serial_no").length() > 0){
mortgageBankofjiangsucainfo.setOld_serial_no( mapList.get(i).get("old_serial_no") );
}
//原交易日期(C8)
if(mapList.get(i).get("old_acdt")!= null && mapList.get(i).get("old_acdt").length() > 0){
mortgageBankofjiangsucainfo.setOld_acdt( mapList.get(i).get("old_acdt") );
}
//现转标志(C1)
if(mapList.get(i).get("cash_flag")!= null && mapList.get(i).get("cash_flag").length() > 0){
mortgageBankofjiangsucainfo.setCash_flag( mapList.get(i).get("cash_flag") );
}
//借贷标志(C1)
if(mapList.get(i).get(" crdr_flag")!= null && mapList.get(i).get("crdr_flag").length() > 0){
mortgageBankofjiangsucainfo.setCrdr_flag( mapList.get(i).get("crdr_flag") );
}
//余额(N16.2)
if(mapList.get(i).get(" balance")!= null && mapList.get(i).get("balance").length() > 0){
mortgageBankofjiangsucainfo.setBalance( new BigDecimal(mapList.get(i).get("balance")) );
}
//冻结金额(N16.2)
if(mapList.get(i).get("freeze_amt")!= null && mapList.get(i).get("freeze_amt").length() > 0){
mortgageBankofjiangsucainfo.setFreeze_amt(new BigDecimal(mapList.get(i).get("freeze_amt")) );
}
//凭证种类(C20)
if(mapList.get(i).get("cert_type")!= null && mapList.get(i).get("cert_type").length() > 0){
mortgageBankofjiangsucainfo.setCert_type( mapList.get(i).get("cert_type") );
}
//凭证批次号(C20)
if(mapList.get(i).get("cert_batchno")!= null && mapList.get(i).get("cert_batchno").length() > 0){
mortgageBankofjiangsucainfo.setCert_batchno( mapList.get(i).get("cert_batchno") );
}
//凭证号码(C20)
if(mapList.get(i).get("cert_no")!= null && mapList.get(i).get("cert_no").length() > 0){
mortgageBankofjiangsucainfo.setCert_no( mapList.get(i).get("cert_no") );
}
//交易码(C6)
if(mapList.get(i).get("tr_code")!= null && mapList.get(i).get("tr_code").length() > 0){
mortgageBankofjiangsucainfo.setTr_code( mapList.get(i).get("tr_code") );
}
//柜员号(C10)
if(mapList.get(i).get("user_no")!= null && mapList.get(i).get("user_no").length() > 0){
mortgageBankofjiangsucainfo.setUser_no( mapList.get(i).get("user_no") );
}
//传票号(C20)
if(mapList.get(i).get("sub_no")!= null && mapList.get(i).get("sub_no").length() > 0){
mortgageBankofjiangsucainfo.setSub_no( mapList.get(i).get("sub_no") );
}
//摘要(C30)
if(mapList.get(i).get("purpose")!= null && mapList.get(i).get("purpose").length() > 0){
mortgageBankofjiangsucainfo.setPurpose( mapList.get(i).get("purpose") );
}
//附言(C60)
if(mapList.get(i).get("postscript")!= null && mapList.get(i).get("postscript").length() > 0){
mortgageBankofjiangsucainfo.setPostscript( mapList.get(i).get("postscript") );
}
//交易时间戳
if(mapList.get(i).get("tr_timestamp")!= null && mapList.get(i).get("tr_timestamp").length() > 0){
mortgageBankofjiangsucainfo.setTr_timestamp( mapList.get(i).get("tr_timestamp") );
}
//备注字段一(C60)
if(mapList.get(i).get("reserved1")!= null && mapList.get(i).get("reserved1").length() > 0){
mortgageBankofjiangsucainfo.setReserved1( mapList.get(i).get("reserved1") );
}
//备注字段二(C60)
if(mapList.get(i).get("reserved2")!= null && mapList.get(i).get("reserved2").length() > 0){
mortgageBankofjiangsucainfo.setReserved2( mapList.get(i).get("reserved2") );
}
//交易行名(C70)
if(mapList.get(i).get("tr_bankname")!= null && mapList.get(i).get("tr_bankname").length() > 0){
mortgageBankofjiangsucainfo.setTr_bankname( mapList.get(i).get("tr_bankname") );
}
//支付系统联行行号(C20)
if(mapList.get(i).get("bank_no")!= null && mapList.get(i).get("bank_no").length() > 0){
mortgageBankofjiangsucainfo.setBank_no( mapList.get(i).get("bank_no") );
}
//支付系统联行行名(C70)
if(mapList.get(i).get("bankname")!= null && mapList.get(i).get("bankname").length() > 0){
mortgageBankofjiangsucainfo.setBankname( mapList.get(i).get("bankname") );
}
//回单打印次数(C8)
if(mapList.get(i).get("printcount")!= null && mapList.get(i).get("printcount").length() > 0){
mortgageBankofjiangsucainfo.setPrintcount( mapList.get(i).get("printcount") );
}
//借出金额(N16,2)
if(mapList.get(i).get("payamt")!= null && mapList.get(i).get("payamt").length() > 0){
mortgageBankofjiangsucainfo.setPayamt( new BigDecimal( mapList.get(i).get("payamt")) );
}
//借入金额(N16,2)
if(mapList.get(i).get("rcvamt")!= null && mapList.get(i).get("rcvamt").length() > 0){
mortgageBankofjiangsucainfo.setRcvamt( new BigDecimal( mapList.get(i).get("rcvamt")));
}
//交易金额(N16.2)
if(mapList.get(i).get("amt")!= null && mapList.get(i).get("amt").length() > 0){
mortgageBankofjiangsucainfo.setAmt( new BigDecimal( mapList.get(i).get("amt")));
}
//手续费(N16.2)
if(mapList.get(i).get("fee_amt")!= null && mapList.get(i).get("fee_amt").length() > 0){
mortgageBankofjiangsucainfo.setFee_amt( new BigDecimal( mapList.get(i).get("fee_amt")) );
}
//上笔余额(N16.2)
if(mapList.get(i).get("last_bal")!= null && mapList.get(i).get("last_bal").length() > 0) {
mortgageBankofjiangsucainfo.setLast_bal(new BigDecimal(mapList.get(i).get("last_bal")));
}
return mortgageBankofjiangsucainfo;
}
/**
* 1.设置发送的报文
* @return
*/
public synchronized StringBuilder getStringBuilderWithSetXML()throws Exception {
StringBuilder sb = new StringBuilder();
sb.append("00<ap>");
sb.append("<head>");
sb.append("<tr_code>" + tr_code + "</tr_code>"); //tr_code 交易码 C6 M
sb.append("<cms_corp_no>" + cms_corp_no + "</cms_corp_no>");//cms_corp_no 现金管理客户号 C20 M 企业不需要赋值,由银企前置机进行赋值。
sb.append("<user_no>" + user_no + "</user_no>");//user_no 用户号 C10 M 企业不需要赋值,由银企前置机进行赋值。
sb.append("<org_code>" + org_code + "</org_code>");//org_code 机构号 C20 M 企业不需要赋值,由银企前置机进行赋值。
sb.append("<serial_no>" + serial_no + "</serial_no>");//serial_no 交易流水号 C20 C 送空,由现金管理系统产生
sb.append("<req_no>" + req_no + "</req_no>");//req_no 请求号 C40 C 企业ERP的流水号
sb.append("<tr_acdt>" + tr_acdt + "</tr_acdt>"); //tr_acdt 交易日期 C8 M 格式 YYYYMMDD
sb.append("<tr_time>" + tr_time + "</tr_time >"); //tr_time 交易时间 C6 M 格式hhmmss
sb.append("<channel>" + channel + "</channel>"); //channel 渠道标识 C1 M ERP送‘5’
sb.append("<sign>" + sign + "</sign>"); //sign 签名标识 C1 M 0-报文未签名 1-报文已签名 企业送空,由银企前置进行传送.
sb.append("<file_flag>" + file_flag + "</file_flag>"); //file_flag 文件标识 C1 M 0-报文1-文件
sb.append("<reserved>" + reserved + "</reserved>");//reserved 保留字段 C60 C
sb.append("</head>");
sb.append("<body>");
sb.append("<acno>" + acno + "</acno>"); //acno 账号 C35 M
sb.append("<cur_code>" + cur_code + "</cur_code>"); //cur_code 币种 C2 M
sb.append("<start_date>" + start_date + "</start_date>");//start_date 起始日期 C8 M 日期格式:YYYYMMDD ;日期时间段不能超过3个月的时间
sb.append("<end_date>" + end_date + "</end_date>");//end_date 终止日期 C8 M 日期格式:YYYYMMDD
sb.append("</body>");
sb.append("</ap>");
return sb;
}
/**
* 5.将返回得到的数据解析到map
* 将得到的银行到账数据{List<List<String> 索引为0 的是key,0以后的为值}解析出来按 键值得方式储存;
* @param lineT1List
* @return
*/
public synchronized List<Map<String, String>> getMapList( List<List<String>> lineT1List)throws Exception{
List<Map<String, String>> mapList = new ArrayList<>();
System.out.println("lineT1List.size() : "+lineT1List.size());
if (lineT1List != null && lineT1List.size() > 0) {
for (int i = 0; i < lineT1List.size(); i++) {
if (i == (lineT1List.size() - 1)) {
break;
}
Map<String, String> map = new HashMap<>();
if (lineT1List.get(i) != null && lineT1List.get(i).size() > 0) {
for (int y = 0; y < lineT1List.get(i).size(); y++) {
map.put(lineT1List.get(0).get(y), lineT1List.get(i + 1).get(y));
}
if(map != null){
mapList.add(map);
}
}
}
}
System.out.println("mapList--------------" + mapList);
System.out.println("765mapList.size()--------------" + mapList.size());
return mapList;
}
}
具体看:这个方法 getJiangSuBankAccountInfo ;这个方法是获取银行到账数据的主要入口;
4.创建定时器运行类
quartz.jiangSuBank.JiangSuBank
package quartz.jiangSuBank;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
import com.tcwl.vsmp.common.ExceptionInfo;
import com.tcwl.vsmp.common.OilConstant;
import com.tcwl.vsmp.customer.po.Customer;
import com.tcwl.vsmp.external.service.HzCapitalService;
import com.tcwl.vsmp.loanmgt.po.LoanTable;
import com.tcwl.vsmp.loanmgt.service.LoanQueryService;
import com.tcwl.vsmp.mortgage.common.MortgageBankofjiangsucainfoConstant;
import com.tcwl.vsmp.mortgage.po.MortgageBankofjiangsucainfo;
import com.tcwl.vsmp.mortgage.service.MortgageBankofjiangsucainfoService;
import com.tcwl.vsmp.mortgage.service.impl.MortgageBankofjiangsucainfoServiceImpl;
import com.tcwl.vsmp.mortgage.utils.EncodeQueryAndTransition;
import com.tcwl.vsmp.oil.dao.CardApplyDao;
import com.tcwl.vsmp.oil.po.CardApply;
import com.tcwl.vsmp.oil.po.Card_info;
import com.tcwl.vsmp.oil.service.Card_infoService;
import com.tcwl.vsmp.oil.service.OilCardOperationService;
import com.tcwl.vsmp.passcard.common.PassCardConstant;
import com.tcwl.vsmp.passcard.po.stk.ChargeInfo;
import com.tcwl.vsmp.passcard.po.stk.ChargeReq;
import com.tcwl.vsmp.passcard.service.STCPassCardChargeRecordService;
import com.tcwl.vsmp.passcard.util.STCRechargeUtil;
import com.tcwl.vsmp.utils.BatchNumber;
import com.tcwl.vsmp.utils.DateUtil;
import com.tcwl.vsmp.utils.JsonAndBaseUtils;
import com.tcwl.vsmp.utils.RandNumUtils;
import com.tcwl.vsmp.weizhang.util.HttpClientUtil;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.shiro.SecurityUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DuplicateKeyException;
import java.io.BufferedReader;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 江苏银行定时任务
*/
@Configurable
/*@Component*/
public class JiangSuBank {
private static final Logger logger = LoggerFactory.getLogger(JiangSuBank.class);
@Autowired
private MortgageBankofjiangsucainfoService mortgageBankofjiangsucainfoService;
@Autowired
private STCPassCardChargeRecordService sTCPassCardChargeRecordService;//通行卡表
@Autowired
private HzCapitalService hzCapitalService;
@Autowired
private LoanQueryService loanQueryService;//借款查询表
@Autowired
private Card_infoService card_infoService;//油卡详细
@Autowired
private OilCardOperationService oilCardOperationService;//油卡充值接口
/**
* 车应用Dao.
* 油卡业务
*/
@Autowired
private CardApplyDao cardApplyDao;
//当getDayInfo为true s时查询当天所有数据
private Boolean getDayInfo = false;
//控制手动执行获取当天全天银行数据的次数为1次,避免死循环
private int x = 0;
/**
* 时时获取江苏银行到账信息,把获取到的数据存入数据库中;
*/
public synchronized void runTimeGetJiangSuBankAccountInfo() {
try {
//获取江苏银行到账信息,把获取到的数据存入数据库中;当getDayInfo为true s时查询当天所有数据
Boolean aBoolean = mortgageBankofjiangsucainfoService.getJiangSuBankAccountInfo(getDayInfo,x);
if(aBoolean){//aBoolean 为true 时当前获取了整天的数据,获取一次后需要关闭,恢复成原来按时间段获取数据[成员变量 X 与成员变量getDayInfo 值还得设回默认]
x = 0;
getDayInfo = false;
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 时时获取数据库银行到账表MortgageBankofjiangsucainfo操作字段ststus 为 0 未操作的数据,进行苏通卡或油卡充值
*/
public synchronized void runTimeJiangSuBankAccountRefillMoney() {
try {
mortgageBankofjiangsucainfoService.updateMortgageBankofjiangsucainfosByStstusAndRefilMoney();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 未防止获取的数据丢失,每天晚上 11点 50分 触发一次获取当天所有银行到账数据;
* @return
*/
public synchronized void getAll_a_Day_JiangSuBankAccountRefillMoney(){
getDayInfo = true;
}
}
配置 spring定时器 spring-quartz.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- start 江苏银行到账信息查询,并存入数据库 苏凯 2018-11-02-->
<ref bean="jiangSuBankTrigger_1" />
<!-- start 从数据库中取出银行到账信息,并为客户充值 苏凯 2018-11-02-->
<ref bean="jiangSuBankTrigger_2" />
<!-- start 未防止获取的数据丢失,每天晚上 定时 触发一次获取当天所有银行到账数据; 苏凯 2018-11-02-->
<ref bean="jiangSuBankTrigger_3" />
</list>
</property>
</bean>
<!--========================================http://cron.qqe2.com/===============http://www.shnydb.com/=========================================================-->
<!-- start 定时任务配置 江苏银行 苏凯2018-10-29 -->
<bean name="jiangSuBank" class="quartz.jiangSuBank.JiangSuBank"/>
<!-- start 江苏银行到账信息查询,并存入数据库 苏凯 -->
<bean id="jiangSuBank_1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="jiangSuBank" />
</property>
<property name="targetMethod">
<value>runTimeGetJiangSuBankAccountInfo</value>
</property>
</bean>
<bean id="jiangSuBankTrigger_1" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jiangSuBank_1" />
</property>
<!-- 定N时间执行一次 -->
<property name="cronExpression">
<value>#{prop.JIANGSUBANK_GETACCOUNTINFO_TIME}</value>
<!--<value>0/10 * * * * ?</value>-->
</property>
</bean>
<!-- end 定时任务配置 江苏银行 -->
<!-- start 从数据库中取出银行到账信息,并为客户充值 苏凯 -->
<bean id="jiangSuBank_2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="jiangSuBank" />
</property>
<property name="targetMethod">
<value>runTimeJiangSuBankAccountRefillMoney</value>
</property>
</bean>
<bean id="jiangSuBankTrigger_2" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jiangSuBank_2" />
</property>
<!-- 定N时间执行一次 -->
<property name="cronExpression">
<value>#{prop.JIANGSUBANK_GETACCOUNTINFO_TIME}</value>
<!--<value>0/10 * * * * ?</value>-->
</property>
</bean>
<!-- end 定时任务配置 江苏银行 -->
<!-- start 未防止获取的数据丢失,每天晚上 定时 触发一次获取当天所有银行到账数据; 苏凯 -->
<bean id="jiangSuBank_3" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="jiangSuBank" />
</property>
<property name="targetMethod">
<value>getAll_a_Day_JiangSuBankAccountRefillMoney</value>
</property>
</bean>
<bean id="jiangSuBankTrigger_3" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jiangSuBank_3" />
</property>
<!-- 定N时间执行一次 -->
<property name="cronExpression">
<value>#{prop.All_A_DAY_JIANGSUBANK_GETACCOUNTINFO_TIME}</value>
<!--<value>0/10 * * * * ?</value>-->
</property>
</bean>
<!-- end 定时任务配置 江苏银行 -->
<!--================================================================================================================-->
</beans>
======================= 简要 ==========================
发送的请求内容:
查询实时余额为例:
请求报文头:
(所有的请求都必须要报文头,交易码根据自己所要需要自己参照文档,不同的交易码实现不同的功能比如 付款、查询余额 等)
StringBuilder sb = new StringBuilder();
sb.append("00<ap>");
sb.append("<head>");
sb.append("<tr_code>"+tr_code+"</tr_code>"); //tr_code 交易码 C6 M
sb.append("<cms_corp_no>"+cms_corp_no+"</cms_corp_no>");//cms_corp_no 现金管理客户号 C20 M 企业不需要赋值,由银企前置机进行赋值。
sb.append("<user_no>"+user_no+"</user_no>");//user_no 用户号 C10 M 企业不需要赋值,由银企前置机进行赋值。
sb.append("<org_code>"+org_code+"</org_code>");//org_code 机构号 C20 M 企业不需要赋值,由银企前置机进行赋值。
sb.append("<serial_no>"+serial_no+"</serial_no>");//serial_no 交易流水号 C20 C 送空,由现金管理系统产生
sb.append("<req_no>"+req_no+"</req_no>");//req_no 请求号 C40 C 企业ERP的流水号
sb.append("<tr_acdt>"+tr_acdt+"</tr_acdt>"); //tr_acdt 交易日期 C8 M 格式 YYYYMMDD
sb.append("<tr_time>"+tr_time+"</tr_time >"); //tr_time 交易时间 C6 M 格式hhmmss
sb.append("<channel>"+channel+"</channel>"); //channel 渠道标识 C1 M ERP送‘5’
sb.append("<sign>"+sign+"</sign>"); //sign 签名标识 C1 M 0-报文未签名 1-报文已签名 企业送空,由银企前置进行传送.
sb.append("<file_flag>"+file_flag+"</file_flag>"); //file_flag 文件标识 C1 M 0-报文1-文件
sb.append("<reserved>"+reserved+"</reserved>");//reserved 保留字段 C60 C
sb.append("</head>");
查询实时余额的报文请求体:
(每个功能的报文体给的参数是不同的具体看银行给的文档)
sb.append("<body>");
sb.append("<acno>"+pay_acno+"</acno>"); //acno 账号 C35 M ,自己公司账号(付款账号)
sb.append("<cur_code>"+pay_cur_code+"</cur_code>"); //cur_code 付款币种 C2 M 01 人民币
sb.append("</body>");
sb.append("</ap>");
报文:
String requestBody = sb.toString();
向前置机发送报文:
前置机IP与端口 :String url ="http://"+FRONT_END_PROCESSOR_IP+":"+DEAL_PROT;
String requestHeader ="application/x-www-form-urlencoded";
与银行请求的方法:
BufferedReader br = HttpClientUtil.httpPostWithXml(requestBody,url,requestHeader);
public static BufferedReader httpPostWithXml(String requestBody1,String url,String requestHeader) {
String urlStr = "";
String line = "";
StringBuffer resultSting = new StringBuffer();
BufferedReader br = null;
try {
//urlStr,写在了配置文件中,直接进行获取
//声明URL
URL url1 = new URL(url);
//1.创建链接
URLConnection con = url1.openConnection();
//2.封装报文传输进行传输
String xmlInfo = requestBody1;
byte[] xmlData = xmlInfo.getBytes("GBK");
con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(false);
con.setRequestProperty("Cache-Control", "no-cache");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// requestHeader
con.setRequestProperty("Content-length",String.valueOf(xmlData.length));
OutputStreamWriter out = new OutputStreamWriter(
con.getOutputStream());
out.write(new String(xmlInfo.getBytes("GBK")));
out.flush();
out.close();
//3.获取返回报文
br = new BufferedReader(new InputStreamReader(
return br;
/*return resultSting.toString();*/
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return br;
}
获取返回值:
//遍历返回值
for (line = br.readLine(); line != null; line = br.readLine())
{
System.out.println("line:" + line);
}