tao.mo

PI-11-HS CODE接口-01:

接口调整
新增HS CODE通用模糊查询接口
mt
2023年2月22日15:24:19
Showing 29 changed files with 224 additions and 221 deletions
package com.erry.iclear.dateInterface;
/**
* 异常编码枚举类
* mt
* 2023年2月21日16:03:16
*/
public enum ErrorCodeEnum {
SUCCESS("0","成功"),
ERROR_7("10001","请求信息不能为空"),
ERROR_10001("10001","Appid错误(Appid不存在)"),
ERROR_10002("10002","Appkey错误(Appkey不存在)"),
ERROR_10004("10004","凭证已过期"),
ERROR_10013("10013","无Token(缺少参数)"),
ERROR_10014("10014","Token无效(Token值验证失败)"),
ERROR_10016("10016","无Appid(缺少参数)"),
ERROR_10017("10017","无Appkey(缺少参数)"),
ERROR_10018("10018","无TimeStamp(缺少参数)"),
ERROR_10019("10019","未指定hscode编码,10分钟之内只允许查询一次。"),
ERROR_30001("30001","数据格式不正确"),
ERROR_30002("30002","缺少必填项"),
ERROR_30003("30003","数据校验不通过"),
ERROR_30100("30100","hscode编码个数超过100个"),
ERROR_30101("30101","数据查询异常(访问数据库超时或者其他数据库异常)"),
ERROR_30102("30102","hscode编码字段长度超过2000字符"),
ERROR_30103("30103","skuCode与skuName必须传递一项"),
ERROR_30104("30104","skuCode或skuName长度超出限制");
ErrorCodeEnum(String code,String name){
this.code = code;
this.name = name;
}
private String code;
private String name;
public String getCode() {
return code;
}
public String getName() {
return name;
}
}
......@@ -36,8 +36,4 @@ public class IClearApiApplication extends SpringBootServletInitializer {
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(IClearApiApplication.class);
}
public String test(){
return "test";
}
}
......
//package com.erry.iclear.dateInterface;
//
//import org.springframework.boot.builder.SpringApplicationBuilder;
//import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
//
///**
// * @author Administrator
// */
//public class SpringBootStartApplication extends SpringBootServletInitializer {
// @Override
// protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// return builder.sources(IClearApiApplication.class);
// }
//}
package com.erry.iclear.dateInterface.api;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.response.ResultRS;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -37,8 +38,6 @@ public class CommonExceptionAdvice {
String itemMessage= messageSource.getMessage(x.getDefaultMessage(), null, x.getDefaultMessage(), LocaleContextHolder.getLocale());
return String.format("%s", itemMessage);
}).collect(Collectors.toList());
return new ResultRS(Boolean.FALSE,"30002",errorMessages.toString());
return new ResultRS(Boolean.FALSE, ErrorCodeEnum.ERROR_30002.getCode(),errorMessages.toString());
}
}
......
package com.erry.iclear.dateInterface.api;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.Mawb;
import com.erry.iclear.dateInterface.api.response.ResultRS;
import com.erry.iclear.dateInterface.entity.IClearApiLog;
......@@ -52,19 +53,18 @@ public class CustomsDataInterface {
ResultRS result = new ResultRS(Boolean.FALSE,"","");
if(Objects.equals(mawb,null)){
result.setCode("-7");
result.setMsg("请求信息不能为空");
result.setCode(ErrorCodeEnum.ERROR_7.getCode());
result.setMsg(ErrorCodeEnum.ERROR_7.getName());
return result;
}
String checkrs = mawbService.checkMawbBaseInfo(mawb);
if(StringUtil.isNotEmpty(checkrs)){
result.setCode("-7");
result.setCode(ErrorCodeEnum.ERROR_7.getCode());
result.setMsg(checkrs);
return result;
}
//1、保存请求信息,保存到iClear的 SQLServer
StopWatch sw = new StopWatch("receice mawb");
......@@ -75,9 +75,6 @@ public class CustomsDataInterface {
String timeStamp=(String) request.getHeader("TimeStamp");
IClearApiLog saveIClearApiLogResult = iClearApiLogService.saveIClearApiLog(iClearApiLogService.convertToIClearApiLog(mawb,appId,appKey,new Date(Long.valueOf(timeStamp))));
mawb.setAppId(appId);
if(!Objects.equals(saveIClearApiLogResult,null)){
log.info("请求保存成功,msgId:"+saveIClearApiLogResult.getMsgId());
......@@ -102,7 +99,7 @@ public class CustomsDataInterface {
}
}
sw.stop();
result.setCode("30001");
result.setCode(ErrorCodeEnum.ERROR_30001.getCode());
result.setMsg(msg);
return result;
}
......@@ -128,7 +125,6 @@ public class CustomsDataInterface {
// }
// sw.stop();
//4、保存运单到iclear中
sw.start("processChmConsignment");
result = chmConsignmentService.processChmConsignment(mawb, timeStamp,appId);
......@@ -137,7 +133,6 @@ public class CustomsDataInterface {
}
sw.stop();
//5、更新日志
sw.start("updateIClearApiLog");
if(!Objects.equals(saveIClearApiLogResult,null)){
......@@ -154,7 +149,7 @@ public class CustomsDataInterface {
//6、return result
result.setSuccess(Boolean.TRUE);
result.setCode("0");
result.setCode(ErrorCodeEnum.SUCCESS.getCode());
result.setMsg("操作成功");
return result;
}
......
......@@ -5,6 +5,7 @@ import com.arronlong.httpclientutil.HttpClientUtil;
import com.arronlong.httpclientutil.common.HttpConfig;
import com.arronlong.httpclientutil.common.HttpHeader;
import com.arronlong.httpclientutil.exception.HttpProcessException;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.*;
import com.erry.iclear.dateInterface.api.response.FedexResultChmRS;
import com.erry.iclear.dateInterface.api.response.FedexResultRS;
......@@ -65,7 +66,6 @@ public class FedexDataInterface {
@Value("${api.address.iclear-submit-url}")
String iclearCSubmitUrl;
@ApiOperation(value = "C类运单数据校验接口", httpMethod = "POST", notes = "ex: http://192.168.1.75:8080/fedex/checkBASFMawbFedex")
@PostMapping("/checkMawbFedexC")
@ResponseBody
......@@ -77,7 +77,6 @@ public class FedexDataInterface {
String token=(String) request.getHeader("Token");
String addr = request.getRemoteAddr();
TIClearApiCheckLog tIclearApiCheckLog = new TIClearApiCheckLog();
tIclearApiCheckLog.setRequestAppid(appId);
tIclearApiCheckLog.setRequestAppkey(appKey);
......@@ -117,7 +116,7 @@ public class FedexDataInterface {
log.info(sw.prettyPrint());
if(result.getSuccess()){
result.setSuccess(Boolean.TRUE);
result.setCode("0");
result.setCode(ErrorCodeEnum.SUCCESS.getCode());
}
tiClearApiCheckLogSave.setResponseText(result.getMsg());
tiClearApiCheckLogSave.setCode(result.getCode());
......@@ -128,8 +127,6 @@ public class FedexDataInterface {
return result;
}
@ApiOperation(value = "Fedex推送运单数据", httpMethod = "POST", notes = "ex: http://192.168.1.75:8080/fedex/sendMawbFedex")
@PostMapping("/sendMawbFedex")
@ResponseBody
......@@ -139,8 +136,8 @@ public class FedexDataInterface {
ResultRS result = new ResultRS(Boolean.FALSE,"","");
if(Objects.equals(fedexc,null)){
result.setCode("-7");
result.setMsg("请求信息不能为空");
result.setCode(ErrorCodeEnum.ERROR_7.getCode());
result.setMsg(ErrorCodeEnum.ERROR_7.getName());
return result;
}
//1、保存请求信息,保存到iClear的 SQLServer
......@@ -189,7 +186,6 @@ public class FedexDataInterface {
// }
// sw.stop();
//4、保存运单到iclear中
sw.start("processChmConsignment");
result = chmConsignmentService.processChmConsignmentFedex(saveMawbFedexResult, timeStamp,appId);
......@@ -216,10 +212,8 @@ public class FedexDataInterface {
headerMap.put("Content-Type", "application/json");
String json = HttpUtils.doPost(this.iclearCSubmitUrl,objJson,headerMap);
log.info("<<<<<<<< checkfedexMawb start >>>>>>>>>> result :" +result.getSuccess() +" iclear check response : " + json + " status : " + result.getSuccess());
//5、更新日志
sw.start("updateIClearApiLog");
if(!Objects.equals(saveIClearApiLogResult,null)){
......@@ -236,7 +230,7 @@ public class FedexDataInterface {
//6、return result
result.setSuccess(Boolean.TRUE);
result.setCode("0");
result.setCode(ErrorCodeEnum.SUCCESS.getCode());
return result;
}
......@@ -250,13 +244,13 @@ public class FedexDataInterface {
//获取请求的运单号
String[] splitConsignment = StringUtil.split(consignmentCode.getConsignmentCode(),",");
if(splitConsignment.length > 20){
result.setCode("30001");
result.setCode(ErrorCodeEnum.ERROR_30001.getCode());
result.setMsg("请求信息不能大于20条运单");
return result;
}
if(splitConsignment.length<1){
result.setCode("-7");
result.setMsg("请求信息不能为空");
result.setCode(ErrorCodeEnum.ERROR_7.getCode());
result.setMsg(ErrorCodeEnum.ERROR_7.getName());
return result;
}
StopWatch sw = new StopWatch("receice mawbFedex");
......@@ -295,7 +289,7 @@ public class FedexDataInterface {
log.info("Fedex申报数据请求成功!");
//6、return result
result.setSuccess(Boolean.TRUE);
result.setCode("0");
result.setCode(ErrorCodeEnum.SUCCESS.getCode());
return result;
}
......@@ -309,13 +303,13 @@ public class FedexDataInterface {
//获取请求的运单号
String[] splitConsignment = StringUtil.split(consignmentCode.getConsignmentCode(),",");
if(splitConsignment.length > 20){
result.setCode("30001");
result.setCode(ErrorCodeEnum.ERROR_30001.getCode());
result.setMsg("请求信息不能大于20条运单");
return result;
}
if(splitConsignment.length<1){
result.setCode("-7");
result.setMsg("请求信息不能为空");
result.setCode(ErrorCodeEnum.ERROR_7.getCode());
result.setMsg(ErrorCodeEnum.ERROR_7.getName());
return result;
}
StopWatch sw = new StopWatch("receice mawbFedex");
......@@ -354,8 +348,7 @@ public class FedexDataInterface {
log.info("Fedex回执数据请求成功!");
//6、return result
result.setSuccess(Boolean.TRUE);
result.setCode("0");
result.setCode(ErrorCodeEnum.SUCCESS.getCode());
return result;
}
}
\ No newline at end of file
......
package com.erry.iclear.dateInterface.api;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.HsCodeParam;
import com.erry.iclear.dateInterface.api.response.ResultHsCode;
import com.erry.iclear.dateInterface.entity.IClearApiHsCodeLog;
......@@ -28,7 +29,7 @@ public class HsCodeInterface {
@Autowired
IClearApiHsCodeLogService iClearApiHsCodeLogService;
@ApiOperation(value = "获取hscode数据", httpMethod = "POST", notes = "ex: http://192.168.1.71:8080/hscode/hscodeRequest")
@ApiOperation(value = "获取最新HS Code信息接口", httpMethod = "POST", notes = "ex: http://192.168.1.71:8080/hscode/hscodeRequest")
@PostMapping("/hscodeRequest")
@ResponseBody
public ResultHsCode hscodeRequest(HttpServletRequest request
......@@ -48,11 +49,10 @@ public class HsCodeInterface {
resultHsCode = hsCodeService.findHsCodeListByCode(hscode.getHscode());
return resultHsCode;
} else {
//如果没有传hscode需要限制10分钟只能查询一次
boolean rs = iClearApiHsCodeLogService.findIClearApiHsCodeLog();
boolean rs = iClearApiHsCodeLogService.findIClearApiHsCodeLog(appId);
if(rs == true){
resultHsCode = new ResultHsCode(Boolean.FALSE,"10019","未指定hscode编码,10分钟之内只允许查询一次",null);
resultHsCode = new ResultHsCode(Boolean.FALSE, ErrorCodeEnum.ERROR_10019.getCode(),ErrorCodeEnum.ERROR_10019.getName(),null);
}else{
resultHsCode = hsCodeService.findAllHsCodeList();
}
......@@ -60,7 +60,7 @@ public class HsCodeInterface {
}
}catch(Exception ex){
log.error(ex.getMessage(),ex);
resultHsCode = new ResultHsCode(Boolean.FALSE,"30101","数据查询异常",null);
resultHsCode = new ResultHsCode(Boolean.FALSE,ErrorCodeEnum.ERROR_30101.getCode(),ErrorCodeEnum.ERROR_30101.getName(),null);
return resultHsCode;
}finally {
iclearApiHsCodeLog.setReceiveResult(resultHsCode.getMsg());
......@@ -69,10 +69,51 @@ public class HsCodeInterface {
long end = System.currentTimeMillis();
iclearApiHsCodeLog.setSpendTime(end-begin);
//如果异常为hscode长度超过2000,将截取0到2000字符
if(resultHsCode.getCode().equals("30102")){
iclearApiHsCodeLog.setCode(iclearApiHsCodeLog.getCode().substring(0,2000));
if(resultHsCode.getCode().equals(ErrorCodeEnum.ERROR_30102.getCode())){
iclearApiHsCodeLog.setCode(hscode.getHscode().substring(0,2000));
}
iClearApiHsCodeLogService.saveIClearApiHsCodeLog(iclearApiHsCodeLog);
}
}
@ApiOperation(value = "HSCODE通用模糊查询接口", httpMethod = "POST", notes = "ex: http://192.168.1.71:8080/hscode/fuzzyQuery")
@PostMapping("/fuzzyQuery")
@ResponseBody
public ResultHsCode fuzzyQueryHsCode(HttpServletRequest request
, @RequestBody HsCodeParam hscode) {
log.info("接收到请求数据skuCode:【"+hscode.getSkuCode()+"】,skuName:【"+hscode.getSkuName()+"】");
String appId = (String) request.getHeader("Appid");
String appkey = (String) request.getHeader("Appkey");
IClearApiHsCodeLog iclearApiHsCodeLog = new IClearApiHsCodeLog();
ResultHsCode resultHsCode = null;
long begin = System.currentTimeMillis();
try {
iclearApiHsCodeLog.setAppId(appId);
iclearApiHsCodeLog.setAppKey(appkey);
iclearApiHsCodeLog.setCreateTime(new Date());
resultHsCode = hsCodeService.fuzzyQueryHsCode(hscode);
iclearApiHsCodeLog.setReceiveResult(resultHsCode.getMsg());
iclearApiHsCodeLog.setErrorCode(resultHsCode.getCode());
iclearApiHsCodeLog.setResponseTime(new Date());
long end = System.currentTimeMillis();
iclearApiHsCodeLog.setSpendTime(end-begin);
String skuCode = hscode.getSkuCode();
if(!StringUtil.isEmpty(skuCode)){
skuCode = skuCode.substring(0,50);
}
String skuName = hscode.getSkuName();
if(!StringUtil.isEmpty(skuName)){
skuName = skuName.substring(0,50);
}
iclearApiHsCodeLog.setCode("[skuCode="+skuCode+"],[skuName="+skuName+"]");
iClearApiHsCodeLogService.saveIClearApiHsCodeLog(iclearApiHsCodeLog);
return resultHsCode;
}catch(Exception ex){
log.error(ex.getMessage(),ex);
resultHsCode = new ResultHsCode(Boolean.FALSE,ErrorCodeEnum.ERROR_30101.getCode(),ErrorCodeEnum.ERROR_30101.getName(),null);
return resultHsCode;
}finally{
return resultHsCode;
}
}
}
......
......@@ -15,4 +15,8 @@ import java.io.Serializable;
public class HsCodeParam implements Serializable {
private static final long serialVersionUID = 786697399667065141L;
String hscode;
//hscode编码
String skuCode;
//商品名称
String skuName;
}
......
......@@ -21,6 +21,4 @@ public class BaseModel implements Serializable {
public void setId(Long id) {
this.id = id;
}
}
\ No newline at end of file
......
package com.erry.iclear.dateInterface.common;
/**
* 常量
* mt
* 2021年7月29日13:34:15
*/
public interface Constants {
/**
* api响应码
*/
public static interface ApiResponseKeys{
//成功
public static final String SUCCESS = "0";
//用户或密码不正确
public static final String KEY_10001 = "10001";
//用户不存在
public static final String KEY_10002 = "10002";
//账号已过期
public static final String KEY_10003 = "10003";
//凭证已过期
public static final String KEY_10004 = "10004";
//账号已禁用
public static final String KEY_10005 = "10005";
//用户凭证无效
public static final String KEY_10013 = "10013";
}
}
......@@ -16,9 +16,7 @@ public class JsonDateTimeSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)
throws IOException, JsonProcessingException {
String formattedDate = dateFormat.format(date);
gen.writeString(formattedDate);
}
}
\ No newline at end of file
......
......@@ -48,7 +48,6 @@ public class IClearExportInterface {
public String refreshSendMawbe() {
try{
return "Success";
}catch (Exception e){
log.error("refreshCache() error:"+e.getMessage());
......
package com.erry.iclear.dateInterface.interceptor;
import com.alibaba.fastjson.JSON;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.response.ResultHsCode;
import com.erry.iclear.dateInterface.api.response.ResultRS;
import com.erry.iclear.dateInterface.common.Constant;
......@@ -36,40 +37,40 @@ public class HsCodeInterceptor extends HandlerInterceptorAdapter {
//String uri = request.getRequestURI();
if(StringUtils.isBlank(appId)){
this.returnJson(response,false,"10016","Appid 不能为空");
this.returnJson(response,false, ErrorCodeEnum.ERROR_10016.getCode(),ErrorCodeEnum.ERROR_10016.getName());
return false;
}
if(StringUtils.isBlank(appkey)){
this.returnJson(response,false,"10017","Appkey 不能为空");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10017.getCode(),ErrorCodeEnum.ERROR_10017.getName());
return false;
}
if(StringUtils.isBlank(timeStamp)){
this.returnJson(response,false,"10018","TimeStamp 不能为空");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10018.getCode(),ErrorCodeEnum.ERROR_10018.getName());
return false;
}
if(StringUtils.isBlank(token)){
this.returnJson(response,false,"10013","token 不能为空");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10013.getCode(),ErrorCodeEnum.ERROR_10013.getName());
return false;
}
HashMap<String,String> secretMap = Constant.appIdSecurityCache.get(appId);
if(secretMap==null){
this.returnJson(response,false,"10001","系统异常,该appId没有注册");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10001.getCode(),ErrorCodeEnum.ERROR_10001.getName());
return false;
}
String secretInSys = secretMap.get(appkey);
if (StringUtils.isBlank(secretInSys)) {
this.returnJson(response,false,"10002","系统异常,该appId没有当前Appkey的权限");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10002.getCode(),ErrorCodeEnum.ERROR_10002.getName());
return false;
}
String sha256Str = SHA256Util.getSHA256String(appId+appkey+secretInSys+timeStamp);
if(!token.equals(sha256Str)){
this.returnJson(response,false,"10014","Token验证失败");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10014.getCode(),ErrorCodeEnum.ERROR_10014.getName());
return false;
}
return true;
......@@ -99,5 +100,4 @@ public class HsCodeInterceptor extends HandlerInterceptorAdapter {
}
}
}
}
\ No newline at end of file
......
package com.erry.iclear.dateInterface.interceptor;
import com.alibaba.fastjson.JSON;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.response.ResultRS;
import com.erry.iclear.dateInterface.common.Constant;
import com.erry.iclear.dateInterface.util.SHA256Util;
......@@ -35,40 +36,40 @@ public class SignInterceptor extends HandlerInterceptorAdapter {
if(StringUtils.isBlank(appId)){
this.returnJson(response,false,"10016","Appid 不能为空");
this.returnJson(response,false, ErrorCodeEnum.ERROR_10016.getCode(),ErrorCodeEnum.ERROR_10016.getName());
return false;
}
if(StringUtils.isBlank(appkey)){
this.returnJson(response,false,"10017","Appkey 不能为空");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10017.getCode(),ErrorCodeEnum.ERROR_10017.getName());
return false;
}
if(StringUtils.isBlank(timeStamp)){
this.returnJson(response,false,"10018","TimeStamp 不能为空");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10018.getCode(),ErrorCodeEnum.ERROR_10018.getName());
return false;
}
if(StringUtils.isBlank(token)){
this.returnJson(response,false,"10013","token 不能为空");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10013.getCode(),ErrorCodeEnum.ERROR_10013.getName());
return false;
}
HashMap<String,String> secretMap = Constant.appIdSecurityCache.get(appId);
if(secretMap==null){
this.returnJson(response,false,"10001","系统异常,该appId没有注册");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10001.getCode(),ErrorCodeEnum.ERROR_10001.getName());
return false;
}
String secretInSys = secretMap.get(appkey);
if (StringUtils.isBlank(secretInSys)) {
this.returnJson(response,false,"10002","系统异常,该appId没有当前Appkey的权限");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10002.getCode(),ErrorCodeEnum.ERROR_10002.getName());
return false;
}
String sha256Str = SHA256Util.getSHA256String(appId+appkey+secretInSys+timeStamp);
if(!token.equals(sha256Str)){
this.returnJson(response,false,"10014","Token验证失败");
this.returnJson(response,false,ErrorCodeEnum.ERROR_10014.getCode(),ErrorCodeEnum.ERROR_10014.getName());
return false;
}
return true;
......@@ -98,5 +99,4 @@ public class SignInterceptor extends HandlerInterceptorAdapter {
}
}
}
}
\ No newline at end of file
......
......@@ -28,6 +28,6 @@ public interface IClearApiHsCodeLogRepository extends JpaRepository<IClearApiHsC
* @param createTime yyyy-MM-dd HH:mm
* @return
*/
@Query(nativeQuery = true,value = "select count(1) from T_ICLEAR_API_HSCODE_LOG where CREATE_TIME > ? AND (CODE IS NULL OR CODE = '')")
public Long findIClearApiHsCodeLog(String createTime);
@Query(nativeQuery = true,value = "select count(1) from T_ICLEAR_API_HSCODE_LOG where CREATE_TIME > ?1 AND APPID = ?2 AND (CODE IS NULL OR CODE = '')")
public Long findIClearApiHsCodeLog(String createTime,String appId);
}
......
package com.erry.iclear.dateInterface.service;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.Mawb;
import com.erry.iclear.dateInterface.api.request.MawbDetail;
import com.erry.iclear.dateInterface.api.request.ReceiptMessage;
import com.erry.iclear.dateInterface.api.response.TokenResult;
import com.erry.iclear.dateInterface.common.Constants;
import com.erry.iclear.dateInterface.entity.ChmConsignment;
import com.erry.iclear.dateInterface.entity.ChmConsignmentDetail;
import com.erry.iclear.dateInterface.entity.DeclearTask;
......@@ -16,28 +16,12 @@ import com.erry.iclear.dateInterface.util.DateUtils;
import com.erry.iclear.dateInterface.util.HttpUtils;
import com.erry.iclear.dateInterface.util.JsonToJava;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.net.ssl.SSLContext;
import javax.transaction.Transactional;
import java.io.IOException;
import java.math.BigDecimal;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
/**
......@@ -160,12 +144,12 @@ public class ApiService {
//接口响应时间
declearTask.setResponseTime(new Date());
TokenResult tokenResult = JsonToJava.parseJson(json,TokenResult.class);
if(tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.SUCCESS)){
if(tokenResult.getErrorcode().equals(ErrorCodeEnum.SUCCESS.getCode())){
//推送成功,记录推送状态
declearTask.setResponseResults(tokenResult.getErrorcode());
declearTask.setResponseContent(tokenResult.getErrormessage());
declearTaskList.add(declearTask);
}else if(tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.KEY_10004) || tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.KEY_10013)){
}else if(tokenResult.getErrorcode().equals(ErrorCodeEnum.ERROR_10004.getCode()) || tokenResult.getErrorcode().equals(ErrorCodeEnum.ERROR_10013.getCode())){
//如果凭证失效,则刷新凭证
refreshToken(token);
}else{
......@@ -259,12 +243,12 @@ public class ApiService {
//接口响应时间
declearTask.setResponseTime(new Date());
TokenResult tokenResult = JsonToJava.parseJson(json,TokenResult.class);
if(tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.SUCCESS)){
if(tokenResult.getErrorcode().equals(ErrorCodeEnum.SUCCESS.getCode())){
//推送成功,记录推送状态
declearTask.setResponseResults(tokenResult.getErrorcode());
declearTask.setResponseContent(tokenResult.getErrormessage());
declearTaskList.add(declearTask);
}else if(tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.KEY_10004) || tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.KEY_10013)){
}else if(tokenResult.getErrorcode().equals(ErrorCodeEnum.ERROR_10004.getCode()) || tokenResult.getErrorcode().equals(ErrorCodeEnum.ERROR_10013.getCode())){
//如果凭证失效,则刷新凭证
refreshToken(token);
}else{
......
package com.erry.iclear.dateInterface.service;
//import cn.hutool.core.date.DateUtil;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.FedexMawb;
import com.erry.iclear.dateInterface.api.request.FedexReceipt;
import com.erry.iclear.dateInterface.api.request.Mawb;
......@@ -493,8 +494,8 @@ public class ChmConsignmentService {
Date pushTime = DateUtils.timeStampToDate(Long.valueOf(timeStamp));
ChmConsignment chmConsignment=this.convertToChmConsignment(mawb,pushTime,creator);
if(Objects.equals(chmConsignment,null)){
result.setCode("30001");
result.setMsg("数据格式不正确");
result.setCode(ErrorCodeEnum.ERROR_30001.getCode());
result.setMsg(ErrorCodeEnum.ERROR_30001.getName());
return result;
}
List<ChmConsignmentDetail> chmConsignmentDetailList = new ArrayList<>();
......@@ -522,7 +523,7 @@ public class ChmConsignmentService {
log.info("主单"+ mawb.getBillNo()+" 保存成功,chmConsignmentId:"+chmConsignmentSaveResult.getId());
}else{
log.info("主单"+ mawb.getBillNo()+" 保存失败");
result.setCode("30002");
result.setCode(ErrorCodeEnum.ERROR_30002.getCode());
result.setMsg("主单"+ mawb.getBillNo()+" 保存失败");
return result;
}
......@@ -579,8 +580,8 @@ public class ChmConsignmentService {
Date pushTime = DateUtils.timeStampToDate(Long.valueOf(timeStamp));
ChmConsignment chmConsignment = this.convertToChmConsignmentFedex(fedexMawb,pushTime,creator);
if(Objects.equals(chmConsignment,null)){
result.setCode("30001");
result.setMsg("数据格式不正确");
result.setCode(ErrorCodeEnum.ERROR_30001.getCode());
result.setMsg(ErrorCodeEnum.ERROR_30001.getName());
return result;
}
List<ChmConsignmentDetail> chmConsignmentDetailList = new ArrayList<>();
......@@ -602,7 +603,7 @@ public class ChmConsignmentService {
log.info("主单"+ fedexMawb.getBillNo()+" 保存成功,chmConsignmentId:"+chmConsignmentSaveResult.getId());
}else{
log.info("主单"+ fedexMawb.getBillNo()+" 保存失败");
result.setCode("30002");
result.setCode(ErrorCodeEnum.ERROR_30002.getCode());
result.setMsg("主单"+ fedexMawb.getBillNo()+" 保存失败");
return result;
}
......@@ -635,7 +636,7 @@ public class ChmConsignmentService {
log.info("主单"+ fedexMawb.getBillNo()+" 更新成功,chmConsignmentId:"+updateResult.getId());
}else{
log.info("主单"+ fedexMawb.getBillNo()+" 更新失败");
result.setCode("30003");
result.setCode(ErrorCodeEnum.ERROR_30003.getCode());
result.setMsg("主单"+ fedexMawb.getBillNo()+" 更新失败");
return result;
}
......
package com.erry.iclear.dateInterface.service;
import com.alibaba.fastjson.JSON;
import com.arronlong.httpclientutil.HttpClientUtil;
import com.arronlong.httpclientutil.common.HttpConfig;
import com.arronlong.httpclientutil.common.HttpHeader;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.*;
import com.erry.iclear.dateInterface.api.response.IClearCheckResponseResult;
import com.erry.iclear.dateInterface.api.response.ResultRS;
......@@ -13,22 +10,11 @@ import com.erry.iclear.dateInterface.repository.FedexMawbRepository;
import com.erry.iclear.dateInterface.util.HttpUtils;
import com.erry.iclear.dateInterface.util.JsonToJava;
import com.google.gson.Gson;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.*;
import java.util.stream.Collectors;
......@@ -134,8 +120,8 @@ public class FedexService {
//1、将请求转换为运单
ChmConsignment chmConsignment=consignmentService.convertToChmConsignmentFedex(fedexMawb,null,"IDE-ICLEAR-API");
if(Objects.equals(chmConsignment,null)){
result.setCode("30001");
result.setMsg("数据格式不正确");
result.setCode(ErrorCodeEnum.ERROR_7.getCode());
result.setMsg(ErrorCodeEnum.ERROR_7.getName());
return result;
}
List<ChmConsignmentDetail> chmConsignmentDetailList = new ArrayList<>();
......@@ -185,8 +171,8 @@ public class FedexService {
ResultRS result = new ResultRS(Boolean.FALSE,"","");
if(Objects.equals(fedexc,null)){
result.setCode("-7");
result.setMsg("请求信息不能为空");
result.setCode(ErrorCodeEnum.ERROR_7.getCode());
result.setMsg(ErrorCodeEnum.ERROR_7.getName());
}else{
List<String> msgList = new ArrayList<>();
// 参数consignmentCode不能为空
......
package com.erry.iclear.dateInterface.service;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.HsCodeParam;
import com.erry.iclear.dateInterface.api.response.ResultHsCode;
import com.erry.iclear.dateInterface.entity.HsCode;
import com.erry.iclear.dateInterface.repository.HsCodeRepository;
import com.erry.iclear.dateInterface.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -28,14 +31,14 @@ public class HsCodeService {
ResultHsCode resultHsCode = new ResultHsCode(Boolean.FALSE,"","",null);
try{
if(hscode.length() > 2000){
resultHsCode.setCode("30102");
resultHsCode.setMsg("参数:hscode编码字段长度超过2000");
resultHsCode.setCode(ErrorCodeEnum.ERROR_30102.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30102.getName());
return resultHsCode;
}
String[] hscodeArrays = hscode.split(",");
if(hscodeArrays.length > 100){
resultHsCode.setCode("30100");
resultHsCode.setMsg("hscode编码个数超过100个");
resultHsCode.setCode(ErrorCodeEnum.ERROR_30100.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30100.getName());
return resultHsCode;
}
List<String> skuCodeList = Arrays.asList(hscodeArrays);
......@@ -57,14 +60,53 @@ public class HsCodeService {
}
});
resultHsCode.setSuccess(Boolean.TRUE);
resultHsCode.setCode("0");
resultHsCode.setMsg("操作成功");
resultHsCode.setCode(ErrorCodeEnum.SUCCESS.getCode());
resultHsCode.setMsg(ErrorCodeEnum.SUCCESS.getName());
resultHsCode.setHsCodeResultList(hsCodeList);
}catch(Exception ex){
log.error(ex.getMessage(),ex);
resultHsCode.setSuccess(Boolean.FALSE);
resultHsCode.setCode("30101");
resultHsCode.setMsg("数据查询异常");
resultHsCode.setCode(ErrorCodeEnum.ERROR_30101.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30101.getName());
}
return resultHsCode;
}
/**
* 根据hscode编码或者商品名称进行模糊查询
* @param hscode
* @return
*/
public ResultHsCode fuzzyQueryHsCode(HsCodeParam hscode){
ResultHsCode resultHsCode = new ResultHsCode(Boolean.FALSE,"","",null);
try{
if(StringUtil.isEmpty(hscode.getSkuCode()) && StringUtil.isEmpty(hscode.getSkuName())){
resultHsCode.setCode(ErrorCodeEnum.ERROR_30103.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30103.getName());
return resultHsCode;
}
if(!StringUtil.isEmpty(hscode.getSkuCode()) && hscode.getSkuCode().length() > 50){
resultHsCode.setCode(ErrorCodeEnum.ERROR_30104.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30104.getName());
return resultHsCode;
}
if(!StringUtil.isEmpty(hscode.getSkuName()) && hscode.getSkuName().length() > 1000){
resultHsCode.setCode(ErrorCodeEnum.ERROR_30104.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30104.getName());
return resultHsCode;
}
List<HsCode> hsCodeList = null;
resultHsCode.setSuccess(Boolean.TRUE);
resultHsCode.setCode(ErrorCodeEnum.SUCCESS.getCode());
resultHsCode.setMsg(ErrorCodeEnum.SUCCESS.getName());
resultHsCode.setHsCodeResultList(hsCodeList);
}catch(Exception ex){
log.error(ex.getMessage(),ex);
resultHsCode.setSuccess(Boolean.FALSE);
resultHsCode.setCode(ErrorCodeEnum.ERROR_30101.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30101.getName());
}
return resultHsCode;
}
......@@ -78,16 +120,14 @@ public class HsCodeService {
try{
List<HsCode> hsCodeList = this.hsCodeRepository.findAllHsCodeList();
resultHsCode.setSuccess(Boolean.TRUE);
resultHsCode.setCode("0");
resultHsCode.setMsg("操作成功");
resultHsCode.setCode(ErrorCodeEnum.SUCCESS.getCode());
resultHsCode.setMsg(ErrorCodeEnum.SUCCESS.getName());
resultHsCode.setHsCodeResultList(hsCodeList);
}catch(Exception ex){
log.error(ex.getMessage());
log.error(ex.getMessage(),ex);
resultHsCode.setSuccess(Boolean.FALSE);
resultHsCode.setCode("30101");
resultHsCode.setMsg("数据查询异常");
resultHsCode.setCode(ErrorCodeEnum.ERROR_30101.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30101.getName());
}
return resultHsCode;
}
......
......@@ -36,10 +36,10 @@ public class IClearApiHsCodeLogService {
* 查询日志,最近10分钟如果有查询过全量hscode则返回true
* @return
*/
public boolean findIClearApiHsCodeLog(){
public boolean findIClearApiHsCodeLog(String appId){
boolean rs = false;
try{
Long count = iClearApiHsCodeLogRepository.findIClearApiHsCodeLog(DateUtils.getAfter10());
Long count = iClearApiHsCodeLogRepository.findIClearApiHsCodeLog(DateUtils.getAfter10(),appId);
if(count > 0){
rs = true;
}
......
......@@ -16,31 +16,21 @@ import java.util.List;
@Service
@Slf4j
public class MawbDetailService {
@Autowired
private MawbDetailRepository mawbDetailRepository;
public void saveMawbDetail(List<MawbDetail> mawbDetailList){
log.info("");
log.info("");
}
public ResultRS checkMawbDetail(Mawb mawb){
ResultRS result = new ResultRS(Boolean.FALSE,null,null);
try{
result.setSuccess(Boolean.TRUE);
}catch (Exception e){
log.error("checkMawbDetail() error:"+e.getMessage());
}
return result;
}
}
\ No newline at end of file
......
......@@ -3,6 +3,7 @@ package com.erry.iclear.dateInterface.service;
import com.arronlong.httpclientutil.HttpClientUtil;
import com.arronlong.httpclientutil.common.HttpConfig;
import com.arronlong.httpclientutil.common.HttpHeader;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.Mawb;
import com.erry.iclear.dateInterface.api.request.MawbDetail;
import com.erry.iclear.dateInterface.api.response.IClearCheckResponseResult;
......@@ -166,11 +167,9 @@ public class MawbService {
}
}
}
return "";
}
/**
* 校验主单
* @param mawb
......@@ -180,12 +179,11 @@ public class MawbService {
ResultRS result = new ResultRS(Boolean.FALSE,null,null);
try{
log.info("checkMawb start>>>>>>>>>> mawb:"+gson.toJson(mawb));
//1、将请求转换为运单
ChmConsignment chmConsignment=consignmentService.convertToChmConsignment(mawb,null,"IDE-ICLEAR-API");
if(Objects.equals(chmConsignment,null)){
result.setCode("30001");
result.setMsg("数据格式不正确");
result.setCode(ErrorCodeEnum.ERROR_30001.getCode());
result.setMsg(ErrorCodeEnum.ERROR_30001.getName());
return result;
}
//校验成交方式 成交方式为CIF时 '参数feeCurr不能为空','参数feeMark不能为空'',参数feeRate不能为空','参数insurCurr不能为空', '参数insurRate不能为空'
......@@ -193,13 +191,11 @@ public class MawbService {
if(!result.getSuccess()){
return result;
}
List<ChmConsignmentDetail> chmConsignmentDetailList = new ArrayList<>();
mawb.getMawbDetailList().forEach(detail ->{
chmConsignmentDetailList.add(consignmentDetailService.convertToChmConsignmentDetail(detail,chmConsignment));
});
chmConsignment.setChmConsignmentDetailList(chmConsignmentDetailList);
//调用IClear接口进行运单数据校验
String objJson = JsonToJava.toJson(chmConsignment);
// Header[] headers = HttpHeader.custom()
......@@ -213,13 +209,9 @@ public class MawbService {
// .encoding("utf-8")
// .json(objJson);
// String json = HttpClientUtil.post(config);
Map<String,String> headerMap = new HashMap<>();
headerMap.put("Content-Type", "application/json");
String json = HttpUtils.doPost(this.iclearCheckUrl,objJson,headerMap);
IClearCheckResponseResult iclearCheckResponseResult = JsonToJava.parseJson(json, IClearCheckResponseResult.class);
result.setSuccess(iclearCheckResponseResult.getSuccess());
result.setCode(iclearCheckResponseResult.getCode());
......@@ -243,23 +235,23 @@ public class MawbService {
if(dealMode.equals("CIF、CIP、DDP、DDU、DAP")){
if(StringUtil.isEmpty(mawb.getFeeCurr())){
result.setSuccess(false);
result.setCode("30002");
result.setCode(ErrorCodeEnum.ERROR_30002.getCode());
result.setMsg("运费币制不能为空");
}else if(StringUtil.isEmpty(mawb.getFeeMark())){
result.setSuccess(false);
result.setCode("30002");
result.setCode(ErrorCodeEnum.ERROR_30002.getCode());
result.setMsg("运费标记不能为空");
}else if(mawb.getFeeRate() == null){
result.setSuccess(false);
result.setCode("30002");
result.setCode(ErrorCodeEnum.ERROR_30002.getCode());
result.setMsg("运费/率不能为空");
}else if(StringUtil.isEmpty(mawb.getInsurCurr())){
result.setSuccess(false);
result.setCode("30002");
result.setCode(ErrorCodeEnum.ERROR_30002.getCode());
result.setMsg("保险费币制不能为空");
}else if(mawb.getInsurRate() == null){
result.setSuccess(false);
result.setCode("30002");
result.setCode(ErrorCodeEnum.ERROR_30002.getCode());
result.setMsg("保险费/率不能为空");
}
}
......
......@@ -34,8 +34,6 @@ public class OrigplacecodeMappingService {
return result;
}
/**
* 初始化DomesticDestinationMapping
*/
......@@ -50,13 +48,4 @@ public class OrigplacecodeMappingService {
log.error("initDomesticDestinationMapping() error" + e.getMessage());
}
}
}
\ No newline at end of file
......
package com.erry.iclear.dateInterface.task;
import com.alibaba.fastjson.JSONObject;
import com.erry.iclear.dateInterface.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.response.TokenResult;
import com.erry.iclear.dateInterface.common.Constants;
import com.erry.iclear.dateInterface.entity.HsCode;
import com.erry.iclear.dateInterface.repository.HsCodeRepository;
import com.erry.iclear.dateInterface.service.ApiService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -62,7 +59,7 @@ public class IClearApiTask {
try {
//获取token
TokenResult tokenResult = apiService.getToken();
if(tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.SUCCESS)){
if(tokenResult.getErrorcode().equals(ErrorCodeEnum.SUCCESS.getCode())){
this.token = tokenResult.getData().getToken();
}
}catch(Exception ex){
......
......@@ -8,9 +8,9 @@ spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#spring.datasource.jndi-name=jdbc/iclearProdTestDS
#推送海关回执
task.pushCustomsTask=0 0/1 * 1 * ?
task.pushCustomsTask=0 0/1 * * * ?
#推送完整报文
task.pushMawbTask=0 0/1 * 1 * ?
task.pushMawbTask=0 0/1 * * * ?
#推送失败的回执数据
task.pushErrorReturnDate=0 0/3 * 1 * ?
#推送失败的申报数据
......
......@@ -3,7 +3,7 @@ spring.datasource.jndi-name=jdbc/iclearDS
#推送海关回执
task.pushCustomsTask=0 0/1 * * * ?
#推送完整报文
task.pushMawbTask=0 0/1 * 1 * ?
task.pushMawbTask=0 0/1 * * * ?
#推送失败的回执数据
task.pushErrorReturnDate=0 0/30 * * * ?
#推送失败的申报数据
......
......@@ -3,7 +3,7 @@ spring.datasource.jndi-name=jdbc/iclearDS
#推送海关回执
task.pushCustomsTask=0 0/1 * * * ?
#推送完整报文
task.pushMawbTask=0 0/1 * 1 * ?
task.pushMawbTask=0 0/1 * * * ?
#推送失败的回执数据
task.pushErrorReturnDate=0 0/3 * * * ?
#推送失败的申报数据
......
......@@ -24,7 +24,7 @@ public class ApiTest {
//获取HSCODE接口地址
public static String hscodeRequest = "hscode/hscodeRequest";
public static String timeStamp = "1645153943";
public static String timeStamp = "1649839249891";
public static String appId = "IDE";
public static String appKey = "iClearExport";
//需要申请
......@@ -33,7 +33,7 @@ public class ApiTest {
public static void main(String[] args) throws Exception{
// BASF,iClearExportC,6db193cb4165a71b
System.out.println(new Date(Long.valueOf(timeStamp)));
String token = SHA256Util.getSHA256String("BASF" + "iClearExportC" + "b92131f03f19a348" + ApiTest.timeStamp);
String token = SHA256Util.getSHA256String("DEMO2" + "iClearExportDemo2" + "fe9f015bd9f12c82" + ApiTest.timeStamp);
System.out.println(token);
//D类申报的数据落地接口
......