ERPServiceImpl.java 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. package com.uas.eis.service.Impl;
  2. import com.deppon.dop.module.sdk.shared.util.FastJsonUtil;
  3. import com.deppon.dop.module.sdk.shared.util.SecurityUtil;
  4. import com.kyexpress.openapi.sdk.KyeDefaultOpenApi;
  5. import com.sf.csim.express.service.CallExpressServiceTools;
  6. import com.sf.csim.express.service.HttpClientUtil;
  7. import com.sf.csim.express.service.IServiceCodeStandard;
  8. import com.sf.csim.express.service.code.ExpressServiceCodeEnum;
  9. import com.uas.eis.core.config.SpObserver;
  10. import com.uas.eis.dao.*;
  11. import com.uas.eis.entity.LogisticsPrice;
  12. import com.uas.eis.entity.dop.DoPApiResp;
  13. import com.uas.eis.entity.dop.DoPPriceQueryReq;
  14. import com.uas.eis.entity.dop.DoPResponseParam;
  15. import com.uas.eis.entity.ky.KYApiResp;
  16. import com.uas.eis.entity.ky.KYPirceData;
  17. import com.uas.eis.entity.ky.KYPriceQueryReq;
  18. import com.uas.eis.entity.sf.*;
  19. import com.uas.eis.service.ERPService;
  20. import com.uas.eis.utils.*;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  25. import org.springframework.stereotype.Service;
  26. import java.util.*;
  27. /**
  28. * @author wuyx
  29. * @email wuyx@usoftchina.com
  30. * @date 2024-09-03
  31. */
  32. @Service
  33. public class ERPServiceImpl implements ERPService {
  34. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  35. @Autowired
  36. private BaseDao baseDao;
  37. @Override
  38. public Map<String, Object> creatSFOrder(String master, Integer id,String emCode) {
  39. Map<String,Object> retMap = new HashMap<>();
  40. retMap.put("success",true);
  41. logger.info("creatSFOrder-Begin: id {}",master,id);
  42. SpObserver.putSp(master);
  43. SqlRowList outMsg = baseDao.queryForRowSet(" select pi_inoutno,pi_dockingstatus,pi_title,pi_address,pi_purposename,pi_expresscode,pi_dockingcode " +
  44. " from prodinout where pi_id = ? ",id);
  45. if(outMsg.next()){
  46. if(outMsg.getGeneralString("pi_dockingstatus").equals("已创建")){
  47. retMap.put("success",false);
  48. retMap.put("message","出货单已创建顺发订单.");
  49. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  50. return retMap;
  51. }
  52. Object[] obs = baseDao.getFieldsDataByCondition("JYX_ZS.DOCK_SF_CONFIG A "
  53. , new String[]{"CALL_URL","CLIENT_CODE","CHECK_WORD","ENABLE_"}, "username='"+master+"' and A.ENABLE_ = 1");
  54. if(!StringUtil.hasText(obs[0])){
  55. retMap.put("success",false);
  56. retMap.put("message","请联系管理员配置创建URL.");
  57. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  58. return retMap;
  59. }
  60. if(!StringUtil.hasText(obs[1])){
  61. retMap.put("success",false);
  62. retMap.put("message","请联系管理员配置丰桥平台顾客编码.");
  63. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  64. return retMap;
  65. }
  66. if(!StringUtil.hasText(obs[2])){
  67. retMap.put("success",false);
  68. retMap.put("message","请联系管理员配置丰桥平台校验码.");
  69. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  70. return retMap;
  71. }
  72. boolean prodFlag = (Integer.valueOf(obs[3].toString())!=0);
  73. Object emName = baseDao.getFieldDataByCondition("employee" , "em_name", "em_code='"+emCode+"'");
  74. if(emName == null){
  75. emName = "管理员("+emCode+")";
  76. }
  77. String inoutNo = outMsg.getGeneralString("pi_inoutno");
  78. String orderCode = outMsg.getGeneralString("pi_dockingcode");
  79. if(orderCode.length()>0){
  80. orderCode=inoutNo+"-"+(Integer.valueOf(orderCode.split("-")[1])+1);
  81. }else {
  82. orderCode=inoutNo+"-1";
  83. }
  84. String CLIENT_CODE = obs[1].toString(); //此处替换为您在丰桥平台获取的顾客编码
  85. //沙箱环境的地址 -PRO https://sfapi-sbox.sf-express.com/std/service
  86. //生产环境的地址 -PRO https://sfapi.sf-express.com/std/service
  87. String CALL_URL = obs[0].toString();
  88. //此处替换为您在丰桥平台获取的校验码 生产环境 "GgO0UoyQ5FssNLItii3olo63bQ80ErAE" 沙箱环境 "rMBhSYRa9OtUPkfX5mow01NlxDWtI411"
  89. String CHECK_WORD = obs[2].toString();
  90. String monthlyCard = "7551234567";
  91. if(prodFlag){
  92. monthlyCard = baseDao.getDBSetting("ProdInOut!Sale","monthlyCard");
  93. }
  94. //寄件人
  95. Object[] en = baseDao.getFieldsDataByCondition("enterprise" , new String[]{"EN_NAME","EN_DELIVERADDR"}, "1=1");
  96. String sendCop = en[0].toString().trim();
  97. String sendAddr = en[1].toString();
  98. String sendMan = baseDao.getDBSetting("ProdInOut!Sale","sendMan");
  99. String sendMobile = baseDao.getDBSetting("ProdInOut!Sale","sendMobile");
  100. IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER; //下订单
  101. CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
  102. Map<String, String> params = new HashMap<String, String>();
  103. String timeStamp = String.valueOf(System.currentTimeMillis());
  104. String msgData = "";
  105. SFCreatOrderReq sfOrder = new SFCreatOrderReq();
  106. sfOrder.setOrderId(orderCode);
  107. sfOrder.setMonthlyCard(monthlyCard);
  108. sfOrder.setIsSignBack(1);
  109. //寄件方信息
  110. List<SFContactInfo> contactInfoList = new ArrayList<>();
  111. SFContactInfo sendInfo = new SFContactInfo();
  112. sendInfo.setContactType(1);
  113. sendInfo.setCompany(sendCop);
  114. sendInfo.setContact(sendMan);
  115. sendInfo.setMobile(sendMobile);
  116. sendInfo.setAddress(sendAddr);
  117. contactInfoList.add(sendInfo);
  118. //到件方信息
  119. SFContactInfo receiveInfo = new SFContactInfo();
  120. receiveInfo.setContactType(2);
  121. receiveInfo.setCompany(outMsg.getGeneralString("pi_title"));
  122. receiveInfo.setContact(outMsg.getGeneralString("pi_purposename"));
  123. receiveInfo.setMobile(outMsg.getGeneralString("pi_expresscode"));
  124. receiveInfo.setAddress(outMsg.getGeneralString("pi_address"));
  125. contactInfoList.add(receiveInfo);
  126. sfOrder.setContactInfoList(contactInfoList);
  127. List<SFCargoDetail> cargoDetails = new ArrayList<>();
  128. /*SqlRowList outList = baseDao.queryForRowSet(" select pr_detail,pr_unit,sum(pd_outqty) outqty from prodiodetail left join product on pr_code = pd_prodcode where pd_piid = ? and pr_detail is not null group by pr_detail,pr_unit",id);
  129. while (outList.next()){
  130. SFCargoDetail cargoDetail = new SFCargoDetail();
  131. cargoDetail.setName(outList.getGeneralString("pr_detail"));
  132. cargoDetail.setUnit(outList.getGeneralString("pr_unit"));
  133. cargoDetail.setCount(outList.getGeneralDouble("outqty"));
  134. cargoDetails.add(cargoDetail);
  135. }*/
  136. sfOrder.setCargoDetails(cargoDetails);
  137. msgData = FlexJsonUtil.toJsonDeep(sfOrder);
  138. // System.out.println("====请求msgData:" + msgData);
  139. try {
  140. params.put("partnerID", CLIENT_CODE); // 顾客编码 ,对应丰桥上获取的clientCode
  141. params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
  142. params.put("serviceCode",standardService.getCode());// 接口服务码
  143. params.put("timestamp", timeStamp);
  144. params.put("msgData", msgData);
  145. params.put("msgDigest", tools.getMsgDigest(msgData,timeStamp,CHECK_WORD));
  146. long startTime = System.currentTimeMillis();
  147. // System.out.println("====调用实际请求:" + params);
  148. String result = HttpClientUtil.post(CALL_URL, params);
  149. // System.out.println("====调用丰桥的接口服务代码:" + String.valueOf(standardService.getCode()) + " 接口耗时:"+ String.valueOf(System.currentTimeMillis()-startTime)+"====");
  150. // System.out.println("===调用地址 ==="+CALL_URL);
  151. // System.out.println("===顾客编码 ==="+CLIENT_CODE);
  152. // System.out.println("===返回结果:" +result);
  153. SFApiResp sfApiResp = FlexJsonUtil.fromJson(result, SFApiResp.class);
  154. if(sfApiResp!=null){
  155. if("A1000".equals(sfApiResp.getApiResultCode())){
  156. String apiResultData = sfApiResp.getApiResultData();
  157. SFCreatOrderResp sfApiRespData = FlexJsonUtil.fromJson(apiResultData, SFCreatOrderResp.class);
  158. if(sfApiRespData.isSuccess()){
  159. SFCreateOrder sfOrderResp = sfApiRespData.getMsgData();
  160. StringBuffer waybillNoList = new StringBuffer();
  161. StringBuffer waybillNoP = new StringBuffer();
  162. StringBuffer waybillSon = new StringBuffer();
  163. StringBuffer waybillBack = new StringBuffer();
  164. if(!CollectionUtil.isEmpty(sfOrderResp.getWaybillNoInfoList())){
  165. for (SFWaybillNoInfo sfWaybillNoInfoResp:sfOrderResp.getWaybillNoInfoList()){
  166. // System.out.println("顺丰物流单号: ====="+sfWaybillNoInfoResp.getWaybillNo());
  167. String waybillNo = sfWaybillNoInfoResp.getWaybillNo();
  168. if(sfWaybillNoInfoResp.getWaybillType() == 1||sfWaybillNoInfoResp.getWaybillType() == 2){//运单号类型1:母单 2 :子单 3 : 签回单
  169. if(waybillNoList.length()>0){
  170. waybillNoList.append(",");
  171. }
  172. waybillNoList.append(waybillNo);
  173. if(sfWaybillNoInfoResp.getWaybillType() == 1) {
  174. if (waybillNoP.length() > 0) {
  175. waybillNoP.append(",");
  176. }
  177. waybillNoP.append(waybillNo);
  178. }else{
  179. if (waybillSon.length() > 0) {
  180. waybillSon.append(",");
  181. }
  182. waybillSon.append(waybillNo);
  183. }
  184. }else {
  185. if(waybillBack.length()>0){
  186. waybillBack.append(",");
  187. }
  188. waybillBack.append(waybillNo);
  189. }
  190. }
  191. }
  192. if(waybillNoList.length()>0){
  193. baseDao.execute("update prodinout set pi_dockingcode=?,pi_logisticscode = ?,pi_dockingstatus='已创建'" +
  194. ",pi_sfParentCode=?,pi_sfSonCode=?,pi_sfBackCode=?" +
  195. ",pi_sf_filterresult=?,pi_sf_remark=? where pi_id = ?"
  196. ,orderCode,waybillNoList.toString(),waybillNoP.toString(),waybillSon.toString(),waybillBack.toString()
  197. ,sfOrderResp.getFilterResult(),sfOrderResp.getRemark()
  198. ,id);
  199. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  200. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','创建顺发订单'" +
  201. ",'创建成功,顺发单号:"+orderCode+",物流单号:"+waybillNoList.toString()+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  202. } else {
  203. retMap.put("message","创建失败:["+sfApiRespData.getErrorCode()+"]"+sfApiRespData.getErrorMsg());
  204. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  205. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','创建顺发订单','"+retMap.get("message")+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  206. retMap.put("success",false);
  207. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  208. return retMap;
  209. }
  210. }else {
  211. retMap.put("message","创建失败:["+sfApiRespData.getErrorCode()+"]"+sfApiRespData.getErrorMsg());
  212. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  213. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','创建顺发订单','"+retMap.get("message")+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  214. retMap.put("success",false);
  215. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  216. return retMap;
  217. }
  218. }else {
  219. // System.out.println("code:"+sfApiResp.getApiResultCode()+"===apiResponseID:"+sfApiResp.getApiResponseID()+"===apiErrorMsg:"+sfApiResp.getApiErrorMsg());
  220. retMap.put("message","创建失败:["+sfApiResp.getApiResultCode()+"]"+sfApiResp.getApiErrorMsg());
  221. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  222. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','创建顺发订单','"+retMap.get("message")+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  223. retMap.put("success",false);
  224. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  225. return retMap;
  226. }
  227. }
  228. }catch (Exception e){
  229. e.printStackTrace();
  230. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  231. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','创建顺发订单','创建失败:"+(StringUtil.nvl(e.getMessage(),""))+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  232. retMap.put("success",false);
  233. retMap.put("message","创建失败"+(StringUtil.nvl(e.getMessage(),"")));
  234. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  235. return retMap;
  236. }
  237. }else {
  238. retMap.put("success",false);
  239. retMap.put("message","没有需要创建的出货单.");
  240. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  241. return retMap;
  242. }
  243. logger.info("creatSFOrder-End: id {}",master,id);
  244. retMap.put("message","创建成功。");
  245. return retMap;
  246. }
  247. @Override
  248. public Map<String, Object> cancelSFOrder(String master, Integer id, String emCode) {
  249. Map<String,Object> retMap = new HashMap<>();
  250. retMap.put("success",true);
  251. logger.info("cancelSFOrder-Begin: id {}",master,id);
  252. SpObserver.putSp(master);
  253. SqlRowList outMsg = baseDao.queryForRowSet(" select pi_inoutno,pi_dockingstatus,pi_dockingcode from prodinout where pi_id = ? ",id);
  254. if(outMsg.next()) {
  255. if (!outMsg.getGeneralString("pi_dockingstatus").equals("已创建")) {
  256. retMap.put("success", false);
  257. retMap.put("message", "出货单尚未创建顺发订单.");
  258. logger.info("cancelSFOrder-F: id {} err {}", master, id, retMap.get("message"));
  259. return retMap;
  260. }
  261. Object[] obs = baseDao.getFieldsDataByCondition("JYX_ZS.DOCK_SF_CONFIG A "
  262. , new String[]{"CALL_URL", "CLIENT_CODE", "CHECK_WORD", "ENABLE_"}, "username='" + master + "' and A.ENABLE_ = 1");
  263. if (!StringUtil.hasText(obs[0])) {
  264. retMap.put("success", false);
  265. retMap.put("message", "请联系管理员配置创建URL.");
  266. logger.info("cancelSFOrder-F: id {} err {}", master, id, retMap.get("message"));
  267. return retMap;
  268. }
  269. if (!StringUtil.hasText(obs[1])) {
  270. retMap.put("success", false);
  271. retMap.put("message", "请联系管理员配置丰桥平台顾客编码.");
  272. logger.info("cancelSFOrder-F: id {} err {}", master, id, retMap.get("message"));
  273. return retMap;
  274. }
  275. if (!StringUtil.hasText(obs[2])) {
  276. retMap.put("success", false);
  277. retMap.put("message", "请联系管理员配置丰桥平台校验码.");
  278. logger.info("cancelSFOrder-F: id {} err {}", master, id, retMap.get("message"));
  279. return retMap;
  280. }
  281. Object emName = baseDao.getFieldDataByCondition("employee" , "em_name", "em_code='"+emCode+"'");
  282. if(emName == null){
  283. emName = "管理员("+emCode+")";
  284. }
  285. String inoutNo = outMsg.getGeneralString("pi_inoutno");
  286. String orderCode = outMsg.getGeneralString("pi_dockingcode");
  287. String CLIENT_CODE = obs[1].toString(); //丰桥平台获取的顾客编码
  288. String CALL_URL = obs[0].toString(); //沙箱环境的地址 -PRO https://sfapi-sbox.sf-express.com/std/service 生产环境的地址 -PRO https://sfapi.sf-express.com/std/service
  289. String CHECK_WORD = obs[2].toString(); //丰桥平台获取的校验码 生产环境 "GgO0UoyQ5FssNLItii3olo63bQ80ErAE" 沙箱环境 "rMBhSYRa9OtUPkfX5mow01NlxDWtI411"
  290. IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_UPDATE_ORDER;//订单取消
  291. CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
  292. Map<String, String> params = new HashMap<String, String>();
  293. String timeStamp = String.valueOf(System.currentTimeMillis());
  294. String msgData = "";
  295. Map<String,Object> msgDataMap = new HashMap<>();
  296. msgDataMap.put("orderId",orderCode);
  297. msgDataMap.put("dealType",2);
  298. msgData = FlexJsonUtil.toJsonDeep(msgDataMap);
  299. try {
  300. params.put("partnerID", CLIENT_CODE); // 顾客编码 ,对应丰桥上获取的clientCode
  301. params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
  302. params.put("serviceCode",standardService.getCode());// 接口服务码
  303. params.put("timestamp", timeStamp);
  304. params.put("msgData", msgData);
  305. params.put("msgDigest", tools.getMsgDigest(msgData,timeStamp,CHECK_WORD));
  306. long startTime = System.currentTimeMillis();
  307. // System.out.println("====调用请求:" + params.get("msgData"));
  308. // System.out.println("====调用实际请求:" + params);
  309. String result = HttpClientUtil.post(CALL_URL, params);
  310. // System.out.println("====调用丰桥的接口服务代码:" + String.valueOf(standardService.getCode()) + " 接口耗时:"+ String.valueOf(System.currentTimeMillis()-startTime)+"====");
  311. // System.out.println("===调用地址 ==="+CALL_URL);
  312. // System.out.println("===顾客编码 ==="+CLIENT_CODE);
  313. // System.out.println("===返回结果:" +result);
  314. // Map<String,Object> resData = JacksonUtil.fromJson(result);
  315. SFApiResp sfApiResp = FlexJsonUtil.fromJson(result, SFApiResp.class);
  316. if(sfApiResp!=null){
  317. if("A1000".equals(sfApiResp.getApiResultCode())){
  318. String apiResultData = sfApiResp.getApiResultData();
  319. SFCancelOrderResp sfApiRespData = FlexJsonUtil.fromJson(apiResultData, SFCancelOrderResp.class);
  320. if(sfApiRespData.isSuccess()){
  321. SFCancelOrder sfOrderResp = sfApiRespData.getMsgData();
  322. StringBuffer waybillNo = new StringBuffer();
  323. if(!CollectionUtil.isEmpty(sfOrderResp.getWaybillNoInfoList())){
  324. for (SFWaybillNoInfo sfWaybillNoInfoResp:sfOrderResp.getWaybillNoInfoList()){
  325. // System.out.println("顺丰物流单号: ====="+sfWaybillNoInfoResp.getWaybillNo());
  326. if(waybillNo.length()>0){
  327. waybillNo.append(",");
  328. }
  329. waybillNo.append(sfWaybillNoInfoResp.getWaybillNo());
  330. }
  331. }
  332. if(sfOrderResp.getResStatus()==2){
  333. baseDao.execute("update prodinout set pi_logisticscode = null,pi_dockingstatus=null,pi_sfParentCode=null,pi_sfSonCode=null,pi_sfBackCode=null,pi_sf_filterresult=null,pi_sf_remark=null where pi_id = ?",id);
  334. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  335. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','取消顺发订单','取消成功"+(waybillNo.length()>0?",物流单号: "+waybillNo.toString():"")+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  336. }else {
  337. if(sfOrderResp.getResStatus()==1){
  338. retMap.put("message","取消失败:客户订单号与顺丰运单不匹配");
  339. }else {
  340. retMap.put("message","取消失败:["+sfOrderResp.getResStatus()+"]");
  341. }
  342. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  343. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','取消顺发订单','"+retMap.get("message")+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  344. retMap.put("success",false);
  345. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  346. return retMap;
  347. }
  348. }else {
  349. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  350. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','取消顺发订单','取消失败:["+sfApiRespData.getErrorCode()+"]"+sfApiRespData.getErrorMsg()+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  351. retMap.put("success",false);
  352. retMap.put("message","取消失败:["+sfApiRespData.getErrorCode()+"]"+sfApiRespData.getErrorMsg());
  353. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  354. return retMap;
  355. }
  356. }else {
  357. retMap.put("message","创建失败:["+sfApiResp.getApiResultCode()+"]"+sfApiResp.getApiErrorMsg());
  358. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  359. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','创建顺发订单','"+retMap.get("message")+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  360. retMap.put("success",false);
  361. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  362. return retMap;
  363. }
  364. }
  365. }catch (Exception e){
  366. e.printStackTrace();
  367. retMap.put("message","取消失败"+(StringUtil.nvl(e.getMessage(),"")));
  368. baseDao.execute("INSERT INTO MESSAGELOG(ML_ID, ML_DATE, ML_MAN, ML_CONTENT, ML_RESULT, ML_SEARCH, CODE) " +
  369. "values( MESSAGELOG_SEQ.nextval,SYSDATE,'"+emName+"','取消顺发订单','"+retMap.get("message")+"','ProdInOut!Sale|pi_id="+id+"','"+inoutNo+"')");
  370. retMap.put("success",false);
  371. logger.info("creatSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  372. return retMap;
  373. }
  374. }else {
  375. retMap.put("success",false);
  376. retMap.put("message","没有需要操作的出货单.");
  377. logger.info("cancelSFOrder-F: id {} err {}",master,id,retMap.get("message"));
  378. return retMap;
  379. }
  380. logger.info("cancelSFOrder-End: id {}",master,id);
  381. retMap.put("message","取消成功。");
  382. return retMap;
  383. }
  384. @Override
  385. public Map<String, Object> getLogisticsPrice(String master, Integer id) {
  386. SpObserver.putSp(master);
  387. Map<String, Object> modelMap = new HashMap<String, Object>();
  388. SqlRowList rs = baseDao.queryForRowSet("select LP_ID, LP_CODE, LP_INDATE, LP_CALDATE, LP_TYPE, LP_ROUTE, LP_WEIGHT, LP_VOLUME, LP_RECIPIENT, LP_TEL, LP_ADD, LP_RECORDER, LP_COMPANY1, LP_PROVINCE, LP_DISTRICT, LP_SENDDATETIME,to_char(LP_SENDDATETIME,'yyyy-mm-dd hh24:mi:ss') SENDDATETIME" +
  389. " from LogisticsPrice where lp_id="+id);
  390. if(rs.next()){
  391. Map<String, Object> data = new HashMap<String, Object>();
  392. baseDao.callProcedure("SP_LOGISTICSPRICE", new Object[] { rs.getInt("lp_id")});
  393. //顺丰
  394. getPrice_SF(id,rs.getGeneralString("LP_TYPE"),rs.getGeneralDouble("LP_WEIGHT"),rs.getGeneralDouble("LP_VOLUME"),
  395. rs.getGeneralString("lp_province"),
  396. rs.getGeneralString("lp_route"),
  397. "广东省","深圳市",
  398. rs.getDate("LP_SENDDATETIME"));
  399. //跨越
  400. getPrice_KY(id,rs.getGeneralString("LP_TYPE"),rs.getGeneralDouble("LP_WEIGHT"),
  401. rs.getGeneralString("lp_province"),
  402. rs.getGeneralString("lp_route"),
  403. rs.getDate("LP_SENDDATETIME"));
  404. //德邦
  405. getPrice_DoP(id,rs.getGeneralString("LP_TYPE"),rs.getGeneralDouble("LP_WEIGHT"),rs.getGeneralDouble("LP_VOLUME"),
  406. rs.getGeneralString("lp_province"),
  407. rs.getGeneralString("lp_route"),
  408. rs.getGeneralString("lp_district"),
  409. rs.getDate("LP_SENDDATETIME")
  410. );
  411. modelMap.put("success", true);
  412. }else{
  413. modelMap.put("message", "单据不存在!");
  414. modelMap.put("success", false);
  415. }
  416. return modelMap;
  417. }
  418. private Map<String, Object> creatOrder_SF(LogisticsPrice logisticsPrice){
  419. Map<String, Object> retMap = new HashMap<String, Object>();
  420. logger.info("creatSFOrder-Begin");
  421. String emCode=logisticsPrice.getLp_Recorder();
  422. Object[] obs = baseDao.getFieldsDataByCondition("SZSI_P.DOCK_LOGISTICS_CONFIG A "
  423. , new String[]{"CALL_URL","CLIENT_CODE","CHECK_WORD","ENABLE_"}, "LOGISTICS_='SFTEST' and type_='CREATEORDER' AND A.ENABLE_ = 1");
  424. if(!StringUtil.hasText(obs[0])){
  425. retMap.put("success",false);
  426. retMap.put("message","请联系管理员配置创建URL.");
  427. logger.info("creatSFOrder-F:id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  428. return retMap;
  429. }
  430. if(!StringUtil.hasText(obs[1])){
  431. retMap.put("success",false);
  432. retMap.put("message","请联系管理员配置丰桥平台顾客编码.");
  433. logger.info("creatSFOrder-F:id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  434. return retMap;
  435. }
  436. if(!StringUtil.hasText(obs[2])){
  437. retMap.put("success",false);
  438. retMap.put("message","请联系管理员配置丰桥平台校验码.");
  439. logger.info("creatSFOrder-F:id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  440. return retMap;
  441. }
  442. boolean prodFlag = (Integer.valueOf(obs[3].toString())!=0);
  443. Object emName = baseDao.getFieldDataByCondition("employee" , "em_name", "em_code='"+emCode+"'");
  444. if(emName == null){
  445. emName = "管理员("+emCode+")";
  446. }
  447. String inoutNo = logisticsPrice.getLp_Code();
  448. String orderCode = logisticsPrice.getLp_DockingCode();
  449. if(orderCode!=null && orderCode.length()>0){
  450. orderCode=inoutNo+"-"+(Integer.valueOf(orderCode.split("-")[1])+1);
  451. }else {
  452. orderCode=inoutNo+"-1";
  453. }
  454. String CLIENT_CODE = obs[1].toString(); //此处替换为您在丰桥平台获取的顾客编码
  455. String CALL_URL = obs[0].toString();
  456. String CHECK_WORD = obs[2].toString();
  457. String monthlyCard = "7551234567";//7550911545";//后续看是否区分市场部和其他部门 先用市场部门的 测试 7551234567
  458. //寄件人
  459. Object[] en = baseDao.getFieldsDataByCondition("enterprise" , new String[]{"EN_NAME","EN_DELIVERADDR"}, "1=1");
  460. String sendCop = en[0].toString().trim();
  461. String sendAddr = en[1].toString();
  462. String sendMan = logisticsPrice.getLp_Recorder();
  463. String sendMobile = baseDao.getFieldValue("employee","max(em_mobile)","em_name='"+ logisticsPrice.getLp_Recorder()+"'",String.class);
  464. IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER; //下订单
  465. CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
  466. Map<String, String> params = new HashMap<String, String>();
  467. String timeStamp = String.valueOf(System.currentTimeMillis());
  468. String msgData = "";
  469. SFCreatOrderReq sfOrder = new SFCreatOrderReq();
  470. sfOrder.setOrderId(orderCode);
  471. sfOrder.setMonthlyCard(monthlyCard);
  472. sfOrder.setTotalWeight(logisticsPrice.getLp_Weight());
  473. int expressTypeId=0;
  474. if("特快".equals(logisticsPrice.getLp_Type())){
  475. expressTypeId=1;
  476. }else if("普快".equals(logisticsPrice.getLp_Type())){
  477. expressTypeId=2;
  478. }else if("物流".equals(logisticsPrice.getLp_Type())){
  479. expressTypeId=255;//卡航
  480. }
  481. sfOrder.setExpressTypeId(expressTypeId);
  482. //sfOrder.setIsSignBack(1);//回签
  483. //寄件方信息
  484. List<SFContactInfo> contactInfoList = new ArrayList<>();
  485. SFContactInfo sendInfo = new SFContactInfo();
  486. sendInfo.setContactType(1);
  487. sendInfo.setCompany(sendCop);
  488. sendInfo.setContact(sendMan);
  489. sendInfo.setMobile(sendMobile);
  490. sendInfo.setAddress(sendAddr);
  491. contactInfoList.add(sendInfo);
  492. //到件方信息
  493. SFContactInfo receiveInfo = new SFContactInfo();
  494. receiveInfo.setContactType(2);
  495. receiveInfo.setCompany(logisticsPrice.getLp_ReceiveCompany());
  496. receiveInfo.setContact(logisticsPrice.getLp_Recipient());
  497. receiveInfo.setMobile(logisticsPrice.getLp_Tel());
  498. receiveInfo.setAddress(logisticsPrice.getLp_Add());
  499. contactInfoList.add(receiveInfo);
  500. sfOrder.setContactInfoList(contactInfoList);
  501. List<SFCargoDetail> cargoDetails = new ArrayList<>();
  502. sfOrder.setCargoDetails(cargoDetails);
  503. msgData = FlexJsonUtil.toJsonDeep(sfOrder);
  504. System.out.println("====请求msgData:" + msgData);
  505. try {
  506. params.put("partnerID", CLIENT_CODE); // 顾客编码 ,对应丰桥上获取的clientCode
  507. params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
  508. params.put("serviceCode",standardService.getCode());// 接口服务码
  509. params.put("timestamp", timeStamp);
  510. params.put("msgData", msgData);
  511. params.put("msgDigest", tools.getMsgDigest(msgData,timeStamp,CHECK_WORD));
  512. System.out.println("====调用实际请求:" + params);
  513. String result = HttpClientUtil.post(CALL_URL, params);
  514. SFApiResp sfApiResp = FlexJsonUtil.fromJson(result, SFApiResp.class);
  515. System.out.println("result:"+result);
  516. if(sfApiResp!=null){
  517. if("A1000".equals(sfApiResp.getApiResultCode())){
  518. String apiResultData = sfApiResp.getApiResultData();
  519. SFCreatOrderResp sfApiRespData = FlexJsonUtil.fromJson(apiResultData, SFCreatOrderResp.class);
  520. if(sfApiRespData.isSuccess()){
  521. SFCreateOrder sfOrderResp = sfApiRespData.getMsgData();
  522. StringBuffer waybillNoList = new StringBuffer();
  523. StringBuffer waybillNoP = new StringBuffer();
  524. StringBuffer waybillSon = new StringBuffer();
  525. StringBuffer waybillBack = new StringBuffer();
  526. if(!CollectionUtil.isEmpty(sfOrderResp.getWaybillNoInfoList())){
  527. for (SFWaybillNoInfo sfWaybillNoInfoResp:sfOrderResp.getWaybillNoInfoList()){
  528. String waybillNo = sfWaybillNoInfoResp.getWaybillNo();
  529. if(sfWaybillNoInfoResp.getWaybillType() == 1||sfWaybillNoInfoResp.getWaybillType() == 2){//运单号类型1:母单 2 :子单 3 : 签回单
  530. System.out.println("顺丰物流单号: ====="+sfWaybillNoInfoResp.getWaybillNo());
  531. if(waybillNoList.length()>0){
  532. waybillNoList.append(",");
  533. }
  534. waybillNoList.append(waybillNo);
  535. if(sfWaybillNoInfoResp.getWaybillType() == 1) {
  536. if (waybillNoP.length() > 0) {
  537. waybillNoP.append(",");
  538. }
  539. waybillNoP.append(waybillNo);
  540. }else{
  541. if (waybillSon.length() > 0) {
  542. waybillSon.append(",");
  543. }
  544. waybillSon.append(waybillNo);
  545. }
  546. }else {
  547. if(waybillBack.length()>0){
  548. waybillBack.append(",");
  549. }
  550. waybillBack.append(waybillNo);
  551. }
  552. }
  553. }
  554. if(waybillNoList.length()>0){
  555. retMap.put("success",true);
  556. retMap.put("logisticscode",waybillNoList.toString());
  557. retMap.put("dockingcode",orderCode);
  558. } else {
  559. retMap.put("message","创建失败:["+sfApiRespData.getErrorCode()+"]"+sfApiRespData.getErrorMsg());
  560. retMap.put("success",false);
  561. logger.info("creatSFOrder-F:id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  562. return retMap;
  563. }
  564. }else {
  565. retMap.put("message","创建失败:["+sfApiRespData.getErrorCode()+"]"+sfApiRespData.getErrorMsg());
  566. retMap.put("success",false);
  567. logger.info("creatSFOrder-F: id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  568. return retMap;
  569. }
  570. }else {
  571. // System.out.println("code:"+sfApiResp.getApiResultCode()+"===apiResponseID:"+sfApiResp.getApiResponseID()+"===apiErrorMsg:"+sfApiResp.getApiErrorMsg());
  572. retMap.put("message","创建失败:["+sfApiResp.getApiResultCode()+"]"+sfApiResp.getApiErrorMsg());
  573. retMap.put("success",false);
  574. logger.info("creatSFOrder-F:id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  575. return retMap;
  576. }
  577. }
  578. }catch (Exception e){
  579. e.printStackTrace();
  580. retMap.put("success",false);
  581. retMap.put("message","创建失败"+(StringUtil.nvl(e.getMessage(),"")));
  582. logger.info("creatSFOrder-F:id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  583. return retMap;
  584. }
  585. return retMap;
  586. }
  587. private Map<String, Object> cancelOrder_SF(LogisticsPrice logisticsPrice){
  588. Map<String,Object> retMap = new HashMap<>();
  589. retMap.put("success",true);
  590. logger.info("cancelSFOrder-Begin: id {}",logisticsPrice.getLp_Id());
  591. if(logisticsPrice!=null) {
  592. String emCode=logisticsPrice.getLp_Recorder();
  593. if (!"已创建".equals(logisticsPrice.getLp_dockingstatus())) {
  594. retMap.put("success", false);
  595. retMap.put("message", "尚未创建快递订单.");
  596. logger.info("cancelSFOrder-F: id {} err {}", logisticsPrice.getLp_Id(), retMap.get("message"));
  597. return retMap;
  598. }
  599. Object[] obs = baseDao.getFieldsDataByCondition("SZSI_P.DOCK_LOGISTICS_CONFIG A "
  600. , new String[]{"CALL_URL","CLIENT_CODE","CHECK_WORD","ENABLE_"}, "LOGISTICS_='SFTEST' and type_='CANCELORDER' AND A.ENABLE_ = 1");
  601. if (!StringUtil.hasText(obs[0])) {
  602. retMap.put("success", false);
  603. retMap.put("message", "请联系管理员配置创建URL.");
  604. logger.info("cancelSFOrder-F: id {} err {}", logisticsPrice.getLp_Id(), retMap.get("message"));
  605. return retMap;
  606. }
  607. if (!StringUtil.hasText(obs[1])) {
  608. retMap.put("success", false);
  609. retMap.put("message", "请联系管理员配置丰桥平台顾客编码.");
  610. logger.info("cancelSFOrder-F: id {} err {}", logisticsPrice.getLp_Id(), retMap.get("message"));
  611. return retMap;
  612. }
  613. if (!StringUtil.hasText(obs[2])) {
  614. retMap.put("success", false);
  615. retMap.put("message", "请联系管理员配置丰桥平台校验码.");
  616. logger.info("cancelSFOrder-F: id {} err {}", logisticsPrice.getLp_Id(), retMap.get("message"));
  617. return retMap;
  618. }
  619. Object emName = baseDao.getFieldDataByCondition("employee" , "em_name", "em_code='"+emCode+"'");
  620. if(emName == null){
  621. emName = "管理员("+emCode+")";
  622. }
  623. String inoutNo = logisticsPrice.getLp_Code();
  624. String orderCode = logisticsPrice.getLp_DockingCode();
  625. String CLIENT_CODE = obs[1].toString(); //丰桥平台获取的顾客编码
  626. String CALL_URL = obs[0].toString(); //沙箱环境的地址 -PRO https://sfapi-sbox.sf-express.com/std/service 生产环境的地址 -PRO https://sfapi.sf-express.com/std/service
  627. String CHECK_WORD = obs[2].toString(); //丰桥平台获取的校验码 生产环境 "GgO0UoyQ5FssNLItii3olo63bQ80ErAE" 沙箱环境 "rMBhSYRa9OtUPkfX5mow01NlxDWtI411"
  628. IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_UPDATE_ORDER;//订单取消
  629. CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
  630. Map<String, String> params = new HashMap<String, String>();
  631. String timeStamp = String.valueOf(System.currentTimeMillis());
  632. String msgData = "";
  633. Map<String,Object> msgDataMap = new HashMap<>();
  634. msgDataMap.put("orderId",orderCode);
  635. msgDataMap.put("dealType",2);
  636. msgData = FlexJsonUtil.toJsonDeep(msgDataMap);
  637. try {
  638. params.put("partnerID", CLIENT_CODE); // 顾客编码 ,对应丰桥上获取的clientCode
  639. params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
  640. params.put("serviceCode",standardService.getCode());// 接口服务码
  641. params.put("timestamp", timeStamp);
  642. params.put("msgData", msgData);
  643. params.put("msgDigest", tools.getMsgDigest(msgData,timeStamp,CHECK_WORD));
  644. System.out.println("====调用请求:" + params.get("msgData"));
  645. String result = HttpClientUtil.post(CALL_URL, params);
  646. System.out.println("===返回结果:" +result);
  647. SFApiResp sfApiResp = FlexJsonUtil.fromJson(result, SFApiResp.class);
  648. if(sfApiResp!=null){
  649. if("A1000".equals(sfApiResp.getApiResultCode())){
  650. String apiResultData = sfApiResp.getApiResultData();
  651. SFCancelOrderResp sfApiRespData = FlexJsonUtil.fromJson(apiResultData, SFCancelOrderResp.class);
  652. if(sfApiRespData.isSuccess()){
  653. SFCancelOrder sfOrderResp = sfApiRespData.getMsgData();
  654. StringBuffer waybillNo = new StringBuffer();
  655. if(!CollectionUtil.isEmpty(sfOrderResp.getWaybillNoInfoList())){
  656. for (SFWaybillNoInfo sfWaybillNoInfoResp:sfOrderResp.getWaybillNoInfoList()){
  657. if(waybillNo.length()>0){
  658. waybillNo.append(",");
  659. }
  660. waybillNo.append(sfWaybillNoInfoResp.getWaybillNo());
  661. }
  662. }
  663. if(sfOrderResp.getResStatus()==2){
  664. retMap.put("success",true);
  665. retMap.put("logisticscode",waybillNo.length()>0?waybillNo.toString():"");
  666. }else {
  667. if(sfOrderResp.getResStatus()==1){
  668. retMap.put("message","取消失败:客户订单号与顺丰运单不匹配");
  669. }else {
  670. retMap.put("message","取消失败:["+sfOrderResp.getResStatus()+"]");
  671. }
  672. retMap.put("success",false);
  673. logger.info("creatSFOrder-F: id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  674. return retMap;
  675. }
  676. }else {
  677. retMap.put("success",false);
  678. retMap.put("message","取消失败:["+sfApiRespData.getErrorCode()+"]"+sfApiRespData.getErrorMsg());
  679. logger.info("creatSFOrder-F: id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  680. return retMap;
  681. }
  682. }else {
  683. retMap.put("message","取消失败:["+sfApiResp.getApiResultCode()+"]"+sfApiResp.getApiErrorMsg());
  684. retMap.put("success",false);
  685. logger.info("creatSFOrder-F: id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  686. return retMap;
  687. }
  688. }
  689. }catch (Exception e){
  690. e.printStackTrace();
  691. retMap.put("message","取消失败"+(StringUtil.nvl(e.getMessage(),""))); retMap.put("success",false);
  692. logger.info("creatSFOrder-F: id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  693. return retMap;
  694. }
  695. }else {
  696. retMap.put("success",false);
  697. retMap.put("message","没有需要操作的单据.");
  698. logger.info("cancelSFOrder-F: id {} err {}",logisticsPrice.getLp_Id(),retMap.get("message"));
  699. return retMap;
  700. }
  701. logger.info("cancelSFOrder-End: id {}",logisticsPrice.getLp_Id());
  702. retMap.put("message","取消成功。");
  703. return retMap;
  704. }
  705. private Map<String, Object> creatOrder_DoP(LogisticsPrice logisticsPrice){
  706. Map<String, Object> modelMap = new HashMap<String, Object>();
  707. logger.info("creatDOPOrder-Begin");
  708. return modelMap;
  709. }
  710. private Map<String, Object> cancelOrder_DoP(LogisticsPrice logisticsPrice){
  711. Map<String, Object> modelMap = new HashMap<String, Object>();
  712. logger.info("cancelDOPOrder-Begin");
  713. return modelMap;
  714. }
  715. private Map<String, Object> creatOrder_KY(LogisticsPrice logisticsPrice){
  716. Map<String, Object> modelMap = new HashMap<String, Object>();
  717. logger.info("creatKYOrder-Begin");
  718. return modelMap;
  719. }
  720. private Map<String, Object> cancelOrder_KY(LogisticsPrice logisticsPrice){
  721. Map<String, Object> modelMap = new HashMap<String, Object>();
  722. logger.info("cancelKYOrder-Begin");
  723. return modelMap;
  724. }
  725. @Override
  726. public Map<String, Object> creatOrder(String master, Integer id) {
  727. SpObserver.putSp(master);
  728. Map<String, Object> modelMap = new HashMap<String, Object>();
  729. LogisticsPrice logisticsPrice=baseDao.getJdbcTemplate().queryForObject("select * from LogisticsPrice where lp_id="+id, new BeanPropertyRowMapper<LogisticsPrice>(LogisticsPrice.class));
  730. if(logisticsPrice != null){
  731. if("顺丰".equals(logisticsPrice.getLp_FinalCompany())){
  732. creatOrder_SF(logisticsPrice);
  733. }else if("德邦".equals(logisticsPrice.getLp_FinalCompany())){
  734. creatOrder_DoP(logisticsPrice);
  735. }else if("跨越".equals(logisticsPrice.getLp_FinalCompany())){
  736. creatOrder_KY(logisticsPrice);
  737. }
  738. }else{
  739. modelMap.put("message", "单据不存在!");
  740. modelMap.put("success", false);
  741. }
  742. return modelMap;
  743. }
  744. @Override
  745. public Map<String, Object> cancelOrder(String master, Integer id) {
  746. SpObserver.putSp(master);
  747. Map<String, Object> modelMap = new HashMap<String, Object>();
  748. LogisticsPrice logisticsPrice=baseDao.getJdbcTemplate().queryForObject("select * from LogisticsPrice where lp_id="+id, new BeanPropertyRowMapper<LogisticsPrice>(LogisticsPrice.class));
  749. if(logisticsPrice != null){
  750. if("顺丰".equals(logisticsPrice.getLp_FinalCompany())){
  751. cancelOrder_SF(logisticsPrice);
  752. }else if("德邦".equals(logisticsPrice.getLp_FinalCompany())){
  753. cancelOrder_DoP(logisticsPrice);
  754. }else if("跨越".equals(logisticsPrice.getLp_FinalCompany())){
  755. cancelOrder_KY(logisticsPrice);
  756. }
  757. }else{
  758. modelMap.put("message", "单据不存在!");
  759. modelMap.put("success", false);
  760. }
  761. return modelMap;
  762. }
  763. @Override
  764. public void getSFPrice(String master, Integer id) {
  765. SpObserver.putSp(master);
  766. Map<String, Object> modelMap = new HashMap<String, Object>();
  767. SqlRowList rs = baseDao.queryForRowSet("select LP_ID, LP_CODE, LP_INDATE, LP_CALDATE, LP_TYPE, LP_ROUTE, LP_WEIGHT, LP_VOLUME, LP_RECIPIENT, LP_TEL, LP_ADD, LP_RECORDER, LP_COMPANY1, LP_PROVINCE, LP_DISTRICT, LP_SENDDATETIME,to_char(LP_SENDDATETIME,'yyyy-mm-dd hh24:mi:ss') SENDDATETIME" +
  768. " from LogisticsPrice where lp_id="+id);
  769. if(rs.next()){
  770. getPrice_SF(id,rs.getGeneralString("LP_TYPE"),rs.getGeneralDouble("LP_WEIGHT"),rs.getGeneralDouble("LP_VOLUME"),
  771. rs.getGeneralString("lp_province"),
  772. rs.getGeneralString("lp_route"),
  773. "广东省","深圳市",
  774. rs.getDate("LP_SENDDATETIME"));
  775. }
  776. }
  777. @Override
  778. public void getKYPrice(String master, Integer id) {
  779. SpObserver.putSp(master);
  780. Map<String, Object> modelMap = new HashMap<String, Object>();
  781. SqlRowList rs = baseDao.queryForRowSet("select LP_ID, LP_CODE, LP_INDATE, LP_CALDATE, LP_TYPE, LP_ROUTE, LP_WEIGHT, LP_VOLUME, LP_RECIPIENT, LP_TEL, LP_ADD, LP_RECORDER, LP_COMPANY1, LP_PROVINCE, LP_DISTRICT, LP_SENDDATETIME,to_char(LP_SENDDATETIME,'yyyy-mm-dd hh24:mi:ss') SENDDATETIME" +
  782. " from LogisticsPrice where lp_id="+id);
  783. if(rs.next()){
  784. getPrice_KY(id,rs.getGeneralString("LP_TYPE"),rs.getGeneralDouble("LP_WEIGHT"),
  785. rs.getGeneralString("lp_province"),
  786. rs.getGeneralString("lp_route"),
  787. rs.getDate("LP_SENDDATETIME"));
  788. }
  789. }
  790. @Override
  791. public void getDOPPrice(String master, Integer id) {
  792. SpObserver.putSp(master);
  793. Map<String, Object> modelMap = new HashMap<String, Object>();
  794. SqlRowList rs = baseDao.queryForRowSet("select LP_ID, LP_CODE, LP_INDATE, LP_CALDATE, LP_TYPE, LP_ROUTE, LP_WEIGHT, LP_VOLUME, LP_RECIPIENT, LP_TEL, LP_ADD, LP_RECORDER, LP_COMPANY1, LP_PROVINCE, LP_DISTRICT, LP_SENDDATETIME,to_char(LP_SENDDATETIME,'yyyy-mm-dd hh24:mi:ss') SENDDATETIME" +
  795. " from LogisticsPrice where lp_id="+id);
  796. if(rs.next()){
  797. getPrice_DoP(id,rs.getGeneralString("LP_TYPE"),rs.getGeneralDouble("LP_WEIGHT"),rs.getGeneralDouble("LP_VOLUME"),
  798. rs.getGeneralString("lp_province"),
  799. rs.getGeneralString("lp_route"),
  800. rs.getGeneralString("lp_district"),
  801. rs.getDate("LP_SENDDATETIME")
  802. );
  803. }
  804. }
  805. //
  806. private Map<String, Object> getPrice_DoP(Integer id,String type,double weight,double volume,String province_d,String city_d,String district,Date sendDateTime){
  807. /*
  808. * http://dpsanbox.deppon.com/sandbox-web/standard-order/queryPriceTime.action
  809. * params String 核算请求参数 是
  810. digest String 区域密文摘要 是
  811. timestamp String 核算当前时间戳 ,当前时间毫秒数 是
  812. companyCode String 核算第三方接入商的公司编码(双方约定,建议公司简拼或者代码,字母大写)请求报文字段 是
  813. * */
  814. Map<String,Object> retMap = new HashMap<>();
  815. try{
  816. Object[] obs = baseDao.getFieldsDataByCondition("SZSI_P.DOCK_LOGISTICS_CONFIG A "
  817. , new String[]{"CALL_URL","CLIENT_CODE","CHECK_WORD","ENABLE_"}, "LOGISTICS_='DOP' and type_='GETPRICE' AND A.ENABLE_ = 1");
  818. String CALL_URL = obs[0].toString();
  819. String CHECK_WORD = obs[1].toString();
  820. /* 特快:TZKJC(特快当日)
  821. 普快:RCP(大件快递3.60)
  822. 物流:HKDJG(航空大件隔日达)
  823. */
  824. if(volume==0){
  825. volume=0.001;
  826. }else{
  827. volume=volume*0.000001;//ERP单位立方厘米 DOP接口单为立方米
  828. }
  829. String businessType="";
  830. if("特快".equals(type)){
  831. businessType="TZKJC";
  832. }else if("普快".equals(type)){
  833. businessType="RCP";//RCP
  834. }else if("物流".equals(type)){
  835. businessType="NFLF";//新精准卡航:NFLF
  836. }
  837. /* originalsStreet": "上海-上海市-长宁区",
  838. "originalsaddress": "上海-上海市-长宁区",
  839. "sendDateTime": "2018-08-07 11:00:03",
  840. "totalVolume": 0.001,
  841. "totalWeight": 500,*/
  842. DoPPriceQueryReq doPPriceQueryReq=new DoPPriceQueryReq();
  843. //目标城市
  844. doPPriceQueryReq.setOriginalsStreet(province_d+"-"+city_d+"-"+district);
  845. //出发城市
  846. doPPriceQueryReq.setOriginalsaddress("广东省-深圳市-龙岗区");
  847. doPPriceQueryReq.setSendDateTime(DateUtil.format(sendDateTime,"yyyy-MM-dd HH:mm:ss"));
  848. doPPriceQueryReq.setTotalVolume(String.valueOf(volume));
  849. doPPriceQueryReq.setTotalWeight( String.valueOf(weight));
  850. doPPriceQueryReq.setProductCode(businessType);//特快专递
  851. String msgData = FastJsonUtil.toJSONString(doPPriceQueryReq);
  852. String timeStamp = SecurityUtil.getTimestamp();
  853. Map<String, String> params = new HashMap<String, String>();
  854. String appkey="8626840f067f147f983c499e03e1a873";
  855. String digest= SecurityUtil.getDigest(msgData+appkey+timeStamp);
  856. params.put("params", msgData);
  857. params.put("digest", digest);
  858. params.put("timestamp", timeStamp);
  859. params.put("companyCode", CHECK_WORD);
  860. System.out.println(msgData);
  861. String result = HttpClientUtil.post(CALL_URL, params);
  862. System.out.println(result);
  863. DoPApiResp doPApiResp= FlexJsonUtil.fromJson(result, DoPApiResp.class);
  864. if("true".equals(doPApiResp.getResult())){
  865. for(DoPResponseParam dop:doPApiResp.getResponseParam()){
  866. if(businessType.equals(dop.getProducteCode())){
  867. baseDao.execute("update LogisticsPrice set lp_msg2='',LP_REALTIMEPRICE2="+dop.getTotalfee()+" where lp_id="+id);
  868. }
  869. }
  870. }else{
  871. baseDao.execute("update LogisticsPrice set lp_msg2='"+doPApiResp.getReason()+"',LP_REALTIMEPRICE2=0 where lp_id="+id);
  872. }
  873. return retMap;
  874. }catch (Exception e){
  875. e.printStackTrace();
  876. retMap.put("success",false);
  877. retMap.put("message","获取失败"+(StringUtil.nvl(e.getMessage(),"")));
  878. logger.info("getPrice_dop-F:id {} err {}",id,retMap.get("message"));
  879. return retMap;
  880. }
  881. }
  882. //跨越
  883. private Map<String, Object> getPrice_KY(Integer id,String type,double weight,String province_d,String city_d,Date sendDateTime){
  884. /*
  885. 正式环境:https://open.ky-express.com/router/rest
  886. 沙箱环境:https://open.ky-express.com/sandbox/router/rest
  887. ======================================================
  888. 参数名称 类型 是否必填 描述
  889. appkey string 是 应用key 11000
  890. format string 是 返回参数格式(默认json) json
  891. timestamp string 否 时间戳 12345672333
  892. method string 是 请求方法 open.api.openCommon.queryFreightCharge
  893. sign string 否 签名 CF529FFB8B49499EC30BE2C29C02AE67
  894. token string 是 请求票据 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....
  895. */
  896. Map<String,Object> retMap = new HashMap<>();
  897. try{
  898. Object[] obs = baseDao.getFieldsDataByCondition("SZSI_P.DOCK_LOGISTICS_CONFIG A "
  899. , new String[]{"CALL_URL","CLIENT_CODE","CHECK_WORD","ENABLE_"}, "LOGISTICS_='KY' and type_='GETPRICE' AND A.ENABLE_ = 1");
  900. String timeStamp = String.valueOf(System.currentTimeMillis());
  901. // 是否沙盒环境 true标识沙盒环境,false标识正式环境,发布生产环境时注意切换
  902. boolean isSandbox = false;
  903. Map<String, String> params = new HashMap<String, String>();
  904. String appkey="83955";//obs[1].toString();
  905. String appSecret = obs[2].toString();//"46129BED8B381806B1FE15562523E2E0";
  906. String businessType="";
  907. /*次日达(特快),隔日达(普快),陆运件(物流)
  908. * 10-当天达,20-次日达,30-隔日达,40-陆运件,50-同城次日,70-同城即日,160-省内次日,170-省内即日,210-空运,220-专运
  909. * */
  910. if("特快".equals(type)){
  911. businessType="20";
  912. }else if("普快".equals(type)){
  913. businessType="30";
  914. }else if("物流".equals(type)){
  915. businessType="40";
  916. if("深圳市".equals(city_d)){
  917. businessType="50";
  918. }else if("广东省".equals(province_d)){
  919. businessType="160";
  920. }
  921. }
  922. System.out.println("businessType:"+businessType);
  923. params.put("format","json");
  924. params.put("timestamp",timeStamp);
  925. String method="open.api.openCommon.queryFreightCharge";
  926. KYPriceQueryReq kyPriceQueryReq=new KYPriceQueryReq();
  927. kyPriceQueryReq.setBeginAreaCode("0755");
  928. kyPriceQueryReq.setBeginCityName("深圳");
  929. kyPriceQueryReq.setBillingTime(DateUtil.format(sendDateTime,"yyyy-MM-dd HH:mm:ss"));
  930. kyPriceQueryReq.setEndCityName(city_d);
  931. kyPriceQueryReq.setWeight(weight);
  932. String bizBody = FlexJsonUtil.toJsonDeep(kyPriceQueryReq);
  933. System.out.println("msgData:"+bizBody);
  934. String result = KyeDefaultOpenApi.builder(appkey, appSecret ) //应用Key,密钥
  935. .env("prod") // //对应环境,包含(uat:测试环境,prod:生产环境),获取对应环境的请求路径
  936. .api(method) //所调用Api Code
  937. .sandbox(isSandbox) //是否沙盒环境(env=prod且isSandbox=true时对应的就是跨越测试环境)
  938. .body(bizBody) //请求体参数,可接受字符串,List,Map三种类型的参数
  939. .connectTimeout(3000) //连接超时时间
  940. .readTimeout(15000) //读取超时时间
  941. .request()
  942. .response();
  943. System.out.println(result);
  944. KYApiResp kyApiResp= FlexJsonUtil.fromJson(result, KYApiResp.class);
  945. if(kyApiResp.isSuccess()){
  946. for(KYPirceData ky:kyApiResp.getData()){
  947. if(businessType.equals(ky.getServiceMode())){
  948. if(ky.getTotalJF()!=null){
  949. baseDao.execute("update LogisticsPrice set lp_msg3='',LP_REALTIMEPRICE3="+ky.getTotalJF()+" where lp_id="+id);
  950. }else{
  951. baseDao.execute("update LogisticsPrice set lp_msg3='"+ky.getRetMsg()+"',LP_REALTIMEPRICE3=0 where lp_id="+id);
  952. }
  953. }
  954. }
  955. }else{
  956. baseDao.execute("update LogisticsPrice set lp_msg3='"+kyApiResp.getMsg()+"' where lp_id="+id);
  957. }
  958. }catch (Exception e){
  959. e.printStackTrace();
  960. retMap.put("success",false);
  961. retMap.put("message","获取失败"+(StringUtil.nvl(e.getMessage(),"")));
  962. logger.info("getPrice_KY-F:id {} err {}",id,retMap.get("message"));
  963. return retMap;
  964. }
  965. return retMap;
  966. }
  967. //顺丰
  968. private Map<String, Object> getPrice_SF(Integer id,String type,double weight,double volume,String province_d,String city_d,String province_s,String city_s,Date sendDateTime) {
  969. Map<String,Object> retMap = new HashMap<>();
  970. /*生产环境地址 https://bspgw.sf-express.com/std/service
  971. 沙箱环境地址 https://sfapi-sbox.sf-express.com/std/service*/
  972. /*1 partnerID String(64) 是 合作伙伴编码(即顾客编码)
  973. 2 requestID String(40) 是 请求唯一号UUID
  974. 3 serviceCode String(50) 是 接口服务代码
  975. 4 timestamp long 是 调用接口时间戳
  976. 5 msgDigest String(128) 条件 数字签名,使用数字签名方式认证时必填
  977. 6 accessToken Number 条件 访问令牌,使用OAuth2方式认证时必填
  978. 7 msgData String 是 业务数据报文*/
  979. try{
  980. Object[] obs = baseDao.getFieldsDataByCondition("SZSI_P.DOCK_LOGISTICS_CONFIG A "
  981. , new String[]{"CALL_URL","CLIENT_CODE","CHECK_WORD","ENABLE_"}, "LOGISTICS_='SF' and type_='GETPRICE' AND A.ENABLE_ = 1");
  982. String msgData = "";
  983. String businessType="";
  984. if("特快".equals(type)){
  985. businessType="1";
  986. }else if("普快".equals(type)){
  987. businessType="2";
  988. }else if("物流".equals(type)){
  989. businessType="255";//卡航
  990. }
  991. //businessType="299";
  992. SFPriceQueryReq sfPriceQueryReq=new SFPriceQueryReq();
  993. sfPriceQueryReq.setBusinessType(businessType);//特快
  994. sfPriceQueryReq.setWeight(weight);
  995. sfPriceQueryReq.setVolume(volume);
  996. sfPriceQueryReq.setConsignedTime(DateUtil.format(sendDateTime,"yyyy-MM-dd HH:mm:ss"));
  997. //目的地
  998. SFDestAddress sfDestAddress=new SFDestAddress();
  999. sfDestAddress.setProvince(province_d);
  1000. sfDestAddress.setCity(city_d);
  1001. sfPriceQueryReq.setDestAddress(sfDestAddress);
  1002. //寄件方信息
  1003. SFSrcAddress srcAddress=new SFSrcAddress();
  1004. srcAddress.setProvince(province_s);
  1005. srcAddress.setCity(city_s);
  1006. sfPriceQueryReq.setSrcAddress(srcAddress);
  1007. msgData = FlexJsonUtil.toJsonDeep(sfPriceQueryReq);
  1008. CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
  1009. String CLIENT_CODE = obs[1].toString();
  1010. String CHECK_WORD = obs[2].toString();
  1011. String CALL_URL = obs[0].toString();
  1012. System.out.println("msgData:"+msgData);
  1013. String timeStamp = String.valueOf(System.currentTimeMillis());
  1014. Map<String, String> params = new HashMap<String, String>();
  1015. params.put("partnerID", CLIENT_CODE); // 顾客编码 ,对应丰桥上获取的clientCode
  1016. params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
  1017. params.put("serviceCode",ExpressServiceCodeEnum.EXP_RECE_QUERY_DELIVERTM.getCode());// 接口服务码
  1018. params.put("timestamp", timeStamp);
  1019. params.put("msgData", msgData);
  1020. params.put("msgDigest", tools.getMsgDigest(msgData,timeStamp,CHECK_WORD));
  1021. String result = HttpClientUtil.post(CALL_URL, params);
  1022. SFApiResp sfApiResp= FlexJsonUtil.fromJson(result, SFApiResp.class);
  1023. if(sfApiResp!=null){
  1024. if("A1000".equals(sfApiResp.getApiResultCode())){
  1025. String apiResultData = sfApiResp.getApiResultData();
  1026. SFPriceApiResultData sfPriceApiResultData=FlexJsonUtil.fromJson(apiResultData, SFPriceApiResultData.class);
  1027. if(sfPriceApiResultData.isSuccess()){
  1028. for(SFPriceDeliverTmDto sfd:sfPriceApiResultData.getMsgData().getDeliverTmDto() ){
  1029. if(businessType.equals(sfd.getBusinessType()) && sfd.getFee() !=null){
  1030. baseDao.execute("update LogisticsPrice set lp_msg1='',LP_REALTIMEPRICE1="+sfd.getFee()+" where lp_id="+id);
  1031. }
  1032. }
  1033. }else{
  1034. baseDao.execute("update LogisticsPrice set lp_msg1='"+sfPriceApiResultData.getErrorMsg()+"',LP_REALTIMEPRICE1=0 where lp_id="+id);
  1035. }
  1036. }
  1037. }
  1038. System.out.println("result:"+result);
  1039. }catch (Exception e){
  1040. e.printStackTrace();
  1041. retMap.put("success",false);
  1042. retMap.put("message","获取失败"+(StringUtil.nvl(e.getMessage(),"")));
  1043. logger.info("getPrice_SF-F:id {} err {}",id,retMap.get("message"));
  1044. return retMap;
  1045. }
  1046. return retMap;
  1047. }
  1048. }