1. 生成xml, 记录并调用传输方法
/**
* 凭证信息页面NC传输调用此方法
* @param tx
* @return
*/
public String sendVoucherData(JBOTransaction tx) {
String ss = DOM4JcreateToVoucher();
return ss;
}
/**
* 凭证信息xml生成, 每1000条生成一个xml
* @throws Exception
*/
private static String DOM4JcreateToVoucher(){
// 定义事物
JBOTransaction tx=null;
Transaction Sqlca = null;
String returns="true";
// 获取配置文件的输入流
FileInputStream in=null;
try {
// 定义全局对象
tx= JBOFactory.createJBOTransaction();
Sqlca = Transaction.createTransaction(tx);
Map<String, String> map = new HashMap<String, String>();
/**
* 读取配置文件信息
* */
//创建Properties对象
//Properties properties = new Properties();
//获取配置文件输入流
//in = new FileInputStream("/vouchers.properties");
//in = new FileInputStream("//data/config//vouchers.properties");
//通过Properties对象读取配置文件
//properties.load(in);
// 获取配置文件数据
// 账套
String account = VouchersPropertiesUtil.get("voucher_account");
// 单据类型
String billtype = VouchersPropertiesUtil.get("voucher_billtype");
// 集团编码
String groupcode = VouchersPropertiesUtil.get("voucher_groupcode");
// 系统参数
String isexchange = VouchersPropertiesUtil.get("voucher_isexchange");
// 接收方
String receiver = VouchersPropertiesUtil.get("voucher_receiver");
// 外系统编码
String sender = VouchersPropertiesUtil.get("voucher_sender");
// 系统参数
String replace = VouchersPropertiesUtil.get("voucher_replace");
// 凭证类别
String pk_vouchertype = VouchersPropertiesUtil.get("voucher_pk_vouchertype");
// 来源系统
String pk_system = VouchersPropertiesUtil.get("voucher_pk_system");
// 凭证类型值
String voucherkind = VouchersPropertiesUtil.get("voucher_voucherkind");
// 核算账簿
String pk_accountingbook = VouchersPropertiesUtil.get("voucher_pk_accountingbook");
// 制单人
String pk_prepared = VouchersPropertiesUtil.get("voucher_pk_prepared");
// 所属组织
String pk_org = VouchersPropertiesUtil.get("voucher_pk_org");
// 所属集团
String pk_group = VouchersPropertiesUtil.get("voucher_pk_group");
// 币种
String pk_currtype = VouchersPropertiesUtil.get("voucher_pk_currtype");
// 传输xml文件存放路径
String LOCALHOST_URL = VouchersPropertiesUtil.get("LOCALHOST_URL");
/**
* 定义全局变量
*/
// xml文件头
Document document=null;
// 生成的xml文件路径
File file=null;
// 输出对象
XMLWriter writer=null;
// 记录表类别
String type="voucher";
// xml主键id
String uuid="";
// 获取科目id
String SUBJECT_ID=null;
// 会计期间/年
String ACC_YEAR = null;
// 会计期间/月
String ACC_MONTH = null;
// 制单日期
String timeAll = "";
// 摘要
String f5="";
// 定义新增语句对象
String insertSql="";
// 用于文件名凭借
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 id,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+"') AND DATE_FORMAT(f1,'%Y-%m')>DATE_FORMAT('-02-11','%Y-%m')";
List<Map<String, String>> list = DataOperatorUtil.getDataBySql(Sqlca, sql, null);// 将所有凭证号封装到list集合中
// v8视图总数据量/ xml中生成的总条数
int a = list.size();
// 设置当前xml生成的条数
int b=1000;
// 获取生成xml文件的数量, 最大循环值=c+1
int c = (int)(a / b);
for (int i = 0; i <=c && a>0; i++) {
// 批次号
String batch="";
// 记录当前批次传输总量
int count=0;
// 记录历史批次号
List<String> batchList= new ArrayList<String>();
document = DocumentHelper.createDocument(); // 创建Document对象
// 设置xml头
Element root = document.addElement("ufinterface");
root.addAttribute("account", account);
root.addAttribute("billtype", billtype);
root.addAttribute("businessunitcode", "develop");
root.addAttribute("filename", "");
root.addAttribute("groupcode", groupcode);
root.addAttribute("isexchange", isexchange);
root.addAttribute("orgcode", "");
root.addAttribute("receiver", receiver);
root.addAttribute("replace", replace);
root.addAttribute("roottag", "");
root.addAttribute("sender", sender);
for (int x = i * b; x < (i + 1) * b && x < a; x++) { // 决定当前xml生成的数据量
// 获取凭证编号
String F3=list.get(x).get("f3");
String F60=list.get(x).get("f60");
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 f1,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("f1"); // 制单时间
}
// 获取本方信息
//BizObject own = JBOFactory.createBizObjectQuery(OWN_INFO.CLASS_NAME, "id=:OWNED_COMPANY").setParameter("OWNED_COMPANY", OWNED_COMPANY).getSingleResult(false);
//uuid=UUID.randomUUID().toString().replace("-", "");
uuid=list.get(x).get("id");
Element voucher = root.addElement("voucher");
voucher.addAttribute("id",uuid);
Element voucherHead = voucher.addElement("voucher_head");
Element pkVoucher = voucherHead.addElement("pk_voucher");// 凭证主键/非空
// pkVoucher.setText(uuid);
pkVoucher.setText("");
Element pk_vouchertype1 = voucherHead.addElement("pk_vouchertype");// 凭证类别, 默认01/非空
pk_vouchertype1.setText(pk_vouchertype);//----------------------------------------------------------------------
Element year = voucherHead.addElement("year");// 会计年度/非空
year.setText((ACC_YEAR==null)?"":ACC_YEAR);
Element pk_system1 = voucherHead.addElement("pk_system");// 来源系统/非空
pk_system1.setText(pk_system);//----------------------------------------
Element voucherkind1 = voucherHead.addElement("voucherkind");// 凭证类型值/非空
voucherkind1.setText(voucherkind);
Element pk_accountingbook1 = voucherHead.addElement("pk_accountingbook");// 核算核算账簿/非空
pk_accountingbook1.setText(pk_accountingbook);
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("");
Element attachment = voucherHead.addElement("attachment");// 附单据数/可空
attachment.setText("");
Element prepareddate = voucherHead.addElement("prepareddate");// 制单日期/非空
prepareddate.setText(timeAll);//---------------------------------------------------
Element pk_prepared1 = voucherHead.addElement("pk_prepared");// 制单人/非空
pk_prepared1.setText(pk_prepared);//-------------------------------------------
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("");//--------------------------
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_org1 = voucherHead.addElement("pk_org");// 所属组织/非空
pk_org1.setText(pk_org);//---------------------------------------------------------
Element pk_org_v = voucherHead.addElement("pk_org_v");// 所属组织版本/可空
pk_org_v.setText("");//-------------------------------------------------------
Element pk_group1 = voucherHead.addElement("pk_group");// 所属集团 如果不输集团取当前登陆集团
pk_group1.setText(pk_group);
Element details = voucherHead.addElement("details");
// 循环借方集合, 按照v8表数据中生成相应的借方item
for (Map<String, String> v8Lend : v1) {
String f7 = v8Lend.get("f7");
double money = Double.parseDouble(f7);
if(money >0) {
// 根据科目id, 获取当前数据对应的科目信息
SUBJECT_ID=v8Lend.get("f6");
f5 = v8Lend.get("f5");
BizObject subject = JBOFactory.createBizObjectQuery(LV_STACTS_CONFIG.CLASS_NAME, "ID=:ID").setParameter("ID", SUBJECT_ID).getSingleResult(false);
// 获取辅助核算id
String ids=subject.getAttribute("AUXILIARY_TYPE").getString();
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(F3+"-"+f5+"66");
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()+"");
debitquantity1.setText("");
Element debitamount1 = item1.addElement("debitamount");// 原币借方金额/可空
debitamount1.setText(f7);//--------------------------------------------------
Element localdebitamount1 = item1.addElement("localdebitamount");// 本币借方金额/可空
localdebitamount1.setText(f7);//-------------------------------------------
Element groupdebitamount1 = item1.addElement("groupdebitamount");// 集团本币借方金额/可空
groupdebitamount1.setText("");//-----------------------------------------
Element globaldebitamount1 = item1.addElement("globaldebitamount");// 全局本币借方金额/可空
globaldebitamount1.setText("");//-------------------------------------------
Element pk_currtype1 = item1.addElement("pk_currtype");// 币种/非空
pk_currtype1.setText(pk_currtype);//
Element pk_accasoa1 = item1.addElement("pk_accasoa");// 科目/非空
pk_accasoa1.setText((subject.getAttribute("SUBJECTS_CODE").getString()==null)?"":subject.getAttribute("SUBJECTS_CODE").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(ids.contains("185b89e22dba458491306a647468d2a5")) {
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("APZL000000");
pk_Checkvalue1.setText((v8Lend.get("f65")==null)?"APZL000000":v8Lend.get("f65"));
}
// 合同号辅助核算
if(ids.contains("1869733a51f1486a97df402e8d899980")) {
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("ap0000");
pk_Checkvalue2.setText((v8Lend.get("f60")==null)?"ap0000":v8Lend.get("f60"));
}
// 主营类型辅助核算
if(ids.contains("1c981e6e47c24d069f9a2e08db819c4c")) {
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(ids.contains("3f0177c4295d4ed99ef18adb37c3e79f")) {
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(ids.contains("5d241cc0d2794ef7943df15c5f97976a")) {
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) {
String f8 = v8loan.get("f8");
double money = Double.parseDouble(f8);
if(money>0) {
// 根据科目id, 获取当前数据对应的科目信息
SUBJECT_ID=v8loan.get("f6");
BizObject subject = JBOFactory.createBizObjectQuery(LV_STACTS_CONFIG.CLASS_NAME, "ID=:ID").setParameter("ID", SUBJECT_ID).getSingleResult(false);
// 获取辅助核算id
String ids=subject.getAttribute("AUXILIARY_TYPE").getString();
Element item2 = details.addElement("item"); // 贷方金额
Element creditquantity2 = item2.addElement("creditquantity");// 贷方数量 可空
creditquantity2.setText(v2.size()+"");
Element creditamount2 = item2.addElement("creditamount"); // 原币贷方金额 可空
creditamount2.setText(f8);
Element localcreditamount2 = item2.addElement("localcreditamount");// 本币贷方金额 可空
localcreditamount2.setText(f8);
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(F3+"-"+f5+"66");
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_CODE").getString()==null)?"":subject.getAttribute("SUBJECTS_CODE").getString());
// pk_accasoa2.setText("");
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(ids.contains("185b89e22dba458491306a647468d2a5")) {
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("APZL000000");
pk_Checkvalue1.setText((v8loan.get("f65")==null)?"APZL000000":v8loan.get("f65"));
}
}
// 合同号辅助核算
if(ids.contains("1869733a51f1486a97df402e8d899980")) {
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("ap0000");
pk_Checkvalue2.setText((v8loan.get("f60")==null)?"ap0000":v8loan.get("f60"));
}
// 主营类型辅助核算
if(ids.contains("1c981e6e47c24d069f9a2e08db819c4c")) {
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(ids.contains("3f0177c4295d4ed99ef18adb37c3e79f")) {
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(ids.contains("5d241cc0d2794ef7943df15c5f97976a")) {
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("");
}
}
// 根据id查询记录表是否已经记录过, 没有记录过使用当前批次号记录, 如果已经记录了, 则不操作
BizObject record=JBOFactory.createBizObjectQuery(NCXML_DETAIL_RECORDS.CLASS_NAME, "BILLID='"+uuid+"'").getSingleResult(false);
if(record==null || "".equals(record)) {
// 有新数据, 当前批次批次号为空才会生成
if("".equals(batch)) {
batch = SerialNumberUtil.getVoucherPCNumber(Sqlca);
}
// 等于null说明新数据, 新增入记录表
insertSql="INSERT INTO NCXML_DETAIL_RECORDS(BILLID,XML_TYPE,TABLE_NUM,FLAG,CREATE_TIME,BATCH) VALUES('"+uuid+"','"+type+"','"+F3+"','1','"+year_month_days+"','"+batch+"')";
Sqlca.executeSQL(insertSql);
logger.info("凭证记录表插入语句: "+insertSql);
count++;
}else {
String updSql=" UPDATE NCXML_DETAIL_RECORDS SET FLAG='1',ERR_DESCRIBE=null,CREATE_TIME='"+year_month_days+"' WHERE BILLID='"+uuid+"' AND XML_TYPE= '"+type+"'";
Sqlca.executeSQL(updSql);
logger.info("旧批次号记录: "+updSql);
String batch1= record.getAttribute("BATCH").getString();
if(batchList.indexOf(batch1) == -1) {
batchList.add(batch1);
}
}
}
String URL=LOCALHOST_URL+"APleasing_VOUCHER_"+year_month_day+".xml";
//String URL="D:\\voucherXml_NC\\APleasing_VOUCHER_"+year_month_day+".xml";
file=new File(URL);
System.out.println("存放传输文件路径: "+file);
writer = new XMLWriter(new FileOutputStream(file), OutputFormat.createPrettyPrint());
writer.setEscapeText(false);// 字符是否转义,默认true
writer.write(document);
writer.close();
InterActionToNC(Sqlca,URL,type,batch,count,batchList);
mit();
}
} catch (Exception e) {
logger.info("凭证xml传输失败");
try {
Sqlca.rollback();
} catch (JBOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
returns="false";
}finally {
if(Sqlca!=null) {
try {
Sqlca.disConnect();
} catch (JBOException e) {
e.printStackTrace();
}
}
}
return returns;
}
2. 执行传输的方法:
/**
* 像NC传输xml, 获取NC回执xml信息, 根据回执信息更改状态
*/
public static void InterActionToNC(Transaction Sqlca,String inputURL,String type,String batch,int count,List<String> batchList) throws Exception {
String updSql=""; // 更新历史记录
String updateSql = ""; // 更新sql对象
String insertSql = ""; // 新增SQL对象
String resultcode= ""; // 单条返回结果
String bdocid = ""; // xml回执id
String resultdescription=""; //错误信息
String NC_URL = VouchersPropertiesUtil.get("NC_URL");// ip地址及端口号
String account = VouchersPropertiesUtil.get("account");
String groupcode = VouchersPropertiesUtil.get("groupcode");
String RECEIVE_URL = VouchersPropertiesUtil.get("RECEIVE_URL"); //回执信息存放路径
/**
* 获取对方post连接
*/
//String url = "http://172.16.0.88:9990/service/XChangeServlet?account=8&groupcode=06";
String url = NC_URL+"service/XChangeServlet?account="+account+"&groupcode="+groupcode;
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,"UTF-8");
BufferedReader bufreader = new BufferedReader(isr);
String xmlString = "";
String b=null;
while((b=bufreader.readLine()) !=null) {
xmlString+=b;
xmlString+="\r\n";
}
System.out.println(xmlString);
bufreader.close();
/**
* 将获取到的回执信息生成本地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");
// 回执信息存放路径
String resFile = RECEIVE_URL+"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));
// 将回执信息转化为xml
transformer.transform(source,result);
/**
* 解析xml, 根据回执信息更新状态
*/
SAXReader sr = new SAXReader();
Document doc = sr.read(new File(resFile));
Element root= doc.getRootElement();
// 根据successful判断是否有失败的, 有则为N, 全部成功为Y
String resSuc = root.attributeValue("successful");
// 创建
if(null != resSuc){
// 状态为N说明本批次传输有失败的
if("N".equals(resSuc)){
// 失败记录数
int failed_count=0;
List<Element> list = root.elements();
// 遍历list, 获取所有回执信息
System.out.println(list.size());
for (Element element : list) {
String names = element.getName();
String value = element.getStringValue();
// 获取单条回执信息的详细信息
List<Element> list2 = element.elements();
for (Element el : list2) {
// 获取标签名
String s = el.getName();
// xml回执id
if("bdocid".equals(s)) {
bdocid = el.getStringValue();
}
// 回执状态: 1=成功, <>1 =失败
if("resultcode".equals(s)) {
resultcode = el.getStringValue();
}
// 回执信息
if("resultdescription".equals(s)) {
resultdescription = el.getStringValue();
}
}
/*// 查询不是本批次号的bdocid, 如果有值说明是之前传输错误的数据
BizObject old_record=JBOFactory.createBizObjectQuery(NCXML_DETAIL_RECORDS.CLASS_NAME, "BILLID='"+bdocid+"' AND BATCH !='"+batch+"' AND XML_TYPE= '"+type+"'").getSingleResult(false);
if(old_record !=null || !"".equals(old_record)) {
// 如果状态为1, 说明已经变更, 传输成功. 执行upddate操作, 变更记录状态
if(resultcode=="1" || "1".equals(resultcode)) {
updSql=" UPDATE NCXML_DETAIL_RECORDS SET FLAG='"+resultcode+"',ERR_DESCRIBE=null,CREATE_TIME='"+formatter2+"' WHERE BILLID='"+bdocid+"' AND XML_TYPE= '"+type+"'";
}
}*/
// 判断, 若失败, 更新错误录入明细表
if(!"1".equals(resultcode)) {
// 如果回执状态不等于1, 说明有误, 更新到记录字表并记录错误信息
updateSql=" UPDATE NCXML_DETAIL_RECORDS SET FLAG='"+resultcode+"',ERR_DESCRIBE='"+resultdescription+"' WHERE BILLID='"+bdocid+"' AND XML_TYPE= '"+type+"'";
Sqlca.executeSQL(updateSql);
logger.info("根据回执信息, 修改传输失败状态, 记录错误信息"+updateSql);
BizObject old_record=JBOFactory.createBizObjectQuery(NCXML_DETAIL_RECORDS.CLASS_NAME, "BILLID='"+bdocid+"' AND BATCH <> '"+batch+"' AND XML_TYPE= '"+type+"'").getSingleResult(false);
if(old_record ==null) {
failed_count++;
}
}
}
// 判断集合为否为null, 不为空遍历集合, 获取旧数据的批次号
if(batchList != null || batchList.size()>0) {
// 定义当前批次, 错误记录数
for (String old_batch : batchList) {
int con=0;
// 查询集合, 获取旧批次的失败总数
String selectSql="SELECT BATCH,COUNT(BILLID) CON FROM ncxml_detail_records WHERE flag !=1 AND xml_type='"+type+"' AND BATCH='"+old_batch+"' GROUP BY BATCH";
List<Map<String,String>> dataList=DataOperatorUtil.getDataBySql(Sqlca, selectSql,null);
if(dataList!=null && dataList.size()>0) {
con=Integer.valueOf(dataList.get(0).get("CON"));
}
if(con==0) {
updateSql="UPDATE NCXML_TOTAL_RECORDS SET FLAG_='Y',FAILED_COUNT='0',CREATETIME='"+formatter2.format(new Date())+"' WHERE XML_TYPE='"+type+"' AND BATCH='"+old_batch+"'";
}else {
updateSql="UPDATE NCXML_TOTAL_RECORDS SET FAILED_COUNT='"+con+"',CREATETIME='"+formatter2.format(new Date())+"' WHERE XML_TYPE='"+type+"' AND BATCH='"+old_batch+"'";
}
Sqlca.executeSQL(updateSql);
}
}
// 如果count不等于0, 说明有新数据, 判断是否全部传输成功做相应新增操作
if(count != 0 ) {
int con=0;
// 查询本批次错误数据
String selectSql="SELECT BATCH,COUNT(BILLID) CON FROM ncxml_detail_records WHERE flag !=1 AND xml_type='"+type+"' AND BATCH='"+batch+"' GROUP BY BATCH;";
List<Map<String,String>> dataList=DataOperatorUtil.getDataBySql(Sqlca, selectSql,null);
// 如果有数据, 统计, 失败记录
if(dataList!=null && dataList.size()>0) {
con=Integer.valueOf(dataList.get(0).get("CON"));
}
// 如果con等于0, 说明没有失败记录, 插入成功记录
if(con==0) {
insertSql = "INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,ERR_DESCRIBE,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','Y','"+count+"','"+con+"','导入成功 !','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(insertSql);
logger.info("本批次传输成功!");
// 如果con不等于0, 记录含失败记录的数据如总表
}else {
insertSql = "INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,ERR_DESCRIBE,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','"+count+"','"+con+"','含失败记录 !','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(insertSql);
logger.info("本批次包含失败数据 !");
}
}
// 状态为Y表示, 本次导入全部成功
}else if(resSuc.equals("Y")){
logger.info("导入成功");
// count不等于0说明有新数据, 否则就只有旧的错误数据, 不需要新增
if(count != 0 ) {
// 将本次导入信息记录入记录总表
String insertSql1="INSERT INTO NCXML_TOTAL_RECORDS(ID,BATCH,XML_TYPE,FLAG_,COUNT_,FAILED_COUNT,ERR_DESCRIBE,CREATETIME) VALUES('"+UUID.randomUUID().toString().replace("-", "")+"','"+batch+"','"+type+"','"+resSuc+"','"+count+"','0','导入成功 !','"+formatter2.format(new Date())+"')";
Sqlca.executeSQL(insertSql1);
}
// 判断集合为否为null, 不为空遍历集合, 获取旧数据的批次号
if(batchList != null) {
// 定义当前批次, 错误记录数
for (String old_batch : batchList) {
int con=0;
// 查询集合, 获取旧批次的失败总数
String selectSql="SELECT BATCH,COUNT(BILLID) CON FROM ncxml_detail_records WHERE flag !=1 AND xml_type='"+type+"' AND BATCH='"+old_batch+"' GROUP BY BATCH;";
List<Map<String,String>> dataList=DataOperatorUtil.getDataBySql(Sqlca, selectSql,null);
if(dataList!=null && dataList.size()>0) {
con=Integer.valueOf(dataList.get(0).get("CON"));
}
if(con==0) {
updateSql="UPDATE NCXML_TOTAL_RECORDS SET FLAG_='Y',FAILED_COUNT='0',CREATETIME='"+formatter2.format(new Date())+"' WHERE XML_TYPE='"+type+"' AND BATCH='"+old_batch+"'";
}else {
updateSql="UPDATE NCXML_TOTAL_RECORDS SET FAILED_COUNT='"+con+"',CREATETIME='"+formatter2.format(new Date())+"' WHERE XML_TYPE='"+type+"' AND BATCH='"+old_batch+"'";
}
Sqlca.executeSQL(updateSql);
}
}
}else{
logger.info("出现未知错误");
}
}else{
logger.info("未找到successful属性");
}
}
3. 读取properties配置文件方法类
/**
* 读取配置文件
* @author xiezhiwen
*
*/
public class VouchersPropertiesUtil {
// 定义全局map, 存储配置文件信息
private static Map<String, String> attributes;
public static void load() {
attributes = new ConcurrentHashMap<String, String>();
// 创建Properties对象
Properties prop = new Properties();
try {
// 加载根路径配置文件; 本地:config, 服务器在classes路径下
prop.load(VouchersPropertiesUtil.class.getResourceAsStream("/vouchers.properties"));
// 遍历结果, 封装如map集合中
for(Entry<Object, Object> entry : prop.entrySet()) {
// 判断是否有null值
if(entry.getKey() == null || entry.getValue() == null) {
continue;
}
// 没有null值, put入map集合
attributes.put(entry.getKey().toString(), entry.getValue().toString());
}
} catch (IOException e) {
e.printStackTrace();
ARE.getLog().error("init QuartzPropertiesUtil info failed");
}
ARE.getLog().info("init QuartzPropertiesUtil info success");
}
public static void destroy() {
if(attributes != null) attributes.clear();
}
public static String get(String propName) {
if(attributes == null) load();
return attributes.get(propName);
}
}