tao.mo

API代码提交

mt
2021年8月4日13:39:17
......@@ -90,6 +90,13 @@
<artifactId>httpclientutil</artifactId>
<version>1.0.4</version>
</dependency>
<!--序列化-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
</dependencies>
<profiles>
......
package com.erry.iclear.dateInterface.api.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
@ApiModel(value = "receiptMessage", description = "海关回执")
@Entity
@Table(name = "T_RECEIPT_MESSAGE")
@Data
public class ReceiptMessage implements Serializable {
private static final long serialVersionUID = 4293869083362084652L;
/**
* ID,自动增加
*/
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@ApiModelProperty(value = "客户端编号", name = "clientSeqNo", example = "773515164336")
@Column(name = "CLIENTSEQ_NO")
String clientSeqNo;
@ApiModelProperty(value = "数据中心统一编号", name = "seqNo", example = "E20210000617922161")
@Column(name = "SEQ_NO")
String seqNo;
@ApiModelProperty(value = "报关单编号", name = "entryId", example = "010120210000226020")
@Column(name = "ENTRY_ID")
String entryId;
@ApiModelProperty(value = "回执时间", name = "noticeDate", example = "20210423T231152")
@Column(name = "NOTICE_DATE")
String noticeDate;
@ApiModelProperty(value = "回执代码", name = "channel", example = "R")
@Column(name = "CHANNEL")
String channel;
@ApiModelProperty(value = "回执说明", name = "note", example = "该单已结关")
@Column(name = "NOTE")
String note;
@ApiModelProperty(value = "总单号_运单号", name = "billNo", example = "02355851832_773515164336")
@Column(name = "BILL_NO")
String billNo;
}
package com.erry.iclear.dateInterface.api.response;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class TokenDataResult {
String expire_in;
String token;
}
\ No newline at end of file
package com.erry.iclear.dateInterface.api.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class TokenResult implements Serializable {
TokenDataResult data;
String errorcode;
String errormessage;
}
\ 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";
}
}
package com.erry.iclear.dateInterface.entity;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author Administrator
*/
@Entity
@Table(name = "T_DECLEAR_TASK")
@Data
public class DeclearTask implements Serializable {
private static final long serialVersionUID = 1763766526675864727L;
/**
* 运单明细表ID,自动增加
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "CHMSIGNMENT_ID")
private BigDecimal chmsignmentId;
@Column(name = "CHMSIGNMENT_CODE")
private String chmsignmentCode;
@Column(name = "CHMSIGNMENT_HEAD_CODE")
private String chmsignmentHeadCode;
@Column(name = "PORT_ID")
private BigDecimal portId;
@Column(name = "PORT_NAME")
private String portName;
@Column(name = "FILE_TYPE")
private String fileType;
@Column(name = "OPERATION_TIME")
private Date operationTime;
@Column(name = "OPERATION_NAME")
private String operationName;
@Column(name = "DATA_SOURCE")
private String dataSource;
@Column(name = "PUSH_NUMBER")
private BigDecimal pushNumber;
@Column(name = "PUSH_TIME")
private Date pushTime;
@Column(name = "RESPONSE_TIME")
private Date responseTime;
@Column(name = "RESPONSE_RESULTS")
private String responseResults;
@Column(name = "RESPONSE_CONTENT")
private String responseContent;
}
\ No newline at end of file
package com.erry.iclear.dateInterface.repository;
import com.erry.iclear.dateInterface.api.request.ReceiptMessage;
import com.erry.iclear.dateInterface.entity.DeclearTask;
import com.erry.iclear.dateInterface.entity.OrigplacecodeMapping;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
/**
* 海关回执信息日志表
* mt
* 2021年7月29日15:36:29
*/
@Repository
public interface ReceiptMessageRepository extends JpaSpecificationExecutor<ReceiptMessage>, JpaRepository<ReceiptMessage, Long> {
/**
* 查找所有目的地
*
* @param
* @return
*/
@Query(nativeQuery = true, value = "SELECT TOP 1 RM.* FROM T_RECEIPT_MESSAGE RM INNER JOIN T_DECLEAR_TASK DT ON(RM.ID = DT.CHMSIGNMENT_ID) WHERE FILE_TYPE = 2 AND PUSH_NUMBER < 3 AND (RESPONSE_RESULTS IS NULL OR RESPONSE_RESULTS <> '0') ORDER BY RM.NOTICE_DATE ASC")
public List<ReceiptMessage> findReceiptMessageList();
@Modifying(clearAutomatically = false)
@Query(nativeQuery = true,value = "UPDATE T_DECLEAR_TASK SET PUSH_TIME = ?1,PUSH_NUMBER = PUSH_NUMBER + 1,RESPONSE_TIME = ?2,RESPONSE_RESULTS = ?3,RESPONSE_CONTENT = ?4 WHERE FILE_TYPE = 2 AND CHMSIGNMENT_ID = ?5")
void updateDeclearTaskStatus(Date pushTime, Date responseTime, String responseResults, String responseContent, Long chmsignmentId);
}
\ 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.api.request.ReceiptMessage;
import com.erry.iclear.dateInterface.api.response.TokenResult;
import com.erry.iclear.dateInterface.common.Constants;
import com.erry.iclear.dateInterface.entity.DeclearTask;
import com.erry.iclear.dateInterface.repository.ReceiptMessageRepository;
import com.erry.iclear.dateInterface.util.JsonToJava;
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;
import javax.transaction.Transactional;
import java.math.BigDecimal;
import java.util.*;
/**
* 调用API接口Service
* mt
* 2021年7月28日17:04:27
*/
@Service
@Slf4j
@Transactional(rollbackOn = Exception.class)
public class ApiService {
@Value("${api.token-info.username}")
String username;
@Value("${api.token-info.password}")
String password;
@Value("${api.address.token-url}")
String tokenUrl;
@Value("${api.address.refresh-token-url}")
String refreshTokenUrl;
@Value("${api.address.customs-url}")
String customsUrl;
@Value("${api.address.complete-msg-url}")
String completeMsgUrl;
@Autowired
ReceiptMessageRepository receiptMessageRepository;
/**
* 获取token信息
* @return
* @throws Exception
*/
public TokenResult getToken() throws Exception{
Map<String,Object> map = new HashMap<String,Object>();
map.put("username", this.username);
map.put("password", this.password);
HttpConfig config = HttpConfig.custom()
.url(tokenUrl)
.map(map)
.encoding("utf-8");
String tokenJson = HttpClientUtil.post(config);
TokenResult tokenResult = JsonToJava.parseJson(tokenJson,TokenResult.class);
return tokenResult;
}
/**
* 刷新token
* @param token
* @throws Exception
*/
public void refreshToken(String token) throws Exception{
Map<String,Object> map = new HashMap<String,Object>();
map.put("token", token);
HttpConfig config = HttpConfig.custom()
.url(refreshTokenUrl)
.map(map)
.encoding("utf-8");
HttpClientUtil.post(config);
}
/**
* 传输海关回执数据
* @param token
* @throws Exception
*/
public void pushCustoms(String token){
Header[] headers = HttpHeader.custom()
.other("Content-Type", "application/json")
.other("Authorization", token)
.build();
//获取海关回执数据
List<ReceiptMessage> receiptMessageList = receiptMessageRepository.findReceiptMessageList();
List<DeclearTask> declearTaskList = new ArrayList<DeclearTask>();
receiptMessageList.forEach(d->{
DeclearTask declearTask = new DeclearTask();
try {
//设置ID
declearTask.setChmsignmentId(BigDecimal.valueOf(d.getId()));
//推送时间
declearTask.setPushTime(new Date());
String objJson = JsonToJava.toJson(d);
//推送海关回执数据
HttpConfig config = HttpConfig.custom()
.headers(headers)
.url(customsUrl)
.encoding("utf-8")
.json(objJson);
String json = HttpClientUtil.post(config);
//接口响应时间
declearTask.setResponseTime(new Date());
TokenResult tokenResult = JsonToJava.parseJson(json,TokenResult.class);
if(tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.SUCCESS)){
//推送成功,记录推送状态
declearTask.setResponseResults(tokenResult.getErrorcode());
declearTask.setResponseContent(tokenResult.getErrormessage());
declearTaskList.add(declearTask);
}else if(tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.KEY_10004)){
//如果凭证失效,则刷新凭证
refreshToken(token);
}else{
//推送失败,记录推送状态
declearTask.setResponseResults(tokenResult.getErrorcode());
declearTask.setResponseContent(tokenResult.getErrormessage());
declearTaskList.add(declearTask);
log.info("海关回执推送失败,推送相应码为:"+tokenResult.getErrorcode() + ",推送ID为:" + d.getId());
}
}catch(Exception ex){
//接口响应时间
declearTask.setResponseTime(new Date());
declearTask.setResponseResults("接口调用失败!");
declearTask.setResponseContent(ex.getMessage());
declearTaskList.add(declearTask);
ex.printStackTrace();
}
});
declearTaskList.forEach(declearTask -> {
//将已经推送完成的回执信息状态修改
receiptMessageRepository.updateDeclearTaskStatus(declearTask.getPushTime(),
declearTask.getResponseTime(),
declearTask.getResponseResults(),
declearTask.getResponseContent(),
declearTask.getChmsignmentId().longValue());
});
}
/**
* 传输完整报文数据
* @param token
* @throws Exception
*/
public void pushMawb(String token){
Header[] headers = HttpHeader.custom()
.other("Content-Type", "application/json")
.other("Authorization", token)
.build();
//获取海关回执数据
}
}
package com.erry.iclear.dateInterface.task;
import com.erry.iclear.dateInterface.api.response.TokenResult;
import com.erry.iclear.dateInterface.common.Constants;
import com.erry.iclear.dateInterface.service.ApiService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
......@@ -10,18 +14,65 @@ import org.springframework.stereotype.Component;
@Component
@Slf4j
public class IClearApiTask {
@Autowired
ApiService apiService;
String token;
/**
* TODO 定时任务:每分钟推送: 报关数据、回执
*/
@Scheduled(cron = "${task.pushMawbToIClear}")
public void pushMawbToIClear(){
@Scheduled(cron = "${task.pushCustomsTask}")
public void pushCustomsTask(){
try{
log.info("pushMawbToIClear start>>>>>>>>>>>>");
log.info("pushCustomsTask start>>>>>>>>>>>>");
if(token == null){
try {
//获取token
TokenResult tokenResult = apiService.getToken();
if(tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.SUCCESS)){
this.token = tokenResult.getData().getToken();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
if(this.token == null){
throw new Exception("获取token失败!");
}
//获取token成功则进行海关回执推送
apiService.pushCustoms(this.token);
log.info("pushCustomsTask end>>>>>>>>>>>>");
}catch (Exception e){
log.error("pushCustomsTask() error:" +e.getMessage());
}
}
log.info("pushMawbToIClear end>>>>>>>>>>>>");
/**
* TODO 定时任务:每分钟推送: 完整报文
*/
@Scheduled(cron = "${task.pushMawbTask}")
public void pushMawbTask(){
try{
log.info("pushMawbTask start>>>>>>>>>>>>");
if(token == null){
try {
//获取token
TokenResult tokenResult = apiService.getToken();
if(tokenResult.getErrorcode().equals(Constants.ApiResponseKeys.SUCCESS)){
this.token = tokenResult.getData().getToken();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
if(this.token == null){
throw new Exception("获取token失败!");
}
//获取token成功则进行海关回执推送
apiService.pushMawb(this.token);
log.info("pushMawbTask end>>>>>>>>>>>>");
}catch (Exception e){
log.error("pushMawbToIClear() error:" +e.getMessage());
log.error("pushMawbTask() error:" +e.getMessage());
}
}
}
......
package com.erry.iclear.dateInterface.util;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
/**
* json字符串和java对象转换
* mt
* 2021年7月29日11:40:27
*/
public class JsonToJava {
/*
Json字符串转Java对象
*/
public static <T>T parseJson(String jsonStr, Class cla) {
Object jsonRootBean = JSONObject.parseObject(jsonStr, cla);
return (T)jsonRootBean;
}
/*
对象转Json串
*/
public static String toJson(Object object) {
String jsonString = JSONObject.toJSONString(object, SerializerFeature.WriteMapNullValue);
return jsonString;
}
}
......@@ -6,9 +6,25 @@ spring:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
type: com.alibaba.druid.pool.DruidDataSource
task:
pushMawbToIClear: 0 0/1 * * * ?
#推送海关回执
pushCustomsTask: 0 0/1 * * * ?
#推送完整报文
pushMawbTask: 0 0/1 * * * ?
#推送地址
api:
token-info:
#获取token账号
username: iclear_external_ctm
#获取token密码
password: toQu3arch6
address:
#获取token地址
token-url: https://apiuat.iclrccd-fedex.com/login
#刷新token地址
refresh-token-url: https://apiuat.iclrccd-fedex.com/user/token/refresh
#传输海关回执地址
customs-url: https://apiuat.iclrccd-fedex.com/export/outbound/customs
#推送完整报文地址
complete-msg-url: https://apiuat.iclrccd-fedex.com/export/outbound/mawb
\ No newline at end of file
......
......@@ -6,6 +6,25 @@ spring:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
type: com.alibaba.druid.pool.DruidDataSource
task:
pushMawbToIClear: 0 0/1 * * * ?
\ No newline at end of file
#推送海关回执
pushCustomsTask: 0 0/1 * * * ?
#推送完整报文
pushMawbTask: 0 0/1 * * * ?
#推送地址
api:
token-info:
#获取token账号
username: iclear_external_ctm
#获取token密码
password: toQu3arch6
address:
#获取token地址
token-url: https://api.iclrccd-fedex.com/export/login
#刷新token地址
refresh-token-url: https://api.iclrccd-fedex.com/export/admin/user/token/refresh
#传输海关回执地址
customs-url: https://api.iclrccd-fedex.com/export/outbound/customs
#推送完整报文地址
complete-msg-url: https://api.iclrccd-fedex.com/export/export/outbound/mawb
\ No newline at end of file
......
......@@ -6,9 +6,25 @@ spring:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
type: com.alibaba.druid.pool.DruidDataSource
task:
pushMawbToIClear: 0 0/1 * * * ?
#推送海关回执
pushCustomsTask: 0 0/1 * * * ?
#推送完整报文
pushMawbTask: 0 0/1 * * * ?
#推送地址
api:
token-info:
#获取token账号
username: iclear_external_ctm
#获取token密码
password: toQu3arch6
address:
#获取token地址
token-url: https://apiuat.iclrccd-fedex.com/login
#刷新token地址
refresh-token-url: https://apiuat.iclrccd-fedex.com/user/token/refresh
#传输海关回执地址
customs-url: https://apiuat.iclrccd-fedex.com/export/outbound/customs
#推送完整报文地址
complete-msg-url: https://apiuat.iclrccd-fedex.com/export/outbound/mawb
\ No newline at end of file
......
package com.erry.iclear.dateInterface;
import com.arronlong.httpclientutil.HttpClientUtil;
import com.arronlong.httpclientutil.common.HttpConfig;
import com.arronlong.httpclientutil.common.HttpHeader;
import com.erry.iclear.dateInterface.api.response.TokenResult;
import com.erry.iclear.dateInterface.util.JsonToJava;
import org.apache.http.Header;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Value;
import java.util.HashMap;
import java.util.Map;
public class TokenTest extends IClearApiApplicationTests {
@Value("${api.token-info.username}")
String username;
@Value("${api.token-info.password}")
String password;
@Value("${api.address.token-url}")
String tokenUrl;
@Value("${api.address.refresh-token-url}")
String refreshTokenUrl;
@Value("${api.address.customs-url}")
String customsUrl;
@Value("${api.address.complete-msg-url}")
String completeMsgUrl;
@Test
public void token() throws Exception{
Map<String,Object> map = new HashMap<String,Object>();
map.put("username", this.username);
map.put("password", this.password);
HttpConfig config = HttpConfig.custom()
.url(tokenUrl)
.map(map)
.encoding("utf-8");
String token = HttpClientUtil.post(config);
TokenResult rss = JsonToJava.parseJson(token, TokenResult.class);
System.out.println(token);
System.out.println(refreshTokenUrl);
token = "eyJhbGciOiJSUzI1NiJ9.eyJleHBpcmVBdCI6MTYyNzQ3MTkyNjIxMCwidXNlcklkIjoiaWNsZWFyX2V4dGVybmFsX2N0bSJ9.dGrNuB8yHkeDM2Cmxwa7tej30fxQ6BpKYieWYh2kaW_nx75Hit8wy3FiLZTEgfXqa4o2axJEslrPgzedle5j5PIlTl-vz1WcCKDvLAh0PNeCX6i7NmpMKwemPAJp8gdo1HYjMdJPn7cV7Cjc7rSS1zjS4NCu0Ob7Qjf_FKopBYYJUITGy79Y0XbDo9_tHxS-2_8ahU3q78l799amQughnnMU3srpD9PLyKNO8uz6l-eV6ShSfYNE0o2L1FSH8xgqpIKNrRsl-JKasHIQl-82CiX-2XEtFFU4JbxDp9t-7jo-UlEIIKWk1Gy10nVC9FSntFFIHgTJ2lMAxF7QqI3QlQ";
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("token", token);
HttpConfig config1 = HttpConfig.custom()
.url(refreshTokenUrl)
.map(map1)
.encoding("utf-8");
String rs = HttpClientUtil.post(config1);
System.out.println(rs);
}
}