tao.mo

Merge branches 'API-2023-03-12' and 'master' of http://118.178.128.178//Fedex/iClear-api

 Conflicts:
	doc/FedEx在线申报系统API - HSCode.docx
	src/main/java/com/erry/iclear/dateInterface/api/FedexDataInterface.java
	src/main/java/com/erry/iclear/dateInterface/interceptor/HsCodeInterceptor.java
	src/main/java/com/erry/iclear/dateInterface/interceptor/SignInterceptor.java
	src/main/java/com/erry/iclear/dateInterface/service/MawbDetailService.java
Showing 42 changed files with 463 additions and 303 deletions
No preview for this file type
ALTER TABLE T_ICLEAR_API_APPINFO
ADD C_CODE_CHECK VARCHAR(1)
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'C类校验是否校验运单号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'T_ICLEAR_API_APPINFO', @level2type=N'COLUMN',@level2name=N'C_CODE_CHECK'
GO
/****** 创建hscode表索引 ******/
CREATE NONCLUSTERED INDEX [nci_wi_T_CC_HS_CODE_SKU_CODE_SKUNAME] ON T_CC_HS_CODE
(
SKU_CODE ASC,
SKUNAME ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
\ No newline at end of file
......@@ -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.enums.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.enums.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;
}
......
package com.erry.iclear.dateInterface.api;
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.enums.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.*;
import com.erry.iclear.dateInterface.api.response.FedexResultChmRS;
import com.erry.iclear.dateInterface.api.response.FedexResultRS;
import com.erry.iclear.dateInterface.api.response.ResultRS;
import com.erry.iclear.dateInterface.entity.ChmConsignment;
import com.erry.iclear.dateInterface.entity.DeclaredInfo;
import com.erry.iclear.dateInterface.entity.IClearApiLog;
import com.erry.iclear.dateInterface.entity.TIClearApiCheckLog;
import com.erry.iclear.dateInterface.common.Constant;
import com.erry.iclear.dateInterface.entity.*;
import com.erry.iclear.dateInterface.repository.ChmConsignmentRepository;
import com.erry.iclear.dateInterface.repository.IClearApiCheckLogRepository;
import com.erry.iclear.dateInterface.service.*;
......@@ -22,11 +18,9 @@ import com.erry.iclear.dateInterface.util.StringUtil;
import com.google.gson.Gson;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.Header;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StopWatch;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
......@@ -65,7 +59,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,6 +70,8 @@ public class FedexDataInterface {
String token=(String) request.getHeader("Token");
String addr = request.getRemoteAddr();
//获取APPINFO信息
AppInfo appInfo = Constant.appInfoCache.get(appId + appKey);
TIClearApiCheckLog tIclearApiCheckLog = new TIClearApiCheckLog();
tIclearApiCheckLog.setRequestAppid(appId);
......@@ -96,7 +91,7 @@ public class FedexDataInterface {
log.info("checkBASFMawbFedex:"+fedexc.toString());
log.info("appId:{},appKey:{},timeStamp:{},token:{}",appId,appKey,timeStamp,token);
ResultRS result = fedexService.checkBasfInterfaceData(fedexc);
ResultRS result = fedexService.checkBasfInterfaceData(fedexc,appInfo);
StopWatch sw = new StopWatch("checkBASFMawbFedex");
sw.start("generate FedexMawb");
......@@ -106,18 +101,24 @@ public class FedexDataInterface {
sw.start("checkFedexMawb");
String msg = result.getMsg();
String iclearCheckMsg = fedexService.checkFedexMawb(saveMawbFedexResult).getMsg();
if(StringUtil.isEmpty(msg) && StringUtil.isEmpty(iclearCheckMsg)){
String iclearCheckMsg = fedexService.checkFedexMawb(saveMawbFedexResult,appInfo).getMsg();
if(result.getSuccess() && StringUtil.isEmpty(iclearCheckMsg)){
result.setSuccess(Boolean.TRUE);
}else{
if(result.getSuccess()){
//基本非空信息验证通过,并且iclear验证失败
result.setMsg(iclearCheckMsg);
}else{
//基本非空信息验证失败,并且iclear验证失败
result.setMsg(msg+";"+iclearCheckMsg);
}
}
sw.stop();
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,9 +129,7 @@ public class FedexDataInterface {
return result;
}
@ApiOperation(value = "C类Fedex推送运单数据", httpMethod = "POST", notes = "ex: http://192.168.1.75:8080/fedex/sendMawbFedex")
@ApiOperation(value = "Fedex推送运单数据", httpMethod = "POST", notes = "ex: http://192.168.1.75:8080/fedex/sendMawbFedex")
@PostMapping("/sendMawbFedex")
@ResponseBody
public ResultRS sendMawbFedex(HttpServletRequest request
......@@ -139,12 +138,11 @@ 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
StopWatch sw = new StopWatch("receice mawbFedex");
sw.start("save log");
......@@ -175,7 +173,7 @@ public class FedexDataInterface {
//2、TODO 校验主单
sw.start("checkFedexMawb");
result=fedexService.checkFedexMawb(saveMawbFedexResult);
result=fedexService.checkFedexMawb(saveMawbFedexResult,null);
if(!result.getSuccess()){
return result;
}
......@@ -189,7 +187,6 @@ public class FedexDataInterface {
// }
// sw.stop();
//4、保存运单到iclear中
sw.start("processChmConsignment");
result = chmConsignmentService.processChmConsignmentFedex(saveMawbFedexResult, timeStamp,appId);
......@@ -216,10 +213,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 +231,7 @@ public class FedexDataInterface {
//6、return result
result.setSuccess(Boolean.TRUE);
result.setCode("0");
result.setCode(ErrorCodeEnum.SUCCESS.getCode());
return result;
}
......@@ -250,13 +245,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 +290,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 +304,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 +349,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.enums.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.length() > 50){
skuCode = skuCode.substring(0,50);
}
String skuName = hscode.getSkuName();
if(!StringUtil.isEmpty(skuName) && skuName.length() > 1000){
skuName = skuName.substring(0,1000);
}
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;
}
}
}
......
......@@ -23,7 +23,7 @@ import java.util.Date;
@Slf4j
public class VersionInterface {
//当前版本号
final String VERSION = "1.5";
final String VERSION = "1.7";
@ApiOperation(value = "获取当前API版本", httpMethod = "GET", notes = "ex: http://192.168.1.71:8080/version/version")
@GetMapping("/version")
......
......@@ -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;
import com.erry.iclear.dateInterface.entity.ChmCarryPort;
import com.erry.iclear.dateInterface.entity.DictionaryEntries;
import com.erry.iclear.dateInterface.entity.DomesticDestinationMapping;
import com.erry.iclear.dateInterface.entity.OrigplacecodeMapping;
import com.erry.iclear.dateInterface.entity.*;
import org.springframework.stereotype.Component;
import java.util.HashMap;
......@@ -21,6 +18,11 @@ public class Constant {
public static Map<String,HashMap<String,String>> appIdSecurityCache = new HashMap<>();
/**
* APP INFO信息
*/
public static Map<String,AppInfo> appInfoCache = new HashMap<>();
/**
* 字典表 code:entity
*/
public static Map<String , DictionaryEntries> dictionaryEntriesCache = new HashMap<>();
......@@ -94,5 +96,8 @@ public class Constant {
public static String DECLARED_DOC_TYPE_ZERO="declaredDocType_00";
/**
* 监管条件
*/
public static final String supervise_condition = "superviseRestrict";
}
......
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());
......
......@@ -34,5 +34,9 @@ public class AppInfo implements Serializable {
@Column(name = "IS_ENABLE")
private String isEnable;
/**
* C类校验是否校验运单号,非空则不校验
*/
@Column(name = "C_CODE_CHECK")
private String codeCheck;
}
......
......@@ -416,6 +416,11 @@ public class ChmConsignment implements Serializable {
@OneToMany(mappedBy = "chmConsignment", cascade = CascadeType.ALL)
private List<ChmConsignmentDetail> chmConsignmentDetailList;
/**
* C类校验是否校验运单号,非空则不校验
*/
@Transient
private String codeCheck;
@Override
public String toString() {
......
package com.erry.iclear.dateInterface.enums;
/**
* 异常编码枚举类
* 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长度超出限制"),
ERROR_30105("30105","skuCode编码最少输入4位字符,skuName最少输入2个字符");
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;
}
}
package com.erry.iclear.dateInterface.interceptor;
import com.alibaba.fastjson.JSON;
import com.erry.iclear.dateInterface.enums.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.response.ResultHsCode;
import com.erry.iclear.dateInterface.api.response.ResultRS;
import com.erry.iclear.dateInterface.common.Constant;
import com.erry.iclear.dateInterface.util.SHA256Util;
import lombok.extern.slf4j.Slf4j;
......@@ -15,7 +15,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.HashMap;
/**
......@@ -36,40 +35,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 +98,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.enums.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
......
......@@ -41,4 +41,13 @@ public interface DictionaryEntriesRepository extends JpaRepository<DictionaryEn
@Query(nativeQuery = true, value = "SELECT * FROM T_BI_DICTIONARY_ENTRIES WHERE DICT_CODE = ?1 AND EXT6 = ?2")
public DictionaryEntries findDictionaryEntriesByDicCode(String code,String numBer);
/**
*监管条件
* @param dictCode
* @param status
* @return
*/
@Query(nativeQuery = true, value = "select CHINESE_NAME from T_BI_DICTIONARY_ENTRIES where DICT_CODE = ?1 AND STATUS=?2 order by ORDINAL")
public List<String> findDicEntByCodeList(String dictCode, Integer status);
}
......
......@@ -16,27 +16,35 @@ import java.util.List;
*/
@Repository
public interface HsCodeRepository extends JpaSpecificationExecutor<HsCode>, JpaRepository<HsCode, Long> {
/**
*
* 根据hscode编码查询最新一条hscode信息
* @param code
* @return
*/
@Query(nativeQuery = true,value = "select top 1 * from T_CC_HS_CODE where VALIDATE=1 and SKU_CODE =?1 order by id desc ")
public HsCode findHsCodeByCode(String code);
/**
* 根据hscode编码查询对应的hscode
* @param skuCodeList
* @return
*/
@Query(nativeQuery = true, value = "select * from [dbo].[T_CC_HS_CODE] where VALIDATE=1 and SKU_CODE in ?1")
@Query(nativeQuery = true, value = "select * from T_CC_HS_CODE where VALIDATE=1 and SKU_CODE in ?1")
List<HsCode> findHsCodeListByCode(List<String> skuCodeList);
/**
* 根据hscode编码或者商品名称进行模糊查询
* @param skuCode
* @param skuName
* @return
*/
@Query(nativeQuery = true, value = "SELECT TOP 50 * FROM T_CC_HS_CODE WHERE VALIDATE=1 and SKU_CODE LIKE ?1 AND SKUNAME LIKE ?2")
List<HsCode> fuzzyQueryHsCode(String skuCode,String skuName);
/**
* 查询所有有效hscode
* @return
*/
@Query(nativeQuery = true,value = "select * from T_CC_HS_CODE where VALIDATE=1")
public List<HsCode> findAllHsCodeList();
List<HsCode> findAllHsCodeList();
/**
* 获取监管条件数据
* @return
*/
@Query(nativeQuery = true,value = "select * from T_CC_HS_CODE where OUT_RATE <> 0 or MONITOR_CONDITION collate Chinese_PRC_CS_AI_WS LIKE ?1")
List<HsCode> findMonitorCondition(String chinsesName);
}
\ 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.enums.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{
......
......@@ -43,6 +43,7 @@ public class AppInfoService {
HashMap<String, String> appkeyMap = new HashMap<String, String>();
appkeyMap.put(appInfo.getAppKey(), appInfo.getSecurity());
Constant.appIdSecurityCache.put(appInfo.getAppId(), appkeyMap);
Constant.appInfoCache.put(appInfo.getAppId()+appInfo.getAppKey(),appInfo);
}
} catch (Exception e) {
log.error("initAppInfo() error" + e.getMessage());
......
......@@ -166,13 +166,13 @@ public class ChmConsignmentDetailService {
result.setSkuName(mawbDetail.getGname());
//成交数量
result.setKnockdownNumber(bigDecimalFormat(BigDecimal.valueOf(mawbDetail.getGqty().doubleValue())));
//第二法定数量
result.setQtyLegalSecond(bigDecimalFormat(mawbDetail.getSecondQty()));
//第二计量单位
DictionaryEntries secondUnitDictionaryEntries = Constant.dictionaryEntriesCache.get(Constant.TRANSACTION_UNIT+ mawbDetail.getSecondUnit());
if(!Objects.equals(secondUnitDictionaryEntries,null)){
result.setUnitLegalSecondId(secondUnitDictionaryEntries);
result.setUnitLegalSecond(secondUnitDictionaryEntries.getChineseName());
//第二法定数量
result.setQtyLegalSecond(bigDecimalFormat(mawbDetail.getSecondQty()));
}
//成交币制
......
package com.erry.iclear.dateInterface.service;
//import cn.hutool.core.date.DateUtil;
import com.erry.iclear.dateInterface.enums.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;
......@@ -239,7 +240,7 @@ public class ChmConsignmentService {
return result;
}
public ChmConsignment convertToChmConsignmentFedex(FedexMawb mawb, Date pushTime, String creator){
public ChmConsignment convertToChmConsignmentFedex(FedexMawb mawb, Date pushTime, String creator,AppInfo appInfo){
ChmConsignment result = new ChmConsignment();
try{
//运单号
......@@ -256,6 +257,11 @@ public class ChmConsignmentService {
result.setTradeModeDic(tradeModeDictionaryEntries);
result.setTradeMode(tradeModeDictionaryEntries.getChineseName());
}*/
if(appInfo != null){
//C类校验是否校验运单号,非空则不校验
result.setCodeCheck(appInfo.getCodeCheck());
}
//境内收发货人社会信用证代码
result.setTradeCoSCC(mawb.getTradeCodeScc());
//境内发货人(经营单位编码)
......@@ -487,8 +493,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<>();
......@@ -516,7 +522,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;
}
......@@ -571,10 +577,10 @@ public class ChmConsignmentService {
ResultRS result = new ResultRS(Boolean.FALSE,null,null);
try {
Date pushTime = DateUtils.timeStampToDate(Long.valueOf(timeStamp));
ChmConsignment chmConsignment = this.convertToChmConsignmentFedex(fedexMawb,pushTime,creator);
ChmConsignment chmConsignment = this.convertToChmConsignmentFedex(fedexMawb,pushTime,creator,null);
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<>();
......@@ -596,7 +602,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;
}
......@@ -629,7 +635,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.enums.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.*;
import com.erry.iclear.dateInterface.api.response.IClearCheckResponseResult;
import com.erry.iclear.dateInterface.api.response.ResultRS;
import com.erry.iclear.dateInterface.entity.AppInfo;
import com.erry.iclear.dateInterface.entity.ChmConsignment;
import com.erry.iclear.dateInterface.entity.ChmConsignmentDetail;
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;
......@@ -126,16 +113,16 @@ public class FedexService {
* @param fedexMawb
* @return
*/
public ResultRS checkFedexMawb(FedexMawb fedexMawb){
public ResultRS checkFedexMawb(FedexMawb fedexMawb,AppInfo appInfo){
ResultRS result = new ResultRS(Boolean.FALSE,null,null);
try{
log.info("checkMawb start>>>>>>>>>> mawb:"+gson.toJson(fedexMawb));
//1、将请求转换为运单
ChmConsignment chmConsignment=consignmentService.convertToChmConsignmentFedex(fedexMawb,null,"IDE-ICLEAR-API");
ChmConsignment chmConsignment=consignmentService.convertToChmConsignmentFedex(fedexMawb,null,"IDE-ICLEAR-API",appInfo);
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<>();
......@@ -180,18 +167,20 @@ public class FedexService {
* @param fedexc
* @return
*/
public ResultRS checkBasfInterfaceData(Fedexc fedexc){
public ResultRS checkBasfInterfaceData(Fedexc fedexc, AppInfo appInfo){
ResultRS result = new ResultRS(Boolean.FALSE,"","");
ResultRS result = new ResultRS(Boolean.TRUE,null,null);
if(Objects.equals(fedexc,null)){
result.setCode("-7");
result.setMsg("请求信息不能为空");
result.setCode(ErrorCodeEnum.ERROR_7.getCode());
result.setMsg(ErrorCodeEnum.ERROR_7.getName());
result.setSuccess(Boolean.FALSE);
}else{
List<String> msgList = new ArrayList<>();
// 参数consignmentCode不能为空
String consignmentCode = fedexc.getConsignmentCode();
if(StringUtils.isEmpty(consignmentCode)){
//C类校验是否校验运单号,非空则不校验
if(appInfo.getCodeCheck() == null && StringUtils.isEmpty(consignmentCode)){
msgList.add("参数consignmentCode不能为空");
}
// 参数consignmentId不能为空
......@@ -216,8 +205,9 @@ public class FedexService {
}
if(msgList.size() > 0){
String join = msgList.stream().collect(Collectors.joining(";"));
result.setCode("-7");
result.setCode(ErrorCodeEnum.ERROR_7.getCode());
result.setMsg(join);
result.setSuccess(Boolean.FALSE);
}
}
return result;
......
package com.erry.iclear.dateInterface.service;
import com.erry.iclear.dateInterface.enums.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.HsCodeParam;
import com.erry.iclear.dateInterface.api.response.ResultHsCode;
import com.erry.iclear.dateInterface.common.Constant;
import com.erry.iclear.dateInterface.entity.HsCode;
import com.erry.iclear.dateInterface.repository.DictionaryEntriesRepository;
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;
import java.util.Arrays;
import java.util.List;
import java.util.*;
/**
* hscode service
......@@ -17,8 +22,12 @@ import java.util.List;
@Service
@Slf4j
public class HsCodeService {
@Autowired
HsCodeRepository hsCodeRepository;
@Autowired
DictionaryEntriesRepository dicEntriesRepository;
/**
* 根据hscode编码查询对应的hscode
* @param hscode
......@@ -28,14 +37,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);
......@@ -56,15 +65,75 @@ public class HsCodeService {
hsCodeList.add(hsCode);
}
});
//只能申报D类hscode监管条件hscode
this.setHscodeSupervise(hsCodeList);
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;
}
/**
* 根据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;
}
//编码长度大于50校验失败
if(!StringUtil.isEmpty(hscode.getSkuCode()) && hscode.getSkuCode().length() > 50){
resultHsCode.setCode(ErrorCodeEnum.ERROR_30104.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30104.getName());
return resultHsCode;
}
//品名长度大于1000校验失败
if(!StringUtil.isEmpty(hscode.getSkuName()) && hscode.getSkuName().length() > 1000){
resultHsCode.setCode(ErrorCodeEnum.ERROR_30104.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30104.getName());
return resultHsCode;
}
//编码长度小于4位字符校验失败
if(!StringUtil.isEmpty(hscode.getSkuCode()) && hscode.getSkuCode().length() < 4){
resultHsCode.setCode(ErrorCodeEnum.ERROR_30105.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30105.getName());
return resultHsCode;
}
//品名长度小于2位字符校验失败
if(!StringUtil.isEmpty(hscode.getSkuName()) && hscode.getSkuName().length() < 2){
resultHsCode.setCode(ErrorCodeEnum.ERROR_30105.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30105.getName());
return resultHsCode;
}
String skuCode = "%"+hscode.getSkuCode()+"%";
String skuName = "%"+hscode.getSkuName()+"%";
//模糊查询hscode信息
List<HsCode> hsCodeList = this.hsCodeRepository.fuzzyQueryHsCode(skuCode,skuName);
//对查询数据进行处理,标志数据是否C类限制品名
//只能申报D类hscode监管条件hscode
this.setHscodeSupervise(hsCodeList);
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;
}
......@@ -78,15 +147,105 @@ 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(),ex);
resultHsCode.setSuccess(Boolean.FALSE);
resultHsCode.setCode("30101");
resultHsCode.setMsg("数据查询异常");
resultHsCode.setCode(ErrorCodeEnum.ERROR_30101.getCode());
resultHsCode.setMsg(ErrorCodeEnum.ERROR_30101.getName());
}
return resultHsCode;
}
/**
* 只能申报D类hscode监管条件hscode
* 设置hscode
* mt
* 2023年2月24日17:29:49
*/
public void setHscodeSupervise(List<HsCode> hsCodeList){
List<Long> hsCodeIds = new ArrayList<>();
Map<String,Object> hscodeMap = this.getHscodeSupervise();
StringBuffer shsql = new StringBuffer("'");
if (hscodeMap !=null && hscodeMap.size()>0){
for (Map.Entry hscodeEntry :hscodeMap.entrySet()){
HsCode hsCode = (HsCode) hscodeEntry.getValue();
hsCodeIds.add(hsCode.getId());
}
}
hsCodeList.forEach(hsCode->{
//判断该hscode是否只能申报D类
if(hsCodeIds.contains(hsCode.getId())){
//d类
hsCode.setRestrictedC(1);
}else{
//C类
hsCode.setRestrictedC(0);
}
//如果ID为空,则设置为空
if(hsCode.getId() == null){
hsCode.setRestrictedC(null);
}
});
}
/**
* 根据监管条件获取数据,只能申报D类hscode信息
* mt
* 2023年2月24日16:43:46
* @return
*/
private Map<String,Object> getHscodeSupervise(){
try {
Map<String,Object> returnMap = new HashMap<>();
List<String> dictionaryEntriesList = dicEntriesRepository.findDicEntByCodeList(Constant.supervise_condition,1);
if (dictionaryEntriesList !=null && dictionaryEntriesList.size()>0){
String chinsesName = "%[";
for (int i= 0;i<dictionaryEntriesList.size();i++){
if (dictionaryEntriesList.size() -1 == i){
chinsesName += dictionaryEntriesList.get(i)+"]%";
}else{
chinsesName += dictionaryEntriesList.get(i)+"|";
}
}
//查询监管条件数据
List<HsCode> hsCodeList = this.hsCodeRepository.findMonitorCondition(chinsesName);
hsCodeList.forEach(hsCode->{
String newCode = getSubHscode(hsCode.getSkuCode());
returnMap.put(newCode,hsCode);
});
}
return returnMap;
}catch (Exception e){
log.error(e.getMessage(),e);
}
return null;
}
/**
* 对商品编码进行处理
* @param code
* @return
*/
private String getSubHscode(String code){
try {
if (!StringUtil.isEmptyWithTrim(code) && code.length()>6) {
if (code.length() == 7) {
code = "0" + code + "00";
} else if (code.length() == 8) {
code = code + "00";
} else if (code.length() == 9) {
code = "0" + code;
} else if (code.length() > 10) {
code = code.substring(0, 10);
}
return code;
}
}catch (Exception e){
log.error(e.getMessage(),e);
}
return null;
}
}
\ No newline at end of file
......
......@@ -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;
}
......
......@@ -5,12 +5,10 @@ import com.erry.iclear.dateInterface.api.request.MawbDetail;
import com.erry.iclear.dateInterface.api.response.ResultRS;
import com.erry.iclear.dateInterface.repository.MawbDetailRepository;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
/**
* @author Administrator
......@@ -18,39 +16,21 @@ import java.util.Objects;
@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,"30002",null);
ResultRS result = new ResultRS(Boolean.FALSE,null,null);
try{
for (MawbDetail detail : mawb.getMawbDetailList()) {
String secondUnit = detail.getSecondUnit();
if (StringUtils.isNotEmpty(secondUnit)) {
Integer secondQty = detail.getSecondQty();
if (Objects.isNull(secondQty)) {
result.setMsg("参数secondQty不能为空");
return result;
}
}
}
result.setSuccess(Boolean.TRUE);
}catch (Exception e){
log.error("checkMawbDetail() error:"+e.getMessage());
}
return result;
}
}
\ No newline at end of file
......
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.enums.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;
......@@ -15,7 +13,6 @@ import com.erry.iclear.dateInterface.util.JsonToJava;
import com.erry.iclear.dateInterface.util.StringUtil;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.Header;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
......@@ -166,11 +163,9 @@ public class MawbService {
}
}
}
return "";
}
/**
* 校验主单
* @param mawb
......@@ -180,12 +175,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 +187,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 +205,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 +231,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.enums.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,13 +8,13 @@ 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 * ?
task.pushErrorReturnDate=0 0/3 * * * ?
#推送失败的申报数据
task.pushErrorDeclareDate=0 0/3 * 1 * ?
task.pushErrorDeclareDate=0 0/3 * * * ?
api.base-address=https://declarationuat.fedex.com.cn/Exp
#获取token账号
......
......@@ -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 * * * ?
#推送失败的申报数据
......
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>iClear-api</contextName>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/var/fedex/dxpweb/weblogic/api/log/"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
......@@ -15,9 +16,9 @@
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<prudent>false</prudent>
<append>true</append>
<file>E:/api/logs/iClear-api.log</file>
<file>${LOG_HOME}/iClear-api.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>E:/api/logs/iClear-api-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<fileNamePattern>${LOG_HOME}/iClear-api-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
......@@ -28,7 +29,6 @@
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread{0}] %c{0} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<logger name="io.lettuce.core" level="ERROR" />
......@@ -51,6 +51,4 @@
<appender-ref ref="FILE"/>
</root>
</springProfile>
</configuration>
......
......@@ -24,7 +24,7 @@ public class ApiTest {
//获取HSCODE接口地址
public static String hscodeRequest = "hscode/hscodeRequest";
public static String timeStamp = "1645153943";
public static String timeStamp = "1624263798669";
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("DEMO1" + "iClearExportDemo1" + "8c7f1108316abfb1" + ApiTest.timeStamp);
System.out.println(token);
//D类申报的数据落地接口
......
......@@ -40,22 +40,22 @@ public class ChmConsignmentServiceTest extends IClearApiApplicationTests {
@Test
public void testProcessChmConsignment1(){
try{
ResultRS result = new ResultRS(Boolean.FALSE,"","");
Fedexc fedexc = this.createNewFedex();
FedexMawb mawb = fedexService.saveMawbFedex(fedexc);
//Basfc fedexc = this.createNewBasf();
String timeStamp = String.valueOf(new Date().getTime());
ResultRS resultRS = chmConsignmentService.processChmConsignmentFedex(mawb, timeStamp, "BASF");
/*result=fedexService.checkBasfMawb(mawb);
if(!result.getSuccess()){
System.out.println(result.getMsg());
}*/
System.out.println(resultRS.toString());
}catch (Exception e){
e.printStackTrace();
}
System.out.println("1");
// try{
// ResultRS result = new ResultRS(Boolean.FALSE,"","");
// Fedexc fedexc = this.createNewFedex();
// FedexMawb mawb = fedexService.saveMawbFedex(fedexc);
// //Basfc fedexc = this.createNewBasf();
// String timeStamp = String.valueOf(new Date().getTime());
// ResultRS resultRS = chmConsignmentService.processChmConsignmentFedex(mawb, timeStamp, "BASF");
// /*result=fedexService.checkBasfMawb(mawb);
// if(!result.getSuccess()){
// System.out.println(result.getMsg());
// }*/
// System.out.println(resultRS.toString());
// }catch (Exception e){
// e.printStackTrace();
// }
// System.out.println("1");
}
private Fedexc createNewFedex(){
......