e61aad6e69856ec7fe9a0788398809941c4f3dae.svn-base 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. package xin.glue.cargocnHttpClient;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.PrintStream;
  4. import java.text.SimpleDateFormat;
  5. import java.util.ArrayList;
  6. import java.util.Calendar;
  7. import java.util.Date;
  8. import java.util.HashMap;
  9. import java.util.HashSet;
  10. import java.util.Map;
  11. import java.util.Set;
  12. import org.apache.commons.lang.StringUtils;
  13. import com.alibaba.fastjson.JSON;
  14. import com.alibaba.fastjson.JSONObject;
  15. import com.posdata.glue.biz.activity.PosActivity;
  16. import com.posdata.glue.context.PosContext;
  17. import com.posdata.glue.dao.PosGenericDao;
  18. import com.posdata.glue.dao.vo.PosParameter;
  19. import com.posdata.glue.dao.vo.PosRow;
  20. import com.posdata.glue.dao.vo.PosRowSet;
  21. /**
  22. * 货运中国--远程调用物流跟踪平台接口上传数据类
  23. *
  24. * @author KangMiao
  25. * @Date 2015-4-13 下午03:25:53
  26. *
  27. */
  28. public class WayBillClient extends PosActivity {
  29. /**
  30. * 远程测试用的地址http://dev.cargocn.net/cargocn/ws/uploadWayBill.do
  31. */
  32. private static String testUrl = "http://dev.cargocn.net/cargocn/ws/uploadWayBill.do";
  33. /**
  34. * 正式调用地址http://www.cargocn.net/cargocn/ws/uploadWayBill.do
  35. * 货运中国ip地址:120.26.85.206;
  36. */
  37. private static String runUrl = "http://120.26.85.206/cargocn/ws/uploadWayBill.do";
  38. /**
  39. * 中转地址http://192.168.3.3:8060/XGToCargocnServer/server/ForwardCargocn-SendRZ
  40. * ST:ST_1234
  41. */
  42. private static String forwardUrl = "http://192.168.3.3:8060/XGToCargocnServer/server/ForwardCargocn-SendRZ";
  43. /**
  44. * 调用物流跟踪平台接口方法,将订单数据通过此方法上传给物流跟踪平台系统;
  45. * @param pDlivDirNos运输指示号,TRNF_DTIMEs发货时间,ORD_NMs收货单位,GET_ON_PCDs发货地址,DEST_PCD_DESC收货地址,
  46. * COIL_WGTs钢卷实际重量(ACT_WGT),CUST_NMs合同单位,SHIP_COMP_CDs运输公司,TRANS_CAR_NOs车号
  47. * ,SPEC_STL_GRDs牌号,OLD_SAMPL_NOs钢卷号,SM_CFNMs产品名称
  48. * @return result解密后得到的返回值返回0为成功调用,所有非0均为非成功调用,目前返回值如下:
  49. 1000:签名验证失败
  50. 1001:运单对象不得为空
  51. 1002:发货人ID不得为空
  52. 1003:发货人信息加载出错
  53. 1004:发货人状态不正常
  54. 1005:订单号不得为空
  55. 1006:承运商不得为空
  56. 1007:承运商信息加载出错
  57. 1008:承运商没在货运中国平台开户
  58. 1009:运单子项不得为空
  59. 1010:车牌号不得为空
  60. 1011:车牌号信息加载出错
  61. 1012:车牌号没在货运中国平台注册
  62. 1013:该车辆在货运中国平台尚未关联司机帐号
  63. */
  64. public String cargocnClientPost(String[] pDlivDirNos, String[] TRNF_DTIMEs,
  65. String[] ORD_NMs, String[] DEST_PCD_DESCs,
  66. String[] COIL_WGTs, String[] CUST_NMs, String[] SHIP_COMP_CDs,
  67. String[] TRANS_CAR_NOs, String[] OLD_SAMPL_NOs,
  68. String[] SPEC_STL_GRDs, String[] SM_CFNMs,String[] SHIP_COMP_NMs,PosGenericDao dao) {
  69. int iCnt = 0;
  70. if (null != pDlivDirNos && 0 != pDlivDirNos.length) {
  71. iCnt = pDlivDirNos.length;
  72. } else
  73. return "返回结果:1001;";
  74. Set<String> dlivNoSet = new HashSet<String>();
  75. Map<String, WayBill> wayMap = new HashMap<String, WayBill>();
  76. //汇总处理
  77. for (int i = 0; i < iCnt; i++) {
  78. try {
  79. if(!dlivNoSet.contains(pDlivDirNos[i])) {
  80. // 主数据
  81. WayBill b = new WayBill();
  82. // 运送指示号
  83. b.setOrderNo(pDlivDirNos[i]);
  84. // 默认1销售物流, 2:采购物流 3:内部物流
  85. b.setOrderType("1");
  86. // 发运日期TRNF_DTIME
  87. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  88. String trnFTime = TRNF_DTIMEs[i];
  89. Date sendDate = null;
  90. if(StringUtils.isEmpty(trnFTime) || "-".equals(trnFTime))
  91. sendDate = Calendar.getInstance().getTime();
  92. else
  93. sendDate = sdf.parse(trnFTime);
  94. b.setScheduleSendDate(sendDate);
  95. // 发货企业代码, 物流跟踪平台给出的新钢集团代码6
  96. b.setShipperCompanyId(Long.valueOf(6));
  97. // 发货城市
  98. b.setShipperCity("新余市");
  99. // 发货地点 GET_ON_PCD 热轧系统默认为热卷厂
  100. b.setShipperAddr("热卷厂");
  101. // 收货单位 ORD_NMs
  102. String ordNm = ORD_NMs[i];
  103. if(StringUtils.isEmpty(ordNm)) {
  104. ordNm = CUST_NMs[i];
  105. }
  106. b.setReceiveCompanyName(ordNm);
  107. //通过到站地点从产销数据库查收货城市、收货人、电话
  108. PosParameter param5 = new PosParameter();
  109. param5.setWhereClauseParameter(0, DEST_PCD_DESCs[i]);
  110. PosRowSet rows5 = getDao("mesdao").find("UIJ010060_cx.select", param5);
  111. if(rows5.hasNext()){
  112. PosRow row = rows5.next();
  113. Object receiveCity = row.getAttribute("UNLOADDOCK"); //收货城市
  114. Object receiveNM = row.getAttribute("SHR"); //收货人
  115. Object receivePhone = row.getAttribute("SHRDH"); //收货人电话
  116. if(null != receiveCity)
  117. b.setReceiveCity(receiveCity.toString()); //收货城市
  118. else
  119. b.setReceiveCity(DEST_PCD_DESCs[i]);
  120. // b.setReceiveCity("新余市");
  121. if(null != receiveNM)
  122. b.setReceiveContactName(receiveNM.toString()); //收货联系人
  123. else
  124. b.setReceiveContactName("");
  125. if(null != receivePhone)
  126. b.setReceiveContactPhone(receivePhone.toString()); //收货联系人电话
  127. else
  128. b.setReceiveContactPhone("");
  129. }
  130. // 到站地点 DEST_PCD_DESC
  131. b.setReceiveAddr(DEST_PCD_DESCs[i]);
  132. // 合同单位
  133. b.setCustomerName(CUST_NMs[i]);
  134. // 运输公司若名字SHIP_COMP_NMs为空则用 SHIP_COMP_CDs[i] 新余中新物流有限公司
  135. // b.setLogisticsCompanyName("新余中新物流有限公司");
  136. if(StringUtils.isEmpty(SHIP_COMP_NMs[i])) {
  137. b.setLogisticsCompanyName(SHIP_COMP_CDs[i]);
  138. } else
  139. b.setLogisticsCompanyName(SHIP_COMP_NMs[i]);
  140. // 明细打印日期(实际发运日期)当前时间
  141. b.setLoadDate(Calendar.getInstance().getTime());
  142. // 车牌号
  143. b.setCarNo(TRANS_CAR_NOs[i]);
  144. // b.setCarNo("赣K12345");
  145. // 明细数据
  146. WayBillItem wbi = new WayBillItem();
  147. // 钢卷号或者块序号OLD_SAMPL_NOs
  148. wbi.setPackageNo(OLD_SAMPL_NOs[i]);
  149. // 钢种SPEC_STL_GRDs
  150. wbi.setGradeNo(SPEC_STL_GRDs[i]);
  151. // 产品名称SM_CFNM
  152. wbi.setProductName(SM_CFNMs[i]);
  153. // 过磅重量
  154. wbi.setWeight(Double.valueOf(COIL_WGTs[i])/1000);
  155. // 实际过磅重量
  156. wbi.setLoadWeight(Double.valueOf(COIL_WGTs[i])/1000);
  157. // 装车件数
  158. wbi.setNums(Integer.valueOf(1));
  159. // 实际装车件数
  160. wbi.setLoadNums(Integer.valueOf(1));
  161. ArrayList<WayBillItem> wItem = new ArrayList<WayBillItem>();
  162. wItem.add(wbi);
  163. b.setWayBillItems(wItem);
  164. dlivNoSet.add(pDlivDirNos[i]);
  165. wayMap.put(pDlivDirNos[i], b);
  166. } else {
  167. WayBill wb = wayMap.get(pDlivDirNos[i]);
  168. // 明细数据
  169. WayBillItem wbi = new WayBillItem();
  170. // 钢卷号或者块序号OLD_SAMPL_NOs
  171. wbi.setPackageNo(OLD_SAMPL_NOs[i]);
  172. // 钢种SPEC_STL_GRDs
  173. wbi.setGradeNo(SPEC_STL_GRDs[i]);
  174. // 产品名称SM_CFNM
  175. wbi.setProductName(SM_CFNMs[i]);
  176. // 过磅重量
  177. wbi.setWeight(Double.valueOf(COIL_WGTs[i])/1000);
  178. // 实际过磅重量
  179. wbi.setLoadWeight(Double.valueOf(COIL_WGTs[i])/1000);
  180. // 装车件数
  181. wbi.setNums(Integer.valueOf(1));
  182. // 实际装车件数
  183. wbi.setLoadNums(Integer.valueOf(1));
  184. ArrayList<WayBillItem> wItem = wb.getWayBillItems();
  185. wItem.add(wbi);
  186. }
  187. } catch (Exception e) {
  188. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  189. e.printStackTrace(new PrintStream(baos));
  190. String exception = baos.toString();
  191. String errStr = "\n错误原因:" + exception;
  192. e.printStackTrace();
  193. return errStr;
  194. }
  195. }
  196. // //公钥文件路径
  197. // String pubPath = "/" + WayBillClient.class.getResource("/") + "cargocn_server_pub.key";
  198. // //私钥文件路径
  199. // String priPath = "/" + WayBillClient.class.getResource("/") + "cargocn_client_pri.p8";
  200. //String[] restr = new String[wayMap.size()];
  201. StringBuffer restr = new StringBuffer("共: [" + wayMap.size() + "]条,返回结果:");
  202. String restr0 = "发送成功!";
  203. for (WayBill value : wayMap.values()) {
  204. try {
  205. // 总件数
  206. value.setLoadTotalNums(value.getWayBillItems().size());
  207. // 总重量COIL_WGTs
  208. Double totalW = 0.0;
  209. for(WayBillItem item : value.getWayBillItems()){
  210. totalW += item.getLoadWeight();
  211. }
  212. value.setLoadTotalWeight(totalW);
  213. // json格式转换
  214. String bill = JSON.toJSONString(value);
  215. //System.out.println("billJSON:" + bill);
  216. //直接用json数据加密传输会出现中文乱码,这里转换成unicode编码
  217. bill = ChangeCharset.stringToUnicode(bill);
  218. System.out.println("unicBill:" + bill);
  219. // 公钥加密
  220. // byte[] cipherData = RSAUtils.encryptByPublicKey(bill.getBytes(), RSAUtils.loadKeyStr("PUB"));
  221. String path = value.getClass().getClassLoader().getResource("cargocn_server_pub.key").getPath();
  222. byte[] cipherData = RSAUtils.encryptByPublicKey(bill.getBytes(),
  223. RSAUtils.loadPublicKeyByFile(path));
  224. String cipher = Base64.encode(cipherData);
  225. //System.out.println("cipher:" + cipher);
  226. // 私钥加密
  227. // String signstr = RSAUtils.sign(cipher.getBytes(),RSAUtils.loadKeyStr("PRI"));
  228. String signstr = RSAUtils.sign(cipher.getBytes(),
  229. RSAUtils.loadPrivateKeyByFile(value.getClass().getClassLoader()
  230. .getResource("cargocn_client_pri.p8").getPath()));
  231. //System.out.println("signstr:" + signstr);
  232. // 远程接口地址
  233. HttpPostUtil hu = new HttpPostUtil(forwardUrl);
  234. // 发送请求
  235. String ret = hu.post(cipher, signstr);
  236. // 转换请求返回参数json
  237. // JSONObject jo = JSON.parseObject(ret);
  238. // restr.append("\n jo:" + jo.size());
  239. // String result = jo.getString("result");
  240. // String resultSign = jo.getString("sign");
  241. // // 验证签名
  242. //// boolean tmp = RSAUtils.verify(result.getBytes(), RSAUtils.loadKeyStr("PUB"), resultSign);
  243. // boolean tmp = RSAUtils.verify(result.getBytes(),
  244. // RSAUtils.loadPublicKeyByFile(value.getClass().getClassLoader()
  245. // .getResource("cargocn_server_pub.key").getPath()),resultSign);
  246. // restr.append("\n tmp:" + tmp);
  247. // if (tmp) {
  248. // // 解密
  249. //// byte[] res = RSAUtils.decryptByPrivateKey(Base64.decode(result), RSAUtils.loadKeyStr("PRI"));
  250. // byte[] res = RSAUtils.decryptByPrivateKey(Base64.decode(result), RSAUtils
  251. // .loadPrivateKeyByFile(value.getClass().getClassLoader()
  252. // .getResource("cargocn_client_pri.p8").getPath()));
  253. // String res0 = new String(res);
  254. System.out.println("返回值restr:" + ret);
  255. if( "0".equals(ret)) {
  256. //返回0发送成功,则修改中间表数据状态为7;
  257. PosParameter param = new PosParameter();
  258. param.setWhereClauseParameter(0, value.getOrderNo());
  259. dao.update("UIJ010060_cargocn.update", param);
  260. } else {
  261. restr0 = "-1";
  262. }
  263. restr.append("\n " + value.getOrderNo() + ":" + ret + ";");
  264. } catch (Exception e) {
  265. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  266. e.printStackTrace(new PrintStream(baos));
  267. String exception = baos.toString();
  268. restr.append("\n异常原因:" + exception);
  269. e.printStackTrace();
  270. return restr.toString();
  271. }
  272. }
  273. if(!"-1".equals(restr0))
  274. return restr0;
  275. restr.append("\n结果值含义:0 表示发送成功,其他值都为失败");
  276. restr.append("\n1000:签名验证失败 1001:运单对象不得为空");
  277. restr.append("\n1002:发货人ID不得为空 1003:发货人信息加载出错");
  278. restr.append("\n1004:发货人状态不正常 1005:订单号不得为空");
  279. restr.append("\n1006:承运商不得为空 1007:承运商信息加载出错");
  280. restr.append("\n1008:承运商没在货运中国平台开户 1009:运单子项不得为空");
  281. restr.append("\n1010:车牌号不得为空 1011:车牌号信息加载出错");
  282. restr.append("\n1012:车牌号没在货运中国平台注册\n1013:该车辆在货运中国平台尚未关联司机帐号");
  283. return restr.toString();
  284. }
  285. public void autoQueryData() {
  286. PosGenericDao dao = this.getDao("mesdao");
  287. PosRowSet rowset = dao.find("UIJ010060_cargocn.select");
  288. PosRow row = null;
  289. Set<String> dlivNoSet = new HashSet<String>();
  290. Map<String, WayBill> wayMap = new HashMap<String, WayBill>();
  291. if (rowset != null && rowset.count() > 0) {
  292. try {
  293. while (rowset.hasNext()) {
  294. row = rowset.next();
  295. String dirNo = row.getAttribute("DLIV_DIRNO").toString();
  296. if(!dlivNoSet.contains(dirNo)) {
  297. // 主数据
  298. WayBill b = new WayBill();
  299. // 运送指示号
  300. b.setOrderNo(dirNo);
  301. // 默认1销售物流, 2:采购物流 3:内部物流
  302. b.setOrderType("1");
  303. // 发运日期TRNF_DTIME
  304. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  305. Date sendDate = null;
  306. String trnFTime = row.getAttribute("TRNF_DTIME").toString();
  307. if(null == trnFTime || "" == trnFTime)
  308. sendDate = Calendar.getInstance().getTime();
  309. else
  310. sendDate = sdf.parse(trnFTime);
  311. b.setScheduleSendDate(sendDate);
  312. // 发货企业代码, 物流跟踪平台给出的新钢集团代码6
  313. b.setShipperCompanyId(Long.valueOf(6));
  314. // 发货城市
  315. String SHIPPERCITY = "新余市";
  316. if(null != row.getAttribute("SHIPPERCITY")) {
  317. SHIPPERCITY = row.getAttribute("SHIPPERCITY").toString();
  318. }
  319. b.setShipperCity(SHIPPERCITY);
  320. // 发货地点 GET_ON_PCD 热轧系统默认为热卷厂
  321. String SHIPPERADDR = "热卷厂";
  322. if(null != row.getAttribute("SHIPPERADDR")) {
  323. SHIPPERADDR = row.getAttribute("SHIPPERADDR").toString();
  324. }
  325. b.setShipperAddr(SHIPPERADDR);
  326. // 收货单位 ORD_NMs
  327. Object ordNm = row.getAttribute("CUST_NM");
  328. Object CUST_NMs = row.getAttribute("CUST_NM");
  329. if(null == ordNm) {
  330. ordNm = CUST_NMs;
  331. }
  332. b.setReceiveCompanyName(ordNm.toString());
  333. // 收货城市,mes暂无
  334. // Object RECEIVECITY = row.getAttribute("RECEIVECITY");
  335. // 到站地点 DEST_PCD_DESC
  336. Object DEST_PCD_DESCs = row.getAttribute("DEST_PCD_DESC");
  337. //通过到站地点从产销数据库查收货城市、收货人、电话
  338. PosParameter param5 = new PosParameter();
  339. param5.setWhereClauseParameter(0, DEST_PCD_DESCs.toString());
  340. PosRowSet rows5 = getDao("mesdao").find("UIJ010060_cx.select", param5);
  341. if(rows5.hasNext()){
  342. PosRow row5 = rows5.next();
  343. Object receiveCity = row5.getAttribute("UNLOADDOCK"); //收货城市
  344. Object receiveNM = row5.getAttribute("SHR"); //收货人
  345. Object receivePhone = row5.getAttribute("SHRDH"); //收货人电话
  346. if(null != receiveCity)
  347. b.setReceiveCity(receiveCity.toString()); //收货城市
  348. else
  349. b.setReceiveCity(DEST_PCD_DESCs.toString());
  350. // b.setReceiveCity("新余市");
  351. if(null != receiveNM)
  352. b.setReceiveContactName(receiveNM.toString()); //收货联系人
  353. else
  354. b.setReceiveContactName("");
  355. if(null != receivePhone)
  356. b.setReceiveContactPhone(receivePhone.toString()); //收货联系人电话
  357. else
  358. b.setReceiveContactPhone("");
  359. }
  360. // b.setReceiveCity("新余市");
  361. b.setReceiveAddr(DEST_PCD_DESCs.toString());
  362. // 合同单位
  363. b.setCustomerName(ordNm.toString());
  364. // 运输公司若名字SHIP_COMP_NMs为空则用 SHIP_COMP_CDs[i] 新余中新物流有限公司
  365. // b.setLogisticsCompanyName("新余中新物流有限公司");
  366. String SHIP_COMP_NM = "";
  367. if(null != row.getAttribute("SHIP_COMP_NM")) {
  368. SHIP_COMP_NM = row.getAttribute("SHIP_COMP_NM").toString();
  369. }
  370. b.setLogisticsCompanyName(SHIP_COMP_NM);
  371. // 明细打印日期(实际发运日期)当前时间
  372. b.setLoadDate(Calendar.getInstance().getTime());
  373. // 车牌号
  374. String TRANS_CAR_NO = row.getAttribute("TRANS_CAR_NO").toString();
  375. b.setCarNo(TRANS_CAR_NO);
  376. // b.setCarNo("赣K12345");
  377. // 明细数据
  378. WayBillItem wbi = new WayBillItem();
  379. // 钢卷号或者块序号COIL_NO
  380. String COIL_NO = row.getAttribute("COIL_NO").toString();
  381. wbi.setPackageNo(COIL_NO);
  382. // 钢种SPEC_STL_GRDs
  383. String SPEC_STL_GRD = row.getAttribute("SPEC_STL_GRD").toString();
  384. wbi.setGradeNo(SPEC_STL_GRD);
  385. // 产品名称SM_CFNM
  386. String SM_CFNM = "";
  387. if(null != row.getAttribute("SM_CFNM")) {
  388. SM_CFNM = row.getAttribute("SM_CFNM").toString();
  389. }
  390. wbi.setProductName(SM_CFNM);
  391. // 过磅重量
  392. String COIL_WGT = "0";
  393. if(null != row.getAttribute("COIL_WGT")) {
  394. COIL_WGT = row.getAttribute("COIL_WGT").toString();
  395. }
  396. wbi.setWeight(Double.valueOf(COIL_WGT)/1000);
  397. // 实际过磅重量
  398. wbi.setLoadWeight(Double.valueOf(COIL_WGT)/1000);
  399. // 装车件数
  400. wbi.setNums(Integer.valueOf(1));
  401. // 实际装车件数
  402. wbi.setLoadNums(Integer.valueOf(1));
  403. ArrayList<WayBillItem> wItem = new ArrayList<WayBillItem>();
  404. wItem.add(wbi);
  405. b.setWayBillItems(wItem);
  406. dlivNoSet.add(dirNo);
  407. wayMap.put(dirNo, b);
  408. } else {
  409. WayBill wb = wayMap.get(dirNo);
  410. // 明细数据
  411. WayBillItem wbi = new WayBillItem();
  412. // 钢卷号或者块序号COIL_NO
  413. String COIL_NO = row.getAttribute("COIL_NO").toString();
  414. wbi.setPackageNo(COIL_NO);
  415. // 钢种SPEC_STL_GRDs
  416. String SPEC_STL_GRD = row.getAttribute("SPEC_STL_GRD").toString();
  417. wbi.setGradeNo(SPEC_STL_GRD);
  418. // 产品名称SM_CFNM
  419. String SM_CFNM = "";
  420. if(null != row.getAttribute("SM_CFNM")) {
  421. SM_CFNM = row.getAttribute("SM_CFNM").toString();
  422. }
  423. wbi.setProductName(SM_CFNM);
  424. // 过磅重量
  425. String COIL_WGT = "0";
  426. if(null != row.getAttribute("COIL_WGT")) {
  427. COIL_WGT = row.getAttribute("COIL_WGT").toString();
  428. }
  429. wbi.setWeight(Double.valueOf(COIL_WGT)/1000);
  430. // 实际过磅重量
  431. wbi.setLoadWeight(Double.valueOf(COIL_WGT)/1000);
  432. // 装车件数
  433. wbi.setNums(Integer.valueOf(1));
  434. // 实际装车件数
  435. wbi.setLoadNums(Integer.valueOf(1));
  436. ArrayList<WayBillItem> wItem = wb.getWayBillItems();
  437. wItem.add(wbi);
  438. }
  439. }
  440. } catch (Exception e) {
  441. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  442. e.printStackTrace(new PrintStream(baos));
  443. String exception = baos.toString();
  444. System.out.println(exception);
  445. // cro.setV_errMsg("\nError : " + exception); // CoreClientParam.ReturnInfo
  446. e.printStackTrace();
  447. }
  448. String state = postCommit(wayMap,dao);
  449. }
  450. }
  451. /*
  452. * 提交请求
  453. */
  454. public String postCommit(Map<String, WayBill> wayMap,PosGenericDao dao) {
  455. StringBuffer restr = new StringBuffer("Result : ");
  456. for (WayBill value : wayMap.values()) {
  457. try {
  458. // 总件数
  459. value.setLoadTotalNums(value.getWayBillItems().size());
  460. // 总重量COIL_WGTs
  461. Double totalW = 0.0;
  462. for(WayBillItem item : value.getWayBillItems()){
  463. totalW += item.getLoadWeight();
  464. }
  465. value.setLoadTotalWeight(totalW);
  466. // json格式转换
  467. String bill = JSON.toJSONString(value);
  468. //System.out.println("billJSON:" + bill);
  469. //直接用json数据加密传输会出现中文乱码,这里转换成unicode编码
  470. bill = ChangeCharset.stringToUnicode(bill);
  471. System.out.println("unicBill:" + bill);
  472. // 公钥加密
  473. String path = value.getClass().getClassLoader().getResource("cargocn_server_pub.key").getPath();
  474. byte[] cipherData = RSAUtils.encryptByPublicKey(bill.getBytes(),
  475. RSAUtils.loadPublicKeyByFile(path));
  476. String cipher = Base64.encode(cipherData);
  477. String signstr = RSAUtils.sign(cipher.getBytes(),
  478. RSAUtils.loadPrivateKeyByFile(value.getClass().getClassLoader()
  479. .getResource("cargocn_client_pri.p8").getPath()));
  480. // 远程接口地址
  481. HttpPostUtil hu = new HttpPostUtil(forwardUrl);
  482. // 发送请求
  483. String ret = hu.post(cipher, signstr);
  484. if( "0" == ret) {
  485. //返回0发送成功,则修改数据状态为7;
  486. PosParameter param = new PosParameter();
  487. param.setWhereClauseParameter(0, value.getOrderNo());
  488. dao.update("UIJ010060_cargocn.update", param);
  489. }
  490. restr.append("\n " + value.getOrderNo() + " : " + ret + ";");
  491. } catch (Exception e) {
  492. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  493. e.printStackTrace(new PrintStream(baos));
  494. String exception = baos.toString();
  495. restr.append("\nError : " + exception);
  496. e.printStackTrace();
  497. }
  498. }
  499. System.out.println(restr.toString());
  500. return restr.toString();
  501. }
  502. /*
  503. * 测试用
  504. */
  505. public static void main(String[] args) {
  506. // 主数据
  507. WayBill b = new WayBill();
  508. b.setOrderNo("20150512XY007"); // 运送指示号
  509. b.setOrderType("1"); // 默认1销售物流, 2:采购物流 3:内部物流
  510. b.setScheduleSendDate(Calendar.getInstance().getTime()); // 发运日期TRNF_DTIME
  511. b.setShipperCompanyId(Long.valueOf(6)); // 发货企业代码 物流跟踪平台给出的新钢集团代码
  512. b.setReceiveCompanyName("新余新钢集团测试数据:005"); // 收货企业 合同单位 CUST_NM
  513. b.setShipperCity("新余市"); // 发货城市
  514. b.setShipperAddr("热卷厂"); // 发货地点 GET_ON_PCD
  515. b.setReceiveCity("南昌市"); // 收货城市,mes暂无
  516. b.setReceiveAddr("新余新钢集团测试数据:005"); // 到站地点 DEST_PCD_DESC
  517. b.setLoadTotalNums(5); // 根据发运指示号获得多少件数
  518. b.setLoadTotalWeight(new Double(22)); // 根据发运指示号获得总重量COIL_WGTs
  519. b.setCustomerName("新余新钢集团测试数据:005"); // 合同单位
  520. b.setLogisticsCompanyName("新余中新物流有限公司"); // 运输公司 SHIP_COMP_CD 上海春风物流有限公司
  521. b.setLoadDate(Calendar.getInstance().getTime()); // 明细打印日期(实际发运日期)当前时间
  522. b.setCarNo("赣K12345"); // 车牌号chepai1
  523. // 明细数据
  524. WayBillItem i = new WayBillItem();
  525. i.setPackageNo("package123"); // 钢卷号或者块序号OLD_SAMPL_NOs
  526. i.setGradeNo("50-1"); // 钢种SPEC_STL_GRDs
  527. i.setProductName("新余新钢集团测试数据:005"); // 产品名称SM_CFNM
  528. i.setWeight(Double.valueOf(42)); // 过磅重量
  529. i.setLoadWeight(Double.valueOf(41.28)); // 实际过磅重量
  530. i.setNums(Integer.valueOf(1)); // 装车件数
  531. i.setLoadNums(Integer.valueOf(1)); // 实际装车件数
  532. ArrayList<WayBillItem> li = new ArrayList<WayBillItem>();
  533. li.add(i);
  534. b.setWayBillItems(li);
  535. // 加密 签名
  536. try {
  537. String bill = JSON.toJSONString(b);
  538. System.out.println("bill:" + bill);
  539. // String iso = new String(bill.getBytes("UTF-8"),"ISO-8859-1");
  540. // System.out.println("iso:" + iso);
  541. // String utf8 = new String(iso.getBytes("ISO-8859-1"),"UTF-8");
  542. // System.out.println("utf8:" + utf8);
  543. String unic = ChangeCharset.stringToUnicode(bill);
  544. System.out.println("unic:" + unic);
  545. String unicTo = ChangeCharset.unicodeToString(unic);
  546. System.out.println("unicTo:" + unicTo);
  547. // 公钥加密
  548. byte[] cipherData = RSAUtils.encryptByPublicKey(
  549. unic.getBytes(),
  550. RSAUtils.loadPublicKeyByFile(b.getClass().getClassLoader()
  551. .getResource("cargocn_server_pub.key").getPath()));
  552. // byte[] cipherData = RSAUtils.encryptByPublicKey(bill.getBytes(),
  553. // RSAUtils.loadKeyStr("PUB"));
  554. String cipher = Base64.encode(cipherData);
  555. System.out.println("cipher:" + cipher);
  556. // 私钥加密
  557. String signstr = RSAUtils.sign(
  558. cipher.getBytes(),
  559. RSAUtils.loadPrivateKeyByFile(b.getClass().getClassLoader()
  560. .getResource("cargocn_client_pri.p8").getPath()));
  561. // String signstr = RSAUtils.sign(cipher.getBytes(),RSAUtils.loadKeyStr("PRI"));
  562. System.out.println("signstr:" + signstr);
  563. // 远程接口地址
  564. HttpPostUtil hu = new HttpPostUtil(forwardUrl);
  565. // 发送请求
  566. String ret = hu.post(cipher, signstr);
  567. System.out.println("ret:" + ret);
  568. // 转换请求返回参数json
  569. JSONObject jo = JSON.parseObject(ret);
  570. String result = jo.getString("result");
  571. String resultSign = jo.getString("sign");
  572. // 验证签名
  573. boolean tmp = RSAUtils.verify(
  574. result.getBytes(),
  575. RSAUtils.loadPublicKeyByFile(b.getClass().getClassLoader()
  576. .getResource("cargocn_server_pub.key").getPath()),
  577. resultSign);
  578. // boolean tmp = RSAUtils.verify(result.getBytes(), RSAUtils.loadKeyStr("PUB"),
  579. // resultSign);
  580. if (tmp) {
  581. // 解密
  582. byte[] res = RSAUtils.decryptByPrivateKey(
  583. Base64.decode(result), RSAUtils
  584. .loadPrivateKeyByFile(b.getClass()
  585. .getClassLoader()
  586. .getResource("cargocn_client_pri.p8")
  587. .getPath()));
  588. // byte[] res = RSAUtils.decryptByPrivateKey(
  589. // Base64.decode(result), RSAUtils.loadKeyStr("PRI"));
  590. String restr = new String(res);
  591. System.out.println("restr:" + restr);
  592. String unicTo1 = ChangeCharset.unicodeToString(unic);
  593. System.out.println("unicTo:" + unicTo1);
  594. }
  595. } catch (Exception e) {
  596. // TODO Auto-generated catch block
  597. e.printStackTrace();
  598. }
  599. }
  600. @Override
  601. public String runActivity(PosContext arg0) {
  602. // TODO Auto-generated method stub
  603. return null;
  604. }
  605. }