package com.stylefeng.guns.modular.system.service.impl; import cn.hutool.core.map.MapUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.stylefeng.guns.core.util.DateUtil; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.call.model.OrderCall; import com.stylefeng.guns.modular.call.server.IOrderCallService; import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity; import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics; import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService; import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; import com.stylefeng.guns.modular.system.dao.RegionMapper; import com.stylefeng.guns.modular.system.dao.SysReformistMapper; import com.stylefeng.guns.modular.system.model.AdditionalFee; import com.stylefeng.guns.modular.system.model.Driver; import com.stylefeng.guns.modular.system.model.OrderPosition; import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.*; import com.stylefeng.guns.modular.system.warpper.BaseWarpper; import com.stylefeng.guns.modular.system.warpper.OrderListWarpper; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; /** * 订单相关逻辑类 */ @Service public class OrderServiceImpl implements IOrderService { @Resource private IOrderTaxiService orderTaxiService; @Resource private RegionMapper regionMapper; @Resource private SysReformistMapper sysReformistMapper; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; @Autowired private GDMapGeocodingUtil gdMapGeocodingUtil; @Autowired private IDriverService driverService; @Autowired private TaskUtil taskUtil; @Autowired private ChinaMobileUtil chinaMobileUtil; @Resource private RedisTemplate redisTemplate; @Autowired private PushUtil pushUtil; @Autowired private IOrderPrivateCarService orderPrivateCarService; @Autowired private IOrderCrossCityService orderCrossCityService; @Autowired private IOrderLogisticsService orderLogisticsService; @Autowired private ALiSendSms aLiSendSms; @Value("${pushMinistryOfTransport}") private boolean pushMinistryOfTransport; @Autowired private PushMinistryOfTransportUtil pushMinistryOfTransportUtil; @Autowired private IOrderCallService orderCallService; @Autowired private IAdditionalFeeService additionalFeeService; // @Autowired // private RedissonClient redissonClient; @Autowired private IOpenCityService openCityService; @Autowired private ICompanyService companyService; /** * 获取司机首页的订单列表 * @param pageNum * @param size * @param uid * @return * @throws Exception */ @Override public List> queryOrderList(Integer state, Integer pageNum, Integer size, Integer uid) throws Exception { Driver driver = driverService.selectById(uid); Integer page = pageNum; pageNum = (pageNum - 1) * size; List> datas = new ArrayList<>(); //出租车 List> list = orderTaxiService.queryOrderList(state, uid); datas.addAll(list); //专车 List> list1 = orderPrivateCarService.queryOrderList(state, uid); datas.addAll(list1); //跨城 List> list2 = orderCrossCityService.queryOrderList(state, uid); datas.addAll(list2); //小件物流 List> list3 = orderLogisticsService.queryOrderList(uid); datas.addAll(list3); //分页 if(datas.size() >= page * size){ datas = datas.subList(pageNum, pageNum + size); }else if(pageNum < datas.size() && datas.size() < page * size){ datas = datas.subList(pageNum, datas.size()); }else{ datas = new ArrayList<>(); } return datas; } /** * 获取司机首页的订单列表 * @param pageNum * @param size * @param uid * @return * @throws Exception */ @Override public List> queryOrderList1(Integer state, Integer type, Integer pageNum, Integer size, Integer uid) throws Exception { Integer page = pageNum; pageNum = (pageNum - 1) * size; List> datas = new ArrayList<>(); if(type == 1){ //出租车 List> list = orderTaxiService.queryOrderList(state, uid); datas.addAll(list); //专车 List> list1 = orderPrivateCarService.queryOrderList(state, uid); datas.addAll(list1); //跨城 List> list2 = orderCrossCityService.queryOrderList(state, uid); datas.addAll(list2); }else{//小件物流 List> list3 = orderLogisticsService.queryOrderList(uid); datas.addAll(list3); } //分页 if(datas.size() >= page * size){ datas = datas.subList(pageNum, pageNum + size); }else if(pageNum < datas.size() && datas.size() < page * size){ datas = datas.subList(pageNum, datas.size()); }else{ datas = new ArrayList<>(); } return datas; } /** * 获取司机端我的订单列表 * @param state 1=全部,2=待支付,3=已取消,4=已完成 * @param pageNum * @param size * @param uid * @return * @throws Exception */ @Override public List queryMyAllOrder(Integer state, Integer pageNum, Integer size, Integer uid) throws Exception { Integer page = pageNum; pageNum = (pageNum - 1) * size; List> datas = new ArrayList<>(); //出租车 List> list = orderTaxiService.queryMyAllOrder(state, uid); datas.addAll(list); //专车 List> list1 = orderPrivateCarService.queryMyAllOrder(state, uid); datas.addAll(list1); //跨城 List> list2 = orderCrossCityService.queryMyAllOrder(state, uid); datas.addAll(list2); //小件物流 List> list3 = orderLogisticsService.queryMyAllOrder(state, uid); for (Map map : list3) { if (ToolUtil.isNotEmpty(map.get("endServiceTime")) && ToolUtil.isNotEmpty(map.get("arriveTimeExpects"))){ if (DateUtil.parseTime(map.get("endServiceTime").toString()).getTime() > DateUtil.parseTime(map.get("arriveTimeExpects").toString()).getTime()){ map.put("timeOutState",1); }else { map.put("timeOutState",2); } }else { map.put("timeOutState",2); } } datas.addAll(list3); List orderListWarpper = OrderListWarpper.getOrderListWarpper(datas); //分页 if(orderListWarpper.size() >= page * size){ orderListWarpper = orderListWarpper.subList(pageNum, pageNum + size); }else if(pageNum < orderListWarpper.size() && orderListWarpper.size() < page * size){ orderListWarpper = orderListWarpper.subList(pageNum, orderListWarpper.size()); }else{ orderListWarpper = new ArrayList<>(); } return orderListWarpper; } /** * 获取司机端我的订单列表 * @param pageNum * @param size * @param uid * @return * @throws Exception */ @Override public List queryMyAllOrder1(Integer pageNum, Integer size, Integer uid) throws Exception { Integer page = pageNum; pageNum = (pageNum - 1) * size; List> datas = new ArrayList<>(); //出租车 List> list = orderTaxiService.queryMyAllOrder(1, uid); datas.addAll(list); // //专车 // List> list1 = orderPrivateCarService.queryMyAllOrder(state, uid); // datas.addAll(list1); // //跨城 // List> list2 = orderCrossCityService.queryMyAllOrder(state, uid); // datas.addAll(list2); // //小件物流 // List> list3 = orderLogisticsService.queryMyAllOrder(state, uid); // datas.addAll(list3); List orderListWarpper = OrderListWarpper.getOrderListWarpper(datas); //分页 if(orderListWarpper.size() >= page * size){ orderListWarpper = orderListWarpper.subList(pageNum, pageNum + size); }else if(pageNum < orderListWarpper.size() && orderListWarpper.size() < page * size){ orderListWarpper = orderListWarpper.subList(pageNum, orderListWarpper.size()); }else{ orderListWarpper = new ArrayList<>(); } return orderListWarpper; } /** * 用户下单成功后司机主动去获取推送的订单详情 * @param orderId * @param orderType * @return */ @Override public Map queryPushOrder(Integer orderId, Integer orderType, String lon, String lat) throws Exception{ Map map = null; switch (orderType){ case 1://专车 String distance = ""; String order = ""; map = orderPrivateCarService.queryPushOrder(orderId); if (MapUtil.get(map,"startLon",String.class) != null){ order = String.valueOf(map.get("startLon")) + "," + String.valueOf(map.get("startLat")); // TODO: 2023/11/4 无法修改 distance = gdMapElectricFenceUtil.getDistance(lon + "," + lat, order, 1).get("distance"); map.put("startDistance", ToolUtil.isNotEmpty(distance) ? Double.valueOf(distance) / 1000 : 0); } if (MapUtil.get(map,"endLon",String.class) != null){ //总距离 String end = String.valueOf(map.get("endLon")) + "," + String.valueOf(map.get("endLat")); // TODO: 2023/11/4 无法修改 distance = gdMapElectricFenceUtil.getDistance(end, order, 1).get("distance"); map.put("totalDistance", ToolUtil.isNotEmpty(distance) ? Double.valueOf(distance) / 1000 : 0); } Integer orderSource = Integer.valueOf(String.valueOf(map.get("orderSource"))); if(orderSource == 1 || orderSource == 2 || orderSource == 3){ if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 1 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "乘客下单"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 1 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 2 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "预约"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 2 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } if(orderSource == 5){ if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 1 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "调度下单"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 1 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 2 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "预约"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 2 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } break; case 2://出租 OrderTaxi orderTaxi = orderTaxiService.selectById(orderId); if((null != orderTaxi && orderTaxi.getType() == 2) || (null != orderTaxi && orderTaxi.getState() == 11)){ map = orderTaxiService.queryPushOrder(orderId); }else{ OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); if(null != orderPrivateCar && orderPrivateCar.getType() == 3){ map = orderPrivateCarService.queryPushOrder(orderId); }else{ map = orderTaxiService.queryPushOrder(orderId); } } String order1 = ""; if (MapUtil.get(map,"startLon",String.class) != null){ order1 = String.valueOf(map.get("startLon")) + "," + String.valueOf(map.get("startLat")); // TODO: 2023/11/4 无法修改 String distance1 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, order1, 1).get("distance"); map.put("startDistance", ToolUtil.isNotEmpty(distance1) ? Double.valueOf(distance1) / 1000 : 0); } if (MapUtil.get(map,"endLon",String.class) != null){ //总距离 String end1 = String.valueOf(map.get("endLon")) + "," + String.valueOf(map.get("endLat")); if(end1.equals(",")){ map.put("totalDistance", 0); }else{ // TODO: 2023/11/4 无法修改 Map disMap = gdMapElectricFenceUtil.getDistance(end1, order1, 1); if(ToolUtil.isEmpty(disMap)){ map.put("totalDistance", 0); }else{ distance = disMap.get("distance"); map.put("totalDistance", ToolUtil.isNotEmpty(distance) ? Double.valueOf(distance) / 1000 : 0); } } } Integer orderSource1 = Integer.valueOf(String.valueOf(map.get("orderSource"))); if(orderSource1 == 1 || orderSource1 == 2 || orderSource1 == 3){ if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 1 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "乘客下单"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 1 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 2 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "预约"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 2 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } if(orderSource1 == 5){ if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 1 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "调度下单"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 1 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 2 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "预约"); } if(Integer.valueOf(String.valueOf(map.get("orderType"))) == 2 && Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } break; case 3://城际 map = orderCrossCityService.queryPushOrder(orderId); String order2 = ""; if (MapUtil.get(map,"startLon",String.class) != null){ order2 = String.valueOf(map.get("startLon")) + "," + String.valueOf(map.get("startLat")); // TODO: 2023/11/4 无法修改 String distance2 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, order2, 1).get("distance"); map.put("startDistance", ToolUtil.isNotEmpty(distance2) ? Double.valueOf(distance2) / 1000 : 0); } if (MapUtil.get(map,"endLon",String.class) != null){ //总距离 String end2 = String.valueOf(map.get("endLon")) + "," + String.valueOf(map.get("endLat")); // TODO: 2023/11/4 无法修改 distance = gdMapElectricFenceUtil.getDistance(end2, order2, 1).get("distance"); map.put("totalDistance", ToolUtil.isNotEmpty(distance) ? Double.valueOf(distance) / 1000 : 0); } Integer orderSource2 = Integer.valueOf(String.valueOf(map.get("orderSource"))); if(orderSource2 == 1 || orderSource2 == 2 || orderSource2 == 3){ if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "乘客下单"); } if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } if(orderSource2 == 5){ if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "调度下单"); } if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } break; case 4://同城小件物流 map = orderLogisticsService.queryPushOrder(orderId); String order3 = ""; if (MapUtil.get(map,"startLon",String.class) != null){ order3 = String.valueOf(map.get("startLon")) + "," + String.valueOf(map.get("startLat")); // TODO: 2023/11/4 无法修改 String distance3 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, order3, 1).get("distance"); map.put("startDistance", ToolUtil.isNotEmpty(distance3) ? Double.valueOf(distance3) / 1000 : 0); } if (MapUtil.get(map,"endLon",String.class) != null){ //总距离 String end3 = String.valueOf(map.get("endLon")) + "," + String.valueOf(map.get("endLat")); // TODO: 2023/11/4 无法修改 distance = gdMapElectricFenceUtil.getDistance(end3, order3, 1).get("distance"); map.put("totalDistance", ToolUtil.isNotEmpty(distance) ? Double.valueOf(distance) / 1000 : 0); } Integer orderSource3 = Integer.valueOf(String.valueOf(map.get("orderSource"))); if(orderSource3 == 1 || orderSource3 == 2 || orderSource3 == 3){ if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "乘客下单"); } if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } if(orderSource3 == 5){ if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "调度下单"); } if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } break; case 5://跨城小件物流 map = orderLogisticsService.queryPushOrder(orderId); String order4 = ""; if (MapUtil.get(map,"startLon",String.class) != null){ order4 = String.valueOf(map.get("startLon")) + "," + String.valueOf(map.get("startLat")); // TODO: 2023/11/4 无法修改 String distance4 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, order4, 1).get("distance"); map.put("startDistance", ToolUtil.isNotEmpty(distance4) ? Double.valueOf(distance4) / 1000 : 0); } if (MapUtil.get(map,"endLon",String.class) != null){ //总距离 String end4 = String.valueOf(map.get("endLon")) + "," + String.valueOf(map.get("endLat")); // TODO: 2023/11/4 无法修改 distance = gdMapElectricFenceUtil.getDistance(end4, order4, 1).get("distance"); map.put("totalDistance", ToolUtil.isNotEmpty(distance) ? Double.valueOf(distance) / 1000 : 0); } Integer orderSource4 = Integer.valueOf(String.valueOf(map.get("orderSource"))); if(orderSource4 == 1 || orderSource4 == 2 || orderSource4 == 3){ if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "乘客下单"); } if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } if(orderSource4 == 5){ if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 1){ map.put("type", "调度下单"); } if(Integer.valueOf(String.valueOf(map.get("isReassign"))) == 2){ map.put("type", "改派"); } } break; case 6: break; } return map; } /** * 司机执行抢单操作 * @param orderId * @param orderType * @param uid * @return * @throws Exception */ @Override public ResultUtil grabOrder(Integer orderId, Integer orderType, Integer uid) throws Exception { //专车和出租是批量下单,所以这里需要将两种类型的抢单操作通过一个锁来一起控制 if(1 == orderType || 2 == orderType){ Boolean lock = redisTemplate.opsForValue().setIfAbsent("grabOrder:" + orderId, "1"); if(!lock){ return ResultUtil.error("抢单失败,请稍后重试"); } try { if(1 == orderType){ return orderPrivateCarService.grabOrder(orderId, uid); } if(2 == orderType){ return orderTaxiService.grabOrder(orderId, uid); } }catch (Exception e){ e.printStackTrace(); }finally { redisTemplate.delete("grabOrder:" + orderId); } } switch (orderType){ case 3://城际 return ResultUtil.success();//不作任何操作,跨城默认选择的司机 case 4://同城小件 return orderLogisticsService.grabOrder(orderId, uid); case 5://跨城小件 return orderLogisticsService.grabOrder(orderId, uid); case 6: break; } return null; } /** * 司机抢单(车载端) * @param orderId * @param orderType * @param uid * @return * @throws Exception */ @Override public synchronized ResultUtil grabOrder_(Integer orderId, Integer orderType, Integer uid) throws Exception { switch (orderType){ case 1://专车 break; case 2://出租 return orderTaxiService.grabOrder_(orderId, uid); case 3://城际 break; case 4://同城小件 return orderLogisticsService.grabOrder_(orderId, uid); case 5://跨城小件 return orderLogisticsService.grabOrder_(orderId, uid); case 6: break; } return null; } /** * 获取订单详情页(服务中的页面) * @param orderId * @param orderType * @param orderType * @return * @throws Exception */ @Override public Map queryOrderInfo(Integer uid, Integer orderId, Integer orderType) throws Exception { Map map = null; switch (orderType){ case 1://专车 map = orderPrivateCarService.queryOrderInfo2(orderId); break; case 2://出租 map = orderTaxiService.queryOrderInfo(orderId); if(null == map){ OrderTaxi orderTaxi = orderTaxiService.selectOne(new EntityWrapper().eq("driverId", uid) .eq("isDelete", 1).in("state", Arrays.asList(2, 3, 4, 5, 6))); map = orderTaxiService.queryOrderInfo(orderTaxi.getId()); } String phone = map.get("phone").toString(); String s = phone.substring(0, 3) + "****" + phone.substring(7 ); map.put("realPhone", s); break; case 3://城际 map = orderCrossCityService.queryOrderCrossCityInfo(orderId); break; case 4://同城小件 map = orderLogisticsService.queryOrderInfo(orderId); if(null != map.get("telXOne")){ map.put("userPhone", map.get("telXOne")); } break; case 5://跨城小件 map = orderLogisticsService.queryOrderInfo(orderId); if(null != map.get("telXOne")){ map.put("userPhone", map.get("telXOne")); } break; case 6: break; case 7: map = orderPrivateCarService.queryOrderInfo(orderId); break; } if(null != map.get("telX")){ map.put("phone", map.get("telX")); } System.out.println("订单需求"+map); return map; } /** * 获取改派订单收费金额 * @param orderId * @return * @throws Exception */ @Override public Double queryReassignMoney(Integer orderId, Integer orderType) throws Exception { Integer openCityId = null; Integer companyId = null; switch (orderType){ case 1://专车 OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); companyId = orderPrivateCar.getCompanyId(); openCityId = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString()).getId(); break; case 2://出租 OrderTaxi orderTaxi = orderTaxiService.selectById(orderId); companyId = orderTaxi.getCompanyId(); openCityId = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString()).getId(); break; case 3://城际 OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId); companyId = orderCrossCity.getCompanyId(); openCityId = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()).getId(); break; case 4://同城小件 OrderLogistics orderLogistics = orderLogisticsService.selectById(orderId); companyId = orderLogistics.getCompanyId(); openCityId = openCityService.openCity1(orderLogistics.getStartLon().toString(), orderLogistics.getStartLat().toString()).getId(); break; case 5://跨城小件 OrderLogistics orderLogistics1 = orderLogisticsService.selectById(orderId); companyId = orderLogistics1.getCompanyId(); openCityId = openCityService.openCity1(orderLogistics1.getStartLon().toString(), orderLogistics1.getStartLat().toString()).getId(); break; case 6: break; } return sysReformistMapper.queryMoney(openCityId, companyId); } /** * 走订单流程操作 * @param orderId * @param orderType * @param state * @param uid * @return * @throws Exception */ @Override public ResultUtil process(Integer orderId, Integer orderType, Integer state, Integer uid, Double lon, Double lat, String driverImg) throws Exception { Map geocode = gdMapGeocodingUtil.geocode(String.valueOf(lon), String.valueOf(lat)); String address = geocode.get("address"); switch (orderType){ case 1://专车 return orderPrivateCarService.process(orderId, state, lon, lat, address); case 2://出租 return orderTaxiService.process(orderId, state, lon, lat, address); case 3://城际 return orderCrossCityService.process(orderId, state, lon, lat, address); case 4://同城小件 return orderLogisticsService.process(orderId, state, lon, lat, address, driverImg); case 5://跨城小件 return orderLogisticsService.process(orderId, state, lon, lat, address, driverImg); case 6: break; } return null; } /** * 确认费用操作 * @param orderId * @param orderType * @param type * @param travelFee * @param parkingFee * @param crossingFee * @return * @throws Exception */ @Override public ResultUtil confirmFees(Integer orderId, Integer orderType, Integer type, Double travelFee, Double parkingFee, Double crossingFee) throws Exception { switch (orderType){ case 1://专车 return orderPrivateCarService.confirmFees(orderId, type, parkingFee, crossingFee); case 2://出租 return orderTaxiService.confirmFees(orderId, type, travelFee, parkingFee, crossingFee); case 3://城际(没有此流程) break; case 4:// break; case 5: break; case 6: break; } return null; } @Override public ResultUtil cancleOrder(Integer orderId, Integer orderType) throws Exception { switch (orderType){ case 1://专车 return orderPrivateCarService.cancleOrder(orderId); case 2://出租 break; case 3:// return orderCrossCityService.cancleOrder(orderId); case 4:// break; case 5: break; case 6: break; } return null; } @Override public ResultUtil updatePeopleNum(Integer orderId, Integer peopleNum) throws Exception { return orderPrivateCarService.updatePeopleNum(orderId,peopleNum); } @Override public ResultUtil confirmFees1(Integer orderId, Integer orderType, Integer type, Double travelFee, String additionalFee) throws Exception { switch (orderType){ case 1://专车 return orderPrivateCarService.confirmFees1(orderId, type, additionalFee); case 2://出租 return orderTaxiService.confirmFees1(orderId, type, travelFee, additionalFee); case 3://城际(没有此流程) break; case 4:// break; case 5: break; case 6: break; } return null; } /** * 确认费用(车载端) * @param orderId * @param orderType * @param type * @param travelFee * @param lon * @param lat * @return * @throws Exception */ @Override public ResultUtil confirmFees_(Integer orderId, Integer orderType, Integer type, Double travelFee, Double lon, Double lat) throws Exception { Map geocode = gdMapGeocodingUtil.geocode(String.valueOf(lon), String.valueOf(lat)); String address = geocode.get("address"); switch (orderType){ case 1://专车 break; case 2://出租 return orderTaxiService.confirmFees_(orderId, type, travelFee, lon, lat, address); case 3://城际 break; case 4:// break; case 5: break; case 6: break; } return null; } /** * 司机确认费用(车载端)不管之前数据状态直接修改到待支付(流程断网情况的处理流程) * @param orderId * @param orderType * @param type * @param travelFee * @param lon * @param lat * @return * @throws Exception */ @Override public ResultUtil confirmFees$(Integer orderId, Integer orderType, Integer type, Double travelFee, Double lon, Double lat) throws Exception { Map geocode = gdMapGeocodingUtil.geocode(String.valueOf(lon), String.valueOf(lat)); String address = geocode.get("address"); switch (orderType){ case 1://专车 break; case 2://出租 return orderTaxiService.confirmFees$(orderId, type, travelFee, lon, lat, address); case 3://城际 break; case 4:// break; case 5: break; case 6: break; } return null; } /** * 获取司机端待支付页面详情 * @param orderId * @param orderType * @return */ @Override public Map queryToBePaidPage(Integer orderId, Integer orderType) throws Exception{ switch (orderType){ case 1://专车 return orderPrivateCarService.queryOrderInfo(orderId); case 2://出租 return orderTaxiService.queryOrderInfo(orderId); case 3://城际(没有此流程) return null; case 4:// break; case 5: break; case 6: break; } return null; } /** * 计算实时里程 * @throws Exception */ @Override public boolean calculateMileage(OrderPosition orderPosition) throws Exception { switch (orderPosition.getOrderType()){ case 1://专车 return orderPrivateCarService.calculateMileage(orderPosition.getOrderId(), orderPosition.getLon(), orderPosition.getLat()); case 2://出租 return orderTaxiService.calculateMileage(orderPosition.getOrderId(), orderPosition.getLon(), orderPosition.getLat()); case 3://城际 return orderCrossCityService.calculateMileage(orderPosition); case 4:// break; case 5: break; case 6: break; } return false; } /** * 获取完成的订单数量 * @param driverId * @param start * @param end * @return * @throws Exception */ @Override public Integer queryOrderNum(Integer driverId, Date start, Date end) throws Exception { //出租车 Integer[] state = new Integer[]{8, 9}; int i = orderTaxiService.selectCount(new EntityWrapper().eq("driverId", driverId).ne("payManner",2).between("insertTime", start, end).in("state", state)); return i; } /** * 处理预约单快到出行时间(30分钟内),将司机调整为服务中 * @throws Exception */ @Override public void reservationOrder() throws Exception { //出租车 List list = orderTaxiService.queryMaturity();//获取所有快到期的预约单(出行时间在10分钟内) List drivers = new ArrayList<>(); for(OrderTaxi orderTaxi : list){ Driver driver = driverService.selectById(orderTaxi.getDriverId()); driver.setState(3);//修改司机为服务中 drivers.add(driver); taskUtil.driverIds.add(driver.getId());//添加需要推送提醒的司机 Integer muoth = Long.valueOf((orderTaxi.getTravelTime().getTime() - System.currentTimeMillis()) / (1000 * 60)).intValue(); //发送短信提醒 // aLiSendSms.sendSms(driver.getPhone(), "SMS_229613325", "{\"data\":\"" + orderTaxi.getStartAddress() + "\",\"data1\":\"" + orderTaxi.getEndAddress() + "\",\"data2\":\"" + muoth + "\"}"); } //专车 List list1 = orderPrivateCarService.queryMaturity(); for(OrderPrivateCar orderPrivateCar : list1){ Driver driver = driverService.selectById(orderPrivateCar.getDriverId()); driver.setState(3);//修改司机为服务中 drivers.add(driver); taskUtil.driverIds.add(driver.getId());//添加需要推送提醒的司机 Integer muoth = Long.valueOf((orderPrivateCar.getTravelTime().getTime() - System.currentTimeMillis()) / (1000 * 60)).intValue(); //发送短信提醒 // aLiSendSms.sendSms(driver.getPhone(), "SMS_229613325", "{\"data\":\"" + orderPrivateCar.getStartAddress() + "\",\"data1\":\"" + orderPrivateCar.getEndAddress() + "\",\"data2\":\"" + muoth + "\"}"); } //跨城 List orderCrossCities = orderCrossCityService.queryMaturity(); for(OrderCrossCity orderCrossCity : orderCrossCities){ Driver driver = driverService.selectById(orderCrossCity.getDriverId()); driver.setState(3);//修改司机为服务中 drivers.add(driver); taskUtil.driverIds.add(driver.getId());//添加需要推送提醒的司机 Integer muoth = Long.valueOf((orderCrossCity.getTravelTime().getTime() - System.currentTimeMillis()) / (1000 * 60)).intValue(); //发送短信提醒 // aLiSendSms.sendSms(driver.getPhone(), "SMS_229613325", "{\"data\":\"" + orderCrossCity.getStartAddress() + "\",\"data1\":\"" + orderCrossCity.getEndAddress() + "\",\"data2\":\"" + muoth + "\"}"); } //小件物流 List orderLogistics = orderLogisticsService.queryMaturity(); for(OrderLogistics orderLogistics1 : orderLogistics){ Driver driver = driverService.selectById(orderLogistics1.getDriverId()); taskUtil.driverIds.add(driver.getId());//添加需要推送提醒的司机 Integer muoth = Long.valueOf((orderLogistics1.getTravelTime().getTime() - System.currentTimeMillis()) / (1000 * 60)).intValue(); //发送短信提醒 // aLiSendSms.sendSms(driver.getPhone(), "SMS_229613325", "{\"data\":\"" + orderLogistics1.getStartAddress() + "\",\"data1\":\"" + orderLogistics1.getEndAddress() + "\",\"data2\":\"" + muoth + "\"}"); } if(drivers.size() > 0){ driverService.updateBatchById(drivers);//批量修改状态为服务中 } } /** * 定时任务处理结束订单后30分钟解绑小号功能 * @throws Exception */ @Override public void taskMidAxbUnBindSend() throws Exception { List list = orderTaxiService.taskMidAxbUnBindSend(); for(OrderTaxi orderTaxi : list){ Map map = chinaMobileUtil.midAxbUnBindSend(orderTaxi.getBindId(), orderTaxi.getTelX(), (System.currentTimeMillis() + 600000)); if(!String.valueOf(map.get("code")).equals("200")){ System.err.println(String.valueOf(map.get("msg"))); } orderTaxi.setTelX(""); orderTaxi.setBindId(""); } if(list.size() > 0){ orderTaxiService.updateBatchById(list); } List list1 = orderPrivateCarService.taskMidAxbUnBindSend(); for(OrderPrivateCar orderTaxi : list1){ Map map = chinaMobileUtil.midAxbUnBindSend(orderTaxi.getBindId(), orderTaxi.getTelX(), (System.currentTimeMillis() + 600000)); if(!String.valueOf(map.get("code")).equals("200")){ System.err.println(String.valueOf(map.get("msg"))); } orderTaxi.setTelX(""); orderTaxi.setBindId(""); } if(list1.size() > 0){ orderPrivateCarService.updateBatchById(list1); } List orderCrossCities = orderCrossCityService.taskMidAxbUnBindSend(); for(OrderCrossCity orderTaxi : orderCrossCities){ Map map = chinaMobileUtil.midAxbUnBindSend(orderTaxi.getBindId(), orderTaxi.getTelX(), (System.currentTimeMillis() + 600000)); if(!String.valueOf(map.get("code")).equals("200")){ System.err.println(String.valueOf(map.get("msg"))); } orderTaxi.setTelX(""); orderTaxi.setBindId(""); } if(orderCrossCities.size() > 0){ orderCrossCityService.updateBatchById(orderCrossCities); } List orderLogistics = orderLogisticsService.taskMidAxbUnBindSend(); for(OrderLogistics orderTaxi : orderLogistics){ Map map = chinaMobileUtil.midAxbUnBindSend(orderTaxi.getBindId(), orderTaxi.getTelX(), (System.currentTimeMillis() + 600000)); if(!String.valueOf(map.get("code")).equals("200")){ System.err.println(String.valueOf(map.get("msg"))); } orderTaxi.setTelX(""); orderTaxi.setBindId(""); } if(orderLogistics.size() > 0){ orderLogisticsService.updateBatchById(orderLogistics); } } /** * 更新绑定关系 * @param orderId * @param orderType * @throws Exception */ @Override public void RebindMidAxbBindSend(Integer orderId, Integer orderType) throws Exception { switch (orderType){ case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); if(ToolUtil.isNotEmpty(orderPrivateCar.getBindId())){ Map map1 = chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(), orderPrivateCar.getTelX(), (System.currentTimeMillis() + 600000)); if(!String.valueOf(map1.get("code")).equals("200")){ System.err.println(String.valueOf(map1.get("msg"))); } //调用移动的小号接口 Driver driver = driverService.selectById(orderPrivateCar.getDriverId()); // Map map = chinaMobileUtil.midAxbBindSend(orderPrivateCar.getPassengersPhone(), driver.getPhone(), (System.currentTimeMillis() + 86400000)); // if(String.valueOf(map.get("code")).equals("200")){ // orderPrivateCar.setTelX(map.get("telX")); // orderPrivateCar.setBindId(map.get("bindId")); // } orderPrivateCarService.updateById(orderPrivateCar); } break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(orderId); if(ToolUtil.isNotEmpty(orderTaxi.getBindId())){ Map map1 = chinaMobileUtil.midAxbUnBindSend(orderTaxi.getBindId(), orderTaxi.getTelX(), (System.currentTimeMillis() + 600000)); if(!String.valueOf(map1.get("code")).equals("200")){ System.err.println(String.valueOf(map1.get("msg"))); } //调用移动的小号接口 Driver driver = driverService.selectById(orderTaxi.getDriverId()); // Map map = chinaMobileUtil.midAxbBindSend(orderTaxi.getPassengersPhone(), driver.getPhone(), (System.currentTimeMillis() + 86400000)); // if(String.valueOf(map.get("code")).equals("200")){ // orderTaxi.setTelX(map.get("telX")); // orderTaxi.setBindId(map.get("bindId")); // } orderTaxiService.updateById(orderTaxi); } break; case 3: OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId); if(ToolUtil.isNotEmpty(orderCrossCity.getBindId())){ Map map1 = chinaMobileUtil.midAxbUnBindSend(orderCrossCity.getBindId(), orderCrossCity.getTelX(), (System.currentTimeMillis() + 600000)); if(!String.valueOf(map1.get("code")).equals("200")){ System.err.println(String.valueOf(map1.get("msg"))); } //调用移动的小号接口 Driver driver = driverService.selectById(orderCrossCity.getDriverId()); // Map map = chinaMobileUtil.midAxbBindSend(orderCrossCity.getPassengersPhone(), driver.getPhone(), (System.currentTimeMillis() + 86400000)); // if(String.valueOf(map.get("code")).equals("200")){ // orderCrossCity.setTelX(map.get("telX")); // orderCrossCity.setBindId(map.get("bindId")); // } orderCrossCityService.updateById(orderCrossCity); } break; } } /** * 获取接单后的语音播报 * @param orderId * @param orderType * @return * @throws Exception */ @Override public String queryVoiceBroadcast(Integer orderId, Integer orderType, String lon, String lat) throws Exception { String content = ""; switch (orderType){ case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); // TODO: 2023/11/4 无法修改 Map distance = gdMapElectricFenceUtil.getDistance(lon + "," + lat, orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), 1); Double d = null != distance ? (Double.valueOf(String.valueOf(distance.get("distance"))) / 1000) : 0; // TODO: 2023/11/4 无法修改 Map distance_ = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), 1); Double d_ = null != distance_ ? (Double.valueOf(String.valueOf(distance_.get("distance"))) / 1000) : 0; content = (orderPrivateCar.getOrderType() == 1 ? "实时单" : "预约单") + ",距您约" + d + "公里,从" + orderPrivateCar.getStartAddress() + "到" + orderPrivateCar.getEndAddress() + ",全程" + d_ + "公里。"; break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(orderId); // TODO: 2023/11/4 无法修改 Map distance1 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, orderTaxi.getStartLon() + "," + orderTaxi.getStartLat(), 1); Double d1 = null != distance1 ? (Double.valueOf(String.valueOf(distance1.get("distance"))) / 1000) : 0; if(ToolUtil.isEmpty(orderTaxi.getEndLon())){ content = (orderTaxi.getOrderType() == 1 ? "实时单" : "预约单") + ",距您约" + d1 + "公里。"; }else{ // TODO: 2023/11/4 无法修改 Map distance1_ = gdMapElectricFenceUtil.getDistance(orderTaxi.getStartLon() + "," + orderTaxi.getStartLat(), orderTaxi.getEndLon() + "," + orderTaxi.getEndLat(), 1); Double d1_ = null != distance1_ ? (Double.valueOf(String.valueOf(distance1_.get("distance"))) / 1000) : 0; content = (orderTaxi.getOrderType() == 1 ? "实时单" : "预约单") + ",距您约" + d1 + "公里,从" + orderTaxi.getStartAddress() + "到" + orderTaxi.getEndAddress() + ",全程" + d1_ + "公里。"; } break; case 3: OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId); // TODO: 2023/11/4 无法修改 Map distance2 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, orderCrossCity.getStartLon() + "," + orderCrossCity.getStartLat(), 1); Double d2 = null != distance2 ? (Double.valueOf(String.valueOf(distance2.get("distance"))) / 1000) : 0; // TODO: 2023/11/4 无法修改 Map distance2_ = gdMapElectricFenceUtil.getDistance(orderCrossCity.getStartLon() + "," + orderCrossCity.getStartLat(), orderCrossCity.getEndLon() + "," + orderCrossCity.getEndLat(), 1); Double d2_ = null != distance2_ ? (Double.valueOf(String.valueOf(distance2_.get("distance"))) / 1000) : 0; content = "实时单,距您约" + d2 + "公里,从" + orderCrossCity.getStartAddress() + "到" + orderCrossCity.getEndAddress() + ",全程" + d2_ + "公里。"; break; case 4: OrderLogistics orderLogistics = orderLogisticsService.selectById(orderId); // TODO: 2023/11/4 无法修改 Map distance3 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, orderLogistics.getStartLon() + "," + orderLogistics.getStartLat(), 1); Double d3 = null != distance3 ? (Double.valueOf(String.valueOf(distance3.get("distance"))) / 1000) : 0; // TODO: 2023/11/4 无法修改 Map distance3_ = gdMapElectricFenceUtil.getDistance(orderLogistics.getStartLon() + "," + orderLogistics.getStartLat(), orderLogistics.getEndLon() + "," + orderLogistics.getEndLat(), 1); Double d3_ = null != distance3_ ? (Double.valueOf(String.valueOf(distance3_.get("distance"))) / 1000) : 0; content = "实时单,距您约" + d3 + "公里,从" + orderLogistics.getStartAddress() + "到" + orderLogistics.getEndAddress() + ",全程" + d3_ + "公里。"; break; case 5: OrderLogistics orderLogistics1 = orderLogisticsService.selectById(orderId); // TODO: 2023/11/4 无法修改 Map distance4 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, orderLogistics1.getStartLon() + "," + orderLogistics1.getStartLat(), 1); Double d4 = null != distance4 ? (Double.valueOf(String.valueOf(distance4.get("distance"))) / 1000) : 0; // TODO: 2023/11/4 无法修改 Map distance4_ = gdMapElectricFenceUtil.getDistance(orderLogistics1.getStartLon() + "," + orderLogistics1.getStartLat(), orderLogistics1.getEndLon() + "," + orderLogistics1.getEndLat(), 1); Double d4_ = null != distance4_ ? (Double.valueOf(String.valueOf(distance4_.get("distance"))) / 1000) : 0; content = "实时单,距您约" + d4 + "公里,从" + orderLogistics1.getStartAddress() + "到" + orderLogistics1.getEndAddress() + ",全程" + d4_ + "公里。"; break; } return content; } /** * 手动完成订单操作 * @param orderId * @param orderType * @return * @throws Exception */ @Override public ResultUtil completeOrder(Integer orderId, Integer orderType) throws Exception { Integer userId = 0; Integer driverId = 0; Integer state = 0; switch (orderType){ case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){ return ResultUtil.error("订单已完成支付,不允许重复支付"); } if(orderPrivateCar.getState() != 7){ return ResultUtil.error("订单不在待支付,无法完成订单"); } orderPrivateCar.setPayManner(2);//其他方式支付 orderPrivateCar.setRedPacketMoney(0D); orderPrivateCar.setCouponMoney(0D); orderPrivateCar.setDiscount(0D); orderPrivateCar.setDiscountMoney(0D); orderPrivateCar.setPayMoney(orderPrivateCar.getOrderMoney()); orderPrivateCar.setState(8); orderPrivateCarService.updateById(orderPrivateCar); userId = orderPrivateCar.getUserId(); driverId = orderPrivateCar.getDriverId(); state = orderPrivateCar.getState(); new Thread(new Runnable() { @Override public void run() { if(pushMinistryOfTransport){//上传数据 pushMinistryOfTransportUtil.operatePay(orderId); } } }).start(); break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(orderId); if(orderTaxi.getState() == 8 || orderTaxi.getState() == 9){ return ResultUtil.error("订单已完成支付,不允许重复支付"); } if(orderTaxi.getState() != 7){ return ResultUtil.error("订单不在待支付,无法完成订单"); } orderTaxi.setPayManner(2);//其他方式支付 orderTaxi.setRedPacketMoney(0D); orderTaxi.setCouponMoney(0D); orderTaxi.setDiscount(0D); orderTaxi.setDiscountMoney(0D); orderTaxi.setPayMoney(orderTaxi.getOrderMoney()); orderTaxi.setState(8); orderTaxiService.updateById(orderTaxi); userId = orderTaxi.getUserId(); driverId = orderTaxi.getDriverId(); state = orderTaxi.getState(); //司机手动确认收款,删除限制司机6分钟不能接单的标识 String vehicle = (String) redisTemplate.opsForValue().get("VEHICLE"); if(ToolUtil.isNotEmpty(vehicle)){ JSONArray jsonArray = JSON.parseArray(vehicle); for(int i = 0; i < jsonArray.size(); i++){ if(jsonArray.getInteger(i).compareTo(driverId) == 0){ jsonArray.remove(i); break; } } redisTemplate.opsForValue().set("VEHICLE", jsonArray.toJSONString()); } break; } Integer finalDriverId = driverId; Integer finalUserId = userId; Integer finalState = state; new Thread(new Runnable() { @Override public void run() { pushUtil.pushOrderState(1, finalUserId, orderId, orderType, finalState); pushUtil.pushOrderState(2, finalDriverId, orderId, orderType, finalState); } }).start(); return ResultUtil.success(); } /** * 获取订单费用明细 * @param orderId * @param orderType * @return * @throws Exception */ @Override public Map queryMoneyInfo(Integer orderId, Integer orderType) throws Exception { switch (orderType){ case 1: return orderPrivateCarService.queryMoneyInfo(orderId); case 2: return orderTaxiService.queryMoneyInfo(orderId); } return null; } @Override public List queryAdditionalFee(Integer orderType, Integer orderId, Integer uid) throws Exception { Integer companyId = null; if(orderType == 1){//专车 OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); companyId = orderPrivateCar.getCompanyId(); } if(orderType == 2){//出租车 OrderTaxi orderTaxi = orderTaxiService.selectById(orderId); companyId = orderTaxi.getCompanyId(); } if(orderType == 3){//跨城出行 Driver driver = driverService.selectById(uid); companyId = driver.getCompanyId(); } if(orderType == 4){//同城小件 OrderLogistics orderLogistics = orderLogisticsService.selectById(orderId); companyId = orderLogistics.getCompanyId(); } if(orderType == 5){//跨城小件 OrderLogistics orderLogistics = orderLogisticsService.selectById(orderId); companyId = orderLogistics.getCompanyId(); } if(orderType == 6){//包车 } if(orderType == 7){//助老模式 OrderCall orderCall = orderCallService.selectById(orderId); companyId = orderCall.getCompanyId(); } List additionalFees = additionalFeeService.selectList(new EntityWrapper().eq("companyId", companyId).eq("state", 1)); List list = new ArrayList<>(); additionalFees.forEach(additionalFee -> { BaseWarpper baseWarpper = new BaseWarpper(); baseWarpper.setId(additionalFee.getId()); baseWarpper.setName(additionalFee.getName()); list.add(baseWarpper); }); return list; } }