实用指南:推送单据信息到第三方系统(NC65)
此处以预付款申请单推动付款结算单到NC系统为例
目录
四、 FcVoucherUtil 的 settlementXML 方法(json 转 xml 的方法)
五、 FcVoucherUtil 的 doPost 方法(推送 NC 的方法)
一、Action
public ActionForm getZhiwu(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception {
String fdId = request.getParameter("fdId");
String fdName = request.getParameter("fdModel");
JSONObject rtn = null;
try {
String hql = "from "+fdName + " model where model.fdId=:fdId";
List list = getServiceImp(request).getBaseDao().getHibernateSession().createQuery(hql).setParameter("fdId", fdId).list();
if (!ArrayUtil.isEmpty(list)) {
rtn = getServiceImp(request).paymentStatement(list.get(0));
}
response.setCharacterEncoding("UTF-8");
response.getWriter().write(rtn.toString());
} catch (Exception e) {
response.getWriter().write("");
e.printStackTrace();
}
return null;
}
前端点击推送调用此方法把查出来的单据信息传到 service 层处理后把返回的结果写出去
返回的 Json 由 succse 和 text 组成,succse 表示是否成功,text 表示返回的响应信息
二、Service
public abstract JSONObject paymentStatement(Object object) throws Exception;
三、ServiceImpl
JSONObject rtn = new JSONObject();
rtn.put("succse", false);
String doPost = null;
if (mainModel == null) {
return rtn;
}
String id = null;
String name = null;
try {
JSONObject json = new JSONObject();
List getfdKey = null;
getfdKey = getFcBaseIntegrationService().getfdKey(ContractManageYfk.class.getName());
if (ArrayUtil.isEmpty(getfdKey)) {
throw new RuntimeException("未配置NC付款结算,集成失败!");
}
List findByFdNc = getFcBaseNcExpenseService().findByFdNc(getfdKey.get(0));
ContractManageYfk contractManageYfk = (ContractManageYfk) mainModel;
if (StringUtil.isNotNull(contractManageYfk.getFdVoucherNumber())) {
rtn.put("succse", true);
return rtn;
}
id = contractManageYfk.getFdId();
name = ContractManageYfk.class.getName();
TraderManageYzgl fdUnit = contractManageYfk.getFdUnit();
json.put("pk_org", fdUnit.getFdUnitNo());
json.put("pk_group", "001");
json.put("trade_type", findByFdNc.get(0).getFdSettlementType());
json.put("bill_date", DateUtil.convertDateToString(new Date(), DateUtil.PATTERN_DATE));
json.put("creator", "zhglxt");
json.put("primal_money", contractManageYfk.getFdSqje());
json.put("local_money", contractManageYfk.getFdSqje());
json.put("memo", StringUtil.isNotNull(contractManageYfk.getFdSm()) ? contractManageYfk.getFdSm() : contractManageYfk.getDocSubject());
json.put("voucher", contractManageYfk.getFdVoucherNumber());
//修改
json.put("objecttype", "1");
json.put("pk_dept", (fdUnit.getFdIsOrg() != null && fdUnit.getFdIsOrg()) ? contractManageYfk.getFdSqbm().getFdNo() : "001");
//修改
json.put("pk_supplier", contractManageYfk.getFdSkdw().getFdNo());
json.put("pk_busiman", contractManageYfk.getDocCreator().getFdNo());
json.put("pk_account", contractManageYfk.getFdYhzh());
json.put("pk_oppaccount", contractManageYfk.getFdFkyhzh1().getFdBankAccount());
json.put("cash_item", contractManageYfk.getFdCashProject().getFdItmeCode());
json.put("lydjh", contractManageYfk.getDocNumber());
json.put("suppliername", contractManageYfk.getFdSkdw().getFdName());
json.put("pzlb", contractManageYfk.getFdVoucherType() != null ? contractManageYfk.getFdVoucherType().getFdCode() : "01");
json.put("fjds", 1);
JSONArray items = new JSONArray();
JSONObject item = new JSONObject();
item.put("pk_org", fdUnit.getFdUnitNo());
item.put("pk_account", contractManageYfk.getFdYhzh());
item.put("accounttype", "0");
item.put("accountname", contractManageYfk.getFdSkyhzh().getFdBankName());
item.put("accountopenbank", contractManageYfk.getFdSkyhzh().getFdOpenBank());
item.put("accountcode", contractManageYfk.getFdYhzh());
item.put("pk_oppaccount", contractManageYfk.getFdFkyhzh1().getFdBankAccount());
item.put("pk_supplier", contractManageYfk.getFdSkdw().getFdNo());
item.put("memo", StringUtil.isNotNull(contractManageYfk.getFdSm()) ? contractManageYfk.getFdSm() : contractManageYfk.getDocSubject());
//修改
item.put("pk_dept", (fdUnit.getFdIsOrg() != null && fdUnit.getFdIsOrg()) ? contractManageYfk.getFdSqbm().getFdNo() : "001");
item.put("pk_busiman", contractManageYfk.getDocCreator().getFdNo());
item.put("pay_primal", contractManageYfk.getFdSqje());
item.put("pay_local", contractManageYfk.getFdSqje());
item.put("cash_item", contractManageYfk.getFdCashProject().getFdItmeCode());
item.put("objecttype", "1");
item.put("creator", "zhglxt");
item.put("suppliername", contractManageYfk.getFdSkdw().getFdName());
item.put("hetong", contractManageYfk.getFdSrht().getFdHtbh());
item.put("gcxm", contractManageYfk.getFdXmbhName());
item.put("gzr", contractManageYfk.getFdAccountsPeople() != null ? contractManageYfk.getFdAccountsPeople().getFdNo() : "");
items.add(item);
json.put("items", items);
String voucherXML = null;
Boolean isTrue = false;
TransactionStatus ts = null;
try {
voucherXML = FcVoucherUtil.settlementXML(json);
doPost = FcVoucherUtil.doPost(getfdKey.get(0).getFdUrl(), getfdKey.get(0).getFdLoganName(), getfdKey.get(0).getFdPassword(), voucherXML);
Element element = DocumentHelper.parseText(doPost).getRootElement().element("sendresult");
ts = TransactionUtils.beginNewTransaction();
if ("1".equals(element.element("resultcode").getTextTrim())) {
isTrue = true;
rtn.put("succse", true);
rtn.put("text", "付款结算单:" + element.element("bdocid").getTextTrim());
if (mainModel instanceof ContractManageYfk) {
IContractManageYfkService contractManageYfkService = (IContractManageYfkService) SpringBeanUtil.getBean("contractManageYfkService");
List list = contractManageYfkService.getBaseDao().getHibernateSession().createQuery("from ContractManageYfk contractManageYfk where contractManageYfk.fdId = :fdId").setParameter("fdId", ((ContractManageYfk) mainModel).getFdI
for (ContractManageYfk contractManageYfk : list) {
contractManageYfk.setFdVoucherNumber(element.element("bdocid").getTextTrim());
contractManageYfkService.update(contractManageYfk);
}
}
TransactionUtils.commit(ts);
} else {
rtn.put("text", "生成付款结算单失败:" + doPost);
}
} catch (Exception e) {
voucherXML = json.toString();
e.printStackTrace();
doPost = e.toString();
rtn.put("text", "生成付款结算单失败:" + e.toString());
if (ts != null)
TransactionUtils.rollback(ts);
}
1、rth 的 JSONObject 返回的是单据是否推送成功以及 NC 返回的信息
2、json 的 JSONObject 是拼接的单据信息,并把这个 json 传给 settlementXML 方法转成一个String 类型的 XML
3、调用 FcVoucherUtil.doPost 方法推送 NC,解析NC 返回的信息修改原单据为已推动和存日志
那 json 是怎么转成 XML 的呢?让我们接着往下看
四、 FcVoucherUtil 的 settlementXML 方法(json 转 xml 的方法)
public static String settlementXML(JSONObject json){
String result = "";
// 创建一个Document实例
Document isHeaderDoc = DocumentHelper.createDocument();
// 1、添加根节点(基本信息)
Element billhead = isHeaderDoc.addElement("billhead");
billhead.addElement("pk_org").addText(json.containsKey("pk_org")?json.getString("pk_org"):"");//
billhead.addElement("pk_pcorg").addText("");//
billhead.addElement("pk_group").addText(json.getString("pk_group"));//
billhead.addElement("pk_paybill").addText("");
billhead.addElement("bill_no").addText("");//
billhead.addElement("trade_type").addText(json.getString("trade_type"));//
billhead.addElement("bill_date").addText(DateUtil.convertDateToString(new Date(),DateUtil.PATTERN_DATE));//
billhead.addElement("source_flag").addText("2");//
billhead.addElement("bill_status").addText("-1");//
billhead.addElement("creator").addText(json.getString("creator"));//
billhead.addElement("creationtime").addText(DateUtil.convertDateToString(new Date(),"yyyy-MM-dd HH:mm:ss"));//
billhead.addElement("approver").addText("");//
billhead.addElement("approve_date").addText("");//
billhead.addElement("approve_time").addText("");//
billhead.addElement("billmaker").addText(json.getString("creator"));//
billhead.addElement("billmaker_date").addText(DateUtil.convertDateToString(new Date(),"yyyy-MM-dd HH:mm:ss"));//
billhead.addElement("primal_money").addText(json.getString("primal_money"));//
billhead.addElement("local_money").addText(json.getString("local_money"));//
billhead.addElement("pk_signer").addText("");//
billhead.addElement("pk_signdate").addText("");//
billhead.addElement("memo").addText(json.getString("memo"));//
billhead.addElement("pk_officialprinter").addText("");//
billhead.addElement("officialprint_date").addText("");//
billhead.addElement("pk_comfirmer").addText("");//
billhead.addElement("pk_effect_user").addText("");//
billhead.addElement("effect_flag").addText("0");//
billhead.addElement("effect_year").addText("");//
billhead.addElement("effect_period").addText("");//
billhead.addElement("effect_date").addText("");//
billhead.addElement("payman").addText("");//
billhead.addElement("payway").addText("0");//
billhead.addElement("paystatus").addText("");//
billhead.addElement("paydate").addText("");//
billhead.addElement("settlenum").addText("");//
billhead.addElement("isnetready").addText("N");//
billhead.addElement("isreded").addText("N");//
billhead.addElement("pk_org_v").addText("");//
billhead.addElement("pk_fiorg_v").addText("");//
billhead.addElement("pk_pcorg_v").addText("");//
billhead.addElement("group_local").addText("");//
billhead.addElement("global_local").addText("");//
billhead.addElement("group_rate").addText("");//
billhead.addElement("global_rate").addText("");//
billhead.addElement("voucher").addText(json.containsKey("voucher")?json.getString("voucher"):"");//
billhead.addElement("objecttype").addText(json.getString("objecttype"));//
billhead.addElement("pk_subjct").addText(json.containsKey("pk_subjct")?json.getString("pk_subjct"):"");//
billhead.addElement("pk_dept").addText(json.getString("pk_dept"));//
billhead.addElement("pk_customer").addText("0".equals(json.getString("objecttype"))?json.getString("pk_customer"):"");//
billhead.addElement("pk_supplier").addText("1".equals(json.getString("objecttype"))?json.getString("pk_supplier"):"");//
billhead.addElement("pk_busiman").addText(json.getString("pk_busiman"));//
billhead.addElement("pk_balatype").addText("3");//
billhead.addElement("pk_account").addText(json.containsKey("pk_account")?json.getString("pk_account"):"");//
billhead.addElement("pk_oppaccount").addText(json.getString("pk_oppaccount"));//
billhead.addElement("pk_currtype").addText("CNY");//
billhead.addElement("local_rate").addText("1.00000000");//
billhead.addElement("dz_date").addText("");//
billhead.addElement("payperson").addText("");//
billhead.addElement("res_issue").addText("");//
billhead.addElement("note_type").addText("");//
billhead.addElement("note_no").addText("");//
billhead.addElement("blanknote_no").addText("");//
billhead.addElement("pk_recproject").addText("");//
billhead.addElement("cash_item").addText(json.getString("cash_item"));//
billhead.addElement("bankroll_projet").addText("");//
billhead.addElement("isrefused").addText("N");//
billhead.addElement("jz_date").addText("");//
billhead.addElement("ys_period").addText("");//
billhead.addElement("savedate").addText("");//
billhead.addElement("is_cf").addText("");//
billhead.addElement("pk_jobid").addText("");//
billhead.addElement("pk_jobobjpha").addText("");//
billhead.addElement("mon_account").addText("");//
billhead.addElement("cf_begindate").addText("");//
billhead.addElement("cf_enddate").addText("");//
billhead.addElement("lydjh").addText(json.getString("lydjh"));//
billhead.addElement("pzlb").addText(json.containsKey("pzlb")?json.getString("pzlb"):"01");//
billhead.addElement("fjds").addText(json.containsKey("fjds")?json.getString("fjds"):"1");//
Element items = billhead.addElement("items");
JSONArray itemsar = json.getJSONArray("items");
for (Object object : itemsar) {
JSONObject itemjs = (JSONObject) object;
Element item = items.addElement("item");
item.addElement("pk_org").addText(itemjs.getString("pk_org"));//
item.addElement("pk_pcorg").addText("");//
item.addElement("pk_account").addText(itemjs.getString("pk_account"));//
item.addElement("accounttype").addText(itemjs.getString("accounttype"));//
item.addElement("accountname").addText(itemjs.getString("accountname"));//
item.addElement("accountopenbank").addText(itemjs.getString("accountopenbank"));//
item.addElement("accountcode").addText(itemjs.getString("accountcode"));//
item.addElement("pk_oppaccount").addText(itemjs.getString("pk_oppaccount"));//
item.addElement("pk_paybill_detail").addText("");//
item.addElement("freeitemid").addText("");//
item.addElement("teade_type").addText("D5");//
item.addElement("billdetail_no").addText("0");//
item.addElement("direction").addText("-1");//
item.addElement("memo").addText(itemjs.getString("memo"));//
item.addElement("pk_subjct").addText(itemjs.containsKey("pk_subjct")?itemjs.getString("pk_subjct"):"");//
item.addElement("pk_customer").addText("0".equals(json.getString("objecttype"))?itemjs.getString("pk_customer"):"");//
item.addElement("pk_supplier").addText("1".equals(json.getString("objecttype"))?itemjs.getString("pk_supplier"):"");//
item.addElement("pk_currtype").addText("CNY");//
item.addElement("local_rate").addText("1.00000000");//
item.addElement("price").addText("");//
item.addElement("pk_jobid").addText("");//
item.addElement("pk_dept").addText(itemjs.getString("pk_dept"));//
item.addElement("pk_busiman").addText(itemjs.getString("pk_busiman"));//
item.addElement("pay_primal").addText(itemjs.getString("pay_primal"));//
item.addElement("pay_local").addText(itemjs.getString("pay_local"));//
item.addElement("pay_count").addText("");//
item.addElement("cinventoryid").addText("");//
item.addElement("openbill_date").addText("");//
item.addElement("note_type").addText("");//
item.addElement("note_no").addText("");//
item.addElement("blanknote_no").addText("");//
item.addElement("pk_balatype").addText("3");//
item.addElement("sanhu").addText("");//
item.addElement("facard_no").addText("");//
item.addElement("cash_item").addText(itemjs.getString("cash_item"));//
item.addElement("payman").addText("");//
item.addElement("paystatus").addText("");//
item.addElement("paydate").addText("");//
item.addElement("bill_date").addText(DateUtil.convertDateToString(new Date(),DateUtil.PATTERN_DATE));//
item.addElement("pk_jobobjpha").addText("");//
item.addElement("djxtflag").addText("N");//
item.addElement("objecttype").addText(itemjs.getString("objecttype"));//
item.addElement("pk_trader").addText("");//
item.addElement("bankroll_projet").addText("");//
item.addElement("trade_type").addText("D5");//
item.addElement("pk_group").addText("001");//
item.addElement("creator").addText(itemjs.getString("creator"));//
item.addElement("creationtime").addText(DateUtil.convertDateToString(new Date(),"yyyy-MM-dd HH:mm:ss"));//
item.addElement("modifier").addText("");//
item.addElement("modifiedtime").addText("");//
item.addElement("pk_org_v").addText("");//
item.addElement("pk_fiorg_v").addText("");//
item.addElement("pk_pcorg_v").addText("");//
item.addElement("group_local_pay").addText("");//
item.addElement("global_local_pay").addText("");//
item.addElement("group_rate").addText("");//
item.addElement("global_rate").addText("");//
item.addElement("ts_primal").addText("");//
item.addElement("ts_local").addText("");//
item.addElement("group_local_ts").addText("");//
item.addElement("global_local_ts").addText("");//
item.addElement("rec_flag").addText("");//
item.addElement("res_issue").addText("");//
item.addElement("mon_account").addText("");//
item.addElement("cf_man").addText("");//
item.addElement("cf_type").addText("");//
item.addElement("cf_status").addText("");//
item.addElement("refusenote").addText("");//
item.addElement("is_refuse").addText("N");//
item.addElement("pk_recproject").addText("");//
item.addElement("bill_type").addText("F5");//
item.addElement("billclass").addText("fj");//
item.addElement("pk_billtypeid").addText("");//
item.addElement("pk_tradetypeid").addText("");//
item.addElement("suppliername").addText(itemjs.containsKey("suppliername")?itemjs.getString("suppliername"):"");//交易对象控制
item.addElement("customername").addText(itemjs.containsKey("customername")?itemjs.getString("customername"):"");//交易对象控制
item.addElement("bankrelated_code").addText("");//
item.addElement("duty_issue").addText("");//
item.addElement("hetong").addText(itemjs.containsKey("hetong")?itemjs.getString("hetong"):"");//
item.addElement("gcxm").addText(itemjs.containsKey("gcxm")?itemjs.getString("gcxm"):"");//
item.addElement("bklx").addText(itemjs.containsKey("bklx")?itemjs.getString("bklx"):"");//
item.addElement("ywlx").addText(itemjs.containsKey("ywlx")?itemjs.getString("ywlx"):"");//
item.addElement("yfxm").addText(itemjs.containsKey("yfxm")?itemjs.getString("yfxm"):"");//
item.addElement("jieduan").addText(itemjs.containsKey("jieduan")?itemjs.getString("jieduan"):"");//
item.addElement("zcmx").addText(itemjs.containsKey("zcmx")?itemjs.getString("zcmx"):"");//
item.addElement("sylx").addText(itemjs.containsKey("sylx")?itemjs.getString("sylx"):"");//
item.addElement("pjlx").addText(itemjs.containsKey("pjlx")?itemjs.getString("pjlx"):"");//
item.addElement("shuilv").addText(itemjs.containsKey("shuilv")?itemjs.getString("shuilv"):"");//
item.addElement("hsje").addText(itemjs.containsKey("hsje")?itemjs.getString("hsje"):"");//
item.addElement("shuie").addText(itemjs.containsKey("shuie")?itemjs.getString("shuie"):"");//
item.addElement("bhsje").addText(itemjs.containsKey("bhsje")?itemjs.getString("bhsje"):"");//
item.addElement("cxjkje").addText(itemjs.containsKey("cxjkje")?itemjs.getString("cxjkje"):"");//
item.addElement("fylx").addText(itemjs.containsKey("fylx")?itemjs.getString("fylx"):"");//
item.addElement("cjyfk").addText(itemjs.containsKey("cjyfk")?itemjs.getString("cjyfk"):"");//
item.addElement("gzr").addText(itemjs.containsKey("gzr")?itemjs.getString("gzr"):"");//
}
billhead.addElement("billclass").addText("fj");//
billhead.addElement("bill_type").addText("F5");//
billhead.addElement("suppliername").addText(json.containsKey("suppliername")?json.getString("suppliername"):"");//根据交易对象
billhead.addElement("customername").addText(json.containsKey("customername")?json.getString("customername"):"");//
billhead.addElement("duty_issue").addText("");//
billhead.addElement("ntberrmsg").addText("");//
billhead.addElement("haspassedntbcheck").addText("");//
result = headXML(json.containsKey("pk_org")?json.getString("pk_org"):"",json.containsKey("pk_group")?json.getString("pk_group"):"")+footXML(isHeaderDoc);
return ""+result;
}
public static String headXML(String pk_org,String pk_group){
String result = ""
+ "";
return result;
}
public static String footXML(Document document){
String re = "<\\?xml version=\"1.0\" encoding=\"UTF-8\"\\?>";
String replaceAll = document.asXML().replaceAll(re,"");
return replaceAll+" ";
}
调用 headXML 方法拼接 XML 的头部,调用 footXML 把 document 对象传入拼接XML 的身体
拿着这个拼接好的 XML、url、userName、pwd 调用 FcVoucherUtil.doPost 方法推送NC
那这个 doPost 方法又是怎么做推送到nc的呢?让我们接着往下看
五、 FcVoucherUtil 的 doPost 方法(推送 NC 的方法)
public static String doPost(String url,String userName,String pwd,String xml){
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建请求内容
httpPost.setHeader("HTTP Method", "POST");
httpPost.setHeader("Connection", "Keep-Alive");
httpPost.setHeader("Content-Type", "text/xml; charset=UTF-8");
httpPost.setHeader("Authorization", getHeader(userName, pwd));
httpPost.setHeader("Username",userName);
httpPost.setHeader("Password",pwd);
StringEntity entity = new StringEntity(xml, "UTF-8");
entity.setContentType("text/xml;charset=UTF-8");
httpPost.setEntity(entity);
// 执行http请求
response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
} else {
String tmp = EntityUtils.toString(response.getEntity(), "UTF-8");
throw new RuntimeException(tmp);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if(response!=null){
response.close();
}
} catch (Exception e) {
e.printStackTrace();
}
if(httpClient!=null){
try{
httpClient.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return resultString;
}
private static String getHeader(String userName,String pwd) {
String auth = userName + ":" + pwd;
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")));
String authHeader = "Basic " + new String(encodedAuth);
return authHeader;
}
1、创建一个 http 对象,在请求头中设置 token 等信息
token:把用户名和密码 转成数组后用 字符集 进行编码(调用 Base64的 encodeBase64 方法进行编码 ),编码完成后再转成 String
2、请求体中放入组装好的 XML
3、执行请求后再解析响应结果
浙公网安备 33010602011771号