凭证相关--NC传输xml拆分

This commit is contained in:
xiezhiwen 2019-01-04 17:57:34 +08:00
parent de4287a45c
commit c4a3d5aed9
4 changed files with 1604 additions and 0 deletions

View File

@ -0,0 +1,282 @@
package com.tenwa.voucher.serviceImp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DocumentSource;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.amarsoft.are.ARE;
import com.amarsoft.are.jbo.JBOException;
import com.amarsoft.are.jbo.JBOFactory;
import com.amarsoft.are.jbo.JBOTransaction;
import com.amarsoft.are.log.Log;
import com.amarsoft.awe.util.Transaction;
import com.base.util.QuartzUtil;
import com.tenwa.comm.util.date.DateAssistant;
import com.tenwa.comm.util.jboutil.DataOperatorUtil;
import com.tenwa.util.SerialNumberUtil;
public class VoucherToNCforAssistContract implements Job{
private static Log logger=ARE.getLog();
// 客商信息传输
public void execute(JobExecutionContext arg0) throws JobExecutionException {
String plan_date = DateAssistant.getToday();
Object userId = arg0.getTrigger().getJobDataMap().get("CurUserId");
String curUserId = userId == null? "system" : userId.toString();
JBOTransaction tx=null;
Transaction Sqlca = null;
try {
tx= JBOFactory.createJBOTransaction();
Sqlca = Transaction.createTransaction(tx);
File file=null; // 文件对象
XMLWriter writer=null; // 输出对象
String uuid=""; // xml传输id
String insertSql=""; // 插入sql对象
String contract_number=""; // 合同编码对象
String contract_name=""; // 合同名称对象
String type="contract"; // xml类别
String ID=""; // xml类别
// 获取特定的日期
String year_month_day = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());// 年月日时分秒
String year_month_days = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());// 年月日时分秒
// 获取未传输及之前传输失败的数据
String sql="SELECT CONTRACT_NUMBER,PRODUCT_NAME,ID FROM LB_CONTRACT_INFO WHERE CONTRACT_NUMBER NOT IN(SELECT TABLE_NUM FROM NCXML_DETAIL_RECORDS WHERE FLAG = '1' AND XML_TYPE='"+type+"')";
List<Map<String, String>> rs = DataOperatorUtil.getDataBySql(Sqlca,sql,null);
if(rs!=null && rs.size()>0) {
// 生成xml头
Document document = DocumentHelper.createDocument(); // 生成每个xml的头
Element root = document.addElement("ufinterface");
root.addAttribute("account","8");
root.addAttribute("billtype","defdoc(自定义档案)");
root.addAttribute("businessunitcode","");
root.addAttribute("filename","");
root.addAttribute("groupcode","06");
root.addAttribute("isexchange","Y");
root.addAttribute("orgcode","");
root.addAttribute("receiver","接收方业务单元编码");
root.addAttribute("replace","Y");
root.addAttribute("roottag","");
root.addAttribute("sender","001");
// 获取批次号
String batch = SerialNumberUtil.getVoucherPCNumber(Sqlca);
// 遍历结果集
for (Map<String, String> map : rs) {
contract_number=(map.get("CONTRACT_NUMBER")==null)?"":map.get("CONTRACT_NUMBER");
contract_name=(map.get("PRODUCT_NAME")==null)?"":map.get("PRODUCT_NAME");
ID=(map.get("ID")==null)?"":map.get("ID");
Element bill = root.addElement("bill");
uuid=UUID.randomUUID().toString().replace("-", "");
bill.addAttribute("id", uuid);
Element billhead = bill.addElement("billhead");
Element pk_defdoclist = billhead.addElement("pk_defdoclist");// 自定义档案列表主键,最大长度为20,类型为:String
pk_defdoclist.setText(ID);
Element pk_defdoc = billhead.addElement("pk_defdoc");//
pk_defdoc.setText("");
Element pk_group = billhead.addElement("pk_group");// 所属集团,最大长度为20,类型为:String
pk_group.setText("06");
Element pk_org = billhead.addElement("pk_org");// 所属组织,最大长度为20,类型为:String
pk_org.setText("安鹏租赁业务单元编码");
Element code = billhead.addElement("code");// 档案编码,最大长度为40,类型为:String
code.setText(contract_number);
Element name = billhead.addElement("name");// 档案名称,最大长度为200,类型为:String
name.setText((contract_name==null)?"":contract_name);
Element shortname = billhead.addElement("shortname");// 简称,最大长度为200,类型为:String
shortname.setText(contract_name);
Element mnecode = billhead.addElement("mnecode");// 助记码,最大长度为50,类型为:String
mnecode.setText("");
Element pid = billhead.addElement("pid");// 上级档案,最大长度为20,类型为:String
pid.setText("");
Element memo = billhead.addElement("memo");// 备注,最大长度为200,类型为:String
memo.setText("");
// 将记录写入辅助合同日志表
insertSql="INSERT INTO NCXML_DETAIL_RECORDS(BILLID,XML_TYPE,TABLE_NUM,FLAG,CREATE_TIME,BATCH) VALUES('"+uuid+"','"+type+"','"+contract_number+"','1','"+year_month_days+"','"+batch+"')";
Sqlca.executeSQL(insertSql);
logger.info("辅助合同记录语句: " + insertSql);
}
// String URL="//data//files//apzl_leasing//tmp//XZW//APleasing_Defdoc_"+year_month_day+".xml";
String URL="D:\\voucherXml_NC\\APleasing_Defdoc_"+year_month_day+".xml";
file=new File(URL);
writer = new XMLWriter(new FileOutputStream(file), OutputFormat.createPrettyPrint());
writer.setEscapeText(false);// 字符是否转义,默认true
writer.write(document);
writer.close();
// InterActionToNC(Sqlca,URL,type,batch,rs.size());
Sqlca.commit();
}
QuartzUtil.insertLog(plan_date,"com.tenwa.voucher.serviceImp.VoucherToNCforAssistContract", "success", "成功",curUserId);
} catch (Exception e) {
QuartzUtil.insertLog(plan_date,"com.tenwa.voucher.serviceImp.VoucherToNCforAssistContract", "error", "失败",curUserId);
try {
Sqlca.rollback();
} catch (JBOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
if(Sqlca!=null) {
try {
Sqlca.disConnect();
} catch (JBOException e) {
e.printStackTrace();
}
}
}
}
/**
* 像NC传输xml, 获取NC回执xml信息, 根据回执信息更改状态
*/
public static void InterActionToNC(Transaction Sqlca,String inputURL,String type,String batch,int count) {
try {
String updateSql = ""; // 更新sql对象
String insertSql = ""; // 新增SQL对象
String deleteSql = ""; // 删除SQL对象
String resultcode= ""; // 单条返回结果
String bdocid = ""; // xml回执id
String resultdescription=""; //错误信息
/**
* 获取对方post连接
*/
//String url = "http://47.93.227.86:8858/service/XChangeServlet?account=q0225&groupcode=001";
String url = "http://47.93.227.86:8858/service/XChangeServlet?account=8&groupcode=06";
URL realURL = new URL(url);
HttpURLConnection connection = (HttpURLConnection)realURL.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-type", "text/xml");
connection.setRequestMethod("POST");
/**
* 读取本方生成的xml, 传输到NC
*/
File file = new File(inputURL);
BufferedOutputStream out = new BufferedOutputStream(connection.getOutputStream());
BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
int length;
byte[] buffer = new byte[1000];
while ((length = input.read(buffer, 0, 1000)) != -1) {
out.write(buffer, 0, length);
}
input.close();
out.close();
/**
* 获取NC回执信息
*/
InputStream inputStream = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(inputStream);
BufferedReader bufreader = new BufferedReader(isr);
String xmlString = "";
int c;
while ((c = bufreader.read()) != -1) {
System.out.print((char) c);
xmlString += (char) c;
}
input.close();
System.out.println("--------------------------" + xmlString);
/**
* 将获取到的回执信息生成本地xml
*/
Document resDoc = DocumentHelper.parseText(xmlString);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DocumentSource source = new DocumentSource(resDoc);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//设置文档的换行与缩进
transformer.setOutputProperty(OutputKeys.INDENT, "YES");
// 将回执信息输出到本地
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss");
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 年月日时分秒
// File file2 = new File("D:\\VOUCHER_RECEIPT");
// if (!file2.exists()) {file2.mkdirs();}// 判断是否存在, 如果不存在就创建该文件夹
String resFile = "//data//files//apzl_leasing//tmp//WEN//APleasing_"+type+""+fmt.format(new Date())+".xml";
// String resFile = "D:\\VOUCHER_RECEIPT\\APleasing_"+type+""+fmt.format(new Date())+".xml";
StreamResult result = new StreamResult(new File(resFile));
transformer.transform(source,result);
/**
* 解析xml, 根据回执信息更新状态
*/
SAXReader sr = new SAXReader();
Document doc = sr.read(resFile);
Element root= doc.getRootElement();
//获取根元素,得到导入用友是否成功successful的值,值为Y:成功 N:失败
String resSuc = root.attributeValue("successful");
//后面对回执结果做判断,然后改变导入状态就行了
if(null != resSuc){
if(resSuc.equals("N")){
logger.info("导入失败");
// 导入失败, 将本次在明细表中存储的数据删除
deleteSql = "DELETE FROM NCXML_DETAIL_RECORDS WHERE BATCH='"+batch+"' AND XML_TYPE = '"+type+"'";
// 导入失败, 将失败数据记录入总记录表
insertSql = "INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','0','"+count+"','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(deleteSql);
Sqlca.executeSQL(insertSql);
}else if(resSuc.equals("Y")){
logger.info("导入成功");
List<Element> list = root.elements();
int failed_count=0; // 失败记录数
for (Element element : list) {
List<Element> list2 = element.elements();
for (Element el : list2) {
logger.info("111111111111111111");
// 获取单条回执状态
resultcode = el.element("resultcode").getStringValue();
if(!"1".equals(resultcode)) {
logger.info("22222222222222");
bdocid = el.element("bdocid").getStringValue(); // xml回执id
resultdescription = el.element("resultdescription").getStringValue(); // 错误信息
// 如果回执状态不等于1, 说明有误, 更新到记录字表并记录错误信息
updateSql=" UPDATE NCXML_DETAIL_RECORDS SET FLAG='"+resultcode+"',ERR_DESCRIBE='"+resultdescription+"' WHERE BUILLID='"+bdocid+"' AND XML_TYPE= '"+type+"'";
Sqlca.executeSQL(updateSql);
logger.info("根据回执信息, 修改传输失败状态, 记录错误信息"+updateSql);
failed_count++;
}
}
}
// 将本批次传输总量及 失败数量记录入记录总表
String insertSql1="INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','"+count+"','"+failed_count+"','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(insertSql1);
}else{
logger.info("出现未知错误");
}
}else{
logger.info("未找到successful属性");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,337 @@
package com.tenwa.voucher.serviceImp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DocumentSource;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.amarsoft.are.ARE;
import com.amarsoft.are.jbo.JBOException;
import com.amarsoft.are.jbo.JBOFactory;
import com.amarsoft.are.jbo.JBOTransaction;
import com.amarsoft.are.log.Log;
import com.amarsoft.awe.util.Transaction;
import com.base.util.QuartzUtil;
import com.tenwa.comm.util.date.DateAssistant;
import com.tenwa.comm.util.jboutil.DataOperatorUtil;
import com.tenwa.util.SerialNumberUtil;
public class VoucherToNCforCustomer implements Job{
private static Log logger=ARE.getLog();
/**
* 客户信息xml生成, 每1000条生成一个xml
* @throws Exception
* @throws Exception
*/
public void execute(JobExecutionContext arg0) throws JobExecutionException {
String plan_date = DateAssistant.getToday();
Object userId = arg0.getTrigger().getJobDataMap().get("CurUserId");
String curUserId = userId == null? "system" : userId.toString();
JBOTransaction tx=null;
Transaction Sqlca = null;
try {
tx= JBOFactory.createJBOTransaction();
Sqlca = Transaction.createTransaction(tx);
File file=null; // 定义文件对象
XMLWriter writer=null; // 定义输出对象
String type="customer"; // 定义xml类型对象
String insertSql=""; // 定义新增语句对象
String uuid=""; // 定义xml传输id对象
String customer_num=""; // 定义客户编号对象
String customername=""; // 定义客户名称对象
String customertype=""; // 定义客户类型对象
// 获取特定格式日期
String year_month_day = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String year_month_days = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
// 查询为传输或之前传输失败的数据
String sql="SELECT customer_num,customername,customertype,customerid FROM CUSTOMER_INFO WHERE customer_num NOT IN(SELECT TABLE_NUM FROM NCXML_DETAIL_RECORDS WHERE FLAG='1' AND XML_TYPE='"+type+"') ";
List<Map<String, String>> rs = DataOperatorUtil.getDataBySql(Sqlca,sql,null);
if(rs != null && rs.size()>0) {
// 生成xml头
Document document= DocumentHelper.createDocument();
Element root = document.addElement("ufinterface");
root.addAttribute("account", "8");
root.addAttribute("billtype", "customer(客户)");
root.addAttribute("businessunitcode", "develop");
root.addAttribute("filename", "");
root.addAttribute("groupcode", "06");
root.addAttribute("isexchange", "Y");
root.addAttribute("orgcode", "");
root.addAttribute("receiver", "接收方业务单元编码");
root.addAttribute("replace", "Y");
root.addAttribute("roottag", "");
root.addAttribute("sender", "001");
String batch = SerialNumberUtil.getVoucherPCNumber(Sqlca);// 生成批次号
// 遍历要传输的结果集
for(int i=0;i<rs.size();i++) {
customer_num=rs.get(i).get("customer_num"); // 获取客户编号
customername=rs.get(i).get("customername"); // 获取客户名称
customertype=rs.get(i).get("customertype"); // 获取客户类别
Element bill = root.addElement("bill");
uuid=UUID.randomUUID().toString().replace("-", "");
bill.addAttribute("id", uuid);
Element billhead = bill.addElement("billhead");
Element pk_group = billhead.addElement("pk_group"); // 所属集团,最大长度为20,类型为:String
pk_group.setText("06");
Element pk_org = billhead.addElement("pk_org"); // 所属组织,最大长度为20,类型为:String
pk_org.setText("安鹏租赁业务单元编码");
Element code = billhead.addElement("code"); // 客户编码,最大长度为40,类型为:String
code.setText((customer_num==null)?"":customer_num);
Element name = billhead.addElement("name"); // 客户名称,最大长度为200,类型为:String
name.setText((customername==null)?"":customername);
Element shortname = billhead.addElement("shortname"); // 客户简称,最大长度为200,类型为:String
shortname.setText((customername==null)?"":customername);
Element mnecode = billhead.addElement("mnecode"); // 助记码,最大长度为50,类型为:String
mnecode.setText("");
Element pk_custclass = billhead.addElement("pk_custclass"); // 客户基本分类,最大长度为20,类型为:String
pk_custclass.setText((customertype==null)?"":customertype);
Element pk_areacl = billhead.addElement("pk_areacl"); // 地区分类,最大长度为20,类型为:String
pk_areacl.setText("");
Element issupplier = billhead.addElement("issupplier"); // 供应商,最大长度为1,类型为:UFBoolean
issupplier.setText("");
Element pk_supplier = billhead.addElement("pk_supplier"); // 对应供应商,最大长度为20,类型为:String
pk_supplier.setText("");
Element custprop = billhead.addElement("custprop"); // 客户类型,最大长度为0,类型为:Integer
custprop.setText("外部单位");
Element pk_financeorg = billhead.addElement("pk_financeorg");// 对应财务组织,最大长度为20,类型为:String
pk_financeorg.setText("");
Element taxpayerid = billhead.addElement("taxpayerid"); // 纳税人登记号,最大长度为20,类型为:String
taxpayerid.setText("");
Element pk_customer_main = billhead.addElement("pk_customer_main");// 上级客户,最大长度为20,类型为:String
pk_customer_main.setText("");
Element trade = billhead.addElement("trade"); // 所属行业,最大长度为20,类型为:String
trade.setText("");
Element isfreecust = billhead.addElement("isfreecust"); // 散户,最大长度为1,类型为:UFBoolean
isfreecust.setText("");
Element registerfund = billhead.addElement("registerfund"); // 注册资金,最大长度为14,类型为:UFDouble
registerfund.setText("");
Element legalbody = billhead.addElement("legalbody"); // 法人,最大长度为20,类型为:String
legalbody.setText("");
Element ecotypesincevfive = billhead.addElement("ecotypesincevfive");// 经济类型,最大长度为20,类型为:String
ecotypesincevfive.setText("");
Element pk_custtaxes = billhead.addElement("pk_custtaxes"); // 客户税类,最大长度为20,类型为:String
pk_custtaxes.setText("");
Element corpaddress = billhead.addElement("corpaddress"); // 企业地址主键最大长度为20,类型为:String
corpaddress.setText("");
Element url = billhead.addElement("url"); // Web网址,最大长度为60,类型为:String
url.setText("");
Element tel1 = billhead.addElement("tel1"); // 电话1,最大长度为50,类型为:String
tel1.setText("");
Element tel2 = billhead.addElement("tel2"); // 电话2,最大长度为50,类型为:String
tel2.setText("");
Element tel3 = billhead.addElement("tel3"); // 电话3,最大长度为50,类型为:String
tel3.setText("");
Element fax1 = billhead.addElement("fax1"); // 传真1,最大长度为50,类型为:String
fax1.setText("");
Element fax2 = billhead.addElement("fax2"); // 传真2,最大长度为50,类型为:String
fax2.setText("");
Element email = billhead.addElement("email"); // e-mail地址,最大长度为50,类型为:String
email.setText("");
Element pk_country = billhead.addElement("pk_country"); // 国家/地区,最大长度为20,类型为:String
pk_country.setText("CN");
Element pk_timezone = billhead.addElement("pk_timezone"); // 时区,最大长度为20,类型为:String
pk_timezone.setText("P0800");
Element pk_format = billhead.addElement("pk_format"); // 数据格式,最大长度为20,类型为:String
pk_format.setText("ZH-CN");
Element memo = billhead.addElement("memo");
memo.setText("");
Element frozenflag = billhead.addElement("frozenflag"); // 冻结标志,最大长度为1,类型为:UFBoolean
frozenflag.setText("");
Element enablestate = billhead.addElement("enablestate"); // 启用状态,最大长度为0,类型为:Integer
enablestate.setText("");
// 将客户xml信息写入状态表中
insertSql="INSERT INTO NCXML_DETAIL_RECORDS(BILLID,XML_TYPE,TABLE_NUM,FLAG,CREATE_TIME,BATCH) VALUES('"+uuid+"','"+type+"','"+customer_num+"','1','"+year_month_days+"','"+batch+"')";
Sqlca.executeSQL(insertSql);
logger.info("客户记录语句: "+insertSql);
}
//String URL="//data//files//apzl_leasing//tmp//XZW//APleasing_Customer_"+year_month_day+".xml";
String URL="D:\\voucherXml_NC\\APleasing_Customer_"+year_month_day+".xml";
file=new File(URL);
writer = new XMLWriter(new FileOutputStream(file), OutputFormat.createPrettyPrint());
writer.setEscapeText(false);// 字符是否转义,默认true
writer.write(document);
writer.close();
// InterActionToNC(Sqlca,URL,type,batch,rs.size());
Sqlca.commit();
QuartzUtil.insertLog(plan_date,"com.tenwa.voucher.serviceImp.VoucherToNCforCustomer", "success", "成功",curUserId);
}
} catch (Exception e) {
QuartzUtil.insertLog(plan_date,"com.tenwa.voucher.serviceImp.VoucherToNCforCustomer", "error", "失败",curUserId);
try {
logger.debug("客户xml传输失败");
Sqlca.rollback();
} catch (JBOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
if (Sqlca!=null) {
try {
Sqlca.disConnect();
} catch (JBOException e) {
e.printStackTrace();
}
}
}
}
/**
* 像NC传输xml, 获取NC回执xml信息, 根据回执信息更改状态
*/
public static void InterActionToNC(Transaction Sqlca,String inputURL,String type,String batch,int count) {
try {
String updateSql = ""; // 更新sql对象
String insertSql = ""; // 新增SQL对象
String deleteSql = ""; // 删除SQL对象
String resultcode= ""; // 单条返回结果
String bdocid = ""; // xml回执id
String resultdescription=""; //错误信息
/**
* 获取对方post连接
*/
//String url = "http://47.93.227.86:8858/service/XChangeServlet?account=q0225&groupcode=001";
String url = "http://47.93.227.86:8858/service/XChangeServlet?account=8&groupcode=06";
URL realURL = new URL(url);
HttpURLConnection connection = (HttpURLConnection)realURL.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-type", "text/xml");
connection.setRequestMethod("POST");
/**
* 读取本方生成的xml, 传输到NC
*/
File file = new File(inputURL);
BufferedOutputStream out = new BufferedOutputStream(connection.getOutputStream());
BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
int length;
byte[] buffer = new byte[1000];
while ((length = input.read(buffer, 0, 1000)) != -1) {
out.write(buffer, 0, length);
}
input.close();
out.close();
/**
* 获取NC回执信息
*/
InputStream inputStream = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(inputStream);
BufferedReader bufreader = new BufferedReader(isr);
String xmlString = "";
int c;
while ((c = bufreader.read()) != -1) {
System.out.print((char) c);
xmlString += (char) c;
}
input.close();
System.out.println("--------------------------" + xmlString);
/**
* 将获取到的回执信息生成本地xml
*/
Document resDoc = DocumentHelper.parseText(xmlString);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DocumentSource source = new DocumentSource(resDoc);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//设置文档的换行与缩进
transformer.setOutputProperty(OutputKeys.INDENT, "YES");
// 将回执信息输出到本地
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss");
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 年月日时分秒
// File file2 = new File("D:\\VOUCHER_RECEIPT");
// if (!file2.exists()) {file2.mkdirs();}// 判断是否存在, 如果不存在就创建该文件夹
String resFile = "//data//files//apzl_leasing//tmp//WEN//APleasing_"+type+""+fmt.format(new Date())+".xml";
// String resFile = "D:\\VOUCHER_RECEIPT\\APleasing_"+type+""+fmt.format(new Date())+".xml";
StreamResult result = new StreamResult(new File(resFile));
transformer.transform(source,result);
/**
* 解析xml, 根据回执信息更新状态
*/
SAXReader sr = new SAXReader();
Document doc = sr.read(resFile);
Element root= doc.getRootElement();
//获取根元素,得到导入用友是否成功successful的值,值为Y:成功 N:失败
String resSuc = root.attributeValue("successful");
//后面对回执结果做判断,然后改变导入状态就行了
if(null != resSuc){
if(resSuc.equals("N")){
logger.info("导入失败");
// 导入失败, 将本次在明细表中存储的数据删除
deleteSql = "DELETE FROM NCXML_DETAIL_RECORDS WHERE BATCH='"+batch+"' AND XML_TYPE = '"+type+"'";
// 导入失败, 将失败数据记录入总记录表
insertSql = "INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','0','"+count+"','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(deleteSql);
Sqlca.executeSQL(insertSql);
}else if(resSuc.equals("Y")){
logger.info("导入成功");
List<Element> list = root.elements();
int failed_count=0; // 失败记录数
for (Element element : list) {
List<Element> list2 = element.elements();
for (Element el : list2) {
logger.info("111111111111111111");
// 获取单条回执状态
resultcode = el.element("resultcode").getStringValue();
if(!"1".equals(resultcode)) {
logger.info("22222222222222");
bdocid = el.element("bdocid").getStringValue(); // xml回执id
resultdescription = el.element("resultdescription").getStringValue(); // 错误信息
// 如果回执状态不等于1, 说明有误, 更新到记录字表并记录错误信息
updateSql=" UPDATE NCXML_DETAIL_RECORDS SET FLAG='"+resultcode+"',ERR_DESCRIBE='"+resultdescription+"' WHERE BUILLID='"+bdocid+"' AND XML_TYPE= '"+type+"'";
Sqlca.executeSQL(updateSql);
logger.info("根据回执信息, 修改传输失败状态, 记录错误信息"+updateSql);
failed_count++;
}
}
}
// 将本批次传输总量及 失败数量记录入记录总表
String insertSql1="INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','"+count+"','"+failed_count+"','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(insertSql1);
}else{
logger.info("出现未知错误");
}
}else{
logger.info("未找到successful属性");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,425 @@
package com.tenwa.voucher.serviceImp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DocumentSource;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.amarsoft.are.ARE;
import com.amarsoft.are.jbo.JBOException;
import com.amarsoft.are.jbo.JBOFactory;
import com.amarsoft.are.jbo.JBOTransaction;
import com.amarsoft.are.log.Log;
import com.amarsoft.awe.util.Transaction;
import com.amarsoft.dict.als.manage.NameManager;
import com.base.util.QuartzUtil;
import com.tenwa.comm.util.date.DateAssistant;
import com.tenwa.comm.util.jboutil.DataOperatorUtil;
import com.tenwa.util.SerialNumberUtil;
public class VoucherToNCforDistributor implements Job{
private static Log logger=ARE.getLog();
/**
* 供应商信息xml生成, 每1000条生成一个xml
* @throws Exception
* @throws Exception
*/
public void execute(JobExecutionContext arg0) throws JobExecutionException {
String plan_date = DateAssistant.getToday();
Object userId = arg0.getTrigger().getJobDataMap().get("CurUserId");
String curUserId = userId == null? "system" : userId.toString();
JBOTransaction tx=null;
Transaction Sqlca = null;
try {
tx= JBOFactory.createJBOTransaction();
Sqlca = Transaction.createTransaction(tx);
File file = null; // 文件对象
XMLWriter writer = null; // 输出对象
String type="distributor"; // xml类别
String DISTRIBUTOR_NAME = ""; // 经销商名称
String DISTRIBUTOR_CODING = ""; // 经销商id
String DISTRIBUTOR_ADDRESS=""; // 地区编码
String REGISTERED_ADDR=""; // 注册地址
String POSTCODE=""; // 邮编
String FACT_ADDR=""; // 企业地址
String region=""; // 地区
String PROVINCES=""; // 省份
String BUSINESS_SCOPE=""; // 经营范围
String SUBSIDIARY_COMPANY=""; // 母公司
String TYPE=""; // 供应商基本分类
String BUSINESS_LICENSE_NO=""; // 组织机构代码
String DISTRIBUTOR_STATUS=""; // 启用状态
String FAX_NUMBER=""; // 传真
String E_MAIL=""; // email
String REGISTERED_ASSET=""; // 注册资金
String DISTRIBUTORER=""; // 法人
String URL=""; // 网址
String insertSql=""; // 新增语句
String uuid=""; // uuid
String MBAFC_EARLYDISBURSEMENT_TYPE="";// 资金类型/支付类型
// 获取特定日期
String year_month_day = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String year_month_days = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
// 获取未传输及以前传输失败的数据
String sql="SELECT DISTRIBUTOR_NAME,DISTRIBUTOR_CODING,DISTRIBUTOR_ADDRESS,FACT_ADDR,PROVINCES,POSTCODE,REGISTERED_ADDR,BUSINESS_SCOPE,SUBSIDIARY_COMPANY,TYPE,BUSINESS_LICENSE_NO,DISTRIBUTOR_STATUS,E_MAIL,FAX_NUMBER,REGISTERED_ASSET,DISTRIBUTORER,MBAFC_EARLYDISBURSEMENT_TYPE,URL FROM DISTRIBUTOR_INFO WHERE (DISTRIBUTOR_CODING NOT IN(SELECT TABLE_NUM FROM NCXML_DETAIL_RECORDS WHERE FLAG ='1' AND XML_TYPE='"+type+"') and DISTRIBUTOR_CODING not in(SELECT cust_id FROM customer_list)) and DISTRIBUTOR_STATUS='distributor_status04' ";
List<Map<String, String>> rs = DataOperatorUtil.getDataBySql(Sqlca,sql,null);
if(rs !=null && rs.size()>0) {
// 设置xml标签头
Document document = DocumentHelper.createDocument();
Element root = document.addElement("ufinterface");
root.addAttribute("account", "8");
root.addAttribute("billtype", "supplier(供应商)");
root.addAttribute("filename", "");
root.addAttribute("groupcode", "06");
root.addAttribute("isexchange", "Y");
root.addAttribute("receiver", "接收方业务单元编码");
root.addAttribute("replace", "Y");
root.addAttribute("roottag", "");
root.addAttribute("sender", "001");
// 获取批次号
String batch = SerialNumberUtil.getVoucherPCNumber(Sqlca);
// 遍历要传输的结果集
for(int i=0; i<rs.size();i++) {
DISTRIBUTOR_NAME = rs.get(i).get("DISTRIBUTOR_NAME"); // 获取经销商名称
DISTRIBUTOR_CODING = rs.get(i).get("DISTRIBUTOR_CODING"); // 获取经销商id
DISTRIBUTOR_ADDRESS = rs.get(i).get("DISTRIBUTOR_ADDRESS"); // 获取地区编码
FACT_ADDR=rs.get(i).get("FACT_ADDR"); // 获取企业地址
PROVINCES=rs.get(i).get("PROVINCES"); // 获取省份
POSTCODE=rs.get(i).get("POSTCODE"); // 获取邮编
REGISTERED_ADDR=rs.get(i).get("REGISTERED_ADDR"); // 获取注册地址
BUSINESS_SCOPE=rs.get(i).get("BUSINESS_SCOPE"); // 获取经营范围
SUBSIDIARY_COMPANY=rs.get(i).get("SUBSIDIARY_COMPANY"); // 获取母公司
BUSINESS_LICENSE_NO=rs.get(i).get("BUSINESS_LICENSE_NO"); // 获取组织机构代码
DISTRIBUTOR_STATUS=rs.get(i).get("DISTRIBUTOR_STATUS"); // 获取启用状态
TYPE=rs.get(i).get("TYPE"); // 获取供应商基本分类
E_MAIL=rs.get(i).get("E_MAIL"); // 获取邮箱
REGISTERED_ASSET=rs.get(i).get("REGISTERED_ASSET"); // 获取注册资金
FAX_NUMBER=rs.get(i).get("FAX_NUMBER"); // 获取传真
DISTRIBUTORER=rs.get(i).get("DISTRIBUTORER"); // 获取法人
MBAFC_EARLYDISBURSEMENT_TYPE=rs.get(i).get("MBAFC_EARLYDISBURSEMENT_TYPE"); // 获取资金类型/支付类型
URL=rs.get(i).get("URL"); // 获取网址
region = NameManager.getItemName("AreaCode",DISTRIBUTOR_ADDRESS); // 获取地区
Element bill = root.addElement("bill");
uuid=UUID.randomUUID().toString().replace("-", "");
bill.addAttribute("id",uuid);
Element billhead = bill.addElement("billhead");
Element pk_group = billhead.addElement("pk_group"); // 所属集团,最大长度为20,类型为:String
pk_group.setText("06");
Element pk_org = billhead.addElement("pk_org"); // 所属组织,最大长度为20,类型为:String
pk_org.setText("安鹏租赁业务单元编码");
Element code = billhead.addElement("code"); // 供应商编号,最大长度为40,类型为:String
code.setText((DISTRIBUTOR_CODING==null)?"":DISTRIBUTOR_CODING);
Element name = billhead.addElement("name"); // 供应商名称,最大长度为200,类型为:String
name.setText((DISTRIBUTOR_NAME==null)?"":DISTRIBUTOR_NAME);
Element shortname = billhead.addElement("shortname"); // 供应商简称,最大长度为200,类型为:String
// shortname.setText((DISTRIBUTOR_NAME==null)?"":DISTRIBUTOR_NAME);
shortname.setText("");
Element ename = billhead.addElement("ename"); // 外文名称,最大长度为60,类型为:String
ename.setText("");
Element mnecode = billhead.addElement("mnecode"); // 助记码,最大长度为50,类型为:String
mnecode.setText("");
Element trade = billhead.addElement("trade"); // 所属行业,最大长度为20,类型为:String
trade.setText((BUSINESS_SCOPE==null)?"":BUSINESS_SCOPE);
Element pk_supplier_main = billhead.addElement("pk_supplier_main"); // 上级供应商,最大长度为20,类型为:String
pk_supplier_main.setText((SUBSIDIARY_COMPANY==null)?"":SUBSIDIARY_COMPANY);
Element supprop = billhead.addElement("supprop"); // 供应商类型,最大长度为1,类型为:Integer
supprop.setText("外部单位");
Element pk_areacl = billhead.addElement("pk_areacl"); // 地区分类,最大长度为20,类型为:String
pk_areacl.setText((region==null)?"":region);
Element pk_supplierclass = billhead.addElement("pk_supplierclass"); // 供应商基本分类,最大长度为20,类型为:String
pk_supplierclass.setText((TYPE==null)?"":TYPE);
Element iscustomer = billhead.addElement("iscustomer"); // 客户,最大长度为1,类型为:UFBoolean
iscustomer.setText("");
Element corcustomer = billhead.addElement("corcustomer"); // 对应客户,最大长度为20,类型为:String
corcustomer.setText("");
Element isfreecust = billhead.addElement("isfreecust"); // 散户,最大长度为1,类型为:UFBoolean
isfreecust.setText("");
Element isoutcheck = billhead.addElement("isoutcheck"); // 外部检测机构,最大长度为1,类型为:UFBoolean
isoutcheck.setText("");
Element pk_financeorg = billhead.addElement("pk_financeorg"); // 对应财务组织,最大长度为20,类型为:String
pk_financeorg.setText("");
Element taxpayerid = billhead.addElement("taxpayerid"); // 纳税人登记号,最大长度为20,类型为:String
taxpayerid.setText("");
Element registerfund = billhead.addElement("registerfund"); // 注册资金,最大长度为14,类型为:UFDouble
registerfund.setText((REGISTERED_ASSET==null)?"":REGISTERED_ASSET);
Element legalbody = billhead.addElement("legalbody"); // 法人,最大长度为20,类型为:String
legalbody.setText((DISTRIBUTORER==null)?"":DISTRIBUTORER);
Element ecotypesincevfive = billhead.addElement("ecotypesincevfive");// 经济类型,最大长度为20,类型为:String
ecotypesincevfive.setText((MBAFC_EARLYDISBURSEMENT_TYPE==null)?"":MBAFC_EARLYDISBURSEMENT_TYPE);
Element pk_suptaxes = billhead.addElement("pk_suptaxes"); // 供应商税类,最大长度为20,类型为:String
pk_suptaxes.setText("");
Element zipcode = billhead.addElement("zipcode");
zipcode.setText("");
Element url = billhead.addElement("url"); // Web网址,最大长度为60,类型为:String
url.setText((URL==null)?"":URL);
Element memo = billhead.addElement("memo");
memo.setText("");
Element suplinkman = billhead.addElement("suplinkman"); // 企业地址明细
Element item1 = suplinkman.addElement("item"); // 编码,最大长度为64,类型为:String
Element linkmanvo = item1.addElement("linkmanvo");
Element code2 = linkmanvo.addElement("code"); // 编码,最大长度为64,类型为:String
code2.setText((DISTRIBUTOR_CODING==null)?"":DISTRIBUTOR_CODING);
Element name2 = linkmanvo.addElement("name"); // 名称,最大长度为64,类型为:String
name2.setText((DISTRIBUTOR_NAME==null)?"":DISTRIBUTOR_NAME);
Element sex = linkmanvo.addElement("sex"); // 性别,最大长度为64,类型为:Integer
sex.setText("");
Element vjob2 = linkmanvo.addElement("vjob"); // 职位,最大长度为64,类型为:String
vjob2.setText("");
Element birthday2 = linkmanvo.addElement("birthday"); // 出生日期,最大长度为64,类型为:UFDate
birthday2.setText("");
Element phone2 = linkmanvo.addElement("phone"); // 电话,最大长度为64,类型为:String
phone2.setText("");
Element cell2 = linkmanvo.addElement("cell"); // 手机,最大长度为64,类型为:String
cell2.setText("");
Element fax = linkmanvo.addElement("fax"); // 传真,最大长度为64,类型为:String
fax.setText("");
Element email = linkmanvo.addElement("email"); // email,最大长度为64,类型为:String
email.setText("");
Element webaddress = linkmanvo.addElement("webaddress");// Web网址,最大长度为64,类型为:String
webaddress.setText((URL==null)?"":URL);
Element address = linkmanvo.addElement("address"); // 住址,最大长度为64,类型为:String
address.setText("");
Element postcode = linkmanvo.addElement("postcode"); // 邮编,最大长度为64,类型为:String
postcode.setText((POSTCODE==null)?"":POSTCODE);
Element memo2 = linkmanvo.addElement("memo"); // 其它,最大长度为64,类型为:String
memo2.setText("");
Element pk_linkman = item1.addElement("pk_linkman"); // 联系人,最大长度为20,类型为:String
pk_linkman.setText("");
Element isdefault = item1.addElement("isdefault"); // 是否默认,最大长度为1,类型为:UFBoolean
isdefault.setText("");
Element tel1 = billhead.addElement("tel1"); // 电话1,最大长度为50,类型为:String
tel1.setText("");
Element tel2 = billhead.addElement("tel2"); // 电话2,最大长度为50,类型为:String
tel2.setText("");
Element tel3 = billhead.addElement("tel3"); // 电话3,最大长度为50,类型为:String
tel3.setText("");
Element fax1 = billhead.addElement("fax1"); // 传真1,最大长度为50,类型为:String
fax1.setText((FAX_NUMBER==null)?"":FAX_NUMBER);
Element fax2 = billhead.addElement("fax2"); // 传真2,最大长度为50,类型为:String
fax2.setText("");
Element email2 = billhead.addElement("email"); // e-mail地址,最大长度为50,类型为:String
email2.setText((E_MAIL==null)?"":E_MAIL);
Element pk_country = billhead.addElement("pk_country"); // 国家/地区,最大长度为20,类型为:String
pk_country.setText("CN");
Element pk_timezone = billhead.addElement("pk_timezone"); // 时区,最大长度为20,类型为:String
pk_timezone.setText("P0800");
Element pk_format = billhead.addElement("pk_format"); // 数据格式,最大长度为20,类型为:String
pk_format.setText("ZH-CN");
Element enablestate = billhead.addElement("enablestate"); // 启用状态,最大长度为0,类型为:Integer
enablestate.setText((DISTRIBUTOR_STATUS==null)?"":DISTRIBUTOR_STATUS);
Element aaa = billhead.addElement("企业地址");
Element code3 = aaa.addElement("code"); // 编码,最大长度为64,类型为:String
code3.setText((BUSINESS_LICENSE_NO==null)?"":BUSINESS_LICENSE_NO);
Element country = aaa.addElement("country"); // 国家,最大长度为64,类型为:String
country.setText("");
Element detailinfo = aaa.addElement("detailinfo"); // 详细地址,最大长度为64,类型为:String
detailinfo.setText((REGISTERED_ADDR==null)?"":REGISTERED_ADDR);
Element postcode3 = aaa.addElement("postcode"); // 邮编,最大长度为64,类型为:String
postcode3.setText((POSTCODE==null)?"":POSTCODE);
Element province = aaa.addElement("province"); // 省份,最大长度为64,类型为:String
province.setText((PROVINCES==null)?"":PROVINCES);
Element status = aaa.addElement("status"); // status,最大长度为64,类型为:Integer
status.setText("0");
Element vsection = aaa.addElement("vsection"); // 区县,最大长度为64,类型为:String
vsection.setText((region==null)?"":region);
Element corpaddress = billhead.addElement("corpaddress"); // 企业地址主键,最大长度为20,类型为:String
corpaddress.setText((FACT_ADDR==null)?"":FACT_ADDR);
// 像记录表添加数据
insertSql="INSERT INTO NCXML_DETAIL_RECORDS(BILLID,XML_TYPE,TABLE_NUM,FLAG,CREATE_TIME,BATCH) VALUES('"+uuid+"','"+type+"','"+DISTRIBUTOR_CODING+"','1','"+year_month_days+"','"+batch+"')";
Sqlca.executeSQL(insertSql);
logger.info("经销商记录语句: "+ insertSql);
}
String f="D:\\voucherXml_NC\\APleasing_Supplier_"+year_month_day+".xml";
// String f="//data//files//apzl_leasing//tmp//XZW//APleasing_Supplier_"+year_month_day+".xml";
file=new File(f);
writer = new XMLWriter(new FileOutputStream(file), OutputFormat.createPrettyPrint());
writer.setEscapeText(false);// 字符是否转义,默认true
writer.write(document);
writer.close();
// InterActionToNC(Sqlca,f,type,batch,rs.size());
Sqlca.commit();
QuartzUtil.insertLog(plan_date,"com.tenwa.voucher.serviceImp.VoucherToNCforDistributor", "success", "成功",curUserId);
}
} catch (Exception e) {
QuartzUtil.insertLog(plan_date,"com.tenwa.voucher.serviceImp.VoucherToNCforDistributor", "error", "失败",curUserId);
try {
logger.debug("经销商xml传输失败");
Sqlca.rollback();
} catch (JBOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
if(Sqlca!=null) {
try {
Sqlca.disConnect();
} catch (JBOException e) {
e.printStackTrace();
}
}
}
}
/**
* 像NC传输xml, 获取NC回执xml信息, 根据回执信息更改状态
*/
public static void InterActionToNC(Transaction Sqlca,String inputURL,String type,String batch,int count) {
try {
String updateSql = ""; // 更新sql对象
String insertSql = ""; // 新增SQL对象
String deleteSql = ""; // 删除SQL对象
String resultcode= ""; // 单条返回结果
String bdocid = ""; // xml回执id
String resultdescription=""; //错误信息
/**
* 获取对方post连接
*/
//String url = "http://47.93.227.86:8858/service/XChangeServlet?account=q0225&groupcode=001";
String url = "http://47.93.227.86:8858/service/XChangeServlet?account=8&groupcode=06";
URL realURL = new URL(url);
HttpURLConnection connection = (HttpURLConnection)realURL.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-type", "text/xml");
connection.setRequestMethod("POST");
/**
* 读取本方生成的xml, 传输到NC
*/
File file = new File(inputURL);
BufferedOutputStream out = new BufferedOutputStream(connection.getOutputStream());
BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
int length;
byte[] buffer = new byte[1000];
while ((length = input.read(buffer, 0, 1000)) != -1) {
out.write(buffer, 0, length);
}
input.close();
out.close();
/**
* 获取NC回执信息
*/
InputStream inputStream = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(inputStream);
BufferedReader bufreader = new BufferedReader(isr);
String xmlString = "";
int c;
while ((c = bufreader.read()) != -1) {
System.out.print((char) c);
xmlString += (char) c;
}
input.close();
System.out.println("--------------------------" + xmlString);
/**
* 将获取到的回执信息生成本地xml
*/
Document resDoc = DocumentHelper.parseText(xmlString);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DocumentSource source = new DocumentSource(resDoc);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//设置文档的换行与缩进
transformer.setOutputProperty(OutputKeys.INDENT, "YES");
// 将回执信息输出到本地
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss");
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 年月日时分秒
// File file2 = new File("D:\\VOUCHER_RECEIPT");
// if (!file2.exists()) {file2.mkdirs();}// 判断是否存在, 如果不存在就创建该文件夹
String resFile = "//data//files//apzl_leasing//tmp//WEN//APleasing_"+type+""+fmt.format(new Date())+".xml";
// String resFile = "D:\\VOUCHER_RECEIPT\\APleasing_"+type+""+fmt.format(new Date())+".xml";
StreamResult result = new StreamResult(new File(resFile));
transformer.transform(source,result);
/**
* 解析xml, 根据回执信息更新状态
*/
SAXReader sr = new SAXReader();
Document doc = sr.read(resFile);
Element root= doc.getRootElement();
//获取根元素,得到导入用友是否成功successful的值,值为Y:成功 N:失败
String resSuc = root.attributeValue("successful");
//后面对回执结果做判断,然后改变导入状态就行了
if(null != resSuc){
if(resSuc.equals("N")){
logger.info("导入失败");
// 导入失败, 将本次在明细表中存储的数据删除
deleteSql = "DELETE FROM NCXML_DETAIL_RECORDS WHERE BATCH='"+batch+"' AND XML_TYPE = '"+type+"'";
// 导入失败, 将失败数据记录入总记录表
insertSql = "INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','0','"+count+"','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(deleteSql);
Sqlca.executeSQL(insertSql);
}else if(resSuc.equals("Y")){
logger.info("导入成功");
List<Element> list = root.elements();
int failed_count=0; // 失败记录数
for (Element element : list) {
List<Element> list2 = element.elements();
for (Element el : list2) {
logger.info("111111111111111111");
// 获取单条回执状态
resultcode = el.element("resultcode").getStringValue();
if(!"1".equals(resultcode)) {
logger.info("22222222222222");
bdocid = el.element("bdocid").getStringValue(); // xml回执id
resultdescription = el.element("resultdescription").getStringValue(); // 错误信息
// 如果回执状态不等于1, 说明有误, 更新到记录字表并记录错误信息
updateSql=" UPDATE NCXML_DETAIL_RECORDS SET FLAG='"+resultcode+"',ERR_DESCRIBE='"+resultdescription+"' WHERE BUILLID='"+bdocid+"' AND XML_TYPE= '"+type+"'";
Sqlca.executeSQL(updateSql);
logger.info("根据回执信息, 修改传输失败状态, 记录错误信息"+updateSql);
failed_count++;
}
}
}
// 将本批次传输总量及 失败数量记录入记录总表
String insertSql1="INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','"+count+"','"+failed_count+"','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(insertSql1);
}else{
logger.info("出现未知错误");
}
}else{
logger.info("未找到successful属性");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,560 @@
package com.tenwa.voucher.serviceImp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DocumentSource;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.amarsoft.are.ARE;
import com.amarsoft.are.jbo.BizObject;
import com.amarsoft.are.jbo.JBOException;
import com.amarsoft.are.jbo.JBOFactory;
import com.amarsoft.are.jbo.JBOTransaction;
import com.amarsoft.are.log.Log;
import com.amarsoft.awe.util.Transaction;
import com.base.util.QuartzUtil;
import com.tenwa.comm.util.date.DateAssistant;
import com.tenwa.comm.util.jboutil.DataOperatorUtil;
import com.tenwa.util.SerialNumberUtil;
import jbo.com.tenwa.entity.comm.own.OWN_INFO;
import jbo.voucher.LV_STACTS_CONFIG;
public class VoucherToNCforVoucherPZ implements Job{
private static Log logger=ARE.getLog();
// 凭证信息传输
public void execute(JobExecutionContext arg0) throws JobExecutionException {
String plan_date = DateAssistant.getToday();
Object userId = arg0.getTrigger().getJobDataMap().get("CurUserId");
String curUserId = userId == null? "system" : userId.toString();
String ss = DOM4JcreateToVoucher();
if("true".equals(ss)) {
QuartzUtil.insertLog(plan_date,"com.tenwa.voucher.serviceImp.VoucherToNCforVoucherPZ", "success", "成功",curUserId);
}else {
QuartzUtil.insertLog(plan_date,"com.tenwa.voucher.serviceImp.VoucherToNCforVoucherPZ", "error", "失败",curUserId);
}
}
/*
* 页面执行xml传输
* */
public String sendVoucherData(JBOTransaction tx) {
String ss = DOM4JcreateToVoucher();
return ss;
}
/**
* 凭证信息xml生成, 每1000条生成一个xml
* @throws Exception
*/
private static String DOM4JcreateToVoucher(){
// 本地xml存放文件夹, 没有就创建
File file2 = new File("D:\\voucherXml_NC");
if (!file2.exists()) {file2.mkdirs();}// 判断是否存在, 如果不存在就创建该文件夹
JBOTransaction tx=null;
Transaction Sqlca = null;
String returns="true";
try {
// 定义全局对象
tx= JBOFactory.createJBOTransaction();
Sqlca = Transaction.createTransaction(tx);
Map<String, String> map = new HashMap<String, String>();
Document document=null; // xml文件头
File file=null; // 生成的xml文件路径
XMLWriter writer=null; // 输出对象
String uuid=""; // xml主键id
String SUBJECT_ID=null; // 获取科目id
String OWNED_COMPANY = null; // 所属公司
String ACC_YEAR = null; // 会计期间/
String ACC_MONTH = null; // 会计期间/
String insertSql=""; // 定义新增语句对象
String type="voucher"; // 记录表类别
String timeAll = ""; // 制单日期
String year_month_day = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String year_month_days = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
// 查询凭证视图, 获取每条凭证
String sql = "SELECT F3,F60,ID,MODULE_NAME,DEPT_NAME,F1,F15,V8_STATUS,F5,GENERATE_DATE FROM VI_VOUCHER_V8 WHERE F3 NOT IN(SELECT TABLE_NUM FROM NCXML_DETAIL_RECORDS WHERE FLAG = '1' AND XML_TYPE='"+type+"')";
List<Map<String, String>> list = DataOperatorUtil.getDataBySql(Sqlca, sql, null);// 将所有凭证号封装到list集合中
int a = list.size(); // v8视图总数据量/ xml中生成的总条数
int b=1000; // 设置当前xml生成的条数
int c = (int)(a / b); // 获取生成xml文件的数量, 最大循环值=c+1
for (int i = 0; i <=c && a>0; i++) {
int count=0; // 记录当前批次传输总量
Sqlca = Transaction.createTransaction(tx);
document = DocumentHelper.createDocument(); // 创建Document对象
Element root = document.addElement("ufinterface"); // 设置xml头
root.addAttribute("account", "8"); // 设置xml头属性
root.addAttribute("billtype", "vouchergl(凭证)");
root.addAttribute("businessunitcode", "develop");
root.addAttribute("filename", "");
root.addAttribute("groupcode", "06");
root.addAttribute("isexchange", "Y");
root.addAttribute("orgcode", "");
root.addAttribute("receiver", "接收方业务单元编码");
root.addAttribute("replace", "Y");
root.addAttribute("roottag", "");
root.addAttribute("sender", "001");
String batch = SerialNumberUtil.getVoucherPCNumber(Sqlca);
for (int x = i * b; x < (i + 1) * b && x < a; x++) { // 决定当前xml生成的数据量
// 获取凭证编号
String F3=list.get(x).get("F3");
map.clear();
map.put("F3",F3);
// 获取v8表借方数据
String sql1 = "SELECT f5,f6,f7,f15,f59,f60,f65,f73,f74,f75 FROM VOUCHER_V8 WHERE F3=:F3 AND ENTRYDC='1'";
List<Map<String, String>> v1 = DataOperatorUtil.getDataBySql(Sqlca,sql1,map);
// 获取v8表贷方数据
String sql2 = "SELECT f5,f6,f8,f15,f51,f52,f59,f60,f65,f73,f74,f75 FROM VOUCHER_V8 WHERE F3=:F3 AND ENTRYDC='-1'";
List<Map<String, String>> v2 = DataOperatorUtil.getDataBySql(Sqlca,sql2,map);
// 获取v8表公共信息
for (Map<String, String> map2 : v2) {
//OWNED_COMPANY=map2.get("f49"); // 本方id
ACC_YEAR = map2.get("f51"); // 会计期间/
ACC_MONTH =map2.get("f52"); // 会计期间/
timeAll =map2.get("f15"); // 制单时间
}
// 获取本方信息
//BizObject own = JBOFactory.createBizObjectQuery(OWN_INFO.CLASS_NAME, "id=:OWNED_COMPANY").setParameter("OWNED_COMPANY", OWNED_COMPANY).getSingleResult(false);
Element voucher = root.addElement("voucher");
Element voucherHead = voucher.addElement("voucher_head");
Element pkVoucher = voucherHead.addElement("pk_voucher");// 凭证主键/非空
uuid=UUID.randomUUID().toString().replace("-", "");
pkVoucher.setText(uuid);
Element pk_vouchertype = voucherHead.addElement("pk_vouchertype");// 凭证类别, 默认01/非空
pk_vouchertype.setText("1");//----------------------------------------------------------------------
Element year = voucherHead.addElement("year");// 会计年度/非空
year.setText((ACC_YEAR==null)?"":ACC_YEAR);
Element pk_system = voucherHead.addElement("pk_system");// 来源系统/非空
//pk_system.setText((own.getAttribute("OWN_NAME")==null)? "":own.getAttribute("OWN_NAME").getString());//----------------------------------------
pk_system.setText("安鹏租赁零售性融资业务系统");//----------------------------------------
Element voucherkind = voucherHead.addElement("voucherkind");// 凭证类型值/非空
voucherkind.setText("0");
Element pk_accountingbook = voucherHead.addElement("pk_accountingbook");// 核算核算账簿/非空
pk_accountingbook.setText("安鹏租赁核算账簿编码");
Element discardflag = voucherHead.addElement("discardflag");// 作废标志/可空
discardflag.setText("");
Element period = voucherHead.addElement("period");// 会计期间/非空
period.setText((ACC_MONTH==null)?"":ACC_MONTH);//--------------------------------------------------------------
Element no = voucherHead.addElement("no");// 凭证号为空自动分配/非空
no.setText(F3);
Element attachment = voucherHead.addElement("attachment");// 附单据数/可空
attachment.setText("");
Element prepareddate = voucherHead.addElement("prepareddate");// 制单日期/非空
prepareddate.setText(timeAll);//---------------------------------------------------
Element pk_prepared = voucherHead.addElement("pk_prepared");// 制单人/非空
pk_prepared.setText("制单人/非空");//-------------------------------------------
Element pk_casher = voucherHead.addElement("pk_casher");// 出纳
pk_casher.setText("");//------------------------------------------
Element signflag = voucherHead.addElement("signflag");// 签字标志
signflag.setText("");//-----------------------------------------------------
Element pk_checked = voucherHead.addElement("pk_checked");// 审核人
pk_checked.setText("");//--------------------------------------------------
Element tallydate = voucherHead.addElement("tallydate");// 记账日期
tallydate.setText(timeAll);//--------------------------
Element pk_manager = voucherHead.addElement("pk_manager");// 记账人
pk_manager.setText("");
Element memo1 = voucherHead.addElement("memo1");
memo1.setText("");
Element memo2 = voucherHead.addElement("memo2");
memo2.setText("");
Element reserve1 = voucherHead.addElement("reserve1");
reserve1.setText("");
Element reserve2 = voucherHead.addElement("reserve2");
reserve2.setText("");
Element siscardflag = voucherHead.addElement("siscardflag");
siscardflag.setText("");//--------------------------------------------------------
Element pk_org = voucherHead.addElement("pk_org");// 所属组织/非空
pk_org.setText("安鹏租赁业务单元编码");//---------------------------------------------------------
Element pk_org_v = voucherHead.addElement("pk_org_v");// 所属组织版本/可空
pk_org_v.setText("");//-------------------------------------------------------
Element pk_group = voucherHead.addElement("pk_group");// 所属集团 如果不输集团取当前登陆集团
pk_group.setText("06");
Element details = voucherHead.addElement("details");
// 循环借方集合, 按照v8表数据中生成相应的借方item
for (Map<String, String> v8Lend : v1) {
// 根据科目id, 获取当前数据对应的科目信息
SUBJECT_ID=v8Lend.get("f6");
BizObject subject = JBOFactory.createBizObjectQuery(LV_STACTS_CONFIG.CLASS_NAME, "ID=:ID").setParameter("ID", SUBJECT_ID).getSingleResult(false);
Element item1 = details.addElement("item"); // 借方
Element detailindex1 = item1.addElement("detailindex");// 分录号/非空
detailindex1.setText((v8Lend.get("f59")==null)?"":v8Lend.get("f59"));//------------------------------------
Element explanation1 = item1.addElement("explanation");// 摘要/非空
explanation1.setText((v8Lend.get("f5")==null)?"":v8Lend.get("f5"));
Element verifydate1 = item1.addElement("verifydate");// 业务日期/可空
verifydate1.setText("");
Element price1 = item1.addElement("price");// 单价/可空
price1.setText("");
Element excrate21 = item1.addElement("excrate2");// 折本汇率/可空
excrate21.setText("");//-----------------------------
Element debitquantity1 = item1.addElement("debitquantity");// 借方数量/可空
debitquantity1.setText(v1.size()+"");
Element debitamount1 = item1.addElement("debitamount");// 原币借方金额/可空
debitamount1.setText((v8Lend.get("f7")==null)?"":v8Lend.get("f7"));//--------------------------------------------------
Element localdebitamount1 = item1.addElement("localdebitamount");// 本币借方金额/可空
localdebitamount1.setText("");//-------------------------------------------
Element groupdebitamount1 = item1.addElement("groupdebitamount");// 集团本币借方金额/可空
groupdebitamount1.setText("");//-----------------------------------------
Element globaldebitamount1 = item1.addElement("globaldebitamount");// 全局本币借方金额/可空
globaldebitamount1.setText("");//-------------------------------------------
Element pk_currtype1 = item1.addElement("pk_currtype");// 币种/非空
pk_currtype1.setText("CNY");//
Element pk_accasoa1 = item1.addElement("pk_accasoa");// 科目/非空
pk_accasoa1.setText((subject.getAttribute("SUBJECTS_NAME").getString()==null)?"":subject.getAttribute("SUBJECTS_NAME").getString());
Element pk_unit1 = item1.addElement("pk_unit");// 所属二级核算单位/可空
pk_unit1.setText("");//---------------------------------------------------
Element pk_unit_v1 = item1.addElement("pk_unit_v");// 所属二级核算单位/版本可空
pk_unit_v1.setText("");//-------------------------------------------------
Element ass1 = item1.addElement("ass");// 金额必须有一方不为空
/*// 客商辅助核算
if(v8Lend.get("f65")!=null && !"".equals(v8Lend.get("f65"))) {
Element ass_item1 = ass1.addElement("item");
Element pk_Checktype1 = ass_item1.addElement("pk_Checktype");
pk_Checktype1.setText("客商辅助核算");
Element pk_Checkvalue1 = ass_item1.addElement("pk_Checkvalue");
pk_Checkvalue1.setText((v8Lend.get("f65")==null)?"":v8Lend.get("f65"));
}
// 合同号辅助核算
if(v8Lend.get("f60")!=null && !"".equals(v8Lend.get("f60"))) {// 部门名称
Element ass_item2 = ass1.addElement("item");
Element pk_Checktype2 = ass_item2.addElement("pk_Checktype");
pk_Checktype2.setText("合同号辅助核算");
Element pk_Checkvalue2 = ass_item2.addElement("pk_Checkvalue");
pk_Checkvalue2.setText((v8Lend.get("f60")==null)?"":v8Lend.get("f60"));
}
// 主营类型辅助核算
if(v8Lend.get("f73")!=null && !"".equals(v8Lend.get("f73"))) {
Element ass_item3 = ass1.addElement("item");
Element pk_Checktype3 = ass_item3.addElement("pk_Checktype");
pk_Checktype3.setText("融资租赁收益类型");
Element pk_Checkvalue3 = ass_item3.addElement("pk_Checkvalue");
pk_Checkvalue3.setText((v8Lend.get("f73")==null)?"":v8Lend.get("f73"));
}
//现金流量项目辅助核算
if(v8Lend.get("f74")!=null && !"".equals(v8Lend.get("f74"))) {
Element ass_item4 = ass1.addElement("item");
Element pk_Checktype4 = ass_item4.addElement("pk_Checktype");
pk_Checktype4.setText("资金类型");
Element pk_Checkvalue4 = ass_item4.addElement("pk_Checkvalue");
pk_Checkvalue4.setText((v8Lend.get("f74")==null)?"":v8Lend.get("f74"));
}
//银行账户辅助核算
if(v8Lend.get("f75")!=null && !"".equals(v8Lend.get("f75"))) {
Element ass_item5 = ass1.addElement("item");
Element pk_Checktype5 = ass_item5.addElement("pk_Checktype");
pk_Checktype5.setText("主营类型");
Element pk_Checkvalue5 = ass_item5.addElement("pk_Checkvalue");
pk_Checkvalue5.setText((v8Lend.get("f75")==null)?"":v8Lend.get("f75"));
}*/
Element cashFlow = item1.addElement("cashFlow");
Element cashFlow_item1 = cashFlow.addElement("item");
Element m_pk_currtype1 = cashFlow_item1.addElement("m_pk_currtype");// 币种,最大长度为64,类型为:String
m_pk_currtype1.setText("CNY");
Element money1 = cashFlow_item1.addElement("money");// 原币,最大长度为64,类型为:Double
money1.setText("");
Element moneymoneyglobal1 = cashFlow_item1.addElement("moneyglobal");// 全局本币,最大长度为64,类型为:Double
moneymoneyglobal1.setText("");
Element moneygroup1 = cashFlow_item1.addElement("moneygroup");// 集团本币,最大长度为64,类型为:Double
moneygroup1.setText("");
Element moneymain1 = cashFlow_item1.addElement("moneymain");// 本币,最大长度为64,类型为:Double
moneymain1.setText("");
Element pk_cashflow1 = cashFlow_item1.addElement("pk_cashflow");// 现金主键,最大长度为64,类型为:String
pk_cashflow1.setText("");
Element pk_innercorp1 = cashFlow_item1.addElement("pk_innercorp");// 内部单位主键,最大长度为64,类型为:String
pk_innercorp1.setText("");
}
// 循环贷方集合, 按照v8表数据中生成相应的借方item
for (Map<String, String> v8loan : v2) {
// 根据科目id, 获取当前数据对应的科目信息
SUBJECT_ID=v8loan.get("f6");
BizObject subject = JBOFactory.createBizObjectQuery(LV_STACTS_CONFIG.CLASS_NAME, "ID=:ID").setParameter("ID", SUBJECT_ID).getSingleResult(false);
Element item2 = details.addElement("item"); // 贷方金额
Element creditquantity2 = item2.addElement("creditquantity");// 贷方数量 可空
creditquantity2.setText(v2.size()+"");
Element creditamount2 = item2.addElement("creditamount"); // 原币贷方金额 可空
creditamount2.setText((v8loan.get("f8")==null)?"":v8loan.get("f8"));
Element localcreditamount2 = item2.addElement("localcreditamount");// 本币贷方金额 可空
localcreditamount2.setText("");
Element groupcreditamount2 = item2.addElement("groupcreditamount");// 集团本币贷方金额 可空
groupcreditamount2.setText("");
Element globalcreditamount2 = item2.addElement("globalcreditamount");// 全局本币贷方金额 可空
globalcreditamount2.setText("");
Element detailindex2 = item2.addElement("detailindex");// 分录号 非空
detailindex2.setText((v8loan.get("f59")==null)?"":v8loan.get("f59"));//-------------------------------------
Element explanation2 = item2.addElement("explanation");// 摘要 非空
explanation2.setText((v8loan.get("f5")==null)?"":v8loan.get("f5"));
Element verifydate2 = item2.addElement("verifydate");// 业务日期 可空
verifydate2.setText(timeAll);
Element price2 = item2.addElement("price");// 单价 可空
price2.setText("");
Element excrate22 = item2.addElement("excrate2");// 折本汇率 可空
excrate22.setText("");//-------------------------------------------
Element pk_currtype2 = item2.addElement("pk_currtype");// 币种 非空
pk_currtype2.setText("CNY");
Element pk_accasoa2 = item2.addElement("pk_accasoa");// 科目 非空
pk_accasoa2.setText((subject.getAttribute("SUBJECTS_NAME").getString()==null)?"":subject.getAttribute("SUBJECTS_NAME").getString());
Element pk_unit2 = item2.addElement("pk_unit");// 所属二级核算单位 可空 组织
pk_unit2.setText("");//------------------------------------------
Element pk_unit_v2 = item2.addElement("pk_unit_v");// 所属二级核算单位 版本可空 组织
pk_unit_v2.setText("");//-----------------------------------------------
Element ass2 = item2.addElement("ass");//
/*// 客商辅助核算
if(v8loan.get("f65")!=null && !"".equals(v8loan.get("f65"))) {
Element ass_item1 = ass2.addElement("item");
Element pk_Checktype1 = ass_item1.addElement("pk_Checktype");
pk_Checktype1.setText("客商辅助核算");
Element pk_Checkvalue1 = ass_item1.addElement("pk_Checkvalue");
pk_Checkvalue1.setText((v8loan.get("f65")==null)?"":v8loan.get("f65"));
}
// 合同号辅助核算
if(v8loan.get("f60")!=null && !"".equals(v8loan.get("f60"))) {// 部门名称
Element ass_item2 = ass2.addElement("item");
Element pk_Checktype2 = ass_item2.addElement("pk_Checktype");
pk_Checktype2.setText("合同号辅助核算");
Element pk_Checkvalue2 = ass_item2.addElement("pk_Checkvalue");
pk_Checkvalue2.setText((v8loan.get("f60")==null)?"":v8loan.get("f60"));
}
// 主营类型辅助核算
if(v8loan.get("f73")!=null && !"".equals(v8loan.get("f73"))) {
Element ass_item3 = ass2.addElement("item");
Element pk_Checktype3 = ass_item3.addElement("pk_Checktype");
pk_Checktype3.setText("融资租赁收益类型");
Element pk_Checkvalue3 = ass_item3.addElement("pk_Checkvalue");
pk_Checkvalue3.setText((v8loan.get("f73")==null)?"":v8loan.get("f73"));
}
//现金流量项目辅助核算
if(v8loan.get("f74")!=null && !"".equals(v8loan.get("f74"))) {
Element ass_item4 = ass2.addElement("item");
Element pk_Checktype4 = ass_item4.addElement("pk_Checktype");
pk_Checktype4.setText("资金类型");
Element pk_Checkvalue4 = ass_item4.addElement("pk_Checkvalue");
pk_Checkvalue4.setText((v8loan.get("f74")==null)?"":v8loan.get("f74"));
}
//银行账户辅助核算
if(v8loan.get("f75")!=null && !"".equals(v8loan.get("f75"))) {
Element ass_item5 = ass2.addElement("item");
Element pk_Checktype5 = ass_item5.addElement("pk_Checktype");
pk_Checktype5.setText("主营类型");
Element pk_Checkvalue5 = ass_item5.addElement("pk_Checkvalue");
pk_Checkvalue5.setText((v8loan.get("f75")==null)?"":v8loan.get("f75"));
}*/
Element item2_cashFlow = item2.addElement("cashFlow");
Element cashflowitem2 = item2_cashFlow.addElement("item");
Element m_pk_currtype2 = cashflowitem2.addElement("m_pk_currtype");// 币种,最大长度为64,类型为:String
m_pk_currtype2.setText("CNY");
Element money2 = cashflowitem2.addElement("money");// 原币,最大长度为64,类型为:Double
money2.setText("");
Element moneyglobal2 = cashflowitem2.addElement("moneyglobal");// 全局本币,最大长度为64,类型为:Double
moneyglobal2.setText("");
Element moneygroup2 = cashflowitem2.addElement("moneygroup");// 集团本币,最大长度为64,类型为:Double
moneygroup2.setText("");
Element moneymain2 = cashflowitem2.addElement("moneymain");// 本币,最大长度为64,类型为:Double
moneymain2.setText("");
Element pk_cashflow2 = cashflowitem2.addElement("pk_cashflow");// 现金主键,最大长度为64,类型为:String
pk_cashflow2.setText("");
Element pk_innercorp2 = cashflowitem2.addElement("pk_innercorp");// 内部单位主键,最大长度为64,类型为:String
pk_innercorp2.setText("");
}
// 新增当条凭证信息入记录字表
//insertSql="INSERT INTO VOUCHER_LOG(BILLID,F3,FLAG,CREATE_TIME,BATCH) VALUES('"+str+"','"+F3+"','1','"+year_month_days+"','"+batch+"')";
insertSql="INSERT INTO NCXML_DETAIL_RECORDS(BILLID,XML_TYPE,TABLE_NUM,FLAG,CREATE_TIME,BATCH) VALUES('"+uuid+"','"+type+"','"+F3+"','1','"+year_month_days+"','"+batch+"')";
//sqlObject = new SqlObject(insertSql);
//Sqlca.executeSQL(sqlObject);
Sqlca.executeSQL(insertSql);
logger.info("凭证记录表插入语句: "+insertSql);
count++;
}
// String URL="//data//files//apzl_leasing//tmp//XZW//APleasing_VOUCHER_"+year_month_day+".xml";
String URL="D:\\voucherXml_NC\\APleasing_VOUCHER_"+year_month_day+".xml";
file=new File(URL);
writer = new XMLWriter(new FileOutputStream(file), OutputFormat.createPrettyPrint());
writer.setEscapeText(false);// 字符是否转义,默认true
writer.write(document);
writer.close();
// InterActionToNC(Sqlca,URL,type,batch,count);
Sqlca.commit();
}
} catch (Exception e) {
returns="false";
try {
Sqlca.rollback();
} catch (JBOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
if(Sqlca!=null) {
try {
Sqlca.disConnect();
} catch (JBOException e) {
e.printStackTrace();
}
}
}
return returns;
}
/**
* 像NC传输xml, 获取NC回执xml信息, 根据回执信息更改状态
*/
public static void InterActionToNC(Transaction Sqlca,String inputURL,String type,String batch,int count) {
try {
String updateSql = ""; // 更新sql对象
String insertSql = ""; // 新增SQL对象
String deleteSql = ""; // 删除SQL对象
String resultcode= ""; // 单条返回结果
String bdocid = ""; // xml回执id
String resultdescription=""; //错误信息
/**
* 获取对方post连接
*/
//String url = "http://47.93.227.86:8858/service/XChangeServlet?account=q0225&groupcode=001";
String url = "http://47.93.227.86:8858/service/XChangeServlet?account=8&groupcode=06";
URL realURL = new URL(url);
HttpURLConnection connection = (HttpURLConnection)realURL.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-type", "text/xml");
connection.setRequestMethod("POST");
/**
* 读取本方生成的xml, 传输到NC
*/
File file = new File(inputURL);
BufferedOutputStream out = new BufferedOutputStream(connection.getOutputStream());
BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
int length;
byte[] buffer = new byte[1000];
while ((length = input.read(buffer, 0, 1000)) != -1) {
out.write(buffer, 0, length);
}
input.close();
out.close();
/**
* 获取NC回执信息
*/
InputStream inputStream = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(inputStream);
BufferedReader bufreader = new BufferedReader(isr);
String xmlString = "";
int c;
while ((c = bufreader.read()) != -1) {
System.out.print((char) c);
xmlString += (char) c;
}
input.close();
System.out.println("--------------------------" + xmlString);
/**
* 将获取到的回执信息生成本地xml
*/
Document resDoc = DocumentHelper.parseText(xmlString);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DocumentSource source = new DocumentSource(resDoc);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//设置文档的换行与缩进
transformer.setOutputProperty(OutputKeys.INDENT, "YES");
// 将回执信息输出到本地
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss");
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 年月日时分秒
// File file2 = new File("D:\\VOUCHER_RECEIPT");
// if (!file2.exists()) {file2.mkdirs();}// 判断是否存在, 如果不存在就创建该文件夹
String resFile = "//data//files//apzl_leasing//tmp//WEN//APleasing_"+type+""+fmt.format(new Date())+".xml";
// String resFile = "D:\\VOUCHER_RECEIPT\\APleasing_"+type+""+fmt.format(new Date())+".xml";
StreamResult result = new StreamResult(new File(resFile));
transformer.transform(source,result);
/**
* 解析xml, 根据回执信息更新状态
*/
SAXReader sr = new SAXReader();
Document doc = sr.read(resFile);
Element root= doc.getRootElement();
//获取根元素,得到导入用友是否成功successful的值,值为Y:成功 N:失败
String resSuc = root.attributeValue("successful");
//后面对回执结果做判断,然后改变导入状态就行了
if(null != resSuc){
if(resSuc.equals("N")){
logger.info("导入失败");
// 导入失败, 将本次在明细表中存储的数据删除
deleteSql = "DELETE FROM NCXML_DETAIL_RECORDS WHERE BATCH='"+batch+"' AND XML_TYPE = '"+type+"'";
// 导入失败, 将失败数据记录入总记录表
insertSql = "INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','0','"+count+"','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(deleteSql);
Sqlca.executeSQL(insertSql);
}else if(resSuc.equals("Y")){
logger.info("导入成功");
List<Element> list = root.elements();
int failed_count=0; // 失败记录数
for (Element element : list) {
List<Element> list2 = element.elements();
for (Element el : list2) {
logger.info("111111111111111111");
// 获取单条回执状态
resultcode = el.element("resultcode").getStringValue();
if(!"1".equals(resultcode)) {
logger.info("22222222222222");
bdocid = el.element("bdocid").getStringValue(); // xml回执id
resultdescription = el.element("resultdescription").getStringValue(); // 错误信息
// 如果回执状态不等于1, 说明有误, 更新到记录字表并记录错误信息
updateSql=" UPDATE NCXML_DETAIL_RECORDS SET FLAG='"+resultcode+"',ERR_DESCRIBE='"+resultdescription+"' WHERE BUILLID='"+bdocid+"' AND XML_TYPE= '"+type+"'";
Sqlca.executeSQL(updateSql);
logger.info("根据回执信息, 修改传输失败状态, 记录错误信息"+updateSql);
failed_count++;
}
}
}
// 将本批次传输总量及 失败数量记录入记录总表
String insertSql1="INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','"+count+"','"+failed_count+"','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(insertSql1);
}else{
logger.info("出现未知错误");
}
}else{
logger.info("未找到successful属性");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}