puzhibing
2023-02-17 d6955542a70118191d51046fc0c2489d6039e180
新增加司机端接口
14个文件已修改
7个文件已添加
690 ■■■■■ 已修改文件
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/DriverController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/OrderController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/AppUserMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/OrderMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/AppUserMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/DriverMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/OrderMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/AppUser.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/Driver.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/Order.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IAppUserService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IDriverService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IOrderService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/AppUserServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/DriverServiceImpl.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/DriverWorkServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/GeodesyUtil.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/PushUtil.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/HallOrderList.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/PromotionWarpper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/DriverController.java
@@ -284,4 +284,27 @@
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/driver/queryPromotionQRCode")
    @ServiceLog(name = "获取司机推广二维码", url = "/api/driver/queryPromotionQRCode")
    @ApiOperation(value = "获取司机推广二维码", tags = {"司机端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<PromotionWarpper> queryPromotionQRCode(HttpServletRequest request){
        try {
            Integer uid = driverService.getUserByRequset(request);
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            PromotionWarpper promotionWarpper = driverService.queryPromotionQRCode(uid);
            return ResponseWarpper.success(promotionWarpper);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/OrderController.java
@@ -5,6 +5,7 @@
import com.supersavedriving.driver.modular.system.service.IOrderService;
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import com.supersavedriving.driver.modular.system.warpper.AddOrderWarpper;
import com.supersavedriving.driver.modular.system.warpper.HallOrderList;
import com.supersavedriving.driver.modular.system.warpper.ResponseWarpper;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -16,6 +17,7 @@
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* 订单控制器
@@ -57,6 +59,7 @@
    }
    @ResponseBody
    @PostMapping("/api/order/driverAddOrder")
    @ServiceLog(name = "司机代客下单", url = "/api/order/driverAddOrder")
@@ -77,4 +80,35 @@
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/order/queryOrderHall")
    @ServiceLog(name = "司机获取大厅订单列表", url = "/api/order/queryOrderHall")
    @ApiOperation(value = "司机获取大厅订单列表", tags = {"司机端-首页"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
            @ApiImplicitParam(value = "页条数", name = "pageSize", required = true, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<List<HallOrderList>> queryOrderHall(Integer pageNum, Integer pageSize, HttpServletRequest request){
        if(null == pageNum){
            return ResponseWarpper.success(ResultUtil.paranErr("pageNum"));
        }
        if(null == pageSize){
            return ResponseWarpper.success(ResultUtil.paranErr("pageSize"));
        }
        try {
            Integer uid = driverService.getUserByRequset(request);
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            List<HallOrderList> hallOrderLists = orderService.queryOrderHall(uid, pageNum, pageSize);
            return ResponseWarpper.success(hallOrderLists);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/AppUserMapper.java
New file
@@ -0,0 +1,7 @@
package com.supersavedriving.driver.modular.system.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.supersavedriving.driver.modular.system.model.AppUser;
public interface AppUserMapper extends BaseMapper<AppUser> {
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/OrderMapper.java
@@ -2,6 +2,19 @@
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.supersavedriving.driver.modular.system.model.Order;
import com.supersavedriving.driver.modular.system.warpper.HallOrderList;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface OrderMapper extends BaseMapper<Order> {
    /**
     * 获取大厅订单列表
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<HallOrderList> queryOrderHall(@Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize);
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/AppUserMapper.xml
New file
@@ -0,0 +1,25 @@
<?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.supersavedriving.driver.modular.system.dao.AppUserMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.supersavedriving.driver.modular.system.model.AppUser">
        <id column="id" property="id"/>
        <result column="nickname" property="nickname"/>
        <result column="phone" property="phone"/>
        <result column="sex" property="sex"/>
        <result column="avatar" property="avatar"/>
        <result column="openid" property="openid"/>
        <result column="unionid" property="unionid"/>
        <result column="emergencyContact" property="emergencyContact"/>
        <result column="emergencyPhone" property="emergencyPhone"/>
        <result column="accountBalance" property="accountBalance"/>
        <result column="userTagId" property="userTagId"/>
        <result column="status" property="status"/>
        <result column="createTime" property="createTime"/>
        <result column="is_exception" property="isException"/>
        <result column="remark" property="remark"/>
        <result column="inviterType" property="inviterType"/>
        <result column="inviterId" property="inviterId"/>
    </resultMap>
</mapper>
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/DriverMapper.xml
@@ -28,6 +28,8 @@
        <result column="approvalNotes" property="approvalNotes"/>
        <result column="approvalUserId" property="approvalUserId"/>
        <result column="approvalTime" property="approvalTime"/>
        <result column="serverStatus" property="serverStatus"/>
        <result column="integral" property="integral"/>
        <result column="status" property="status"/>
        <result column="createTime" property="createTime"/>
    </resultMap>
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/OrderMapper.xml
@@ -7,6 +7,8 @@
        <id column="id" property="id" />
        <result column="code" property="code" />
        <result column="userId" property="userId" />
        <result column="userPhone" property="userPhone" />
        <result column="userName" property="userName" />
        <result column="driverId" property="driverId" />
        <result column="source" property="source" />
        <result column="agentId" property="agentId" />
@@ -37,14 +39,44 @@
        <result column="overBadWeatherDistance" property="overBadWeatherDistance" />
        <result column="overBadWeatherPrice" property="overBadWeatherPrice" />
        <result column="estimatedPrice" property="estimatedPrice" />
        <result column="estimatedMileage" property="estimatedMileage"/>
        <result column="orderMoney" property="orderMoney" />
        <result column="actualMileage" property="actualMileage"/>
        <result column="payMoney" property="payMoney" />
        <result column="discountedPrice" property="discountedPrice" />
        <result column="couponId" property="couponId" />
        <result column="payType" property="payType" />
        <result column="payTime" property="payTime" />
        <result column="hallOrder" property="hallOrder"/>
        <result column="state" property="state" />
        <result column="oldState" property="oldState"/>
        <result column="status" property="status" />
        <result column="createTime" property="createTime" />
    </resultMap>
    <select id="queryOrderHall" resultType="com.supersavedriving.driver.modular.system.warpper.HallOrderList">
        select
        a.id,
        b.avatar,
        a.userName,
        a.userPhone,
        (select count(1) from t_order where userPhone = a.userPhone and state in (107, 108)) as orderTimes,
        (select count(1) from t_order where userPhone = a.userPhone and state in (301)) as cancelTimes,
        a.source,
        UNIX_TIMESTAMP(a.createTime) * 1000 as createTime,
        a.startAddress,
        a.startLat,
        a.startLng,
        a.endAddress,
        a.endLat,
        a.endLng,
        a.estimatedPrice,
        a.estimatedMileage,
        a.startPrice
        from t_order a
        left join t_app_user b on (a.userId = b.id)
        where a.`status` = 1 and a.hallOrder = 1 order by a.createTime desc
    </select>
</mapper>
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/AppUser.java
New file
@@ -0,0 +1,106 @@
package com.supersavedriving.driver.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;
import lombok.Data;
import java.util.Date;
/**
* 用户
* @author pzb
* @Date 2023/2/17 12:08
*/
@Data
@TableName("t_app_user")
public class AppUser {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    @TableField("id")
    private Integer id;
    /**
     * 用户昵称
     */
    @TableField("nickname")
    private String nickname;
    /**
     * 手机号
     */
    @TableField("phone")
    private String phone;
    /**
     * 性别(1=男,2=女)
     */
    @TableField("sex")
    private Integer sex;
    /**
     * 头像
     */
    @TableField("avatar")
    private String avatar;
    /**
     * 微信openid
     */
    @TableField("openid")
    private String openid;
    /**
     * 微信unionid
     */
    @TableField("unionid")
    private String unionid;
    /**
     * 紧急联系人
     */
    @TableField("emergencyContact")
    private String emergencyContact;
    /**
     * 紧急联系人电话
     */
    @TableField("emergencyPhone")
    private String emergencyPhone;
    /**
     * 账户余额
     */
    @TableField("accountBalance")
    private Double accountBalance;
    /**
     * 用户标签id
     */
    @TableField("userTagId")
    private Integer userTagId;
    /**
     * 状态(1=正常,2=冻结,3=删除)
     */
    @TableField("status")
    private Integer status;
    /**
     * 添加时间
     */
    @TableField("createTime")
    private Date createTime;
    /**
     * 是否异常 1正常 0异常
     */
    @TableField("is_exception")
    private Integer isException;
    /**
     * 启用/冻结理由
     */
    @TableField("remark")
    private String remark;
    /**
     * 邀约人类型(1=用户,2=司机)
     */
    @TableField("inviterType")
    private Integer inviterType;
    /**
     * 邀约人id
     */
    @TableField("inviterId")
    private Integer inviterId;
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/Driver.java
@@ -138,6 +138,16 @@
    @TableField("approvalTime")
    private Date approvalTime;
    /**
     * 服务状态(1=空闲中,2=服务中)
     */
    @TableField("serverStatus")
    private Integer serverStatus;
    /**
     * 剩余积分
     */
    @TableField("integral")
    private Integer integral;
    /**
     * 状态(1=正常,2=冻结,3=删除)
     */
    @TableField("status")
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/Order.java
@@ -33,6 +33,16 @@
    @TableField("userId")
    private Integer userId;
    /**
     * 乘车人电话
     */
    @TableField("userPhone")
    private String userPhone;
    /**
     * 乘车人姓名
     */
    @TableField("userName")
    private String userName;
    /**
     * 司机id
     */
    @TableField("driverId")
@@ -183,10 +193,20 @@
    @TableField("estimatedPrice")
    private Double estimatedPrice;
    /**
     * 预估里程
     */
    @TableField("estimatedMileage")
    private Double estimatedMileage;
    /**
     * 订单金额
     */
    @TableField("orderMoney")
    private Double orderMoney;
    /**
     * 实际里程
     */
    @TableField("actualMileage")
    private Double actualMileage;
    /**
     * 支付金额
     */
@@ -213,11 +233,21 @@
    @TableField("payTime")
    private Date payTime;
    /**
     * 大厅订单(0=否,1=是)
     */
    @TableField("hallOrder")
    private Integer hallOrder;
    /**
     * 订单状态(101=待接单,102=已接单,103=前往预约点,104=到达预约点,105=开始服务,106=到达目的地,107=待评价,108=已完成,201=转单中,301=已取消)
     */
    @TableField("state")
    private Integer state;
    /**
     * 历史订单状态(用于还原之前状态)
     */
    @TableField("oldState")
    private Integer oldState;
    /**
     * 状态(1=正常,2=冻结,3=删除)
     */
    @TableField("status")
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IAppUserService.java
New file
@@ -0,0 +1,12 @@
package com.supersavedriving.driver.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.supersavedriving.driver.modular.system.model.AppUser;
/**
* 用户
* @author pzb
* @Date 2023/2/17 14:02
*/
public interface IAppUserService extends IService<AppUser> {
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IDriverService.java
@@ -5,6 +5,7 @@
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import com.supersavedriving.driver.modular.system.warpper.DriverPositionWarpper;
import com.supersavedriving.driver.modular.system.warpper.DriverRegisterWarpper;
import com.supersavedriving.driver.modular.system.warpper.PromotionWarpper;
import com.supersavedriving.driver.modular.system.warpper.TokenWarpper;
import javax.servlet.http.HttpServletRequest;
@@ -89,4 +90,13 @@
     * @throws Exception
     */
    void addDriverPosition(DriverPositionWarpper driverPositionWarpper) throws Exception;
    /**
     * 获取分享二维码数据
     * @param uid
     * @return
     * @throws Exception
     */
    PromotionWarpper queryPromotionQRCode(Integer uid) throws Exception;
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IOrderService.java
@@ -5,6 +5,9 @@
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import com.supersavedriving.driver.modular.system.warpper.AddOrderWarpper;
import com.supersavedriving.driver.modular.system.warpper.BaseWarpper;
import com.supersavedriving.driver.modular.system.warpper.HallOrderList;
import java.util.List;
/**
* 订单
@@ -31,4 +34,15 @@
     * @throws Exception
     */
    ResultUtil driverAddOrder(Integer uid, AddOrderWarpper addOrderWarpper) throws Exception;
    /**
     * 获取大厅订单列表
     * @param uid
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    List<HallOrderList> queryOrderHall(Integer uid, Integer pageNum, Integer pageSize) throws Exception;
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/AppUserServiceImpl.java
New file
@@ -0,0 +1,16 @@
package com.supersavedriving.driver.modular.system.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.driver.modular.system.dao.AppUserMapper;
import com.supersavedriving.driver.modular.system.model.AppUser;
import com.supersavedriving.driver.modular.system.service.IAppUserService;
import org.springframework.stereotype.Service;
/**
* 用户
* @author pzb
* @Date 2023/2/17 14:03
*/
@Service
public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> implements IAppUserService {
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/DriverServiceImpl.java
@@ -10,19 +10,18 @@
import com.supersavedriving.driver.core.util.JwtTokenUtil;
import com.supersavedriving.driver.core.util.ToolUtil;
import com.supersavedriving.driver.modular.system.dao.DriverMapper;
import com.supersavedriving.driver.modular.system.model.AppUser;
import com.supersavedriving.driver.modular.system.model.BranchOffice;
import com.supersavedriving.driver.modular.system.model.Driver;
import com.supersavedriving.driver.modular.system.model.DriverWork;
import com.supersavedriving.driver.modular.system.service.IBranchOfficeService;
import com.supersavedriving.driver.modular.system.service.IDriverService;
import com.supersavedriving.driver.modular.system.service.IDriverWorkService;
import com.supersavedriving.driver.modular.system.service.IOrderPositionService;
import com.supersavedriving.driver.modular.system.service.*;
import com.supersavedriving.driver.modular.system.util.RedisUtil;
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import com.supersavedriving.driver.modular.system.util.UUIDUtil;
import com.supersavedriving.driver.modular.system.util.mongodb.model.Location;
import com.supersavedriving.driver.modular.system.warpper.DriverPositionWarpper;
import com.supersavedriving.driver.modular.system.warpper.DriverRegisterWarpper;
import com.supersavedriving.driver.modular.system.warpper.PromotionWarpper;
import com.supersavedriving.driver.modular.system.warpper.TokenWarpper;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
@@ -79,6 +78,10 @@
    @Value("${filePath}")
    private String filePath;
    @Autowired
    private IAppUserService appUserService;
    /**
@@ -399,5 +402,18 @@
    }
    @Override
    public PromotionWarpper queryPromotionQRCode(Integer uid) throws Exception {
        PromotionWarpper promotionWarpper = new PromotionWarpper();
        promotionWarpper.setUrl("http://127.0.0.1?uid=" + 2 + "utype=" + 2);
        int user = appUserService.selectCount(new EntityWrapper<AppUser>().eq("inviterType", 2).eq("inviterId", uid).eq("status", 1));
        int driver = this.selectCount(new EntityWrapper<Driver>().eq("inviterType", 2).eq("inviterId", uid).eq("approvalStatus", 2).eq("status", 1));
        promotionWarpper.setTotal(user + driver);
        promotionWarpper.setUser(user);
        promotionWarpper.setDriver(driver);
        Driver driver1 = this.selectById(uid);
        promotionWarpper.setAvatar(driver1.getAvatar());
        promotionWarpper.setName(driver1.getName());
        return promotionWarpper;
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/DriverWorkServiceImpl.java
@@ -9,6 +9,7 @@
import com.supersavedriving.driver.modular.system.model.SystemConfig;
import com.supersavedriving.driver.modular.system.service.IDriverService;
import com.supersavedriving.driver.modular.system.service.IDriverWorkService;
import com.supersavedriving.driver.modular.system.service.IOrderService;
import com.supersavedriving.driver.modular.system.service.ISystemConfigService;
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +31,9 @@
    @Autowired
    private ISystemConfigService systemConfigService;
    @Autowired
    private IOrderService orderService;
@@ -47,6 +51,10 @@
        if(driver.getBalance() == null || driver.getBalance().compareTo(num1) < 0){
            return ResultUtil.error("账户余额不足,请先充值");
        }
        systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 1));
        JSON.parseObject(systemConfig.getContent()).getDouble("num1");
        DriverWork driverWork = this.selectOne(new EntityWrapper<DriverWork>().eq("driverId", 1).eq("status", 1));
        if(null != driverWork){
            return ResultUtil.error("您正在上班中");
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java
@@ -6,30 +6,31 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.driver.modular.system.dao.OrderMapper;
import com.supersavedriving.driver.modular.system.model.Driver;
import com.supersavedriving.driver.modular.system.model.DriverWork;
import com.supersavedriving.driver.modular.system.model.Order;
import com.supersavedriving.driver.modular.system.model.SystemConfig;
import com.supersavedriving.driver.modular.system.service.IDriverService;
import com.supersavedriving.driver.modular.system.service.IDriverWorkService;
import com.supersavedriving.driver.modular.system.service.IOrderService;
import com.supersavedriving.driver.modular.system.service.ISystemConfigService;
import com.supersavedriving.driver.modular.system.model.*;
import com.supersavedriving.driver.modular.system.service.*;
import com.supersavedriving.driver.modular.system.util.GaoDe.MapUtil;
import com.supersavedriving.driver.modular.system.util.GeodesyUtil;
import com.supersavedriving.driver.modular.system.util.PushUtil;
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import com.supersavedriving.driver.modular.system.util.UUIDUtil;
import com.supersavedriving.driver.modular.system.util.mongodb.model.Location;
import com.supersavedriving.driver.modular.system.warpper.AddOrderWarpper;
import com.supersavedriving.driver.modular.system.warpper.BaseWarpper;
import com.supersavedriving.driver.modular.system.warpper.HallOrderList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.xml.crypto.Data;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -49,6 +50,18 @@
    @Autowired
    private ISystemConfigService systemConfigService;
    @Autowired
    private PushUtil pushUtil;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private IAppUserService appUserService;
    /**
     * 获取服务中的订单id
@@ -66,21 +79,41 @@
    }
    /**
     * 司机代客下单
     * @param uid
     * @param addOrderWarpper
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil driverAddOrder(Integer uid, AddOrderWarpper addOrderWarpper) throws Exception {
        /**
         * 司机上线且空闲,下单直接给当前司机,其余进大厅
         * 司机下的订单不需要创建新用户,且只能走线下支付
         */
        int count = this.selectCount(new EntityWrapper<Order>().eq("userPhone", addOrderWarpper.getPhone()).eq("status", 1).in("state", Arrays.asList(101, 102, 103, 104, 105, 106, 201)));
        if(count > 0){
            return ResultUtil.error("该用户还有未完成的订单");
        }
        Driver driver = driverService.selectById(uid);
        DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", uid).eq("status", 1));
        Order order1 = this.selectOne(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", Arrays.asList(102, 103, 104, 105, 201)));
        Order order = new Order();
        if(driverWork != null && null == order1){
            order.setDriverId(uid);
            driver.setServerStatus(2);
        }
        order.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(3));
        order.setSource(2);
        AppUser appUser = appUserService.selectOne(new EntityWrapper<AppUser>().eq("phone", addOrderWarpper.getPhone()).eq("status", 1));
        if(null != appUser){
            order.setUserId(appUser.getId());
        }
        order.setUserName(addOrderWarpper.getUserName());
        order.setUserPhone(addOrderWarpper.getPhone());
        order.setAgentId(driver.getAgentId());
        order.setBranchOfficeId(driver.getBranchOfficeId());
        order.setStartAddress(addOrderWarpper.getStartAddress());
@@ -94,12 +127,22 @@
            return ResultUtil.error("获取预估距离出错");
        }
        Double d = Double.valueOf(distance.get("distance")) / 1000;
        order.setEstimatedMileage(d);
        order = getOrderPrice(1, d, 0, order);
        order.setHallOrder(0);
        order.setState(null == order.getDriverId() ? 101 : 102);
        order.setStatus(1);
        order.setCreateTime(new Date());
        this.insert(order);
        return null;
        driverService.updateById(driver);
        //推送状态
        if(null != order.getDriverId()){
            pushUtil.pushOrderStatus(uid, 2, order.getId(), order.getStatus());
        }else{
            //开始推单
            pushOrder(order);
        }
        return ResultUtil.success();
    }
@@ -271,4 +314,82 @@
        return order;
    }
    /**
     * 订单推送逻辑
     * @param order
     */
    public void pushOrder(Order order){
        /**
         * 系统根据配置进行三轮的范围查找司机。
         * 只要找到司机就直接推出去。
         * 当推出去的司机都没有接单,直接将订单放入大厅,不再去更大范围找司机。
         */
        SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 1));
        if(null != systemConfig){
            JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
            Integer num4 = jsonObject.getInteger("num4");//接单时间
            String startLat = order.getStartLat();
            String startLng = order.getStartLng();
            //找到中心点
            GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLat), Double.valueOf(startLng));
            for (int i = 1; i < 4; i++) {
                Double num = jsonObject.getDouble("num" + i) / 1000;//范围公里
                //构造半径
                Distance distanceR = new Distance(num, Metrics.KILOMETERS);
                //画圆
                Circle circle = new Circle(geoJsonPoint, distanceR);
                // 构造query对象
                Query query = Query.query(Criteria.where("location").withinSphere(circle));
                List<Location> locations = mongoTemplate.find(query, Location.class);
                List<Integer> driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
                if(driverIds.size() > 0){
                    List<Driver> drivers = driverService.selectList(new EntityWrapper<Driver>().eq("approvalStatus", 2).eq("serverStatus", 1).eq("status", 1).in("id", driverIds));
                    if(drivers.size() == 0){
                        continue;
                    }
                    for (Driver driver : drivers) {
                        pushUtil.pushGrabOrder(driver.getId(), 2, order.getId(), num4);
                    }
                    //创建定时任务处理订单到大厅
                    new Timer().schedule(new TimerTask() {
                        @Override
                        public void run() {
                            Order order1 = OrderServiceImpl.this.selectById(order.getId());
                            if(order1.getState() == 101){
                                order1.setHallOrder(1);
                                OrderServiceImpl.this.updateById(order1);
                            }
                        }
                    }, num4 * 1000);
                }
            }
        }
    }
    /**
     * 获取大厅订单列表
     * @param uid
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    @Override
    public List<HallOrderList> queryOrderHall(Integer uid, Integer pageNum, Integer pageSize) throws Exception {
        pageNum = (pageNum - 1) * pageSize;
        List<HallOrderList> hallOrderLists = this.baseMapper.queryOrderHall(pageNum, pageSize);
        hallOrderLists.forEach(hallOrderList -> {
            Map<String, Double> distance = GeodesyUtil.getDistance(hallOrderList.getStartLng() + "," + hallOrderList.getStartLat(), hallOrderList.getEndLng() + "," + hallOrderList.getEndLat());
            Double wgs84 = distance.get("WGS84");
            hallOrderList.setCurrentDistance(wgs84);
        });
        return hallOrderLists;
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/GeodesyUtil.java
@@ -12,7 +12,6 @@
/**
 * 计算两个金纬度坐标之间的直线距离
 */
@Component
public class GeodesyUtil {
@@ -22,7 +21,7 @@
     * @param toLonLat
     * @return
     */
    public Map<String, Double> getDistance(String fromLonLat, String toLonLat){
    public static Map<String, Double> getDistance(String fromLonLat, String toLonLat){
        String[] from = fromLonLat.split(",");
        String[] to = toLonLat.split(",");
        GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0]));
@@ -56,16 +55,10 @@
    }
    private double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){
    private static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){
        //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);
        return geoCurve.getEllipsoidalDistance();
    }
    public static void main(String[] ages){
        GeodesyUtil geodesyUtil = new GeodesyUtil();
        geodesyUtil.getDistance("115.481028,39.989643", "114.465302,40.004717");
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/PushUtil.java
@@ -60,15 +60,15 @@
    /**
     * 余额不足提醒
     * 下班提醒
     * @param id
     * @param type
     */
    public void pushBalance(Integer id, Integer type){
    public void pushOffWork(Integer id, Integer type){
        JSONObject msg = new JSONObject();
        msg.put("code", 200);
        msg.put("msg", "SUCCESS");
        msg.put("method", "BALANCE");
        msg.put("method", "OFF_WORK");
        msg.put("data", new Object());
        //调用推送
@@ -88,4 +88,80 @@
            System.err.println(jsonObject1.getString("msg"));
        }
    }
    /**
     * 推送订单状态
     * @param id
     * @param type
     * @param orderId
     * @param status
     */
    public void pushOrderStatus(Integer id, Integer type, Long orderId, Integer status){
        JSONObject msg = new JSONObject();
        msg.put("code", 200);
        msg.put("msg", "SUCCESS");
        msg.put("method", "ORDER_STATUS");
        Map<String, Object> map = new HashMap<>();
        map.put("orderId", orderId);
        map.put("status", status);
        msg.put("data", map);
        //调用推送
        HttpHeaders headers = new HttpHeaders();
        // 以表单的方式提交
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        //将请求头部和参数合成一个请求
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("msg", msg.toJSONString());
        params.add("id", id.toString());
        params.add("type", type.toString());
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
        String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class);
        JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
        if(jsonObject1.getIntValue("code") != 200){
            logger.debug(jsonObject1.getString("msg"));
            System.err.println(jsonObject1.getString("msg"));
        }
    }
    /**
     * 系统推单推送
     * @param id            接受对象id
     * @param type          接受对象类型(1=用户,2=司机)
     * @param orderId       订单id
     * @param countdown     抢单倒计时(秒)
     */
    public void pushGrabOrder(Integer id, Integer type, Long orderId, Integer countdown){
        JSONObject msg = new JSONObject();
        msg.put("code", 200);
        msg.put("msg", "SUCCESS");
        msg.put("method", "GRAB_ORDER");
        Map<String, Object> map = new HashMap<>();
        map.put("orderId", orderId);
        map.put("countdown", countdown);
        msg.put("data", map);
        //调用推送
        HttpHeaders headers = new HttpHeaders();
        // 以表单的方式提交
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        //将请求头部和参数合成一个请求
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("msg", msg.toJSONString());
        params.add("id", id.toString());
        params.add("type", type.toString());
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
        String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class);
        JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
        if(jsonObject1.getIntValue("code") != 200){
            logger.debug(jsonObject1.getString("msg"));
            System.err.println(jsonObject1.getString("msg"));
        }
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/HallOrderList.java
New file
@@ -0,0 +1,51 @@
package com.supersavedriving.driver.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 大厅订单列表
* @author pzb
* @Date 2023/2/17 9:24
*/
@Data
@ApiModel
public class HallOrderList {
    @ApiModelProperty("订单id")
    private Long id;
    @ApiModelProperty("用户头像")
    private String avatar;
    @ApiModelProperty("用户名称")
    private String userName;
    @ApiModelProperty("用户电话")
    private String userPhone;
    @ApiModelProperty("下单次数")
    private Integer orderTimes;
    @ApiModelProperty("取消次数")
    private Integer cancelTimes;
    @ApiModelProperty("与用户距离")
    private Double currentDistance;
    @ApiModelProperty("订单来源(1=用户创建,2=司机创建)")
    private Integer source;
    @ApiModelProperty("下单时间")
    private Long createTime;
    @ApiModelProperty("起点")
    private String startAddress;
    @ApiModelProperty("起点纬度")
    private String startLat;
    @ApiModelProperty("起点经度")
    private String startLng;
    @ApiModelProperty("终点")
    private String endAddress;
    @ApiModelProperty("终点纬度")
    private String endLat;
    @ApiModelProperty("终点经度")
    private String endLng;
    @ApiModelProperty("预估费")
    private Double estimatedPrice;
    @ApiModelProperty("预估里程")
    private Double estimatedMileage;
    @ApiModelProperty("起步价")
    private Double startPrice;
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/PromotionWarpper.java
New file
@@ -0,0 +1,27 @@
package com.supersavedriving.driver.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 推广
* @author pzb
* @Date 2023/2/17 14:26
*/
@Data
@ApiModel
public class PromotionWarpper {
    @ApiModelProperty("二维码链接")
    private String url;
    @ApiModelProperty("推荐总数")
    private Integer total;
    @ApiModelProperty("推荐用户数")
    private Integer user;
    @ApiModelProperty("推荐司机数")
    private Integer driver;
    @ApiModelProperty("司机头像")
    private String avatar;
    @ApiModelProperty("司机名称")
    private String name;
}