| | |
| | | import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper; |
| | | import com.stylefeng.guns.modular.crossCity.model.Line; |
| | | import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver; |
| | | import com.stylefeng.guns.modular.crossCity.model.LineSite; |
| | | import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity; |
| | | import com.stylefeng.guns.modular.crossCity.server.ILineService; |
| | | import com.stylefeng.guns.modular.crossCity.server.ILineSiteService; |
| | | import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; |
| | | import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityOnBehalfWarpper; |
| | | import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper; |
| | | import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper; |
| | | import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; |
| | |
| | | |
| | | @Autowired |
| | | private ILineService lineService; |
| | | |
| | | @Autowired |
| | | private ILineSiteService lineSiteService; |
| | | |
| | | @Autowired |
| | | private ISystemNoticeService systemNoticeService; |
| | |
| | | private CarServiceImpl carServiceImpl; |
| | | @Autowired |
| | | private ICompanyService companyService; |
| | | |
| | | @Autowired |
| | | private CarServiceMapper carServiceMapper; |
| | | @Autowired |
| | | private WeChatUtil weChatUtil; |
| | | |
| | |
| | | } |
| | | return ResultUtil.success(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 跨城代客下单操作 |
| | | * @param warpper 代客下单参数 |
| | | * @param driverId 司机ID |
| | | * @return 订单ID |
| | | * @throws Exception |
| | | */ |
| | | @Override |
| | | public synchronized ResultUtil<BaseWarpper> orderCrossCityOnBehalf(OrderCrossCityOnBehalfWarpper warpper, Integer driverId) throws Exception { |
| | | // 1. 参数校验 |
| | | if (warpper.getLineShiftDriverId() == null) { |
| | | return ResultUtil.error("班次ID不能为空"); |
| | | } |
| | | if (warpper.getPeopleNumber() == null || warpper.getPeopleNumber() < 1 || warpper.getPeopleNumber() > 7) { |
| | | return ResultUtil.error("乘车人数必须在1-7之间"); |
| | | } |
| | | if (ToolUtil.isEmpty(warpper.getPassengersPhone())) { |
| | | return ResultUtil.error("乘客手机号不能为空"); |
| | | } |
| | | if (warpper.getStartLon() == null || warpper.getStartLat() == null || ToolUtil.isEmpty(warpper.getStartAddress())) { |
| | | return ResultUtil.error("上车点信息不完整"); |
| | | } |
| | | if (warpper.getEndLon() == null || warpper.getEndLat() == null || ToolUtil.isEmpty(warpper.getEndAddress())) { |
| | | return ResultUtil.error("下车点信息不完整"); |
| | | } |
| | | if (warpper.getOtherFee() != null && warpper.getOtherFee().compareTo(BigDecimal.ZERO) < 0) { |
| | | return ResultUtil.error("其他费用不能为负数"); |
| | | } |
| | | |
| | | // 2. 校验班次信息 |
| | | LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(warpper.getLineShiftDriverId()); |
| | | if (lineShiftDriver == null) { |
| | | return ResultUtil.error("班次信息不存在"); |
| | | } |
| | | if (!driverId.equals(lineShiftDriver.getDriverId())) { |
| | | return ResultUtil.error("无权操作此班次"); |
| | | } |
| | | |
| | | // 3. 校验剩余座位数 |
| | | if (lineShiftDriver.getLaveSeat() < warpper.getPeopleNumber()) { |
| | | return ResultUtil.error("座位不足,无法下单"); |
| | | } |
| | | |
| | | // 4. 自动分配座位号 |
| | | String laveSeatNumber = lineShiftDriver.getLaveSeatNumber(); |
| | | if (ToolUtil.isEmpty(laveSeatNumber)) { |
| | | return ResultUtil.error("无可用座位"); |
| | | } |
| | | String[] availableSeats = laveSeatNumber.split(","); |
| | | if (availableSeats.length < warpper.getPeopleNumber()) { |
| | | return ResultUtil.error("座位不足,无法下单"); |
| | | } |
| | | // 取前 peopleNumber 个座位 |
| | | StringBuilder seatNumberBuilder = new StringBuilder(); |
| | | for (int i = 0; i < warpper.getPeopleNumber(); i++) { |
| | | if (i > 0) { |
| | | seatNumberBuilder.append(","); |
| | | } |
| | | seatNumberBuilder.append(availableSeats[i]); |
| | | } |
| | | String seatNumber = seatNumberBuilder.toString(); |
| | | |
| | | // 5. 获取司机信息 |
| | | Driver driver = driverService.selectById(driverId); |
| | | if (driver == null) { |
| | | return ResultUtil.error("司机信息不存在"); |
| | | } |
| | | if (driver.getState() == 1) { |
| | | return ResultUtil.error("司机处于离线状态"); |
| | | } |
| | | |
| | | // 6. 获取线路班次信息 |
| | | LineSite lineSite = lineSiteService.selectById(lineShiftDriver.getLineShiftId()); |
| | | if (lineSite == null) { |
| | | return ResultUtil.error("线路班次信息不存在"); |
| | | } |
| | | Line line = lineService.selectById(lineSite.getLineId()); |
| | | if (line == null) { |
| | | return ResultUtil.error("线路信息不存在"); |
| | | } |
| | | |
| | | // 7. 处理用户信息 |
| | | UserInfo userInfo = userInfoMapper.queryByPhone(warpper.getPassengersPhone()); |
| | | if (userInfo == null) { |
| | | // 自动创建用户 |
| | | userInfo = new UserInfo(); |
| | | Integer integer = userInfoMapper.selectCount(null) + 1000001; |
| | | userInfo.setNickName("GRJY" + String.valueOf(integer).substring(1)); |
| | | userInfo.setPhone(warpper.getPassengersPhone()); |
| | | userInfo.setState(1); |
| | | userInfo.setFlag(1); |
| | | userInfo.setInsertTime(new Date()); |
| | | userInfo.setInsertUser(driverId); |
| | | userInfoMapper.insert(userInfo); |
| | | } |
| | | |
| | | // 8. 检查用户是否有未完成订单 |
| | | List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(userInfo.getId(), 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12); |
| | | if (orderPrivateCars.size() > 0) { |
| | | return ResultUtil.error("该乘客有未完成的订单"); |
| | | } |
| | | List<OrderTaxi> orderTaxis = orderTaxiMapper.queryByState_(userInfo.getId(), 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12); |
| | | if (orderTaxis.size() > 0) { |
| | | return ResultUtil.error("该乘客有未完成的订单"); |
| | | } |
| | | List<OrderCrossCity> orderCrossCities1 = orderCrossCityMapper.queryByState(userInfo.getId(), 1, 2, 3, 4, 5, 6, 7, 11, 12); |
| | | if (orderCrossCities1.size() > 0) { |
| | | return ResultUtil.error("该乘客有未完成的订单"); |
| | | } |
| | | |
| | | // 9. 检查司机是否正在服务中 |
| | | List<OrderCrossCity> orderCrossCities2 = orderCrossCityMapper.queryOrders(driverId, warpper.getLineShiftDriverId(), Arrays.asList(5)); |
| | | if (orderCrossCities2.size() > 0) { |
| | | return ResultUtil.error("司机正在服务中"); |
| | | } |
| | | |
| | | // 10. 计算价格 |
| | | Map<String, String> distanceMap = gdMapElectricFenceUtil.getDistance( |
| | | warpper.getStartLon() + "," + warpper.getStartLat(), |
| | | warpper.getEndLon() + "," + warpper.getEndLat(), 1); |
| | | if (distanceMap == null) { |
| | | return ResultUtil.error("计算行程距离出错"); |
| | | } |
| | | Double distance = Double.valueOf(distanceMap.get("distance")); |
| | | |
| | | // 获取车辆信息 |
| | | Car car = carServiceImpl.selectById(driver.getCarId()); |
| | | if (car == null) { |
| | | return ResultUtil.error("车辆信息不存在"); |
| | | } |
| | | CarModel carModel = carModelMapper.selectById(car.getCarModelId()); |
| | | if (carModel == null) { |
| | | return ResultUtil.error("车型信息不存在"); |
| | | } |
| | | CarService carService = carServiceMapper.query(3, driver.getCarId()); |
| | | if(null == carService){ |
| | | return ResultUtil.error("车辆未开通该服务"); |
| | | } |
| | | ResultUtil<Map<String, Object>> priceResult = this.getPrice(distance, warpper.getPeopleNumber(), 1, |
| | | lineSite.getLineId(), carService.getServerCarModelId(), lineShiftDriver.getTotalSeat(), seatNumber); |
| | | if (priceResult.getCode() != 200) { |
| | | return ResultUtil.error("计算价格失败"); |
| | | } |
| | | Double ticketPrice = Double.valueOf(priceResult.getData().get("price").toString()); |
| | | |
| | | // 计算合计费用 |
| | | Double otherFee = warpper.getOtherFee() != null ? warpper.getOtherFee().setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() : 0D; |
| | | Double totalMoney = new BigDecimal(ticketPrice).add(new BigDecimal(otherFee)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); |
| | | |
| | | // 11. 创建订单 |
| | | OrderCrossCity orderCrossCity = new OrderCrossCity(); |
| | | orderCrossCity.setUserId(userInfo.getId()); |
| | | orderCrossCity.setPassengers(userInfo.getName()); |
| | | orderCrossCity.setPassengersPhone(warpper.getPassengersPhone()); |
| | | orderCrossCity.setServerCarModelId(carService.getServerCarModelId()); |
| | | orderCrossCity.setDriverId(driverId); |
| | | orderCrossCity.setLineId(lineSite.getLineId()); |
| | | orderCrossCity.setCarId(driver.getCarId()); |
| | | orderCrossCity.setOrderNum(this.getOrderNum(driverId, warpper.getLineShiftDriverId())); |
| | | |
| | | // 下单地点 |
| | | orderCrossCity.setPlacementLat(warpper.getPlacementLat()); |
| | | orderCrossCity.setPlacementLon(warpper.getPlacementLon()); |
| | | String placementAddress = warpper.getStartAddress(); |
| | | placementAddress = placementAddress.replaceAll("& #40;", "("); |
| | | placementAddress = placementAddress.replaceAll("& #41;", ")"); |
| | | orderCrossCity.setPlacementAddress(placementAddress); |
| | | |
| | | // 上车点 |
| | | orderCrossCity.setStartLon(warpper.getStartLon()); |
| | | orderCrossCity.setStartLat(warpper.getStartLat()); |
| | | String startAddress = warpper.getStartAddress(); |
| | | startAddress = startAddress.replaceAll("& #40;", "("); |
| | | startAddress = startAddress.replaceAll("& #41;", ")"); |
| | | orderCrossCity.setStartAddress(startAddress); |
| | | |
| | | // 下车点 |
| | | orderCrossCity.setEndLon(warpper.getEndLon()); |
| | | orderCrossCity.setEndLat(warpper.getEndLat()); |
| | | String endAddress = warpper.getEndAddress(); |
| | | endAddress = endAddress.replaceAll("& #40;", "("); |
| | | endAddress = endAddress.replaceAll("& #41;", ")"); |
| | | orderCrossCity.setEndAddress(endAddress); |
| | | |
| | | orderCrossCity.setMileage(0D); |
| | | orderCrossCity.setOrderMoney(totalMoney); |
| | | orderCrossCity.setCompanyId(driver.getCompanyId()); |
| | | orderCrossCity.setPeopleNumber(warpper.getPeopleNumber()); |
| | | orderCrossCity.setSeatNumber(seatNumber); |
| | | |
| | | List<OrderCrossCity> orderCrossCities = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderCrossCity.getOrderNum()).eq("isDelete", 1)); |
| | | orderCrossCity.setSort(orderCrossCities.size() + 1); |
| | | orderCrossCity.setState(7); // 待支付 |
| | | orderCrossCity.setInsertTime(new Date()); |
| | | |
| | | // 设置出行时间为班次日期+开始时间 |
| | | Calendar calendar = Calendar.getInstance(); |
| | | calendar.setTime(lineShiftDriver.getDay()); |
| | | String[] startTimeParts = lineSite.getStartTime().split(":"); |
| | | calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTimeParts[0])); |
| | | calendar.set(Calendar.MINUTE, Integer.parseInt(startTimeParts[1])); |
| | | calendar.set(Calendar.SECOND, 0); |
| | | orderCrossCity.setTravelTime(calendar.getTime()); |
| | | |
| | | orderCrossCity.setSnatchOrderTime(new Date()); |
| | | orderCrossCity.setTravelMode(1); // 固定拼车 |
| | | orderCrossCity.setIsDelete(1); |
| | | orderCrossCity.setIsReassign(1); |
| | | orderCrossCity.setLineShiftDriverId(warpper.getLineShiftDriverId()); |
| | | orderCrossCity.setOrderSource(4); // 司机下单 |
| | | orderCrossCity.setOtherFee(warpper.getOtherFee()); |
| | | this.insert(orderCrossCity); |
| | | |
| | | // 13. 更新司机状态 |
| | | if (driver.getState() == 2) { |
| | | driver.setState(3); |
| | | driverService.updateById(driver); |
| | | } |
| | | |
| | | // 14. 更新班次座位信息 |
| | | lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() - warpper.getPeopleNumber()); |
| | | // 更新剩余座位号 |
| | | StringBuilder newLaveSeatNumber = new StringBuilder(); |
| | | for (int i = warpper.getPeopleNumber(); i < availableSeats.length; i++) { |
| | | if (newLaveSeatNumber.length() > 0) { |
| | | newLaveSeatNumber.append(","); |
| | | } |
| | | newLaveSeatNumber.append(availableSeats[i]); |
| | | } |
| | | lineShiftDriver.setLaveSeatNumber(newLaveSeatNumber.toString()); |
| | | lineShiftDriverMapper.updateById(lineShiftDriver); |
| | | |
| | | // 15. 添加系统消息 |
| | | systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功,请尽快完成支付!", orderCrossCity.getUserId(), 1); |
| | | |
| | | // 16. 创建定时任务,30分钟未支付自动取消 |
| | | Integer orderId = orderCrossCity.getId(); |
| | | TimerTask timerTask = new TimerTask() { |
| | | @Override |
| | | public void run() { |
| | | OrderCrossCity order = orderCrossCityMapper.selectById(orderId); |
| | | if (order.getState() == 7 && order.getPayMoney() == null) { |
| | | order.setState(10); |
| | | orderCrossCityMapper.updateById(order); |
| | | |
| | | OrderCancel orderCancel = new OrderCancel(); |
| | | orderCancel.setOrderId(orderId); |
| | | orderCancel.setOrderType(3); |
| | | orderCancel.setReason("用户未及时付款,系统自动取消订单"); |
| | | orderCancel.setRemark("用户未及时付款,系统自动取消订单"); |
| | | orderCancel.setState(2); |
| | | orderCancel.setInsertTime(new Date()); |
| | | orderCancel.setUserType(2); |
| | | orderCancelService.insert(orderCancel); |
| | | |
| | | // 恢复座位 |
| | | LineShiftDriver lsd = lineShiftDriverMapper.selectById(order.getLineShiftDriverId()); |
| | | lsd.setLaveSeat(lsd.getLaveSeat() + order.getPeopleNumber()); |
| | | lsd.setLaveSeatNumber( |
| | | (ToolUtil.isNotEmpty(lsd.getLaveSeatNumber()) ? lsd.getLaveSeatNumber() + "," : "") + |
| | | order.getSeatNumber() |
| | | ); |
| | | lineShiftDriverMapper.updateById(lsd); |
| | | |
| | | // 修改司机为空闲 |
| | | List<OrderCrossCity> orders = orderCrossCityMapper.queryByDriverId(order.getDriverId(), 2, 3, 4, 5, 11); |
| | | if (orders.size() == 0) { |
| | | Driver d = driverService.selectById(order.getDriverId()); |
| | | d.setState(2); |
| | | driverService.updateById(d); |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | Timer timer = new Timer(); |
| | | timer.schedule(timerTask, 30 * 60 * 1000); |
| | | |
| | | // 17. 返回结果 |
| | | BaseWarpper baseWarpper = new BaseWarpper(); |
| | | baseWarpper.setId(orderCrossCity.getId()); |
| | | return ResultUtil.success(baseWarpper); |
| | | } |
| | | } |