package xin.glue.cargocnHttpClient; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.sql.ResultSet; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import CoreFS.SA01.CoreIComponent; import CoreFS.SA06.CoreReturnObject; import UIB.COM.XmlSqlParsersFactory; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; /** * 货运中国--远程调用物流跟踪平台接口上传数据类 * * @author KangMiao * @Date 2015-4-13 下午03:25:53 * */ public class WayBillClient extends CoreIComponent { /** * 远程测试用的地址http://dev.cargocn.net/cargocn/ws/uploadWayBill.do */ private static String testUrl = "http://dev.cargocn.net/cargocn/ws/uploadWayBill.do"; /** * 正式调用地址http://www.cargocn.net/cargocn/ws/uploadWayBill.do * 货运中国ip地址:120.26.85.206; */ private static String runUrl = "http://120.26.85.206/cargocn/ws/uploadWayBill.do"; /** * 中转地址http://192.168.3.3:8060/XGToCargocnServer/server/ForwardCargocn-SendRZ */ private static String forwardUrl = "http://192.168.3.3:8060/XGToCargocnServer/server/ForwardCargocn-SendRZ"; /** * 调用物流跟踪平台接口方法,将订单数据通过此方法上传给物流跟踪平台系统; * @param pDlivDirNos运输指示号,TRNF_DTIMEs发货时间,ORD_NMs收货单位,GET_ON_PCDs发货地址,DEST_PCD_DESC收货地址, * COIL_WGTs钢卷实际重量(ACT_WGT),CUST_NMs合同单位,SHIP_COMP_CDs运输公司,TRANS_CAR_NOs车号 * ,SPEC_STL_GRDs牌号,OLD_SAMPL_NOs钢卷号,SM_CFNMs产品名称 * @return result解密后得到的返回值返回0为成功调用,所有非0均为非成功调用,目前返回值如下: 1000:签名验证失败 1001:运单对象不得为空 1002:发货人ID不得为空 1003:发货人信息加载出错 1004:发货人状态不正常 1005:订单号不得为空 1006:承运商不得为空 1007:承运商信息加载出错 1008:承运商没在货运中国平台开户 1009:运单子项不得为空 1010:车牌号不得为空 1011:车牌号信息加载出错 1012:车牌号没在货运中国平台注册 1013:该车辆在货运中国平台尚未关联司机帐号 */ public String cargocnClientPost(String[] pDlivDirNos, String[] TRNF_DTIMEs, String[] ORD_NMs, String[] DEST_PCD_DESCs, String[] COIL_WGTs, String[] CUST_NMs, String[] SHIP_COMP_CDs, String[] TRANS_CAR_NOs, String[] OLD_SAMPL_NOs, String[] SPEC_STL_GRDs, String[] SM_CFNMs) { int iCnt = 0; if (null != pDlivDirNos && 0 != pDlivDirNos.length) { iCnt = pDlivDirNos.length; } else return "1001"; Set dlivNoSet = new HashSet(); Map wayMap = new HashMap(); //汇总处理 for (int i = 0; i < iCnt; i++) { try { if(!dlivNoSet.contains(pDlivDirNos[i])) { // 主数据 WayBill b = new WayBill(); // 运送指示号 b.setOrderNo(pDlivDirNos[i]); // 默认1销售物流, 2:采购物流 3:内部物流 b.setOrderType("1"); // 发运日期TRNF_DTIME SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String trnFTime = TRNF_DTIMEs[i]; Date sendDate = null; if(null == trnFTime || "" == trnFTime) sendDate = Calendar.getInstance().getTime(); else sendDate = sdf.parse(trnFTime); b.setScheduleSendDate(sendDate); // 发货企业代码, 物流跟踪平台给出的新钢集团代码6 b.setShipperCompanyId(Long.valueOf(6)); // 发货城市 b.setShipperCity("新余市"); // 发货地点 GET_ON_PCD 冷轧系统默认为冷卷厂 b.setShipperAddr("冷卷厂"); // 收货单位 ORD_NMs String ordNm = ORD_NMs[i]; if(StringUtils.isEmpty(ordNm)) { ordNm = CUST_NMs[i]; } b.setReceiveCompanyName(ordNm); // 收货城市,mes暂无 //通过到站地点从产销数据库查收货城市、收货人、电话 String receiveCity = DEST_PCD_DESCs[i]; String sql5 = "SELECT CX.UNLOADDOCK,CX.SHR,CX.SHRDH FROM SEL_STATIONINFO@XGCX CX WHERE CX.STATIONNAME LIKE '" + receiveCity + "%' "; String receiveNM = ""; String receivePhone = ""; ResultSet rs = this.getDao("KgDao").ExceuteQueryForResultSet(sql5); if (rs.next()) { receiveNM = rs.getString("SHR"); //收货人 receivePhone = rs.getString("SHRDH"); //收货人电话 if(!StringUtils.isEmpty(rs.getString("UNLOADDOCK"))) receiveCity = rs.getString("UNLOADDOCK"); //收货城市 } this.getDao("KgDao").closeRs(rs); b.setReceiveCity(receiveCity); //收货城市 b.setReceiveContactName(receiveNM); b.setReceiveContactPhone(receivePhone); // 到站地点 DEST_PCD_DESC b.setReceiveAddr(DEST_PCD_DESCs[i]); // 合同单位 b.setCustomerName(CUST_NMs[i]); // 运输公司 SHIP_COMP_CDs[i] // b.setLogisticsCompanyName("上海春风物流有限公司"); b.setLogisticsCompanyName(SHIP_COMP_CDs[i]); // 明细打印日期(实际发运日期)当前时间 b.setLoadDate(Calendar.getInstance().getTime()); // 车牌号 b.setCarNo(TRANS_CAR_NOs[i]); // b.setCarNo("chepai1"); // 明细数据 WayBillItem wbi = new WayBillItem(); // 钢卷号或者块序号OLD_SAMPL_NOs wbi.setPackageNo(OLD_SAMPL_NOs[i]); // 钢种SPEC_STL_GRDs wbi.setGradeNo(SPEC_STL_GRDs[i]); // 产品名称SM_CFNM wbi.setProductName(SM_CFNMs[i]); // 过磅重量 wbi.setWeight(Double.valueOf(COIL_WGTs[i])/1000); // 实际过磅重量 wbi.setLoadWeight(Double.valueOf(COIL_WGTs[i])/1000); // 装车件数 wbi.setNums(Integer.valueOf(1)); // 实际装车件数 wbi.setLoadNums(Integer.valueOf(1)); ArrayList wItem = new ArrayList(); wItem.add(wbi); b.setWayBillItems(wItem); dlivNoSet.add(pDlivDirNos[i]); wayMap.put(pDlivDirNos[i], b); } else { WayBill wb = wayMap.get(pDlivDirNos[i]); // 明细数据 WayBillItem wbi = new WayBillItem(); // 钢卷号或者块序号OLD_SAMPL_NOs wbi.setPackageNo(OLD_SAMPL_NOs[i]); // 钢种SPEC_STL_GRDs wbi.setGradeNo(SPEC_STL_GRDs[i]); // 产品名称SM_CFNM wbi.setProductName(SM_CFNMs[i]); // 过磅重量 wbi.setWeight(Double.valueOf(COIL_WGTs[i])/1000); // 实际过磅重量 wbi.setLoadWeight(Double.valueOf(COIL_WGTs[i])/1000); // 装车件数 wbi.setNums(Integer.valueOf(1)); // 实际装车件数 wbi.setLoadNums(Integer.valueOf(1)); ArrayList wItem = wb.getWayBillItems(); wItem.add(wbi); } } catch (Exception e) { // TODO: handle exception } } return postCommit(wayMap); } /** * 调用物流跟踪平台接口方法,将订单数据通过此方法上传给物流跟踪平台系统; * @param params明细集合对象 * @return result解密后得到的返回值返回0为成功调用,所有非0均为非成功调用,目前返回值如下: 1000:签名验证失败 1001:运单对象不得为空 1002:发货人ID不得为空 1003:发货人信息加载出错 1004:发货人状态不正常 1005:订单号不得为空 1006:承运商不得为空 1007:承运商信息加载出错 1008:承运商没在货运中国平台开户 1009:运单子项不得为空 1010:车牌号不得为空 1011:车牌号信息加载出错 1012:车牌号没在货运中国平台注册 1013:该车辆在货运中国平台尚未关联司机帐号 */ public CoreReturnObject cargocnClientPost( ArrayList params) { CoreReturnObject cro = new CoreReturnObject(); if (null == params || 0 == params.size()) { cro.setV_errMsg("Result : 1001"); // cro.setV_errCode(1001); return cro; } Set dlivNoSet = new HashSet(); Map wayMap = new HashMap(); for(String[] billArrays : params){ try { if(!dlivNoSet.contains(billArrays[1])) { // 主数据 WayBill b = new WayBill(); // 运送指示号 b.setOrderNo(billArrays[1]); // 默认1销售物流, 2:采购物流 3:内部物流 b.setOrderType("1"); // 发运日期TRNF_DTIME SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String trnFTime = billArrays[8]; Date sendDate = null; if(StringUtils.isEmpty(trnFTime) || "-".equals(trnFTime)) sendDate = Calendar.getInstance().getTime(); else sendDate = sdf.parse(trnFTime); b.setScheduleSendDate(sendDate); // 发货企业代码, 物流跟踪平台给出的新钢集团代码6 b.setShipperCompanyId(Long.valueOf(6)); // 发货城市 b.setShipperCity("新余市"); // 发货地点 GET_ON_PCD 冷轧系统默认为冷卷厂 b.setShipperAddr("冷轧厂"); // 收货单位 ORD_NMs String ordNm = billArrays[14]; if(StringUtils.isEmpty(ordNm)) { ordNm = billArrays[13]; } b.setReceiveCompanyName(ordNm); //通过到站地点从产销数据库查收货城市、收货人、电话 String receiveCity = billArrays[15]; String sql5 = "SELECT CX.UNLOADDOCK,CX.SHR,CX.SHRDH FROM SEL_STATIONINFO@XGCX CX WHERE CX.STATIONNAME LIKE '" + receiveCity + "%' "; String receiveNM = ""; String receivePhone = ""; ResultSet rs = this.getDao("KgDao").ExceuteQueryForResultSet(sql5); if (rs.next()) { receiveNM = rs.getString("SHR"); //收货人 receivePhone = rs.getString("SHRDH"); //收货人电话 if(!StringUtils.isEmpty(rs.getString("UNLOADDOCK"))) receiveCity = rs.getString("UNLOADDOCK"); //收货城市 } this.getDao("KgDao").closeRs(rs); b.setReceiveCity(receiveCity); b.setReceiveContactName(receiveNM); b.setReceiveContactPhone(receivePhone); // 到站地点 DEST_PCD_DESC b.setReceiveAddr(billArrays[15]); // 合同单位 b.setCustomerName(billArrays[13]); // 运输公司若名字SHIP_COMP_NMs为空则用 SHIP_COMP_CDs[i] 新余中新物流有限公司 // b.setLogisticsCompanyName("新余中新物流有限公司"); if(StringUtils.isEmpty(billArrays[18])) { b.setLogisticsCompanyName(billArrays[10]); } else b.setLogisticsCompanyName(billArrays[18]); // 明细打印日期(实际发运日期)当前时间 b.setLoadDate(Calendar.getInstance().getTime()); // 车牌号 b.setCarNo(billArrays[2]); // b.setCarNo("赣K12345"); // 明细数据 WayBillItem wbi = new WayBillItem(); // 钢卷号或者块序号OLD_SAMPL_NOs wbi.setPackageNo(billArrays[16]); // 钢种SPEC_STL_GRDs wbi.setGradeNo(billArrays[9]); // 产品名称SM_CFNM wbi.setProductName(billArrays[17]); // 过磅重量 wbi.setWeight(Double.valueOf(billArrays[6])/1000); // 实际过磅重量 wbi.setLoadWeight(Double.valueOf(billArrays[6])/1000); // 装车件数 wbi.setNums(Integer.valueOf(1)); // 实际装车件数 wbi.setLoadNums(Integer.valueOf(1)); ArrayList wItem = new ArrayList(); wItem.add(wbi); b.setWayBillItems(wItem); dlivNoSet.add(billArrays[1]); wayMap.put(billArrays[1], b); } else { WayBill wb = wayMap.get(billArrays[1]); // 明细数据 WayBillItem wbi = new WayBillItem(); // 钢卷号或者块序号OLD_SAMPL_NOs wbi.setPackageNo(billArrays[16]); // 钢种SPEC_STL_GRDs wbi.setGradeNo(billArrays[9]); // 产品名称SM_CFNM wbi.setProductName(billArrays[17]); // 过磅重量 wbi.setWeight(Double.valueOf(billArrays[6])/1000); // 实际过磅重量 wbi.setLoadWeight(Double.valueOf(billArrays[6])/1000); // 装车件数 wbi.setNums(Integer.valueOf(1)); // 实际装车件数 wbi.setLoadNums(Integer.valueOf(1)); ArrayList wItem = wb.getWayBillItems(); wItem.add(wbi); } } catch (Exception e) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); e.printStackTrace(new PrintStream(baos)); String exception = baos.toString(); cro.setV_errMsg("\nError : " + exception); // CoreClientParam.ReturnInfo e.printStackTrace(); return cro; } } String state = postCommit(wayMap); //cro.setV_errCode(Integer.valueOf(state)); //对应客户端显示CoreClientParam.ReturnCode cro.setV_errMsg(state); // CoreClientParam.ReturnInfo //cro.setResult("setResult:" + state); //CoreClientParam.ReturnObject return cro; } /* * 提交请求 */ public String postCommit(Map wayMap) { StringBuffer restr = new StringBuffer("Total: [" + wayMap.size() + "] Result : "); // //公钥文件路径 // String pubPath = "/" + WayBillClient.class.getResource("/") + "cargocn_server_pub.key"; // //私钥文件路径 // String priPath = "/" + WayBillClient.class.getResource("/") + "cargocn_client_pri.p8"; for (WayBill value : wayMap.values()) { try { // 总件数 value.setLoadTotalNums(value.getWayBillItems().size()); // 总重量COIL_WGTs Double totalW = 0.0; for(WayBillItem item : value.getWayBillItems()){ totalW += item.getLoadWeight(); } value.setLoadTotalWeight(totalW); // json格式转换 String bill = JSON.toJSONString(value); System.out.println("billJSON:" + bill); //直接用json数据加密传输会出现中文乱码,这里转换成unicode编码 String unicBill = ChangeCharset.stringToUnicode(bill); System.out.println("unicBill:" + unicBill); // 公钥加密 byte[] cipherData = RSAUtils.encryptByPublicKey(unicBill.getBytes(), RSAUtils.loadKeyStr("PUB")); // String path = value.getClass().getClassLoader().getResource("cargocn_server_pub.key").getPath(); // restr.append("\n path:" + path); // byte[] cipherData = RSAUtils.encryptByPublicKey(unicBill.getBytes(), // RSAUtils.loadPublicKeyByFile(path)); String cipher = Base64.encode(cipherData); System.out.println("cipher:" + cipher); // 私钥加密 String signstr = RSAUtils.sign(cipher.getBytes(),RSAUtils.loadKeyStr("PRI")); // String signstr = RSAUtils.sign(cipher.getBytes(), // RSAUtils.loadPrivateKeyByFile(value.getClass().getClassLoader() // .getResource("cargocn_client_pri.p8").getPath())); System.out.println("signstr:" + signstr); //中转接口地址 HttpPostUtil hu = new HttpPostUtil(forwardUrl); // 发送请求 String ret = hu.post(cipher, signstr); if( "0".equals(ret)) { //返回0发送成功,则修改数据状态为7; String sql = XmlSqlParsersFactory.getSql("UIJ030030_cargocn.update"); this.getDao("KgDao").ExcuteNonQuery(sql, new Object[]{value.getOrderNo()}); } // 转换请求返回参数json // JSONObject jo = JSON.parseObject(ret); // restr.append("\n jo:" + jo); // String result = jo.getString("result"); // String resultSign = jo.getString("sign"); // // 验证签名 // boolean tmp = RSAUtils.verify(result.getBytes(), RSAUtils.loadKeyStr("PUB"), resultSign); //// boolean tmp = RSAUtils.verify(result.getBytes(), //// RSAUtils.loadPublicKeyByFile(value.getClass().getClassLoader() //// .getResource("cargocn_server_pub.key").getPath()),resultSign); // if (tmp) { // // 解密 // byte[] res = RSAUtils.decryptByPrivateKey(Base64.decode(result), RSAUtils.loadKeyStr("PRI")); //// byte[] res = RSAUtils.decryptByPrivateKey(Base64.decode(result), RSAUtils //// .loadPrivateKeyByFile(value.getClass().getClassLoader() //// .getResource("cargocn_client_pri.p8").getPath())); // String restr0 = new String(res); restr.append("\n " + value.getOrderNo() + " : " + ret + ";"); System.out.println("返回值restr:" + ret); } catch (Exception e) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); e.printStackTrace(new PrintStream(baos)); String exception = baos.toString(); restr.append("\nError : " + exception); e.printStackTrace(); } } return restr.toString(); } /* * 测试用 */ public static void main(String[] args) { // 主数据 WayBill b = new WayBill(); b.setOrderNo("20150515XY005"); // 运送指示号 b.setOrderType("1"); // 默认1销售物流, 2:采购物流 3:内部物流 b.setScheduleSendDate(Calendar.getInstance().getTime()); // 发运日期TRNF_DTIME b.setShipperCompanyId(Long.valueOf(6)); // 发货企业代码 物流跟踪平台给出的新钢集团代码 b.setReceiveCompanyName("新余新钢集团测试数据:005"); // 收货企业 合同单位 CUST_NM b.setShipperCity("新余市"); // 发货城市 b.setShipperAddr("热卷厂"); // 发货地点 GET_ON_PCD b.setReceiveCity("南昌市"); // 收货城市,mes暂无 b.setReceiveAddr("新余新钢集团测试数据:005"); // 到站地点 DEST_PCD_DESC b.setLoadTotalNums(5); // 根据发运指示号获得多少件数 b.setLoadTotalWeight(new Double(22)); // 根据发运指示号获得总重量COIL_WGTs b.setCustomerName("新余新钢集团测试数据:005"); // 合同单位 b.setLogisticsCompanyName("新余中新物流有限公司"); // 运输公司 SHIP_COMP_CD b.setLoadDate(Calendar.getInstance().getTime()); // 明细打印日期(实际发运日期)当前时间 b.setCarNo("赣K12345"); // 车牌号 // 明细数据 WayBillItem i = new WayBillItem(); i.setPackageNo("package123"); // 钢卷号或者块序号OLD_SAMPL_NOs i.setGradeNo("50-1"); // 钢种SPEC_STL_GRDs i.setProductName("新余新钢集团测试数据:005"); // 产品名称SM_CFNM i.setWeight(Double.valueOf(42)); // 过磅重量 i.setLoadWeight(Double.valueOf(41.28)); // 实际过磅重量 i.setNums(Integer.valueOf(1)); // 装车件数 i.setLoadNums(Integer.valueOf(1)); // 实际装车件数 ArrayList li = new ArrayList(); li.add(i); b.setWayBillItems(li); // 加密 签名 try { String bill = JSON.toJSONString(b); System.out.println("bill:" + bill); String iso = new String(bill.getBytes("UTF-8"),"ISO-8859-1"); System.out.println("iso:" + iso); String utf8 = new String(iso.getBytes("ISO-8859-1"),"UTF-8"); System.out.println("utf8:" + utf8); String unic = ChangeCharset.stringToUnicode(bill); System.out.println("unic:" + unic); String unicTo = ChangeCharset.unicodeToString(unic); System.out.println("unicTo:" + unicTo); // 公钥加密 // byte[] cipherData = RSAUtils.encryptByPublicKey( // bill.getBytes(), // RSAUtils.loadPublicKeyByFile(b.getClass().getClassLoader() // .getResource("cargocn_server_pub.key").getPath())); byte[] cipherData = RSAUtils.encryptByPublicKey(bill.getBytes(), RSAUtils.loadKeyStr("PUB")); String cipher = Base64.encode(cipherData); System.out.println("cipher:" + cipher); // 私钥加密 // String signstr = RSAUtils.sign( // cipher.getBytes(), // RSAUtils.loadPrivateKeyByFile(b.getClass().getClassLoader() // .getResource("cargocn_client_pri.p8").getPath())); String signstr = RSAUtils.sign(cipher.getBytes(),RSAUtils.loadKeyStr("PRI")); System.out.println("signstr:" + signstr); // 远程接口地址 HttpPostUtil hu = new HttpPostUtil(runUrl); // 发送请求 String ret = hu.post(cipher, signstr); System.out.println("ret:" + ret); // 转换请求返回参数json JSONObject jo = JSON.parseObject(ret); String result = jo.getString("result"); String resultSign = jo.getString("sign"); // 验证签名 // boolean tmp = RSAUtils.verify( // result.getBytes(), // RSAUtils.loadPublicKeyByFile(b.getClass().getClassLoader() // .getResource("cargocn_server_pub.key").getPath()), // resultSign); boolean tmp = RSAUtils.verify(result.getBytes(), RSAUtils.loadKeyStr("PUB"), resultSign); if (tmp) { // 解密 // byte[] res = RSAUtils.decryptByPrivateKey( // Base64.decode(result), RSAUtils // .loadPrivateKeyByFile(b.getClass() // .getClassLoader() // .getResource("cargocn_client_pri.p8") // .getPath())); byte[] res = RSAUtils.decryptByPrivateKey( Base64.decode(result), RSAUtils.loadKeyStr("PRI")); String restr = new String(res); System.out.println("restr:" + restr); String unicTo1 = ChangeCharset.unicodeToString(unic); System.out.println("unicTo:" + unicTo1); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }