实用指南:推送单据信息到第三方系统(NC65)

此处以预付款申请单推动付款结算单到NC系统为例 

目录

一、Action

二、Service

三、ServiceImpl

四、 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、执行请求后再解析响应结果 

posted @ 2025-12-15 16:30  clnchanpin  阅读(48)  评论(0)    收藏  举报