DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -478,7 +478,7 @@ return orderService.confirmFees(language, orderId, orderType, type, travelFee, parkingFee, crossingFee, uid); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); return ResultUtil.runErr(null, e.getMessage()); } } @@ -711,7 +711,7 @@ return ResultUtil.success(MoneyInfoWarpper.getMoneyInfoWarpper(map)); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); return ResultUtil.runErr(null, e.getMessage()); } } @@ -995,7 +995,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ @@ -1017,7 +1017,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ @@ -1050,7 +1050,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ @@ -1072,7 +1072,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -1143,7 +1143,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ @@ -1161,7 +1161,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } } DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -746,7 +746,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ @@ -765,7 +765,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } } DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/AssignOrderMapper.java
New file @@ -0,0 +1,7 @@ package com.stylefeng.guns.modular.system.dao; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.stylefeng.guns.modular.system.model.AssignOrder; public interface AssignOrderMapper extends BaseMapper<AssignOrder> { } DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/AssignOrderMapper.xml
New file @@ -0,0 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.stylefeng.guns.modular.system.dao.AssignOrderMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.AssignOrder"> <id column="id" property="id" /> <result column="companyId" property="companyId" /> <result column="distance" property="distance" /> <result column="type" property="type" /> <result column="people" property="people"/> </resultMap> </mapper> DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml
@@ -332,15 +332,10 @@ ) and id in (select driverId from t_driver_orders where `type` = #{type}) and carId in (select carId from t_car_service where `type` = #{type} <if test="null != serverCarModelId"> and serverCarModelId = #{serverCarModelId} </if> ) ) as aa <!--where aa.id not in ( select driverId from t_order_private_car where isDelete = 1 and driverPay = 1 and state in (7, 8, 9) union all select driverId from t_order_logistics where isDelete = 1 and driverPay = 1 and state != 10 )--> ) as aa </select> </mapper> DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/AssignOrder.java
New file @@ -0,0 +1,90 @@ package com.stylefeng.guns.modular.system.model; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; /** * 订单指派范围配置 */ @TableName("t_assign_order") public class AssignOrder { /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) @TableField("id") private Integer id; /** * 企业id */ @TableField("companyId") private Integer companyId; /** * 指派范围(公里) */ @TableField("distance") private Double distance; /** * 1=专车,2=出租车,3=小件物流 */ @TableField("type") private Integer type; /** * 用于计算实际行驶里程最近的人数范围 */ @TableField("people") private Integer people; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getCompanyId() { return companyId; } public void setCompanyId(Integer companyId) { this.companyId = companyId; } public Double getDistance() { return distance; } public void setDistance(Double distance) { this.distance = distance; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public Integer getPeople() { return people; } public void setPeople(Integer people) { this.people = people; } @Override public String toString() { return "AssignOrder{" + "id=" + id + ", companyId=" + companyId + ", distance=" + distance + ", type=" + type + ", people=" + people + '}'; } } DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IAssignOrderService.java
New file @@ -0,0 +1,7 @@ package com.stylefeng.guns.modular.system.service; import com.baomidou.mybatisplus.service.IService; import com.stylefeng.guns.modular.system.model.AssignOrder; public interface IAssignOrderService extends IService<AssignOrder> { } DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/AssignOrderServiceImpl.java
New file @@ -0,0 +1,12 @@ package com.stylefeng.guns.modular.system.service.impl; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.modular.system.dao.AssignOrderMapper; import com.stylefeng.guns.modular.system.model.AssignOrder; import com.stylefeng.guns.modular.system.service.IAssignOrderService; import org.springframework.stereotype.Service; @Service public class AssignOrderServiceImpl extends ServiceImpl<AssignOrderMapper, AssignOrder> implements IAssignOrderService { } DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyCityServiceImpl.java
@@ -108,7 +108,15 @@ String englishName = city1.getEnglishName(); String frenchName = city1.getFrenchName(); for (String s : city) { if(s.indexOf(chineseName) != -1 || s.indexOf(englishName) != -1 || s.indexOf(frenchName) != -1){ if(s.equals(chineseName)){ collect.add(city1.getId()); break; } if(s.equals(englishName)){ collect.add(city1.getId()); break; } if(s.equals(frenchName)){ collect.add(city1.getId()); break; } @@ -140,7 +148,15 @@ String englishName = city1.getEnglishName(); String frenchName = city1.getFrenchName(); for (String s : city) { if(s.indexOf(chineseName) != -1 || s.indexOf(englishName) != -1 || s.indexOf(frenchName) != -1){ if(s.equals(chineseName)){ collect.add(city1.getId()); break; } if(s.equals(englishName)){ collect.add(city1.getId()); break; } if(s.equals(frenchName)){ collect.add(city1.getId()); break; } DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -1196,7 +1196,7 @@ //检测是否有未完成的订单 List<Map<String, Object>> list = orderService.queryOrderList(1, 1, 10, uid, language); if(list.size() > 0){ return ResultUtil.error(language == 1 ? "还有未完成的订单,不能进行下班操作" : language == 2 ? "There are still outstanding orders, can not be off-duty operation" : "Il y a encore des commandes en suspens qui ne peuvent pas être exécutées"); return ResultUtil.error(language == 1 ? "还有未完成的订单,不能进行下班操作" : language == 2 ? "Outstanding orders ! So you can't get off work" : "Commandes en suspens ! Vous ne pouvez pas quitter le travail"); } driverWork.setEndTime(new Date()); driverWork.setState(2); @@ -1410,7 +1410,7 @@ //检测是否有未完成的订单 List<Map<String, Object>> list = orderService.queryOrderList(1, 1, 10, uid, language); if(list.size() > 0){ return ResultUtil.error(language == 1 ? "还有未完成的订单,不能进行下班操作" : language == 2 ? "There are still outstanding orders, can not be off-duty operation" : "Il y a encore des commandes en suspens qui ne peuvent pas être exécutées"); return ResultUtil.error(language == 1 ? "还有未完成的订单,不能进行下班操作" : language == 2 ? "Outstanding orders ! So you can't get off work" : "Commandes en suspens ! Vous ne pouvez pas quitter le travail"); } driverWork.setEndTime(new Date()); driverWork.setState(2); @@ -3287,6 +3287,7 @@ @Override public List<Driver> queryIdleDriver(Integer userId, Integer type, Integer serverCarModelId, Double lon, Double lat, Double distance, Integer companyId) throws Exception { List<Driver> drivers = driverMapper.queryIdleDriver_(type, serverCarModelId, companyId); System.err.println("派单查询的司机:" + JSON.toJSONString(drivers)); String tripId = redisUtil.getValue("trip" + userId); List<Driver> list = new ArrayList<>(); for(Driver driver : drivers){ DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java
@@ -1304,12 +1304,12 @@ @Override public void overGoogleOrder() { List<OrderPrivateCar> privateCars = orderPrivateCarService.selectList(new EntityWrapper<OrderPrivateCar>().isNotNull("tripId") .eq("isover", 0).in("state", Arrays.asList(7, 8, 9, 10)).eq("isDelete", 1)); .eq("isover", 0).in("state", Arrays.asList(6, 7, 8, 9, 10, 12)).eq("isDelete", 1)); for (OrderPrivateCar privateCar : privateCars) { Integer state = privateCar.getState(); String tripId = privateCar.getTripId(); String trip = fleetEngineUtil.getTrip(tripId); if("" == trip){ if(null != trip && "" == trip){ privateCar.setIsover(1); orderPrivateCarService.updateById(privateCar); continue; @@ -1332,7 +1332,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ @@ -1354,7 +1354,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ @@ -1365,12 +1365,12 @@ } } List<OrderLogistics> orderLogisticsList = orderLogisticsService.selectList(new EntityWrapper<OrderLogistics>().isNotNull("tripId") .eq("isover", 0).in("state", Arrays.asList(7, 8, 9, 10)).eq("isDelete", 1)); .eq("isover", 0).in("state", Arrays.asList(6, 7, 8, 9, 10, 12)).eq("isDelete", 1)); for (OrderLogistics orderLogistics : orderLogisticsList) { Integer state = orderLogistics.getState(); String tripId = orderLogistics.getTripId(); String trip = fleetEngineUtil.getTrip(tripId); if("" == trip){ if(null != trip && "" == trip){ orderLogistics.setIsover(1); orderLogisticsService.updateById(orderLogistics); continue; @@ -1393,7 +1393,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ @@ -1415,7 +1415,7 @@ try { Thread.sleep(3000L); } catch (InterruptedException e) { throw new RuntimeException(e); e.printStackTrace(); } } }else{ DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java
@@ -66,6 +66,9 @@ @Autowired private PayMoneyUtil payMoneyUtil; @Resource private IDriverWorkService driverWorkService; /*@Autowired private ICBCPayUtil icbcPayUtil;*/ @@ -128,6 +131,9 @@ @Resource private QuartzUtil quartzUtil; @Resource private IAssignOrderService assignOrderService; @@ -207,18 +213,66 @@ //开始自动完成改派 List<Driver> drivers = new ArrayList<>(); switch (reassign.getOrderType()){ case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId()); Company company = companyCityService.query1(orderPrivateCar.getUserId(), String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司 AssignOrder assignOrder = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", company.getId()).eq("type", 1)); if(null == assignOrder || assignOrder.getPeople() == 0) {//配置了指派规则才处理 return resultUtil; } PushOrder pushOrder = pushOrderService.querys(1, 1, company.getId()).get(0); //获取空闲司机 List<Driver> list = driverService.queryIdleDriver(orderPrivateCar.getUserId(), 1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机 System.err.println("【" + orderPrivateCar.getId() + "】空闲司机:" + JSON.toJSONString(list)); if(list.size() > 0){ Optional<Driver> optional = list.stream().filter(d -> !d.getId().equals(orderPrivateCar.getDriverId())).findFirst(); if(optional.isPresent()){ Driver driver1 = optional.get(); drivers = list.stream().filter(d -> !d.getId().equals(orderPrivateCar.getDriverId())).collect(Collectors.toList()); if(drivers.size() > 0) {//有司机,直接指派给司机 Driver dr = null; if (drivers.size() > 1) { List<Driver> ds = new ArrayList<>();//存储直线距离最近的几个司机 for (int i = 0; i < assignOrder.getPeople(); i++) { Driver driver1 = null; long m = 0; int index = 0; for (int j = 0; j < drivers.size(); j++) { String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId()); if (null != value) { String[] split = value.split(","); DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId); Long distance = distancematrix.getDistance(); if ((0 == m && null == driver1) || (distance < m)) { driver1 = drivers.get(j); m = distance; index = j; } } } ds.add(driver1); drivers.remove(index); } //再根据直线距离最短的司机中找出行驶距离最短的司机 Long m = 0L; for (Driver driver1 : ds) { String value = redisUtil.getValue("DRIVER" + driver1.getId()); if (null != value) { String[] split = value.split(","); DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId); Long d = distancematrix.getDistance(); if ((0 == m && null == dr) || (d.intValue() < m.intValue())) { dr = driver1; m = d; } } } } else { dr = drivers.get(0); } Driver driver1 = driverService.selectById(dr.getId()); DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", dr.getId()) .eq("state", 1).like("type", "1")); if(driver.getState() == 2 && null != driverWork) { String text = ""; reassign.setState(3); reassign.setNowDriverId(driver1.getId()); @@ -503,20 +557,70 @@ systemNoticeService.addSystemNotice(1, language2 == 1 ? "您的订单已指派给" + driver1.getFirstName() + "师傅,请保持电话畅通!" : language2 == 2 ? "Your order has been assigned to the driver- " + driver1.getFirstName() + ", please keep your line on." : "Votre commande a été attribuée au chauffeur- " + driver1.getFirstName() + ", S'il vous plaît, restez en ligne.", orderPrivateCar.getUserId()); } } break; case 4: OrderLogistics orderLogistics = orderLogisticsService.selectById(reassign.getOrderId()); Company company1 = companyCityService.query1(orderLogistics.getUserId(), String.valueOf(orderLogistics.getStartLon()), String.valueOf(orderLogistics.getStartLat()));//获取起点所属分公司 AssignOrder assignOrder1 = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", company1.getId()).eq("type", 1)); if(null == assignOrder1 || assignOrder1.getPeople() == 0) {//配置了指派规则才处理 return resultUtil; } PushOrder pushOrder1 = pushOrderService.querys(1, 1, company1.getId()).get(0); //获取空闲司机 List<Driver> list1 = driverService.queryIdleDriver(orderLogistics.getUserId(), orderLogistics.getType(), orderLogistics.getServerCarModelId(), orderLogistics.getStartLon(), orderLogistics.getStartLat(), pushOrder1.getPushDistance(), null);//所有附近空闲司机 System.err.println("【" + orderLogistics.getId() + "】空闲司机:" + JSON.toJSONString(list1)); if(list1.size() > 0){ Optional<Driver> optional = list1.stream().filter(d -> !d.getId().equals(orderLogistics.getDriverId())).findFirst(); if(optional.isPresent()){ Driver driver1 = optional.get(); drivers = list1.stream().filter(d -> !d.getId().equals(orderLogistics.getDriverId())).collect(Collectors.toList()); if(drivers.size() > 0){//有司机,直接指派给司机 Driver dr = null; if(drivers.size() > 1){ List<Driver> ds = new ArrayList<>();//存储直线距离最近的几个司机 for(int i = 0; i < assignOrder1.getPeople(); i++){ Driver driver1 = null; long m = 0; int index = 0; for(int j = 0; j < drivers.size(); j++){ String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId()); if(null != value){ String[] split = value.split(","); DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId); Long distance = distancematrix.getDistance(); if((0 == m && null == driver1) || (distance < m)){ driver1 = drivers.get(j); m = distance; index = j; } } } ds.add(driver1); drivers.remove(index); } //再根据直线距离最短的司机中找出行驶距离最短的司机 Long m = 0L; for(Driver driver1 : ds){ String value = redisUtil.getValue("DRIVER" + driver1.getId()); if(null != value){ String[] split = value.split(","); DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId); Long d = distancematrix.getDistance(); if((0 == m && null == dr) || (d.intValue() < m.intValue())){ dr = driver1; m = d; } } } }else{ dr = drivers.get(0); } Driver driver1 = driverService.selectById(dr.getId()); DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driver1.getId()) .eq("state", 1).like("type", "4")); if(driver1.getState() == 2 || null != driverWork){ reassign.setState(3); reassign.setNowDriverId(driver1.getId()); reassign.setNowCarId(driver1.getCarId()); @@ -732,6 +836,9 @@ } break; } return resultUtil; } DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java
@@ -5,6 +5,7 @@ import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties; @@ -51,6 +52,7 @@ //选择ssl方式 gmailssl(props); final String displayName = "I-GO";//昵称 final String username = "i-gotech@i-go.group";// gmail 邮箱 final String password = "mbhyptngnvlewdxo";// Google应用专用密码 Session session = Session.getInstance(props, @@ -61,8 +63,14 @@ }); // 创建默认的MimeMessage对象 MimeMessage message = new MimeMessage(session); String nick=""; try { nick=javax.mail.internet.MimeUtility.encodeText(displayName); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 设置发件人 message.setFrom(new InternetAddress(username)); message.setFrom(new InternetAddress(nick + " <" + username + ">")); // 设置收件人 message.addRecipient(Message.RecipientType.TO, new InternetAddress(sentToEmail)); // 设置邮件主题