From eb0fa100af9347ba2a93188170d023fe5cf396eb Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期二, 13 一月 2026 19:13:21 +0800
Subject: [PATCH] feat(user):扫码下单创建订单接口

---
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java |  320 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 315 insertions(+), 5 deletions(-)

diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
index 2b8eb80..464698f 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -10,13 +10,16 @@
 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;
@@ -196,7 +199,16 @@
 
 	@Autowired
 	private TDriverPromotionActivityService driverPromotionActivityService;
-	
+
+	@Autowired
+	private CarServiceMapper carServiceMapper;
+
+	@Autowired
+	private ILineSiteService lineSiteService;
+
+	@Autowired
+	private ILineService lineService;
+
 	
 	@Value("${callbackPath}")
 	private String callbackPath;
@@ -2980,13 +2992,13 @@
 
 	/**
 	 * 【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()) {
@@ -3031,12 +3043,310 @@
 		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);
+	}
 }

--
Gitblit v1.7.1