Browse Source

add flight list interface

tags/B.2.5.0_20231216_base
yk 2 years ago
parent
commit
ee94a919b8
5 changed files with 182 additions and 34 deletions
  1. +38
    -0
      xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/controller/BaseApiController.java
  2. +45
    -0
      xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/domain/BaseReq.java
  3. +42
    -0
      xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/FlightsQueryReq.java
  4. +2
    -1
      xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/PlaneQueryReq.java
  5. +55
    -33
      xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/controller/PlaneController.java

+ 38
- 0
xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/controller/BaseApiController.java View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.google.common.collect.Lists;
import com.xueyi.common.core.web.vo.DeviceTenantSourceMergeVo;
import com.xueyi.common.web.constant.ResponseCode;
import com.xueyi.common.web.entity.domain.BaseReq;
import com.xueyi.common.web.response.MyResponse;
import com.xueyi.system.api.device.feign.RemoteDeviceTenantMergeService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,6 +22,43 @@ public class BaseApiController {
private MyResponse message = null;


public MyResponse checkSign(Object t, String sign, String ts){
System.err.println("----------header check start----------");
if (ts == null || ts.isEmpty()) {
return output(400, "ts is null");
}
if (sign == null || sign.isEmpty()) {
return new MyResponse(400, "sign is null");
}
ts.replace(".", "");
Long tsVal = Long.parseLong(ts);
if (ts.length() == 10) {
// 将10位时间戳转为13位
tsVal *= 1000;
}
Long currentTs = System.currentTimeMillis();

if (currentTs - tsVal > 1000 * 60 || tsVal - currentTs > 1000 * 60){//时间误差正负1分钟内为合法
return new MyResponse(400, "请求时间戳ts非法");
}
System.err.println("----------header check complete----------");
BaseReq req = null;
String signStr = "";
if (t instanceof BaseReq) {
req = (BaseReq) t;
signStr = req.getSign(ts);
}
System.err.println(signStr);
System.err.println(sign);
System.err.println("----------sign check end----------");

if (!sign.equals(signStr)) {
return output(ResponseCode.AUTH_NOT_PASS);
}
return new MyResponse(200);
}


public DeviceTenantSourceMergeVo getDeviceTenantSourceMergeVo(String devId){
return remoteDeviceTenantMergeService.selectDeviceTenantSourceMerge(devId);
}


+ 45
- 0
xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/domain/BaseReq.java View File

@@ -0,0 +1,45 @@
package com.xueyi.common.web.entity.domain;

import lombok.Data;
import org.springframework.util.DigestUtils;

import java.lang.reflect.Field;
import java.util.Arrays;

/**
* @author yk
* @description
* @date 2023-12-06 11:45
*/
@Data
public class BaseReq {

public String getSign(String ts){
Field[] fields = this.getClass().getDeclaredFields();
StringBuilder sb = new StringBuilder();
//fields按name字典排序
Arrays.sort(fields, (o1, o2) -> o1.getName().compareTo(o2.getName()));
for (Field field : fields) {
//设置允许通过反射访问私有变量
field.setAccessible(true);
//获取字段属性名称
String name = field.getName();
//获取字段的值
String value = null;
try {
value = field.get(this).toString();
sb.append(value);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
//其他自定义操作
System.out.println("字段的属性名称:"+name);
System.out.println("字段的值:"+value);
}
String parmas = sb.toString()+ts;
System.err.println("加密前的参数:"+parmas);
//返回md5加密后的值
return DigestUtils.md5DigestAsHex(parmas.getBytes());
}

}

+ 42
- 0
xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/FlightsQueryReq.java View File

@@ -0,0 +1,42 @@
package com.xueyi.system.interfaces.airport.bean;

import com.xueyi.common.web.entity.domain.BaseReq;
import lombok.Data;

import javax.validation.constraints.NotNull;

/**
* @author yk
* @description
* @date 2023-12-06 11:45
*/
@Data
public class FlightsQueryReq extends BaseReq {

@NotNull(message = "Valid校验:出发城市startCity不能为空!")
private String startCity;

@NotNull(message = "Valid校验:抵达城市endCity不能为空!")
private String endCity;

@NotNull(message = "Valid校验:时间startDate不能为空!")
private String date;




@Override
public String toString() {
return "PlaneQueryReq{" +
"START_CITY='" + startCity + '\'' +
", END_CITY='" + endCity + '\'' +
", START_DATE='" + date + '\'' +
'}';
}

public String toQueryString() {
return "START_CITY=" + startCity +
"&END_CITY=" + endCity +
"&START_DATE=" + date;
}
}

+ 2
- 1
xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/PlaneQueryReq.java View File

@@ -1,5 +1,6 @@
package com.xueyi.system.interfaces.airport.bean;

import com.xueyi.common.web.entity.domain.BaseReq;
import lombok.Data;

import javax.validation.constraints.NotNull;
@@ -10,7 +11,7 @@ import javax.validation.constraints.NotNull;
* @date 2023-12-06 11:45
*/
@Data
public class PlaneQueryReq {
public class PlaneQueryReq extends BaseReq {

@NotNull(message = "Valid校验:航班号fNum不能为空!")
private String fNum;


+ 55
- 33
xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/controller/PlaneController.java View File

@@ -2,9 +2,9 @@ package com.xueyi.system.interfaces.airport.controller;

import com.alibaba.fastjson2.JSONObject;
import com.xueyi.common.redis.utils.RedisUtil;
import com.xueyi.common.web.constant.ResponseCode;
import com.xueyi.common.web.controller.BaseApiController;
import com.xueyi.common.web.response.MyResponse;
import com.xueyi.system.interfaces.airport.bean.FlightsQueryReq;
import com.xueyi.system.interfaces.airport.bean.PlaneQueryReq;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
@@ -13,7 +13,6 @@ import okhttp3.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -32,42 +31,25 @@ import java.io.IOException;
public class PlaneController extends BaseApiController {
private final Logger logger = LoggerFactory.getLogger(PlaneController.class);

@Value("${notification.airport.flight.key}")
@Value("${notification.airport.flight.juhe.key}")
private String key;

@Value("${notification.airport.flight.juhe.url}")
private String juHeUrl;

@Value("${notification.airport.flight.icredit.app-code}")
private String icreditCode;

@Value("${notification.airport.flight.icredit.flights-url}")
private String icreditUrl;

@RequestMapping("/query-flight")
public JSONObject query (@Valid @RequestBody PlaneQueryReq req, HttpServletRequest httpServletRequest) {
String sign = httpServletRequest.getHeader("sign");
String ts = httpServletRequest.getHeader("ts");
System.err.println("----------sign check start----------");
if (ts == null || ts.isEmpty()) {
return output(400, "ts is null").toJSON();
}
if (sign == null || sign.isEmpty()) {
return new MyResponse(400, "sign is null").toJSON();
}
ts.replace(".", "");
Long tsVal = Long.parseLong(ts);
if (ts.length() == 10) {
// 将10位时间戳转为13位
tsVal *= 1000;
}
Long currentTs = System.currentTimeMillis();
System.err.println(currentTs);
System.err.println(tsVal);

if (currentTs - tsVal > 1000 * 60 || tsVal - currentTs > 1000 * 60){//时间误差正负1分钟内为合法
return new MyResponse(400, "请求时间戳ts非法").toJSON();
}
String singStr = req.getDate() + req.getFNum() + ts;
System.err.println(singStr);
String signStr = DigestUtils.md5DigestAsHex(singStr.getBytes());
System.err.println(signStr);
System.err.println(sign);
System.err.println("----------sign check end----------");

if (!sign.equals(signStr)) {
return output(ResponseCode.AUTH_NOT_PASS).toJSON();
MyResponse resp = super.checkSign(req, sign, ts);
if (resp.getStatus() != 200) {
return resp.toJSON();
}

logger.info("查询航班信息:{}", req);
@@ -83,7 +65,7 @@ public class PlaneController extends BaseApiController {
logger.info("请求参数:{}", "key="+key+"&"+req.toQueryString());
okhttp3.RequestBody body = okhttp3.RequestBody.Companion.create("key="+key+"&"+req.toQueryString(), mediaType);
Request request = new Request.Builder()
.url("http://v.juhe.cn/flight_dynamic/query")
.url(juHeUrl)
.method("POST", body)
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.build();
@@ -100,8 +82,48 @@ public class PlaneController extends BaseApiController {
} catch (IOException e) {
throw new RuntimeException(e);
}
return new JSONObject();
}

@RequestMapping("/flight-list")
public JSONObject flightList (@Valid @RequestBody FlightsQueryReq req, HttpServletRequest httpServletRequest) {
String sign = httpServletRequest.getHeader("sign");
String ts = httpServletRequest.getHeader("ts");
MyResponse resp = super.checkSign(req, sign, ts);
if (resp.getStatus() != 200) {
return resp.toJSON();
}

logger.info("查询航班列表信息:{}", req);
String dateStr = req.getDate().replaceAll("-","");
String redisKey = "dgman:airport:flight:"+req.getEndCity()+":" + dateStr;
if (RedisUtil.existed(redisKey)){
return JSONObject.parseObject(RedisUtil.getVal(redisKey).toString());
}

req.setDate(req.getDate().replaceAll("-",""));

OkHttpClient client = new OkHttpClient().newBuilder()
.build();
Request request = new Request.Builder()
.url(icreditUrl+"?"+req.toQueryString())
.get()
.addHeader("Authorization", "APPCODE "+icreditCode)
.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
.build();
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
String result = response.body().string();
logger.info("查询航班列表结果:{}", result);
RedisUtil.setVal(redisKey,result,60*60*24);

return JSONObject.parseObject(result);
}

} catch (IOException e) {
throw new RuntimeException(e);
}
return new JSONObject();
}



Loading…
Cancel
Save