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