package com.tyche.tpl.modules.wms.rpc;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tyche.erpapi.rpc.RPCResult;
import com.tyche.erpapi.wms.module.sf.param.AddedService;
import com.tyche.erpapi.wms.module.sf.param.CargoDetail;
import com.tyche.erpapi.wms.module.sf.param.ContactInfo;
import com.tyche.erpapi.wms.module.sf.param.SfOrderParam;
import com.tyche.erpapi.wms.module.sf.service.SfService;
import com.tyche.tpl.modules.wms.customexception.HttpTimeOutException;
import com.tyche.tpl.modules.wms.service.CallExpressServiceTools;
import com.tyche.tpl.modules.wms.util.HttpClientUtil;
import com.tyche.tpl.modules.wms.util.HttpUtil;
import com.tyche.tpl.modules.wms.util.XStreamUtil;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang.StringUtils;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.*;
/**
* @author guoxinsong
* @date 2021-01-20 09:41:14
* @description 顺丰枫桥接口实现类
*/
@Log4j2
@Service
public class SfServiceImpl implements SfService {
@Autowired
private XStreamUtil xStreamUtil;
@Autowired
private HttpUtil httpUtil;
@Value("${sf.call.url}")
private String sfCallUrl;
@Value("${sf.client.code}")
private String sfClientCode;
@Value("${sf.check.word}")
private String sfCheckWord;
/**
* 下订单serviceCode
*/
private final String EXP_RECE_CREATE_ORDER = "EXP_RECE_CREATE_ORDER";
/**
* 订单结果查询接口serviceCode
*/
private final String EXP_RECE_SEARCH_ORDER_RESP = "EXP_RECE_SEARCH_ORDER_RESP";
private final String API_RESULT_CODE_A1000 = "A1000";
private final String ERROR_CODE_S0000 = "S0000";
// 重复下单
private final String ERROR_CODE_8016 = "8016";
private final String LANGUAGE_ZHCN = "zh-cn";
private final String One = "1";
/**
* 顺丰丰桥下订单服务接口
*
* @param sfOrderParam
* @return
*/
@Override
public RPCResult createOrder(SfOrderParam sfOrderParam) {
try {
if (null == sfOrderParam) {
return RPCResult.buildBizError(null, 1000, "顺丰丰桥下订单服务接口入参不能为空");
}
if (StringUtils.isBlank(sfOrderParam.getOrderId())) {
return RPCResult.buildBizError(null, 1000, "顺丰丰桥下订单服务接口orderId不能为空");
}
// 封装数据
Map params = new HashMap();
String timeStamp = String.valueOf(System.currentTimeMillis());
String msgData = JSONObject.toJSONString(sfOrderParam);
params.put("partnerID", sfClientCode);
params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
params.put("serviceCode", EXP_RECE_CREATE_ORDER);
params.put("timestamp", timeStamp);
params.put("msgData", msgData);
params.put("msgDigest", CallExpressServiceTools.getMsgDigest(msgData, timeStamp, sfCheckWord));
long startTime = System.currentTimeMillis();
log.info("调用丰桥下订单接口服务开始, 入参:{}, sfCallUrl:{}, sfClientCode:{}, sfCheckWord:{}" + (String) params.get("msgData"), sfCallUrl, sfClientCode, sfCheckWord);
String result = HttpClientUtil.post(sfCallUrl, params);
log.info("调用丰桥下订单接口服务结束, 返回结果:{}, 接口耗时:{}", result, String.valueOf(System.currentTimeMillis() - startTime));
if (StringUtils.isNotBlank(result)) {
JSONObject jsonObject = JSON.parseObject(result);
String apiResultCode = jsonObject.getString("apiResultCode");
if (StringUtils.isNotBlank(apiResultCode) && API_RESULT_CODE_A1000.equals(apiResultCode)) {
JSONObject apiResultData = jsonObject.getJSONObject("apiResultData");
if (apiResultData != null) {
String errorCode = apiResultData.getString("errorCode");
if (StringUtils.isNotBlank(errorCode) && ERROR_CODE_S0000.equals(errorCode)) {
result = apiResultData.getString("msgData");
log.info("调用丰桥下订单接口服务, msgData:{}", result);
} else if (StringUtils.isNotBlank(errorCode) && ERROR_CODE_8016.equals(errorCode)) {
// 重复下单逻辑处理
result = queryOrder(sfOrderParam.getOrderId());
} else {
return RPCResult.buildBizError(null, 1000, apiResultData.getString("errorMsg"));
}
} else {
return RPCResult.buildBizError(null, 1000, "调用丰桥下订单接口服务异常");
}
} else {
return RPCResult.buildBizError(null, 1000, "调用丰桥下订单接口服务异常");
}
}
log.info("调用丰桥下订单接口服务结束, 出参:{}", result);
return RPCResult.buildBizSuccess(JSONObject.parseObject(result));
} catch (HttpTimeOutException e) {
log.error("调用丰桥下订单接口服务连接超时", e);
// 连接超时异常
return RPCResult.buildBizError(null, 1000, e.getMessage());
} catch (Exception e) {
log.error("调用丰桥下订单接口服务异常", e);
return RPCResult.buildBizError(null, 1000, e.getMessage());
}
}
/**
* 丰桥订单结果查询接口
*
* @param orderId
* @return
* @throws Exception
*/
public String queryOrder(String orderId) throws Exception {
// 封装数据
Map params = new HashMap();
String timeStamp = String.valueOf(System.currentTimeMillis());
JSONObject jSONObjectParam = new JSONObject();
jSONObjectParam.put("searchType", One);
jSONObjectParam.put("language", LANGUAGE_ZHCN);
jSONObjectParam.put("orderId", orderId);
String msgData = JSONObject.toJSONString(jSONObjectParam);
params.put("partnerID", sfClientCode);
params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
params.put("serviceCode", EXP_RECE_SEARCH_ORDER_RESP);
params.put("timestamp", timeStamp);
params.put("msgData", msgData);
params.put("msgDigest", CallExpressServiceTools.getMsgDigest(msgData, timeStamp, sfCheckWord));
long startTime = System.currentTimeMillis();
log.info("调用丰桥订单结果查询接口开始, 入参:{}, sfCallUrl:{}, sfClientCode:{}, sfCheckWord:{}" + (String) params.get("msgData"), sfCallUrl, sfClientCode, sfCheckWord);
String result = "";
try {
result = HttpClientUtil.post(sfCallUrl, params);
} catch (Exception e) {
log.error("调用丰桥订单结果查询接口异常", e);
}
log.info("调用丰桥订单结果查询接口结束, 返回结果:{}, 接口耗时:{}", result, String.valueOf(System.currentTimeMillis() - startTime));
if (StringUtils.isNotBlank(result)) {
JSONObject jsonObject = JSON.parseObject(result);
String apiResultCode = jsonObject.getString("apiResultCode");
if (StringUtils.isNotBlank(apiResultCode) && API_RESULT_CODE_A1000.equals(apiResultCode)) {
JSONObject apiResultData = jsonObject.getJSONObject("apiResultData
- 1
- 2
前往页