| | |
| | | import com.stylefeng.guns.modular.crossCity.dao.LinePriceMapper; |
| | | import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper; |
| | | 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.OrderCrossCityScanWarpper; |
| | | import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper; |
| | | import com.stylefeng.guns.modular.crossCity.warpper.ScanOrderDetailWarpper; |
| | | import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService; |
| | | import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper; |
| | | import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; |
| | | import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; |
| | |
| | | |
| | | @Autowired |
| | | private TDriverPromotionActivityService driverPromotionActivityService; |
| | | |
| | | @Autowired |
| | | private CarServiceMapper carServiceMapper; |
| | | |
| | | @Autowired |
| | | private ILineSiteService lineSiteService; |
| | | |
| | | @Autowired |
| | | private ILineService lineService; |
| | | |
| | | |
| | | @Value("${callbackPath}") |
| | |
| | | |
| | | /** |
| | | * 【202601】获取扫码下单详情 |
| | | * |
| | | * @param lineShiftDriverId 司机排班记录ID |
| | | * @param otherFee 其他费用 |
| | | * @return 扫码下单详情 |
| | | * @throws Exception |
| | | */ |
| | | @Override |
| | | public ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId, Double otherFee) throws Exception { |
| | | public ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId) throws Exception { |
| | | // 1. 查询基础数据 |
| | | Map<String, Object> data = lineShiftDriverMapper.queryScanOrderDetail(lineShiftDriverId); |
| | | if (data == null || data.isEmpty()) { |
| | |
| | | result.setEndSiteId(data.get("endSiteId") != null ? Integer.parseInt(data.get("endSiteId").toString()) : null); |
| | | result.setEndSiteName(data.get("endSiteName") != null ? data.get("endSiteName").toString() : null); |
| | | |
| | | // 默认点信息 |
| | | result.setDefaultPointAddress(data.get("defaultPointAddress") != null ? data.get("defaultPointAddress").toString() : null); |
| | | result.setDefaultPointLon(data.get("defaultPointLon") != null ? Double.parseDouble(data.get("defaultPointLon").toString()) : null); |
| | | result.setDefaultPointLat(data.get("defaultPointLat") != null ? Double.parseDouble(data.get("defaultPointLat").toString()) : null); |
| | | |
| | | // 其他信息 |
| | | result.setOtherFee(otherFee); |
| | | result.setServerCarModelId(data.get("serverCarModelId") != null ? Integer.parseInt(data.get("serverCarModelId").toString()) : null); |
| | | result.setDriverId(data.get("driverId") != null ? Integer.parseInt(data.get("driverId").toString()) : null); |
| | | result.setLineShiftDriverId(lineShiftDriverId); |
| | | |
| | | return ResultUtil.success(result); |
| | | } |
| | | |
| | | @Override |
| | | public synchronized ResultUtil<BaseWarpper> orderCrossCityScan(OrderCrossCityScanWarpper warpper, Integer uid) 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.getPlacementLat() == null || warpper.getPlacementLon() == null || ToolUtil.isEmpty(warpper.getPlacementAddress())) { |
| | | 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("其他费用不能为负数"); |
| | | } |
| | | |
| | | /** |
| | | * 先判断司机座位数是否符合出行人数 |
| | | */ |
| | | LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(warpper.getLineShiftDriverId()); |
| | | if (lineShiftDriver.getLaveSeat() < warpper.getPeopleNumber()) { |
| | | return ResultUtil.error("司机剩余座位数小于出行人数"); |
| | | } |
| | | Driver driver = driverService.selectById(lineShiftDriver.getDriverId()); |
| | | if (driver == null) { |
| | | return ResultUtil.error("司机信息不存在"); |
| | | } |
| | | |
| | | if (driver.getState() == 1) { |
| | | 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(); |
| | | // 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("线路信息不存在"); |
| | | } |
| | | |
| | | /** |
| | | * 1.出租车、专车、跨城有待支付的订单不能叫车 |
| | | * 2.小件物流有未完成的订单可以下跨城、专车、出租车 |
| | | * 3.出租车、专车、跨城有预约单可以下即时单 |
| | | */ |
| | | List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12); |
| | | if (orderPrivateCars.size() > 0) { |
| | | return ResultUtil.error("有未完成的订单"); |
| | | } |
| | | List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12); |
| | | if (list.size() > 0) { |
| | | return ResultUtil.error("有未完成的订单"); |
| | | } |
| | | List<OrderCrossCity> orderCrossCities1 = orderCrossCityMapper.queryByState(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12); |
| | | if (orderCrossCities1.size() > 0) { |
| | | return ResultUtil.error("有未完成的订单"); |
| | | } |
| | | |
| | | List<OrderCrossCity> orderCrossCities2 = orderCrossCityMapper.queryOrders(driver.getId(), 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 = carMapper.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(); |
| | | |
| | | UserInfo userInfo = userInfoService.selectById(uid); |
| | | // 11. 创建订单 |
| | | OrderCrossCity orderCrossCity = new OrderCrossCity(); |
| | | orderCrossCity.setUserId(userInfo.getId()); |
| | | orderCrossCity.setPassengers(userInfo.getName()); |
| | | orderCrossCity.setPassengersPhone(warpper.getPassengersPhone()); |
| | | orderCrossCity.setServerCarModelId(carService.getServerCarModelId()); |
| | | orderCrossCity.setDriverId(driver.getId()); |
| | | orderCrossCity.setLineId(lineSite.getLineId()); |
| | | orderCrossCity.setCarId(driver.getCarId()); |
| | | orderCrossCity.setOrderNum(this.getOrderNum(driver.getId(), warpper.getLineShiftDriverId())); |
| | | |
| | | // 下单地点 |
| | | orderCrossCity.setPlacementLat(warpper.getPlacementLat()); |
| | | orderCrossCity.setPlacementLon(warpper.getPlacementLon()); |
| | | String placementAddress = warpper.getPlacementAddress(); |
| | | 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(2); // 扫码下单 |
| | | orderCrossCity.setOtherFee(warpper.getOtherFee()); |
| | | |
| | | // 推广订单处理 |
| | | Integer promotion = isPromotion(uid); |
| | | if(promotion != null){ |
| | | orderCrossCity.setPromotion(2); |
| | | Driver promotionDriver = driverService.selectById(promotion); |
| | | orderCrossCity.setPromotionUser(promotionDriver.getName()); |
| | | orderCrossCity.setPromotionPhone(promotionDriver.getPhone()); |
| | | orderCrossCity.setPromotionDriverId(promotion); |
| | | }else{ |
| | | orderCrossCity.setPromotion(1); |
| | | } |
| | | |
| | | 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分钟未支付自动取消 |
| | | TimerTask timerTask = new TimerTask() { |
| | | @Override |
| | | public void run() { |
| | | OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId()); |
| | | if (orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null) { |
| | | orderCrossCity1.setState(10); |
| | | orderCrossCityMapper.updateById(orderCrossCity1); |
| | | |
| | | //中台修改订单状态 |
| | | if(ToolUtil.isNotEmpty(orderCrossCity1.getTravelId())){ |
| | | ModifyTravelItineraryRequest request1 = new ModifyTravelItineraryRequest(); |
| | | request1.setOrderId(orderCrossCity1.getTravelId()); |
| | | request1.setStatus(orderCrossCity1.getState()); |
| | | if (null != orderCrossCity1.getDriverId()) { |
| | | Driver driver2 = driverService.selectById(orderCrossCity1.getDriverId()); |
| | | Company company = iCompanyService.selectById(driver2.getCompanyId()); |
| | | request1.setDriverId(driver2.getEmpId().toString()); |
| | | request1.setSupplierShopId(company.getEnterCode()); |
| | | } |
| | | if (2 == orderCrossCity1.getPromotion() && null != orderCrossCity1.getPromotionDriverId()) { |
| | | Driver driver2 = driverService.selectById(orderCrossCity1.getPromotionDriverId()); |
| | | request1.setPromoterId(driver2.getEmpId().toString()); |
| | | } |
| | | OrderUtil.modifyTravelItinerary(request1); |
| | | } |
| | | |
| | | //未支付的情况取消订单 |
| | | if(null == orderCrossCity1.getPayType() && ToolUtil.isNotEmpty(orderCrossCity1.getTravelId())){ |
| | | OrderUtil.tradeOrderCancel(orderCrossCity1.getTravelId()); |
| | | } |
| | | |
| | | OrderCancel orderCancel = new OrderCancel(); |
| | | orderCancel.setOrderId(orderCrossCity1.getId()); |
| | | orderCancel.setOrderType(3); |
| | | orderCancel.setReason("用户未及时付款,系统自动取消订单"); |
| | | orderCancel.setRemark("用户未及时付款,系统自动取消订单"); |
| | | orderCancel.setState(2); |
| | | orderCancel.setInsertTime(new Date()); |
| | | orderCancel.setUserType(2); |
| | | orderCancelService.insert(orderCancel); |
| | | |
| | | //修改司机座位 |
| | | LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity1.getLineShiftDriverId()); |
| | | lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity1.getPeopleNumber()); |
| | | lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity1.getTravelMode() == 1 ? "," : "") + orderCrossCity1.getSeatNumber()); |
| | | lineShiftDriverMapper.updateById(lineShiftDriver); |
| | | |
| | | //修改司机为空闲 |
| | | List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity1.getDriverId(), 2, 3, 4, 5, 11); |
| | | if (orderCrossCities.size() == 0) { |
| | | Driver driver = driverService.selectById(orderCrossCity1.getDriverId()); |
| | | driver.setState(2); |
| | | driverService.updateById(driver); |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | }; |
| | | Timer timer = new Timer(); |
| | | timer.schedule(timerTask, 30 * 60 * 1000); |
| | | |
| | | // 17. 返回结果 |
| | | BaseWarpper baseWarpper = new BaseWarpper(); |
| | | baseWarpper.setId(orderCrossCity.getId()); |
| | | return ResultUtil.success(baseWarpper); |
| | | } |
| | | } |