Commit c3e8b319 authored by 李洪明's avatar 李洪明

添加上传进出厂记录

parent c1f03b85
package com.bme.access.upload.common;
import org.apache.commons.lang.time.DateFormatUtils;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateUtils extends org.apache.commons.lang.time.DateUtils {
public final static String DATE_FORMAT_DAY = "yyyy-MM-dd";
public final static String DATE_FORMAT_SECOND = "yyyy-MM-dd HH:mm:ss";
public final static String DATE_FORMAT_MIN = "MMddHHmmssSS";
public final static String DATE_FORMAT_SECOND1 = "yyyyMMddHHmmss";
/**
* 取当前时间
*
* @return
*/
public static Timestamp now() {
return new Timestamp(System.currentTimeMillis());
}
/**
* 取当天
*
* @return
*/
public static Date today() {
Date date = DateUtils.now();
return DateUtils.toDate(date);
}
/**
* 获取unix_timestamp
*
* @return
*/
public static int unix_timestamp() {
long timestamp = System.currentTimeMillis();
return new Long(timestamp / 1000).intValue();
}
/**
* 获取月的第一天
*
* @return
*/
public static Date firstDayOfMonth() {
Date date = DateUtils.now();
return DateUtils.firstDayOfMonth(date);
}
/**
* 获取月的第一天
*
* @param date
* @return
*/
public static Date firstDayOfMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, 1);
Date date2 = DateUtils.toDate(calendar.getTime());
return date2;
}
/**
* 获取当月的最后一天
*
* @return
*/
public static Date lastDayOfMonth() {
Date date = DateUtils.now();
return DateUtils.lastDayOfMonth(date);
}
/**
* 获取当月的最后一天
*
* @return
*/
public static Date lastDayOfMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int maxDayNum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DATE, maxDayNum);
Date date2 = DateUtils.toDate(calendar.getTime());
return date2;
}
/**
* 转换成日期格式
*
* @param str
* @return
*/
public static Date toDate(String str) {
String[] patterns = new String[]{"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd", "HH:mm:ss", "HH:mm", "yyyy/M/d H:m:s", "HH:mm", "yyyy/M/d H:m", "yyyy/M/d",
"H:m:s", "H:m", "yyyy-MM-dd HH:mm:ss.SSS", "yyyyMMdd", "yyyyMM"};
try {
return org.apache.commons.lang.time.DateUtils.parseDate(str, patterns);
} catch (Exception ex) {
return null;
}
}
/**
* 转换成日期格式
*
* @param str
* @param pattern
* @return
*/
public static Date toDate(String str, String pattern) {
try {
return DateUtils.parseDate(str, new String[]{pattern});
} catch (Exception e) {
return null;
}
}
/**
* 取日期的0点
*
* @param date
* @return
*/
public static Date toDate(Date date) {
String strDate = DateUtils.format(date, "yyyy-MM-dd");
return DateUtils.toDate(strDate, "yyyy-MM-dd");
}
/**
* 日期格式化,取当前日期时间
*
* @param pattern
* @return
*/
public static String format(String pattern) {
return DateUtils.format(DateUtils.now(), pattern);
}
/**
* 日期格式化
*
* @param date
* @param pattern
* @return
*/
public static String format(Date date, String pattern) {
if (date == null) {
return null;
}
return DateFormatUtils.format(date, pattern);
}
/**
* 时间前推或后推分钟,其中JJ表示分钟.
*/
public static String getPreTime(String sj1, int jj) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String mydate1 = "";
try {
Date date1 = format.parse(sj1);
long Time = (date1.getTime() / 1000) + jj * 60;
date1.setTime(Time * 1000);
mydate1 = format.format(date1);
} catch (Exception e) {
}
return mydate1;
}
/**
* 时间前推或后推分钟,其中ss表示秒.
*/
public static String getDateStr(String sj1, int ss) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String mydate1 = "";
try {
Date date1 = format.parse(sj1);
long Time = (date1.getTime() / 1000) + ss;
date1.setTime(Time * 1000);
mydate1 = format.format(date1);
} catch (Exception e) {
}
return mydate1;
}
/**
* 获取两个时间相差多少分
*
* @param firstTime
* @param secondTime
* @return
*/
public static long getDiffMin(String firstTime, String secondTime) {
long first = toDate(firstTime).getTime();
long second = toDate(secondTime).getTime();
//从对象中拿到时间
long diff = (second - first) / 1000 / 60;
return diff;
}
public static long getDiffHour(String firstTime, String secondTime) {
long first = toDate(firstTime).getTime();
long second = toDate(secondTime).getTime();
//从对象中拿到时间
long diff = (second - first) / 1000 / 60 / 60;
return diff;
}
/**
* 获取两个时间相差多少秒
*
* @param firstTime
* @param secondTime
* @return
*/
public static long getDiffSecond(String firstTime, String secondTime) {
long first = toDate(firstTime).getTime();
long second = toDate(secondTime).getTime();
//从对象中拿到时间
long diff = (second - first) / 1000;
return diff;
}
/**
* 查询几天前/后的日期
*
* @param day
* @return
*/
public static String getStrData(int day) {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.DATE, day);
Date start = c.getTime();
String qyt = format(start, DATE_FORMAT_SECOND);
return qyt;
}
public static String getStrDateTime(String data, int day) {
SimpleDateFormat dateStyes = new SimpleDateFormat(DATE_FORMAT_SECOND);//设置日期格式
Calendar c = Calendar.getInstance();
try {
c.setTime(dateStyes.parse(data));
} catch (ParseException e) {
e.printStackTrace();
}
c.add(Calendar.DATE, day);
Date start = c.getTime();
String qyt = format(start, DATE_FORMAT_SECOND);
return qyt;
}
/**
* 根据传进来得日期 计算前后day日期
*
* @param day
* @return
*/
public static String getDateChange(String data, int day) {
SimpleDateFormat dateStyes = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
Calendar c = Calendar.getInstance();
try {
c.setTime(dateStyes.parse(data));
} catch (ParseException e) {
e.printStackTrace();
}
c.add(Calendar.DATE, day);
Date start = c.getTime();
String qyt = format(start, DATE_FORMAT_DAY);
return qyt;
}
/**
* 根据传进来得日期计算 此月一共有多少天
*
* @param data
* @return
*/
public static int getDateDays(String data) {
SimpleDateFormat dateStyes = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
Calendar c = Calendar.getInstance();
try {
c.setTime(dateStyes.parse(data));
} catch (ParseException e) {
e.printStackTrace();
}
int days = c.getActualMaximum(Calendar.DAY_OF_MONTH);//根据年月 获取月份天数
return days;
}
public static String dateToStr(Date date, String format) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
return simpleDateFormat.format(date);
}
public static String getYesterdayBegin() {
// 创建Calendar实例
Calendar calendar = Calendar.getInstance();
// 获取当前时间
calendar.setTimeInMillis(System.currentTimeMillis());
// 将时间设置为昨天
calendar.add(Calendar.DAY_OF_YEAR, -1);
// 设置时间为当天的零点
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
// 获取昨天的起始时间
Date yesterdayStartTime = calendar.getTime();
return DateUtils.format(yesterdayStartTime,DATE_FORMAT_SECOND);
}
public static String getYesterdayEnd() {
// 创建Calendar实例
Calendar calendar = Calendar.getInstance();
// 获取当前时间
calendar.setTimeInMillis(System.currentTimeMillis());
// 将时间设置为昨天
calendar.add(Calendar.DAY_OF_YEAR, -1);
// 设置时间为当天的零点
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 59);
// 获取昨天的起始时间
Date yesterdayBeginTime = calendar.getTime();
return DateUtils.format(yesterdayBeginTime,DATE_FORMAT_SECOND);
}
}
\ No newline at end of file
......@@ -338,7 +338,7 @@ public class HttpUtils {
return httpClient.execute(request);
}
public static HttpResponse sendPost(String host, String path, Map<String, String> querys, Map<String, Object> bodys) throws Exception {
public static HttpResponse sendPost(String host, String path, Map<String, String> querys, String bodyJson) throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
Map<String, String> headers = new HashMap<>();
......@@ -347,8 +347,8 @@ public class HttpUtils {
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (bodys != null) {
StringEntity entity = new StringEntity(JSON.toJSONString(bodys), "UTF-8");
if (bodyJson != null) {
StringEntity entity = new StringEntity(bodyJson, "UTF-8");
request.setEntity(entity);
}
return httpClient.execute(request);
......
package com.bme.access.upload.job;
import com.bme.access.upload.module.service.InAndOutDateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
@Slf4j
public class UploadDataJob {
@Autowired
private InAndOutDateService inAndOutDateService;
@Scheduled(cron = "*/30 * * * * ?")
public void uploadInAndOutDate() {
try {
inAndOutDateService.uploadInAndOutDate();
} catch (Exception e) {
log.error("上传进出场记录异常: {}", e);
}
}
}
package com.bme.access.upload.model;
import lombok.Data;
@Data
public class InAndOutDate {
// 道闸编号 道闸编号规则(3位):出入口编号+道闸顺序编号,如 A 出入口道闸编号 A01,依次递增,同一企业不可重复。
private String barriernumber;
// 运输货物名称
private String cargoname;
// 运输量
private String cargoquantity;
// 运输量单位/进厂运输量单位:T:吨L:升(L)P:箱、包、桶、瓶、件
private String unit;
// 车牌号码
private String licenseplatenumber;
// 出入口编号,用于区分不同的出入口 出入口编号规则(1位):A、B、C 依次递增,同一企业不可重复。
private String entryexitnumber;
// 进出厂状态 1-进厂,2-出厂
private String entryexitstatus;
// 进出厂时间
private String entryexittime;
// 车队名称
private String fleetname;
// 进出厂流水号 最长为36位字符串
private String entryexitflownumber;
// 进厂出厂照片 图片使用base64字节存储
private String photos;
// 0=手动模式 1=自动模式
private String inOutAttribute;
}
package com.bme.access.upload.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class InAndOutDateUrl {
private Integer id; //ID
private String numberPlate; //Number_plate
private String inOutTime;// InOut_Time
private String inOutImage; //InOut_Image
private Integer inOrOut; //InorOut
private String gatePostCode; //Gate_post_code
private String inOutPlateImage; //InOut_Plate_Image
private String inoutTopImage; // Inout_Top_image
private Integer vehicleColorIndex;//Vehicle_color_index
private Integer isEdit;
private String rsn;
private Date createTime;
private String msg;
private Integer result;
private Integer unattended;
}
\ No newline at end of file
package com.bme.access.upload.module.dao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface DataUploadTimeMapper {
String getUploadTime(@Param("type")Integer type);
Integer insertUploadTime(@Param("uploadTime")String uploadTime, @Param("type")Integer type);
Integer updateUploadTimeByType(@Param("uploadTime")String uploadTime, @Param("type")Integer type);
}
package com.bme.access.upload.module.dao;
import com.bme.access.upload.model.InAndOutDateUrl;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface InAndOutDateUploadFailMapper {
Integer insertInAndOutFail(@Param("data")InAndOutDateUrl data);
}
package com.bme.access.upload.module.dao;
import com.bme.access.upload.model.InAndOutDateUrl;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface InAndOutDateUrlMapper {
List<InAndOutDateUrl> selectInAndOutDateUrl(@Param("startTime")String startTime, @Param("endTime")String endTime);
}
package com.bme.access.upload.module.service;
import com.alibaba.fastjson.JSONObject;
import com.bme.access.upload.common.DateUtils;
import com.bme.access.upload.common.HttpUtils;
import com.bme.access.upload.model.InAndOutDate;
import com.bme.access.upload.model.InAndOutDateUrl;
import com.bme.access.upload.module.dao.DataUploadTimeMapper;
import com.bme.access.upload.module.dao.InAndOutDateUploadFailMapper;
import com.bme.access.upload.module.dao.InAndOutDateUrlMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
@Service
@Slf4j
public class InAndOutDateService {
@Autowired
private DataUploadTimeMapper dataUploadTimeMapper;
@Autowired
private InAndOutDateUrlMapper inAndOutDateUrlMapper;
@Autowired
private InAndOutDateUploadFailMapper inAndOutDateUploadFailMapper;
@Autowired
private LoginService loginService;
private final static String IN_AND_OUT_DATE_URL = "https://dctapi.soszyzg.com/dct/new/addInAndOut";
public void uploadInAndOutDate() {
// 查询上次更新时间
String uploadTime = dataUploadTimeMapper.getUploadTime(103);
if (org.springframework.util.StringUtils.isEmpty(uploadTime)) {
uploadTime = DateUtils.dateToStr(new Date(System.currentTimeMillis() - 60 * 60 * 1000), "yyyy-MM-dd HH:mm:ss");
dataUploadTimeMapper.insertUploadTime(uploadTime, 103);
}
log.info("本次循环上传大于{}的数据", uploadTime);
String endTime = LocalDateTime.now().minusMinutes(2).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
this.getAndUploadInAndOutDate(uploadTime, endTime, Boolean.TRUE);
}
public List<InAndOutDateUrl> getAndUploadInAndOutDate(String startTime, String endTime, Boolean flag) {
log.info("执行进出场记录上传线程");
List<InAndOutDateUrl> inAndOutDateUrlList = inAndOutDateUrlMapper.selectInAndOutDateUrl(startTime, endTime);
if (!CollectionUtils.isEmpty(inAndOutDateUrlList)){
try {
loginService.login();
} catch (Exception e) {
log.error("更新token失败:{}", e.getMessage());
}
}
log.info("本次通行记录需要上报{}条", inAndOutDateUrlList.size());
for(int i = 0; i < inAndOutDateUrlList.size(); i++) {
InAndOutDateUrl inAndOutDateUrl = inAndOutDateUrlList.get(i);
InAndOutDate inAndOutDate = this.convertInAndOutDate(inAndOutDateUrl);
try {
String bodyJson = JSONObject.toJSONString(inAndOutDate);
HttpUtils.sendPost(IN_AND_OUT_DATE_URL, null, null, bodyJson);
if (flag){
dataUploadTimeMapper.updateUploadTimeByType(inAndOutDateUrl.getInOutTime(), 103);
}
// 防止连接超时
Thread.sleep(50);
} catch (Exception e) {
log.info("过车记录上传失败,重新上传一次{}", e.getMessage());
try {
String bodyJson = JSONObject.toJSONString(inAndOutDate);
HttpUtils.sendPost(IN_AND_OUT_DATE_URL, null, null, bodyJson);
} catch (Exception ex) {
log.info("再次失败,此条数据存于失败表里{}", ex.getMessage());
inAndOutDateUrl.setMsg(ex.getMessage());
inAndOutDateUploadFailMapper.insertInAndOutFail(inAndOutDateUrl);
} finally {
if (flag){
dataUploadTimeMapper.updateUploadTimeByType(inAndOutDateUrl.getInOutTime(), 103);
}
}
} finally {
if (flag){
dataUploadTimeMapper.updateUploadTimeByType(inAndOutDateUrl.getInOutTime(), 103);
}
}
}
if (!CollectionUtils.isEmpty(inAndOutDateUrlList) && flag){
log.info("本次循环上传完成,再次更新最后的上传时间{}", inAndOutDateUrlList.get(inAndOutDateUrlList.size() - 1).getInOutTime());
dataUploadTimeMapper.updateUploadTimeByType(inAndOutDateUrlList.get(inAndOutDateUrlList.size() - 1).getInOutTime(), 103);
} else {
log.info("本次循环无数据上传");
}
return inAndOutDateUrlList;
}
private InAndOutDate convertInAndOutDate(InAndOutDateUrl inAndOutDateUrl) {
InAndOutDate inAndOutDate = new InAndOutDate();
inAndOutDate.setInOutAttribute("1");
inAndOutDate.setEntryexitstatus(inAndOutDateUrl.getInOrOut().toString());
inAndOutDate.setEntryexittime(inAndOutDateUrl.getInOutTime());
inAndOutDate.setLicenseplatenumber(inAndOutDateUrl.getNumberPlate());
inAndOutDate.setEntryexitnumber(inAndOutDateUrl.getGatePostCode());
inAndOutDate.setBarriernumber("");
// 货物信息
inAndOutDate.setCargoname("");
inAndOutDate.setCargoquantity("");
inAndOutDate.setUnit("T");
// 车队信息
inAndOutDate.setEntryexitflownumber(inAndOutDateUrl.getRsn());
return new InAndOutDate();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bme.access.upload.module.dao.DataUploadTimeMapper">
<select id="getUploadTime" resultType="java.lang.String">
select Upload_Time uploadTime from Data_Upload_Time where Type=#{type}
</select>
<insert id="insertUploadTime">
insert into Data_Upload_Time (Upload_Time, type) values (#{uploadTime}, #{type});
</insert>
<update id="updateUploadTimeByType">
update Data_Upload_Time set Upload_Time=#{uploadTime} where type=#{type};
</update>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bme.access.upload.module.dao.InAndOutDateUploadFailMapper">
<insert id="insertInAndOutFail" parameterType="com.bme.access.upload.model.InAndOutDateUrl">
insert into InAndOut_Date_Url_Fail (Number_plate, InOut_Time, InOut_Image, InorOut, Gate_post_code, InOut_Plate_Image, Inout_Top_image, Vehicle_color_index, msg)
values (#{inAndOutDateUrl.numberPlate}, #{inAndOutDateUrl.inOutTime}, #{inAndOutDateUrl.inOutImage}, #{inAndOutDateUrl.inOrOut}, #{inAndOutDateUrl.gatePostCode},
#{inAndOutDateUrl.inOutPlateImage}, #{inAndOutDateUrl.inoutTopImage}, #{inAndOutDateUrl.vehicleColorIndex}, #{inAndOutDateUrl.msg})
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bme.access.upload.module.dao.InAndOutDateUrlMapper">
<select id="selectInAndOutDateUrl" resultType="com.bme.access.upload.model.InAndOutDateUrl">
select id ID,
Number_plate numberPlate,
InOut_Time inOutTime,
InOut_Image inOutImage,
InorOut inOrOut,
Gate_post_code gatePostCode,
InOut_Plate_Image inOutPlateImage,
Inout_Top_image inoutTopImage,
Vehicle_color_index vehicleColorIndex,
unattended,
rsn
from InAndOut_Date_Url where InOut_Time > #{uploadTime}
<if test="endTime !=null and endTime != ''">
and InOut_Time &lt;= #{endTime}
</if>
order by InOut_Time asc
</select>
</mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment