注:如果没有与银行合作,银行是不会提供开发文档与测试账号的,请确保合作后看以下内容,否则看了也没用,因为重要的详细信息都在银行提供的文档中,我写的只是实际开发的代码;

查询银行到账信息代码示例:

介绍:此业务我是用时间定时器做的,每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_QUERYpublic static String TR_CODE_QUERY ;//交易码 ;对外支付(300001交易) MortgageBankofjiangsucainfoConstant.TR_CODE_PAYpublic static String TR_CODE_PAY;//cms_corp_no   现金管理客户号  企业不需要赋值,由银企前置机进行赋值。 MortgageBankofjiangsucainfoConstant.CMS_CORP_NOpublic static String CMS_CORP_NO = "";//user_no   用户号 企业不需要赋值,由银企前置机进行赋值。MortgageBankofjiangsucainfoConstant.USER_NOpublic static String USER_NO = "";//org_code    机构号 企业不需要赋值,由银企前置机进行赋值。MortgageBankofjiangsucainfoConstant.ORG_CODEpublic static String ORG_CODE = "";//serial_no 交易流水号   送空,由现金管理系统产生 MortgageBankofjiangsucainfoConstant.SERIAL_NOpublic static String SERIAL_NO = "";//req_no   请求号 企业ERP的流水号 MortgageBankofjiangsucainfoConstant.REQ_NOpublic static String REQ_NO = "";//channel   渠道标识    ERP送‘5’  MortgageBankofjiangsucainfoConstant.CHANNELpublic static String CHANNEL ;//sign    签名标识 0-报文未签名 ;  1-报文已签名;  企业送空,由银企前置进行传送. MortgageBankofjiangsucainfoConstant.SIGNpublic static String SIGN = "";//file_flag  文件标识0-报文1-文件 MortgageBankofjiangsucainfoConstant.FILE_FLAGpublic static String FILE_FLAG;//reserved 保留字段public static String RESERVED = "";/*** 请求体* @throws Exception*///坦程自己公司账号 MortgageBankofjiangsucainfoConstant.ACNOpublic static String ACNO;//自己公司账号对应的户名 MortgageBankofjiangsucainfoConstant.ACNAMEpublic static String ACNAME ;//cur_code    币种   01 -人民币 MortgageBankofjiangsucainfoConstant.CUR_CODEpublic static String CUR_CODE ;/*** 请求IP地址*///前置机ip  MortgageBankofjiangsucainfoConstant.FRONT_END_PROCESSOR_IPpublic static String FRONT_END_PROCESSOR_IP;//前置机交易端口prot  MortgageBankofjiangsucainfoConstant.DEAL_PROTpublic static String  DEAL_PROT ;//前置机文件端口prot  MortgageBankofjiangsucainfoConstant.FILE_PROTpublic static String  FILE_PROT;//日期模板  MortgageBankofjiangsucainfoConstant.DATETEMPLATEpublic static String DATETEMPLATE ;//时间模板  MortgageBankofjiangsucainfoConstant.TIME_TEMPLATEpublic static String TIME_TEMPLATE ;/* ============================操作状态================================================*///操作状态【非金鑫获取的数据,由自己写入】 0为未操作,1为操作,数据库默认为0,MortgageBankofjiangsucainfoConstant.STSTUS_NOpublic 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,写在了配置文件中,直接进行获取//声明URLURL 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");// requestHeadercon.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 {//声明URLURL 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————》StringString str = t.xmlToString(document);System.out.println("str:" + str);// String ————》XMLDocument doc = t.StringTOXml(str);String nodePath = "/transaction/header/msg/sndMbrCd";// getNodeValueString nodeValue = t.getNodeValue(doc, nodePath);System.out.println("修改前nodeValue:" + nodeValue);// setNodeValuet.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))) {      //判断是不是GB2312String s = encode;return s;      //是的话,返回“GB2312“,以下代码同理}} catch (Exception exception) {}encode = "ISO-8859-1";try {if (str.equals(new String(str.getBytes(encode), encode))) {      //判断是不是ISO-8859-1String s1 = encode;return s1;}} catch (Exception exception1) {}encode = "UTF-8";try {if (str.equals(new String(str.getBytes(encode), encode))) {   //判断是不是UTF-8String s2 = encode;return s2;}} catch (Exception exception2) {}encode = "GBK";try {if (str.equals(new String(str.getBytes(encode), encode))) {      //判断是不是GBKString 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;//交易时间 格式hhmmssprivate String tr_time_head;//交易日期 格式YYYYMMDDprivate 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;}@Overridepublic 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);/*  @Autowiredprivate MortgageBankofjiangsucainfoService mortgageBankofjiangsucainfoService;*/@Autowiredprivate STCPassCardChargeRecordService sTCPassCardChargeRecordService;//通行卡表@Autowiredprivate HzCapitalService hzCapitalService;@Autowiredprivate LoanQueryService loanQueryService;//借款查询表@Autowiredprivate Card_infoService card_infoService;//油卡详细@Autowiredprivate OilCardOperationService oilCardOperationService;//油卡充值接口/*** 车应用Dao.* 油卡业务*/@Autowiredprivate 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   格式  YYYYMMDDprivate String tr_acdt  = null;//tr_time   交易时间    C6  M   格式hhmmssprivate 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   日期格式:YYYYMMDDprivate String end_date = "";/*** 请求地址*/@Value("#{prop.FRONT_END_PROCESSOR_IP}")//前置机ipprivate String FRONT_END_PROCESSOR_IP;@Value("#{prop.DEAL_PROT}")//前置机交易端口protprivate 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;@Resourceprivate MortgageBankofjiangsucainfoMapper mortgageBankofjiangsucainfoMapper;/*** 根据ID删除数据* @param id* @return*/@Overridepublic int deleteByPrimaryKey(Long id)throws Exception {int i = mortgageBankofjiangsucainfoMapper.deleteByPrimaryKey(id);return i;}/*** 增加数据* @param record* @return*/@Overridepublic int insert(MortgageBankofjiangsucainfo record) throws Exception{int i = mortgageBankofjiangsucainfoMapper.insert(record);return i;}/*** 增加数据(Null值不增加)* @param record* @return*/@Overridepublic int insertSelective(MortgageBankofjiangsucainfo record) throws Exception{int i = mortgageBankofjiangsucainfoMapper.insertSelective(record);return i;}/*** 按主键查询数据* @param id* @return*/@Overridepublic MortgageBankofjiangsucainfo selectByPrimaryKey(Long id)throws Exception {MortgageBankofjiangsucainfo mortgageBankofjiangsucainfo = mortgageBankofjiangsucainfoMapper.selectByPrimaryKey(id);return mortgageBankofjiangsucainfo;}/*** 按操作状态查询* @param ststus* @return*/@Overridepublic List<MortgageBankofjiangsucainfo> selectByStstus(int ststus)throws Exception {List<MortgageBankofjiangsucainfo> mortgageBankofjiangsucainfos = mortgageBankofjiangsucainfoMapper.selectByStstus(ststus);return mortgageBankofjiangsucainfos;}/*** 按主键更新数据(Null值不更新)* @param record* @return*/@Overridepublic int updateByPrimaryKeySelective(MortgageBankofjiangsucainfo record)throws Exception {int i = mortgageBankofjiangsucainfoMapper.updateByPrimaryKeySelective(record);return i;}/*** 按主键更新数据* @param record* @return*/@Overridepublic 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{//urlString 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)方法 将中文单独转成 GBKBufferedReader 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  MString 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   格式YYYYMMDDString tr_time = null;//交易时间 C6  M   格式hhmmssString succ_flag = null; //成功标识    C1  M ; 0-  表示成功 1- 表示通讯机超时 8-表示主机结果未知 其它-交易失败String ret_code = null; //返回码 C4  M   0000表示成功,正常返回String ret_info = null; //返回信息 C60 MString ext_info = null; //返回附加信息  C255    CString file_flag = null; //文件标识   C1  C   传送0-报文 1-文件,或为空String reserved = null; //保留字段  C60 Cif (head != null) {Element tr_codeElement = head.element("tr_code");//交易码  C6  MElement tr_acdtElement = head.element("tr_acdt"); //交易日期    C8  M   格式YYYYMMDDElement tr_timeElement = head.element("tr_time");//交易时间    C6  M   格式hhmmssElement file_flagElement = head.element("file_flag");//文件标识  C1  C   传送0-报文1-文件,或为空Element ret_infoElement = head.element("ret_info");//返回信息  C60 MElement 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    CElement reservedElement = head.element("reserved");//保留字段   C60 Cif (tr_codeElement != null) { //交易码   C6  Mtr_code = tr_codeElement.getText();}if (tr_acdtElement != null) {//交易日期  C8  M   格式YYYYMMDDtr_acdt = tr_acdtElement.getText();}if (tr_timeElement != null) { //交易时间    C6  M   格式hhmmsstr_time = tr_timeElement.getText();}if (file_flagElement != null) { //文件标识    C1  C   传送0-报文1-文件,或为空file_flag = file_flagElement.getText();}if (ret_infoElement != null) { //返回信息   C60 Mret_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.将得到的数据解析到mapmapList = 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", "");//声明URLString 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.获取返回的数据;将得到的数据解析到mapmapList = getMapList(lineT1List);}/*   Thread.sleep(10000);*///必须关闭下载文件//声明URLString 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);}}}//forSystem.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需要改为默认值falsereturn 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_Idif(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_OVERcontinue;}//申请类型【油卡或通行卡】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_applySystem.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  Msb.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   格式  YYYYMMDDsb.append("<tr_time>" + tr_time + "</tr_time >"); //tr_time   交易时间    C6  M   格式hhmmsssb.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 Csb.append("</head>");sb.append("<body>");sb.append("<acno>" + acno + "</acno>"); //acno  账号  C35 Msb.append("<cur_code>" + cur_code + "</cur_code>"); //cur_code   币种  C2  Msb.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   日期格式:YYYYMMDDsb.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);@Autowiredprivate MortgageBankofjiangsucainfoService mortgageBankofjiangsucainfoService;@Autowiredprivate STCPassCardChargeRecordService sTCPassCardChargeRecordService;//通行卡表@Autowiredprivate HzCapitalService hzCapitalService;@Autowiredprivate LoanQueryService loanQueryService;//借款查询表@Autowiredprivate Card_infoService card_infoService;//油卡详细@Autowiredprivate OilCardOperationService oilCardOperationService;//油卡充值接口/*** 车应用Dao.* 油卡业务*/@Autowiredprivate 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/beanshttp://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  Msb.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   格式  YYYYMMDDsb.append("<tr_time>"+tr_time+"</tr_time >"); //tr_time   交易时间    C6  M   格式hhmmsssb.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 Csb.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,写在了配置文件中,直接进行获取//声明URLURL 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");// requestHeadercon.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); }

江苏银行业务对接,现金管理平台,银企直联相关推荐

  1. 兴业银行银企直联对接记录及SDK

    年前因为业务需要,接触了兴业银行的银企直联,因为感兴趣,所以大致搜了下国内一些银行,发现目前银行银企直联模式新接入的用户都只有前置代理机这一途径,所以兴业银行也不例外. 可在此处查看兴业银行的接口文档 ...

  2. 网银和银企直联的区别

    1.1网银 网银,简单地讲,就是银行在互联网上开展的各种业务,也就是银行客户利用个人计算机通过Internet获得银行的各项服务,银行利用专用的服务器提供各项在线服务.对银行,这种高效.全天候的服务能 ...

  3. 银企直联中的银行接口

    1.网银和银企直联的区别 1.1网银 网银,简单地讲,就是银行在互联网上开展的各种业务,也就是银行客户利用个人计算机通过Internet获得银行的各项服务,银行利用专用的服务器提供各项在线服务.对银行 ...

  4. 企业为什么要开通银企直联_企业网银银企直联系统介绍.ppt

    企业网银银企直联系统介绍 * 企业网银银企直联系统介绍 主要内容 第二部分:目前已开通案例介绍 第三部分:系统架构与网络方案 第一部分: 银企直联系统简介 第四部分:系统的未来展望 期望: 理解系统的 ...

  5. 超融合环境,虚拟化环境使用首驰兴华USB服务器实现银企直联,首驰兴华USBserver

    银企直联系统是当前最新的企业级银行业务实现方式,通过互联网或专线连接使企业的财务系统与银行综合业务系统实现对接,企业无需专门登录网上银行,就可以利用自身财务系统自主完成对其银行账户包括分(子)公司银行 ...

  6. 聊聊银企直联服务那些事

    背景 相关 wiki 定义. 银企直联是指集团企业在集团内部建立自己的资金管理系统,通过数据接口将内部资金管理系统与商业银行核心系统.网银或者现金管理平台实现联接.通过银企直联系统企业可实现实时帐户信 ...

  7. 农行银企直联Java

    农行银企直联 前段时间项目中接入了农行的银企直联来完成代发的功能,当我拿到银行方面给过来的文档和资料后,发现和招行的银企直联模式差不多,大概就是:在window机器上开一个类似于前置机的小程序,作为我 ...

  8. 兴业银行银企直联客户端

    兴业银行银企直联客户端是一款企业网上银行,并也是一种新的网上银行系统与企业的财务软件系统在线直接联接的接入方式,也就是说客户可以通过通用浏览器(如微软的IE浏览器)方式来进行直接接入,以此快速的来获取 ...

  9. 企业为什么要开通银企直联_企业账务的福音,竟然只有1%的人知道!|1分钟带你了解银企直联...

    "银企直联",顾名思义,就是通过internet或专线连接的方式,实现企业财务系统和银行综合业务系统的直联对接,财务的转账等业务指令可以直接通过接口发送给银行操作. 银企直联最核心 ...

最新文章

  1. JSON字符串 拼接与解析
  2. Java 常用类库 之 Arrays 数组操作类
  3. MySQL中B-tree索引和Hash索引区别
  4. SAP C4C里前台Opportunity搜索的响应明细
  5. php javascript 不执行,javascript – 不工作php按钮来执行操作
  6. android微信条码支付接口,Android中调用微信支付接口
  7. Expression Blend实战开发技巧 第四章 从最常用ButtonStyle开始 - PathButton
  8. JDBC学习笔记(全)
  9. linux怎样打开终端命令,Linux命令-初学者入门之打开终端
  10. 用VBA代码打开xls文件时,判断被打开的xls文件是否含VBA代码并禁止其运行
  11. “马太效应”与“二八法则”
  12. 服务器大线程有什么作用,全面剖析超线程技术优点与缺点
  13. 微信隐藏的功能和技巧
  14. ManyPixels 插画素材分享
  15. 虚拟现实房产展示系统提前预见未来装修效果
  16. HorizontalScrollView 自动滑动
  17. Kubernetes基础:重启pod的方法
  18. 固态硬盘属于计算机的什么设备,怎么区分电脑里面的c\d\e盘是机械硬盘还是固态硬盘...
  19. 修复路径穿越、任意文件写入漏洞
  20. P42-前端基础-浮动塌陷最终解决方案

热门文章

  1. 基于商业地产的管理系统设计思路——空间管理(一)
  2. java公路车几何有问题_教你读懂公路车架几何
  3. 清华大一 Python 作业太难上热榜
  4. js判断浏览器是电脑,iPad还是手机
  5. ❤️AI从入门到到精通❤️
  6. 蓝桥杯学习笔记--工厂灯光控制系统(小蜜蜂笔记作业)
  7. 中国顶级IC设计公司薪酬
  8. 一个简单的pygame小游戏-合金子弹
  9. 记一次解决Intel 9462无线网卡的笔记本安装Ubuntu16.04后无法连接WIFI问题的艰难历程
  10. SAAS PAAS IAAS