自我记录:
跨系统拉取数据时应该根据记录表来拉取判断:
表结构如下 user_shipment_status_records:
编号 | |
---|---|
开始时间 (timestamp) | add_time |
结束时间 (timestamp) | end_time |
成功状态 (int) | whether_status |
推送或拉取内容 (text) | push_pull_content (0失败1成功) |
返回内容 (text) | return_content |
– | – |
实体类:
/**
* 用户物流信息拉取记录表
*/
@Getter
@Setter
public class UserShipmentStatusRecords implements Serializable {
private Integer id; //编号
private Timestamp addTime; //开始时间
private Timestamp endTime; //结束时间
private Integer whetherStatus; //成功状态
private String pushPullContent; //拉取内容
private String returnContent; //返回内容
private Integer treatmentStateDispose; //处理状态
}
mapper:
//添加用户物流信息
Integer addUserOrderShipmentPro(UserOrderShipmentPro userOrderShipmentPro);
//删除用户物流信息 根据订单号
@Delete("DELETE FROM user_order_shipment_pro WHERE order_no = #{orderNo}")
Integer deleteUserOrderShipmentPro(String orderNo);
//查看物流状态 失败记录的开始时间
//@Select("select * from user_shipment_status_records where whether_status=0 and treatment_state_dispose=0 ORDER BY add_time asc LIMIT 1")
@Select("select * from user_shipment_status_records where whether_status=1 and treatment_state_dispose=0 ORDER BY add_time desc LIMIT 1")
UserShipmentStatusRecords selectUserShipmentStatusRecords();
service:
//定时拉取用户物流信息进行新增或修改
@Override
public Integer addOrUpdateUserOrderShipmentPro() {
//根据时间节点来获取订单
UserShipmentStatusRecords userShipmentStatusRecords = systemOrderMapper.selectUserShipmentStatusRecords();//查看物流状态 失败记录的开始时间
UserShipmentStatusRecords userShipmentStatus = new UserShipmentStatusRecords();//物流拉取拉取记录
//查看最新订单状态 失败 或成功
if (userShipmentStatusRecords == null) {
//当前时间 和 当前时间+1 进行拉取
//String addTime = "2021-01-08 08:03:15.527";
//String endTime = "2021-09-08 08:03:15.527";
String addTime = StrUtil.getDate();
String endTime = StrUtil.getDateAddOne();
//Token数据
boolean organtoken = redisUtil.exitsKey("Organtoken");
System.out.println("token在redis中是否存在: " + organtoken);
if (organtoken) {
token = redisUtil.get("Organtoken");
} else {
//Token数据
token = visitorUtil.sendRollbackInfo(tokenUrl);
}
String Json = VisitorUtil.doGetLogistics(addTime, endTime, getLogistics, token);
System.out.println("Json :" + Json);
JSONObject jsonObject = JSONObject.parseObject(Json);
UserOrderShipmentProDetail jsonRootBean = JSON.toJavaObject(jsonObject, UserOrderShipmentProDetail.class);
if (jsonRootBean.getMessage().equals("Succeed")) {
jsonRootBean.getItems().forEach(q -> {
UserOrderShipmentPro userOrderShipmentPro;//物流信息
System.out.println(q.getOrderNo() + " : " + q.getTrackingNo() + " : " + q.getCarrier() + " : " + q.getCatalogNo() + " : " + q.getSize()
+ " : " + q.getQuantity() + " : " + q.getIdKey() + " : " + q.getAddDate()
);
UserOrderShipmentPro userOrderShipmentProIsNot = systemOrderMapper.selectUserOrderShipmentPro(q.getOrderNo());//查看物流信息是否存在
//拿到对应的订单号 存在就删除 新增
if (userOrderShipmentProIsNot != null) {
//删除对应物流信息
systemOrderMapper.deleteUserOrderShipmentPro(userOrderShipmentProIsNot.getOrderNo());
//新增订单
userOrderShipmentPro = q;//物流信息赋值
systemOrderMapper.addUserOrderShipmentPro(userOrderShipmentPro);//新增物流信息
System.out.println("初始化无数据 修改 删除 新增");
} else {
//新增订单
userOrderShipmentPro = q;//物流信息赋值
systemOrderMapper.addUserOrderShipmentPro(userOrderShipmentPro);//新增物流信息
System.out.println("初始化无数据 新增");
}
//成功
userShipmentStatus.setAddTime(Timestamp.valueOf(addTime));
userShipmentStatus.setEndTime(Timestamp.valueOf(endTime));
userShipmentStatus.setPushPullContent(Json);
userShipmentStatus.setWhetherStatus(1);//成功
//添加记录
systemOrderMapper.addUserShipmentStatusRecords(userShipmentStatus);
});
} else {
//失败
userShipmentStatus.setAddTime(Timestamp.valueOf(addTime));
userShipmentStatus.setEndTime(Timestamp.valueOf(endTime));
userShipmentStatus.setPushPullContent(Json);
userShipmentStatus.setWhetherStatus(0);//失败
//添加记录
systemOrderMapper.addUserShipmentStatusRecords(userShipmentStatus);
}
} else {
//拿到最新成功的一条数据 结束时间 为开始时间 和 当前时间 进行拉取
Timestamp addTime = userShipmentStatusRecords.getEndTime();
System.out.println("结束时间 " + addTime);
String endTime = StrUtil.getDate();
//方法调用 传参 拿到数据 数据有无进行判断
//Token数据
boolean organtoken = redisUtil.exitsKey("Organtoken");
System.out.println("token在redis中是否存在: " + organtoken);
if (organtoken) {
token = redisUtil.get("Organtoken");
} else {
//Token数据
token = visitorUtil.sendRollbackInfo(tokenUrl);
}
String Json = VisitorUtil.doGetLogistics(String.valueOf(addTime), endTime, getLogistics, token);
System.out.println("Json :" + Json);
JSONObject jsonObject = JSONObject.parseObject(Json);
UserOrderShipmentProDetail jsonRootBean = JSON.toJavaObject(jsonObject, UserOrderShipmentProDetail.class);
//判断成功
if (jsonRootBean.getMessage().equals("Succeed")) {
jsonRootBean.getItems().forEach(q -> {
UserOrderShipmentPro userOrderShipmentPro;//物流信息
System.out.println(q.getOrderNo() + " : " + q.getTrackingNo() + " : " + q.getCarrier() + " : " + q.getCatalogNo() + " : " + q.getSize()
+ " : " + q.getQuantity() + " : " + q.getIdKey() + " : " + q.getAddDate()
);
UserOrderShipmentPro userOrderShipmentProIsNot = systemOrderMapper.selectUserOrderShipmentPro(q.getOrderNo());//查看物流信息是否存在
//拿到对应的订单号 存在就删除 新增
if (userOrderShipmentProIsNot != null) {
//删除对应物流信息
systemOrderMapper.deleteUserOrderShipmentPro(userOrderShipmentProIsNot.getOrderNo());
//新增订单
userOrderShipmentPro = q;//物流信息赋值
systemOrderMapper.addUserOrderShipmentPro(userOrderShipmentPro);//新增物流信息
System.out.println("初始化无数据 修改 删除 新增");
} else {
//新增订单
userOrderShipmentPro = q;//物流信息赋值
systemOrderMapper.addUserOrderShipmentPro(userOrderShipmentPro);//新增物流信息
System.out.println("初始化无数据 新增");
}
//成功
userShipmentStatus.setAddTime(addTime);
userShipmentStatus.setEndTime(Timestamp.valueOf(endTime));
userShipmentStatus.setPushPullContent(Json);
userShipmentStatus.setWhetherStatus(1);//成功
//添加记录
systemOrderMapper.addUserShipmentStatusRecords(userShipmentStatus);
});
} else {
//失败
userShipmentStatus.setAddTime(addTime);
userShipmentStatus.setEndTime(Timestamp.valueOf(endTime));
userShipmentStatus.setPushPullContent(Json);
userShipmentStatus.setWhetherStatus(0);//失败
//添加记录
systemOrderMapper.addUserShipmentStatusRecords(userShipmentStatus);
}
}
return 1;
}
访问token工具类:
/**
* 获取系统token
*/
public String sendRollbackInfo(String tokenUrl){
String result = "";//返回结果
String token="";//token
PrintWriter out = null;
BufferedReader in = null;
try {
URL realUrl;
realUrl = new URL(tokenUrl);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
conn.setRequestMethod("POST");
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
//body中X-www-form-urlencodede中的token账号密码参数 格式 a=b&c=d
out.print("username=AAA&password=AAA&client_id=AAA&client_secret=AAA&grant_type=AAA&scope=AAA");
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
String[] split = result.split(":");
String[] strings = split[1].split(",");
token= strings[0].replace("\"","");
}
} catch (Exception e) {
e.printStackTrace();
} finally {// 使用finally块来关闭输出流、输入流
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
System.out.println("Token: "+token);
redisUtil.setCacheWithCustomerTime("Organtoken",token,1440);
return token;
}
访问接口工具类 根据token:
/**
* 以get请求 根据时间戳 拉取信息工具
*/
public static String doGetData(String stateTime, String endTime, String url, String token){
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
String getUrl=url+"?StateTime="+stateTime+"&EndTime="+endTime;
System.out.println(getUrl);
HttpGet get = new HttpGet(getUrl.replace(" ", "%20"));
try {
//api_gateway_auth_token自定义header头,用于token验证使用
get.addHeader("Authorization", "Bearer "+token);
get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
HttpResponse response = httpClient.execute(get);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//返回json格式
String res = EntityUtils.toString(response.getEntity());
return res;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
推送工具类:
/**
* 推送信息工具 post请求
* @param json
* @param token
* @return
*/
public String pushUserAndOrgan(String json, String token,String url){
String result = "";//返回结果
PrintWriter out = null;
BufferedReader in = null;
try {
URL realUrl;
realUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
conn.setRequestMethod("POST");
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("Authorization","Bearer "+token);//传入token
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", "application/json-patch+json");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
//body
// 发送请求参数
out.print(json);//json传参
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
} finally {// 使用finally块来关闭输出流、输入流
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
System.out.println(result);
return result;
}