diff --git a/cpxt-admin/src/main/java/com/cpxt/web/task/StatTask.java b/cpxt-admin/src/main/java/com/cpxt/web/task/StatTask.java new file mode 100644 index 0000000..e36e302 --- /dev/null +++ b/cpxt-admin/src/main/java/com/cpxt/web/task/StatTask.java @@ -0,0 +1,183 @@ +package com.cpxt.web.task; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cpxt.biz.domain.*; +import com.cpxt.biz.mapper.*; +import com.cpxt.common.utils.DateUtils; +import com.cpxt.common.utils.Helper; +import com.e6yun.project.sdk.api.E6SdkApi; +import com.e6yun.project.sdk.api.exception.ApiException; +import com.e6yun.project.sdk.api.pojo.basevo.basic.VehicleInfoResp; +import com.e6yun.project.sdk.api.pojo.business.GetVehicleInfoVO; +import org.apache.commons.beanutils.PropertyUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component("statTask") +public class StatTask { + + // 域名 + private static final String ADDRESS = "http://api.e6yun.com/"; + // 公钥 + private static final String APP_KEY = "FEB9F91D-BCD7-4DC2-97D1-CB599EEAF9D5"; + // 密钥 + private static final String SECRET_KEY = "A8211E8F-9E95-4C80-9414-CD5E1F675FEF"; + + /*添加代码 begin*/ + private static StatTask statTask; + + @Autowired + private BizCarStateMapper stateMapper; + @Autowired + private BizCarMapper carMapper; + @Autowired + private BizDriverMapper driverMapper; + @Autowired + private TrackTempMapper trackMapper; + @Autowired + private StatCarMapper statCarMapper; + @Autowired + private StatDriverMapper statDriverMapper; + + @PostConstruct + public void init(){ + statTask = this; +// statTask.commonService = this.commonService; + statTask.carMapper = this.carMapper; + statTask.statCarMapper = this.statCarMapper; + statTask.driverMapper = this.driverMapper; + statTask.stateMapper = this.stateMapper; + statTask.trackMapper = this.trackMapper; + } + + // 定时统计车辆使用情况 + public void statWorkData(){ + Date now = new Date(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BizCar::getStatus,1); + + List carList = statTask.carMapper.selectList(queryWrapper); + + String today = DateUtils.getDate(); + LambdaQueryWrapper statCarQueryWrapper = new LambdaQueryWrapper<>(); + statCarQueryWrapper.eq(StatCar::getStatDate, today); + List statCarList = statTask.statCarMapper.selectList(statCarQueryWrapper); + + // 当天没有统计数据,初始化所有车辆统计数 + if (statCarList==null || statCarList.size()<=0){ + statTask.statCarMapper.initStatCar(today); + } + + for (BizCar car : carList) { + StatCar todayStat = statTask.statCarMapper.selectTodayByCarId(car.getId()); + Map map = statTask.statCarMapper.getTodayOdometer(car.getId().toString()); + BigDecimal odometer = new BigDecimal(0); + if (map!=null && Helper.FInt(map.get("minOdometer"))>0) { + BigDecimal min = new BigDecimal(Helper.FDouble(map.get("minOdometer"))); + BigDecimal max = new BigDecimal(Helper.FDouble(map.get("maxOdometer"))); + + odometer = max.subtract(min); + } + todayStat.setOdometer(odometer); + + // 获取车辆今日订单数 + Map jrdd = statTask.statCarMapper.getTodayOrderCount(car.getId()); + if (jrdd!=null) + todayStat.setOrderCount(Helper.FInt(jrdd.get("orderCount"))); + + Map jrsj = statTask.statCarMapper.selectDriverByCarId(car.getId()); + int usetime = 0; + if (jrsj!=null){ + Long driverId = Helper.FLong(jrsj.get("driver_id")); + List clocks = statTask.statDriverMapper.selectDriverClockList(driverId); + + for (BizDriverClock clock : clocks) { + Date ontime = clock.getOnTime(); + Date offtime = clock.getOffTime(); + + if (offtime==null) + offtime = now; + + if (ontime.getDay()!=now.getDay()) + ontime = DateUtils.dateTime(DateUtils.YYYY_MM_DD, DateUtils.getDate()); + + int diffsecond = Helper.FInt( (offtime.getTime() - ontime.getTime()) / 1000); + usetime += diffsecond; + } + } + todayStat.setUseTime(usetime); + + statTask.statCarMapper.updateById(todayStat); + } + + LambdaQueryWrapper bizDriverQueryWrapper = new LambdaQueryWrapper<>(); + bizDriverQueryWrapper.eq(BizDriver::getStatus,1); + + List driverList = statTask.driverMapper.selectList(bizDriverQueryWrapper); + + LambdaQueryWrapper statDriverQueryWrapper = new LambdaQueryWrapper<>(); + statDriverQueryWrapper.eq(StatDriver::getStatDate, today); + List statDriverList = statTask.statDriverMapper.selectList(statDriverQueryWrapper); + + // 当天没有统计数据,初始化所有车辆统计数 + if (statDriverList==null || statDriverList.size()<=0){ + statTask.statDriverMapper.initStatDriver(today); + } + + for (BizDriver driver : driverList) { + StatDriver todayStat = statTask.statDriverMapper.selectTodayByDriverId(driver.getId()); + + List clocks = statTask.statDriverMapper.selectDriverClockList(driver.getId()); + + int usetime = 0; + BigDecimal odometer = new BigDecimal(0); + + for (BizDriverClock clock : clocks) { + Date ontime = clock.getOnTime(); + Date offtime = clock.getOffTime(); + + if (offtime==null) + offtime = now; + + if (ontime.getDay()!=now.getDay()) + ontime = DateUtils.dateTime(DateUtils.YYYY_MM_DD, DateUtils.getDate()); + + int diffsecond = Helper.FInt( (offtime.getTime() - ontime.getTime()) / 1000); + usetime += diffsecond; + + if (Helper.FInt(driver.getCurrentCarId())>0) { + Map map = statTask.statDriverMapper.getTodayOdometer( + driver.getCurrentCarId().toString(), + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, ontime), + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, offtime)); + if (map != null && Helper.FInt(map.get("minOdometer")) > 0) { + BigDecimal min = new BigDecimal(Helper.FDouble(map.get("minOdometer"))); + BigDecimal max = new BigDecimal(Helper.FDouble(map.get("maxOdometer"))); + + odometer = odometer.add(max.subtract(min)); + } + } + } + + todayStat.setOnlineTime(usetime); + todayStat.setOdometer(odometer); + + Map jrdd = statTask.statDriverMapper.getTodayOrderCount(driver.getId()); + if (jrdd!=null) + todayStat.setOrderCount(Helper.FInt(jrdd.get("orderCount"))); + + statTask.statDriverMapper.updateById(todayStat); + } + } + + +} diff --git a/cpxt-system/src/main/java/com/cpxt/biz/mapper/StatCarMapper.java b/cpxt-system/src/main/java/com/cpxt/biz/mapper/StatCarMapper.java index 01c0b8e..8093148 100644 --- a/cpxt-system/src/main/java/com/cpxt/biz/mapper/StatCarMapper.java +++ b/cpxt-system/src/main/java/com/cpxt/biz/mapper/StatCarMapper.java @@ -1,12 +1,18 @@ package com.cpxt.biz.mapper; +import java.util.List; +import java.util.Map; + import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cpxt.biz.domain.BizDriverClock; import com.cpxt.biz.domain.StatCar; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; /** * 车辆统计Mapper接口 @@ -24,4 +30,22 @@ public interface StatCarMapper extends BaseMapper @Select("select t.sumo from (SELECT car_no,SUM(odometer) sumo FROM `stat_car` where stat_date >= #{startTime} and stat_date <= #{endTime} GROUP BY car_no ORDER BY sumo desc limit 5) t") List selectOdometerTop5Odometer(@Param("startTime")String startTime,@Param("endTime") String endTime); + @Insert("insert into stat_car (stat_date, car_id, car_no) select #{statDate}, id, car_no from biz_car where status = 1 ") + void initStatCar(String statDate); + + @Select("select min(odometer) minOdometer, max(odometer) maxOdometer from track_${carId} where car_id = #{carId} and gps_time BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY ") + Map getTodayOdometer(String carId); + + @Select("select * from stat_car where car_id = #{carId} and stat_date BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY ") + StatCar selectTodayByCarId(Long carId); + + @Select("select count(id) orderCount from biz_order where car_id = #{carId} and create_time BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY ") + Map getTodayOrderCount(Long carId); + + @Select("select * from biz_driver_clock where car_id = #{carId} and ((on_time BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY ) or off_time BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY)) ") + Map getTodayUsetime(Long carId); + + @Select("select driver_id from biz_order where car_id = #{carId} and create_time BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY limit 1 ") + Map selectDriverByCarId(Long carId); + } diff --git a/cpxt-system/src/main/java/com/cpxt/biz/mapper/StatDriverMapper.java b/cpxt-system/src/main/java/com/cpxt/biz/mapper/StatDriverMapper.java index 33ad330..1425955 100644 --- a/cpxt-system/src/main/java/com/cpxt/biz/mapper/StatDriverMapper.java +++ b/cpxt-system/src/main/java/com/cpxt/biz/mapper/StatDriverMapper.java @@ -1,10 +1,16 @@ package com.cpxt.biz.mapper; import java.util.List; +import java.util.Map; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cpxt.biz.domain.BizDriverClock; +import com.cpxt.biz.domain.StatCar; import com.cpxt.biz.domain.StatDriver; +import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; /** * 司机统计Mapper接口 @@ -16,4 +22,21 @@ import org.apache.ibatis.annotations.Mapper; public interface StatDriverMapper extends BaseMapper { + @Insert("insert into stat_driver (stat_date, driver_id, driver_name) select #{statDate}, id, name from biz_driver where status = 1 ") + void initStatDriver(String statDate); + + @Select("select min(odometer) minOdometer, max(odometer) maxOdometer from track_${carId} where car_id = #{carId} and gps_time between #{startTime} and #{endTime} ") + Map getTodayOdometer(@Param("carId") String carId, @Param("startTime") String startTime, @Param("endTime") String endTime); + + @Select("select * from stat_driver where driver_id = #{driverId} and stat_date BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY") + StatDriver selectTodayByDriverId(Long driverId); + + @Select("select count(id) orderCount from biz_order where (driver_id = #{driverId} or copilot_id = #{driverId}) and create_time BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY") + Map getTodayOrderCount(Long driverId); + + @Select("select * from biz_driver_clock where driver_id = #{driverId} order by on_time desc limit 1 ") + Map getTodayUsetime(Long driverId); + + @Select("select * from biz_driver_clock where driver_id = #{driverId} and ( on_time BETWEEN CURDATE() - INTERVAL 23 HOUR AND NOW() or off_time between CURDATE() and NOW() ) order by on_time asc ") + List selectDriverClockList(Long driverId); }