package com.stylefeng.guns.modular.crossCity.server.impl; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.modular.crossCity.dao.LinePriceMapper; import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper; import com.stylefeng.guns.modular.crossCity.dao.LineShiftMapper; import com.stylefeng.guns.modular.crossCity.model.LineShift; import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver; import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity; import com.stylefeng.guns.modular.crossCity.server.ILineService; import com.stylefeng.guns.modular.crossCity.server.ILineShiftDriverService; import com.stylefeng.guns.modular.crossCity.server.ILineSiteService; import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.system.dao.CarModelMapper; import com.stylefeng.guns.modular.system.dao.CarServiceMapper; import com.stylefeng.guns.modular.system.dao.ServerCarModelMapper; import com.stylefeng.guns.modular.system.model.CarModel; import com.stylefeng.guns.modular.system.model.CarService; import com.stylefeng.guns.modular.system.service.ICarService; import com.stylefeng.guns.modular.system.service.IDriverService; import com.stylefeng.guns.modular.system.util.DateUtil; import com.stylefeng.guns.modular.system.util.ResultUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; @Service public class LineShiftDriverServiceImpl extends ServiceImpl implements ILineShiftDriverService { @Resource private LineShiftDriverMapper lineShiftDriverMapper; @Autowired private DateUtil dateUtil; @Autowired private ICarService carService; @Autowired private IDriverService driverService; @Resource private CarModelMapper carModelMapper; @Resource private LineShiftMapper lineShiftMapper; @Resource private LinePriceMapper linePriceMapper; @Resource private CarServiceMapper carServiceMapper; @Autowired private IOrderCrossCityService orderCrossCityService; @Autowired private ILineService lineService; /** * 预约班次操作 * @param lineShiftId * @param time * @param driverId * @return * @throws Exception */ @Override public synchronized ResultUtil reservation(Integer type, Integer lineShiftId, String time, Integer driverId) throws Exception { Map date = dateUtil.getStartAndEndDate(time); List startTime = lineShiftDriverMapper.queryByDriver(lineShiftId, driverId, date.get("startTime")); if(type == 1 && startTime.size() > 0){ return ResultUtil.error("不能重复预约"); } if(type == 2 && startTime.size() == 0){ return ResultUtil.error("您还没预约呢"); } if(type == 1){//预约操作 boolean b = this.judgeTime(driverId, lineShiftId, date.get("startTime")); if(b){ return ResultUtil.error("预约间隔超出给定可预约范围"); } int num = lineShiftDriverMapper.queryByDriver(lineShiftId, null, date.get("startTime")).size(); LineShift lineShift = lineShiftMapper.selectById(lineShiftId); Integer carNum = lineShift.getCarNum(); if(num >= carNum){ return ResultUtil.error("该班次已经超出了可预约车次"); } CarService query = carServiceMapper.query(3, driverService.selectById(driverId).getCarId()); Map query1 = linePriceMapper.query(lineShift.getLineId(), query.getServerCarModelId()); if(null == query1){ return ResultUtil.error("该线路还未设置服务车型相关数据,请联系管理员!"); } CarModel carModel = carModelMapper.selectById(carService.selectById(driverService.selectById(driverId).getCarId()).getCarModelId()); LineShiftDriver lineShiftDriver = new LineShiftDriver(); lineShiftDriver.setLineShiftId(lineShiftId); lineShiftDriver.setDriverId(driverId); lineShiftDriver.setDay(date.get("startTime")); lineShiftDriver.setLaveSeat(carModel.getSeat() - 1); String seatNumber = ""; for(int i = 1; i < carModel.getSeat(); i++){ seatNumber += i + ","; } lineShiftDriver.setLaveSeatNumber(seatNumber.substring(0, seatNumber.length() - 1)); lineShiftDriver.setTotalSeat(carModel.getSeat() - 1); lineShiftDriver.setInserTime(new Date()); lineShiftDriverMapper.insert(lineShiftDriver); } if(type == 2){//取消预约 Integer id = startTime.get(0).getId(); int i = orderCrossCityService.selectCount( new EntityWrapper() .eq("driverId", driverId) .eq("lineShiftDriverId", id) .eq("isDelete", 1) .in("state", Arrays.asList(2, 3, 4, 5, 6, 7, 8, 9, 11)) ); if(i > 0){ return ResultUtil.error("班次已使用,不允许取消"); } lineShiftDriverMapper.deleteById(id); } return ResultUtil.success(); } /** * 判断当前预约的班次时间与之前已经预约的班次时间的间隔是否大于设定的间隔时间 * @param driverId * @param shiftId * @param day * @return */ public boolean judgeTime(Integer driverId, Integer shiftId, Date day) throws Exception{ //获取当前预约班次的开始时间 LineShift lineShift = lineShiftMapper.selectById(shiftId); String startTime = lineShift.getStartTime();//需要预约的班次开始时间 String endTime1 = lineShift.getEndTime();//需要预约的班次结束时间 List list = new ArrayList<>();//存储给定天的预约的班次 List lineShiftDrivers = lineShiftDriverMapper.queryByDriver(null, driverId, day); for(LineShiftDriver lineShiftDriver : lineShiftDrivers){ list.add(lineShiftDriver.getLineShiftId()); } if(list.size() == 0){ return false; } List lineShifts_ = lineShiftMapper.selectList(new EntityWrapper().eq("lineId", lineShift.getLineId()).eq("state", 1).orderBy("endTime")); int index = 0;//需要预约的数据下标 for(int i = 0; i < lineShifts_.size(); i++){ if(startTime.equals(lineShifts_.get(i).getStartTime()) && endTime1.equals(lineShifts_.get(i).getEndTime())){ index = i; break; } } //找出预约数据最近的预约了的数据 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss"); Integer shiftInterval = lineService.selectById(lineShift.getLineId()).getShiftInterval();//获取可预约的间隔(分钟) long time = simpleDateFormat.parse("1999-01-01 " + startTime + ":00").getTime();//当前预约的班次的开始时间 long time1 = simpleDateFormat.parse("1999-01-01 " + endTime1 + ":00").getTime();//当前预约的班次的结束时间 if(index == 0 && lineShifts_.size() > 1){ for(LineShift lineShift1 : lineShifts_){ if(list.contains(lineShift1.getId())){ long s = simpleDateFormat.parse("1999-01-01 " + lineShift1.getStartTime() + ":00").getTime(); long e = simpleDateFormat.parse("1999-01-01 " + lineShift1.getEndTime() + ":00").getTime(); if((s - time1) < (Long.valueOf(shiftInterval) * 60 * 1000)){ return true; } } } return false; } if(index == lineShifts_.size() - 1 && lineShifts_.size() > 1){ for(LineShift lineShift1 : lineShifts_){ if(list.contains(lineShift1.getId())){ long s = simpleDateFormat.parse("1999-01-01 " + lineShift1.getStartTime() + ":00").getTime(); long e = simpleDateFormat.parse("1999-01-01 " + lineShift1.getEndTime() + ":00").getTime(); if((time - e) < (Long.valueOf(shiftInterval) * 60 * 1000)){ return true; } } } return false; } if(index > 0 && index < lineShifts_.size() - 1 && lineShifts_.size() > 2){ for(int i = index + 1; i < lineShifts_.size(); i++){ if(list.contains(lineShifts_.get(i).getId())){ long s = simpleDateFormat.parse("1999-01-01 " + lineShifts_.get(i).getStartTime() + ":00").getTime(); long e = simpleDateFormat.parse("1999-01-01 " + lineShifts_.get(i).getEndTime() + ":00").getTime(); if((s - time1) < (Long.valueOf(shiftInterval) * 60 * 1000)){ return true; } } } for(int i = 0; i < index; i++){ if(list.contains(lineShifts_.get(i).getId())){ long s = simpleDateFormat.parse("1999-01-01 " + lineShifts_.get(i).getStartTime() + ":00").getTime(); long e = simpleDateFormat.parse("1999-01-01 " + lineShifts_.get(i).getEndTime() + ":00").getTime(); if((time - e) < (Long.valueOf(shiftInterval) * 60 * 1000)){ return true; } } } return false; } return false; } }