liujie
2025-07-22 9ac52631cc628cd01d4c761ed9467963447d4f9a
司机端新增注册地址 服务商
13个文件已修改
2个文件已添加
1068 ■■■■■ 已修改文件
DriverQYTTravel/guns-admin/pom.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/CompanyVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CarServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RongCloudUtil.java 608 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RegisteredWarpper.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/resources/application-dev.yml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/pom.xml
@@ -17,6 +17,14 @@
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>cn.rongcloud.im</groupId>
            <artifactId>server-sdk-java</artifactId>
            <version>3.2.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java
@@ -12,7 +12,9 @@
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.model.*;
import com.stylefeng.guns.modular.system.model.vo.CompanyVo;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.ALiSendSms;
import com.stylefeng.guns.modular.system.util.ResultUtil;
@@ -36,6 +38,8 @@
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import static org.bouncycastle.cms.RecipientId.password;
/**
 * 司机控制器
@@ -64,7 +68,7 @@
    private ICarService carService;
    
    @Autowired
    private ALiSendSms aLiSendSms;
    private RegionMapper regionMapper;
    
    @Autowired
    private IOrderTaxiService orderTaxiService;
@@ -83,7 +87,13 @@
    
    @Autowired
    private GunsProperties gunsProperties;
    @Autowired
    private ICompanyService companyService;
    @Autowired
    private ICompanyCityService companyCityService;
    
    /**
     * 获取短信验证码
@@ -665,7 +675,7 @@
     */
    @ResponseBody
    @PostMapping("/api/driver/queryMyCar")
    @ApiOperation(value = "获取当前车辆及空闲车辆", tags = {"司机端-个人中心"}, notes = "")
    @ApiOperation(value = "获取当前车辆及空闲车辆  新增useState 1使用中 2空闲", tags = {"司机端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
@@ -1290,6 +1300,65 @@
    /**
     * 获取省市区3级联动
     * @return
     */
    @ResponseBody
    @GetMapping("/base/driver/getRegion")
    @ApiOperation(value = "获取省市区3级联动", tags = {"司机端-注册"}, notes = "")
    @ApiImplicitParams({
    })
    public ResultUtil<List<Region>> getRegion(){
        try {
            List<Region> regions = regionMapper.selectList(null);
            List<Region> regionList = regions.stream().filter(e -> e.getParentId() == 0).collect(Collectors.toList());
            for (Region region : regionList) {
                region.setTire(1);
                List<Region> regionList1 = regions.stream().filter(e -> e.getParentId().equals(region.getId())).collect(Collectors.toList());
                for (Region region1 : regionList1) {
                    region1.setTire(2);
                    List<Region> regionList2 = regions.stream().filter(e -> e.getParentId().equals(region1.getId())).collect(Collectors.toList());
                    region1.setChildren(regionList2);
                }
                region.setChildren(regionList1);
            }
            return ResultUtil.success(regionList);
        }catch (Exception e){
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    @ResponseBody
    @GetMapping("/base/driver/getCompany")
    @ApiOperation(value = "通过区code获取服务商", tags = {"司机端-注册"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "区code", name = "areaCode", required = true, dataType = "String"),
    })
    public ResultUtil<List<CompanyVo>> getCompany(String areaCode){
        try {
            ArrayList<CompanyVo> companyVos = new ArrayList<>();
            List<CompanyCity> companyCities = companyCityService.selectList(new EntityWrapper<CompanyCity>().eq("areaCode", areaCode).eq("state", 1));
            if(companyCities.isEmpty()){
                return ResultUtil.success(companyVos);
            }
            List<Company> companies = companyService.selectList(new EntityWrapper<Company>().eq("type", 2).ne("flag", 3).in("id", companyCities.stream().map(CompanyCity::getCompanyId).collect(Collectors.toList())));
            for (Company company : companies) {
                CompanyVo companyVo = new CompanyVo(company.getId(), company.getName());
                companyVos.add(companyVo);
            }
            return ResultUtil.success(companyVos);
        }catch (Exception e){
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    /**
     * 设置提现密码
     * @param withdrawPassword
     * @param request
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -161,7 +161,7 @@
                    new EntityWrapper<OrderTaxi>()
                            .eq("type", 2)
                            .eq("userId", orderPrivateCar.getUserId())
                            .ne("state", 1)
                            .notIn("state", 1,11)
                            .eq("crossCityOrderId", orderPrivateCar.getCrossCityOrderId())
                            .eq("place", orderPrivateCar.getPlace())
            );
@@ -173,7 +173,7 @@
        if(orderPrivateCar.getState() == 10){
            return ResultUtil.error("订单已取消");
        }
        if(orderPrivateCar.getState() != 1){
        if(orderPrivateCar.getState() != 1 && orderPrivateCar.getState() != 11){
            return ResultUtil.error("手速有点慢哦,订单已被抢啦!");
        }
        Driver driver = driverService.selectById(uid);
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java
@@ -26,4 +26,7 @@
     * @throws Exception
     */
    Car query(@Param("licensePlate") String licensePlate) throws Exception;
    List<Map<String, Object>> queryIdleDataFromId(@Param("id") Integer id);
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml
@@ -68,4 +68,13 @@
        addObjectId as addObjectId
        from t_car where state = 1 and carLicensePlate = #{licensePlate}
    </select>
    <select id="queryIdleDataFromId" resultType="java.util.Map">
        select
            a.id as id,
            CONCAT(a.carLicensePlate, '-',c.`name`, b.`name`, ' ', a.carColor) as name
        from t_car a
                 left join t_car_model b on (a.carModelId = b.id)
                 left join t_car_brand c on (b.brandId = c.id)
        where a.state = 1 and find_in_set(a.bindDriverId,#{id})
    </select>
</mapper>
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
@@ -364,7 +365,74 @@
     */
    @TableField("entercode")
    private String entercode;
    @ApiModelProperty("省")
    private String province;
    @ApiModelProperty("省代码")
    private String provinceCode;
    @ApiModelProperty("市")
    private String city;
    @ApiModelProperty("市代码")
    private String cityCode;
    @ApiModelProperty("区")
    private String area;
    @ApiModelProperty("区代码")
    private String areaCode;
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    public String getProvinceCode() {
        return provinceCode;
    }
    public void setProvinceCode(String provinceCode) {
        this.provinceCode = provinceCode;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getCityCode() {
        return cityCode;
    }
    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }
    public String getArea() {
        return area;
    }
    public void setArea(String area) {
        this.area = area;
    }
    public String getAreaCode() {
        return areaCode;
    }
    public void setAreaCode(String areaCode) {
        this.areaCode = areaCode;
    }
    public String getQrCode() {
        return qrCode;
    }
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java
@@ -4,6 +4,9 @@
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
/**
 * 省市区
@@ -20,28 +23,58 @@
     * 城市名称
     */
    @TableField("name")
    @ApiModelProperty("城市名称")
    private String name;
    /**
     * 城市行政code
     */
    @TableField("code")
    @ApiModelProperty("城市code")
    private String code;
    /**
     * 区号code
     */
    @TableField("citycode")
    @ApiModelProperty("区号code")
    private String citycode;
    /**
     * 父级id
     */
    @TableField("parent_id")
    @ApiModelProperty("父级id")
    private Integer parentId;
    /**
     * 英文
     */
    @TableField("english")
    @ApiModelProperty("英文名称")
    private String english;
    @TableField(exist = false)
    @ApiModelProperty("层级 1省 2市  3区")
    private Integer tire=3;
    @TableField(exist = false)
    @ApiModelProperty("下级")
    private List<Region> children;
    public Integer getTire() {
        return tire;
    }
    public void setTire(Integer tire) {
        this.tire = tire;
    }
    public List<Region> getChildren() {
        return children;
    }
    public void setChildren(List<Region> children) {
        this.children = children;
    }
    public Integer getId() {
        return id;
    }
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/CompanyVo.java
New file
@@ -0,0 +1,17 @@
package com.stylefeng.guns.modular.system.model.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanyVo {
    @ApiModelProperty(value = "公司id")
    private Integer companyId;
    @ApiModelProperty(value = "公司名称")
    private String companyName;
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CarServiceImpl.java
@@ -48,16 +48,31 @@
    @Override
    public Map<String, Object> queryCars(Integer uid) throws Exception {
        Driver driver = driverService.selectById(uid);
        List<Map<String, Object>> list = carMapper.queryIdleData(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
                driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
        Map<String, Object> map = new HashMap<>();
        map.put("list", list);
        Map<String, Object> map1 = driverService.queryInfo(uid);
        if(null == map1.get("licensePlate")){
            map.put("car", "");
        }else{
            map.put("car", map1.get("licensePlate") + "-" + map1.get("brand") + " " + map1.get("carColor"));
        Integer carId = driver.getCarId();
        map.put("car", "");
        if(carId!=null){
            Car car = carMapper.selectById(carId);
            if(car.getCarLicensePlate()!=null){
                CarBrand carBrand = carBrandMapper.selectById(car.getCarBrandId());
                CarModel carModel = carModelMapper.selectById(car.getCarModelId());
                map.put("car", car.getCarLicensePlate()+"-" + carBrand.getName() +carModel.getName()+ " " + car.getCarColor());
            }
        }
        List<Map<String, Object>> list = carMapper.queryIdleDataFromId(driver.getId());
//        List<Map<String, Object>> list = carMapper.queryIdleData(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
//                driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
        for (Map<String, Object> stringObjectMap : list) {
            // 1使用中 2空闲中
            if(stringObjectMap.get("id").toString().equals(carId.toString())){
                map.put("useState", 1);
            }else {
                map.put("useState", 0);
            }
        }
        map.put("list", list);
        return map;
    }
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -21,6 +21,7 @@
import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
import com.stylefeng.guns.modular.system.warpper.RegisteredWarpper;
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
import io.rong.models.response.TokenResult;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
@@ -348,7 +349,14 @@
        driver.setSex(registeredWarpper.getSex());
        driver.setIdCard(registeredWarpper.getIdCard());
        String code = registeredWarpper.getPlaceOfEmployment();
        driver.setArea(registeredWarpper.getArea());
        driver.setAreaCode(registeredWarpper.getAreaCode());
        driver.setCity(registeredWarpper.getCity());
        driver.setCityCode(registeredWarpper.getCityCode());
        driver.setProvince(registeredWarpper.getProvince());
        driver.setProvinceCode(registeredWarpper.getProvinceCode());
        String code = registeredWarpper.getAreaCode();
        Company query = companyCityService.query(code);
        if(null == query){
            return ResultUtil.error("选择从业地暂未开通业务");
@@ -502,7 +510,9 @@
        loginWarpper.setToken(token);
        loginWarpper.setAppid(UUIDUtil.getRandomCode());
        loginWarpper.setState(ToolUtil.isEmpty(driver.getIdCard()) ? 1 : 0);
        TokenResult token1 = RongCloudUtil.getToken(driver.getId().toString(), driver.getName(), driver.getHeadImgUrl());
        loginWarpper.setRongYunToken(token1.getToken());
        //创建高德猎鹰的终端数据
        String tid = gdFalconUtil.createTerminal(phone);
        loginWarpper.setServerId(gdFalconUtil.getServerId());
@@ -838,10 +848,10 @@
        if(driver.getState() == 3){
            return ResultUtil.error("还在服务中,不能更换");
        }
//        boolean idle = carService.idle(carId);
//        if(!idle){
//            return ResultUtil.error("车辆已被绑定了");
//        }
        boolean idle = carService.idle(carId);
        if(!idle){
            return ResultUtil.error("当前车辆已经有其他司机在使用,请更换车辆");
        }
        driver.setCarId(carId);
        this.updateById(driver);
        return ResultUtil.success();
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java
@@ -1,5 +1,6 @@
package com.stylefeng.guns.modular.system.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.util.ToolUtil;
@@ -22,9 +23,11 @@
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
import com.stylefeng.guns.modular.taxi.service.impl.OrderTaxiServiceImpl;
import org.apache.commons.lang.time.DateFormatUtils;
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 org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
@@ -226,10 +229,13 @@
                Map<String, String> map = new HashMap<>();
                map.put("orderId", reassign.getOrderId().toString());
                map.put("orderType", reassign.getOrderType().toString());
                List<Dispatch> dispatches = dispatchMapper.queryDispatchs(driver.getFranchiseeId() == null ? driver.getCompanyId() : driver.getFranchiseeId(), 1);
                for(Dispatch dispatch : dispatches){
                    jgPushUtil.push(2,"有新的改派订单需要处理,请及时处理!", "订单改派", map, "DISPATCH" + dispatch.getId());
                }
//                List<Dispatch> dispatches = dispatchMapper.queryDispatchs(driver.getFranchiseeId() == null ? driver.getCompanyId() : driver.getFranchiseeId(), 1);
//                for(Dispatch dispatch : dispatches){
//                    jgPushUtil.push(2,"有新的改派订单需要处理,请及时处理!", "订单改派", map, "DISPATCH" + dispatch.getId());
//                }
                // qyt 改派直接推送
                pushOrder();
    
    
            }
@@ -493,6 +499,13 @@
    }
    public static List<Integer> orderIds = new ArrayList<>();
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    /**
     * 改派支付完成后的操作
     * @param id            改派单id
@@ -548,6 +561,12 @@
                    }
                    systemNoticeService.addSystemNotice(2, "您已使用" + (type == 1 ? "微信" : (type == 2?"支付宝":"云闪付")) + "成功支付改派申请费用!", reassigns.get(0).getOriginalDriverId(), 1);
                    System.out.println("==============跨城修改改派通知状态完毕===================");
                    // qyt 新增改派 重新推送
                }else{
                    System.err.println("预支付数据异常(orderId = "  + id + ")");
                }
@@ -637,4 +656,70 @@
    }
    @Autowired
    private ICompanyCityService companyCityService;
    @Autowired
    private IPushOrderService pushOrderService;
    /**
     * 推送订单给司机抢单
     * @param orderTaxi
     * @throws Exception
     */
    public void pushOrder(OrderTaxi orderTaxi, Integer type) throws Exception{
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    orderIds.add(orderTaxi.getId());//添加记录,防止调用接口重复提醒无人接单
                    String vehicle = (String) redisTemplate.opsForValue().get("VEHICLE");
                    List<Integer> integers = new ArrayList<>();
                    if (ToolUtil.isNotEmpty(vehicle)) {
                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
                    }
                    Company query = companyCityService.query(String.valueOf(orderTaxi.getStartLon()), String.valueOf(orderTaxi.getStartLat()));//获取起点所属分公司
                    List<PushOrder> querys = pushOrderService.querys(null, 2, query.getId());//获取需要推送的次数
                    for (int i = 1; i <= querys.size(); i++) {
                        PushOrder pushOrder = pushOrderService.querys(i, 2, query.getId()).get(0);
                        System.out.println("pushOrder:" + pushOrder);
                        //获取空闲司机
                        List<Driver> list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                        if (list.size() > 0) {
                            double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
                            int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
                            lastIndex = lastIndex == 0 ? list.size() : lastIndex;
                            list = list.subList(0, lastIndex);//获取空闲司机中占比数据
                            for (Driver driver : list) {//开始进行推送
                                //查询是否在限制推单范围内
                                boolean bo = false;
                                for (Integer integer : integers) {
                                    if (integer.compareTo(driver.getId()) == 0) {
                                        bo = true;
                                        break;
                                    }
                                }
                                if (bo) {
                                    continue;
                                }
                                pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime());
                            }
                        }
                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
                        OrderTaxi orderTaxi1 = OrderTaxiServiceImpl.this.selectById(orderTaxi.getId());
                        Integer state = orderTaxi1.getState();
                        if (state != 1) {
                            break;
                        }
                        if (i == querys.size() && state == 1) {
                            pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2);
                            orderIds.remove(orderTaxi.getId());
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RongCloudUtil.java
New file
@@ -0,0 +1,608 @@
package com.stylefeng.guns.modular.system.util;
import com.stylefeng.guns.core.exception.GunsException;
import io.rong.RongCloud;
import io.rong.messages.BaseMessage;
import io.rong.messages.TxtMessage;
import io.rong.methods.group.Group;
import io.rong.methods.user.User;
import io.rong.models.Result;
import io.rong.models.group.GroupMember;
import io.rong.models.group.GroupModel;
import io.rong.models.message.GroupMessage;
import io.rong.models.message.PrivateMessage;
import io.rong.models.message.SystemMessage;
import io.rong.models.response.ResponseResult;
import io.rong.models.response.TokenResult;
import io.rong.models.user.UserModel;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.List;
/**
 * 融云
 */
public class RongCloudUtil {
    public static String appKey = "bmdehs6pbnozs";
    public static String appSecret = "RovVwtABN1";
    //  海外token获取RongCloud.getSingaporeInstance(appKey, appSecret);
    private static RongCloud rongCloud = RongCloud.getInstance(appKey, appSecret);
    public static void main(String[] args) throws Exception {
        TokenResult token = getToken("1", "1", "1");
        System.out.println(token.toString());
    }
    /**
     * 融云注册
     * @param id
     * @param name
     * @param portrait
     * @return
     * @throws Exception
     */
    public static TokenResult getToken(String id, String name, String portrait) throws Exception{
        User user = rongCloud.user;
//        rongCloud.message.group.recall()
        UserModel userModel = new UserModel()
                .setId(id)
                .setName(name)
                .setPortrait(portrait);
        TokenResult result = user.register(userModel);
        return result;
    }
    /**
     * 修改
     * @param id
     * @param name
     * @param portrait
     * @return
     * @throws Exception
     */
    public static Result update(String id, String name, String portrait) throws Exception{
        User user = rongCloud.user;
        UserModel userModel = new UserModel()
                .setId(id)
                .setName(name)
                .setPortrait(portrait);
        Result result = user.update(userModel);
        return result;
    }
    /**
     * 推送
     * @param userId
     * @param content
     * @param extras
     * @return
     * @throws Exception
     */
    public static String push( String userId, String content,String extras) throws Exception {
        String platform="[\"ios\",\"android\"]";
        String audience="{\"userid\":"+"[\""+userId+"\"]"+",\"is_to_all\":false}";
        String notification="{\"alert\":\""+content+"\",\"ios\":"+extras+",\"android\":"+extras+"}";
        String[] tag = {"10"};
        StringBuilder sb = new StringBuilder();
        sb.append("platform=").append(platform);
        sb.append("&tag=").append(tag.toString());
        sb.append("&audience=").append(audience);
        sb.append("&notification=").append(notification);
        /*sb.append(",");
        sb.append("\"extras\":").append(extras);*/
        /*HostType apiHostType = new HostType("https://api-sg01.ronghub.com/message/system");
        HttpURLConnection conn = HttpUtil.CreatePostHttpConnection(apiHostType, appKey, appSecret, "/publish.json", "application/json");
        HttpUtil.setBodyParameter(sb, conn);*/
        //return HttpUtil.returnResult("");
        return "";
    }
    /**
     * 通过融云发送系统信息,详见https://www.rongcloud.cn/docs/message_architecture.html#group_notification_message
     * @param senderId 发送人
     * @param targetIds 接收人(数组)
     * @param baseMessage 消息内容
     * @param pushContent 推送内容
     * @param pushData 推送数据
     */
    public static void sendSystemMessage(String senderId, String[] targetIds, BaseMessage baseMessage, String pushContent, String pushData){
        SystemMessage systemMessage = new SystemMessage()
                .setSenderId(senderId)
                .setTargetId(targetIds)
                .setObjectName(baseMessage.getType())
                .setContent(baseMessage)
                .setPushContent(pushContent)
                .setPushData(pushData)
                .setIsPersisted(0)
                .setIsCounted(0)
                .setContentAvailable(0);
        try {
            ResponseResult responseResult = rongCloud.message.system.send(systemMessage);
            System.out.println(responseResult);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void sendSystemMessage1(String senderId, String[] targetIds, BaseMessage baseMessage, String pushContent, String pushData){
        SystemMessage systemMessage = new SystemMessage()
                .setSenderId(senderId)
                .setTargetId(targetIds)
                .setObjectName(baseMessage.getType())
                .setContent(baseMessage)
                .setPushContent(pushContent)
                .setPushData(pushData)
                .setIsPersisted(0)
                .setIsCounted(0)
                .setContentAvailable(1);
        try {
            ResponseResult responseResult = rongCloud.message.system.send(systemMessage);
            System.out.println(responseResult);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 通过融云发送单聊消息
     */
    public static void sendPrivateMsg(String senderId, String targetId, BaseMessage baseMessage){
        PrivateMessage privateMessage = new PrivateMessage()
                .setSenderId(senderId)
                .setTargetId(new String[]{targetId})
                .setObjectName(baseMessage.getType())
                .setContent(baseMessage)
                .setPushContent("")
                .setPushData("")
                .setCount("")
                .setVerifyBlacklist(0)
                .setIsPersisted(1)
                .setIsCounted(1)
                .setIsIncludeSender(0);
        //发送单聊方法
        try {
            rongCloud.message.msgPrivate.send(privateMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void sendPrivateMsg1(String senderId, String targetId, BaseMessage baseMessage){
        PrivateMessage privateMessage = new PrivateMessage()
                .setSenderId(senderId)
                .setTargetId(new String[]{targetId})
                .setObjectName(baseMessage.getType())
                .setContent(baseMessage)
                .setPushContent("")
                .setPushData("")
                .setCount("")
                .setVerifyBlacklist(0)
                .setIsPersisted(1)
                .setIsCounted(1)
                .setIsIncludeSender(1);
        //发送单聊方法
        try {
            rongCloud.message.msgPrivate.send(privateMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void sendPrivateMsg(String senderId, String[] targetId, BaseMessage baseMessage){
        PrivateMessage privateMessage = new PrivateMessage()
                .setSenderId(senderId)
                .setTargetId(targetId)
                .setObjectName(baseMessage.getType())
                .setContent(baseMessage)
                .setPushContent("")
                .setPushData("")
                .setCount("")
                .setVerifyBlacklist(0)
                .setIsPersisted(1)
                .setIsCounted(1)
                .setIsIncludeSender(1);
        //发送单聊方法
        try {
            rongCloud.message.msgPrivate.send(privateMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 发送群组消息
     * @param fromUserId 注意当前用户id不会接收到该消息
     * @param toGroupId 群id
     */
    public static void sendGroupMessage(String fromUserId, String toGroupId, BaseMessage baseMessage, String pushContent, String pushData){
        GroupMessage groupMessage = new GroupMessage()
                .setSenderId(fromUserId)
                .setTargetId(new String[]{toGroupId})
                .setObjectName(baseMessage.getType())
                .setContent(baseMessage)
                .setPushContent(pushContent)
                .setPushData(pushData)
                .setIsPersisted(1)
                .setIsIncludeSender(1)
                .setContentAvailable(0);
        try {
            ResponseResult groupResult = rongCloud.message.group.send(groupMessage);
            System.out.println(groupResult);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void sendGroupMessage1(String fromUserId, String toGroupId, BaseMessage baseMessage, String pushContent, String pushData){
        GroupMessage groupMessage = new GroupMessage()
                .setSenderId(fromUserId)
                .setTargetId(new String[]{toGroupId})
                .setObjectName(baseMessage.getType())
                .setContent(baseMessage)
                .setPushContent(pushContent)
                .setPushData(pushData)
                .setIsPersisted(1)
                .setIsIncludeSender(1)
                .setContentAvailable(0);
        try {
            ResponseResult groupResult = rongCloud.message.group.send(groupMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 移除黑名单
     */
    public static void removeBlackList(String userId,String friendId){
        UserModel user = getUserModel(userId,friendId);
        try {
            rongCloud.user.blackList.remove(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 添加黑名单
     */
    public static void addBlackList(String userId,String friendId){
        UserModel user = getUserModel(userId,friendId);
        try {
            rongCloud.user.blackList.add(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static UserModel getUserModel(String userId, String friendId){
        UserModel blackUser = new UserModel().setId(userId);
        UserModel[] blacklist = {blackUser};
        UserModel user = new UserModel()
                .setId(friendId)
                .setBlacklist(blacklist);
        return user;
    }
    /**
     * 通过融云发送单聊消息
     */
    public static void sendPrivateMsg(String fromUserId, String toUserId, String objectName, String content) {
        TxtMessage txtMessage  = new TxtMessage(content, content);
        PrivateMessage privateMessage = new PrivateMessage()
                .setSenderId(fromUserId)
                .setTargetId(new String[]{toUserId})
//                .setObjectName("RC:TxtMsg")
                .setObjectName(objectName)
                .setContent(txtMessage)
                .setPushContent("")
                .setPushData("")
                .setCount("")
                .setVerifyBlacklist(0)
                .setIsPersisted(1)
                .setIsCounted(1)
                .setIsIncludeSender(0);
        //发送单聊方法
        try {
            rongCloud.message.msgPrivate.send(privateMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 发送文本消息
     * @param userId        发送用户id
     * @param toUserId    接收用户id
     * @param content       消息文本内容
     * @return
     */
    public static Integer privatePushTxtMessage(String userId, String toUserId, String content){
        /*String url = "https://api-cn.ronghub.com/message/private/publish.json";
        String data = "fromUserId=" + userId + "&toUserId=" + toUserId + "&objectName=RC:TxtMsg&content=" + content;
        String s = this.pushHttp(url, data);
        JSONObject jsonObject = JSON.parseObject(s);
        if(jsonObject.getIntValue("code") == 200){
            return jsonObject.getIntValue("status");
        }*/
        //sendPrivateMsg(userId,toUserId,"RC:TxtMsg",content);
        String url = "https://api-sg01.ronghub.com/message/private/publish.json";
        String data = "fromUserId=" + userId + "&toUserId=" + toUserId + "&objectName=RC:TxtMsg&content=" + content;
        sendPost(url,data);
        return 1;
    }
    public static Integer pushSilentAll(String userId, String groupNo,String[] toUserId,String name){
        GroupMessage message = new GroupMessage();
        message.setIsIncludeSender(1);
        message.setSenderId(userId);
        message.setTargetId(new String[]{groupNo});
        message.setToUserId(toUserId);
        message.setObjectName("RC:TxtMsg");
        TxtMessage txtMessage = new TxtMessage(name, "");
        message.setContent(txtMessage);
        try{
            rongCloud.message.group.sendDirection(message);
        }catch (Exception e){
            e.printStackTrace();
        }
        return 1;
    }
    // 单人禁言
    public static Integer Silent(String userId, String groupNo,Integer minute,String groupName ) throws Exception {
//        String url = "https://api-cn.ronghub.com/group/user/gag/add.json";
//        HashMap<String, String> map = new HashMap<>();
//        map.put("userId",userId);
//        map.put("groupId",groupNo);
//        map.put("minute",minute);
    //    String data = "fromUserId=" + userId + "&toUserId=" + toUserId + "&objectName=RC:TxtMsg&content=" + name;
        //sendPost(url,data);
    //    String s = HttpRequestUtil.postRequest1(url, map, appKey, appSecret);
        GroupModel groupModel = new GroupModel();
        GroupMember[] members = new GroupMember[1];
        GroupMember groupMember = new GroupMember();
        groupMember.setGroupId(groupNo);
        groupMember.setId(userId);
        members[0]=groupMember;
        groupModel.setId(groupNo);
        groupModel.setMembers(members);
        groupModel.setName(groupName);
        groupModel.setMinute(minute);
        rongCloud.group.gag.add(groupModel);
        return 1;
    }
    private static GroupModel initGroupModel(String groupId, List<String> memberIds, String groupName) {
        GroupMember[] members = new GroupMember[memberIds.size()];
        for (int i = 0; i < memberIds.size(); i++) {
            members[i] = new GroupMember().setId(memberIds.get(i));
        }
        return new GroupModel()
                .setId(groupId)
                .setMembers(members)
                .setName(groupName);
    }
    /**
     * 解散群组
     * @param groupId    群组id
     */
    public static Integer dismissGroup(String groupId, GroupMember[] members){
        Group Group = rongCloud.group;
        //GroupMember[] members = new GroupMember[]{new GroupMember().setId(memberId)};
        GroupModel group = new GroupModel()
                .setId(groupId)
                .setMembers(members);
        Result groupDismissResult = null;
        try {
            groupDismissResult = (Result)Group.dismiss(group);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("dismiss:  " + groupDismissResult.toString());
        return groupDismissResult.getCode();
    }
    /**
     * 创建群组
     */
    public static Integer createGroup(String groupNo, String groupName,GroupMember[] members){
        Group Group = rongCloud.group;
        //    GroupMember[] members = new GroupMember[]{new GroupMember().setId(userid)};
        GroupModel group = new GroupModel()
                .setId(groupNo).setName(groupName).setMembers(members);
        Result groupDismissResult = null;
        try {
            groupDismissResult = (Result)Group.create(group);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return groupDismissResult.getCode();
    }
    /**
     * 全体禁言
     * @param groupIds
     * @return
     */
    public static Integer banAdd(String[] groupIds){
        Group Group = rongCloud.group;
        Result banAddResult = null;
        try {
            banAddResult = (Result)Group.ban.add(groupIds);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("banAdd:  " + banAddResult.toString());
        return banAddResult.getCode();
    }
    /**
     * 移除禁言
     * @param groupIds
     * @return
     */
    public static Integer banRemove(String[] groupIds){
        Group Group = rongCloud.group;
        Result banRemoveResult = null;
        try {
            banRemoveResult = (Result)Group.ban.remove(groupIds);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("banRemove:  " + banRemoveResult.toString());
        return banRemoveResult.getCode();
    }
    public static void addGroup(String groupNo,List<String> userid,String groupName) throws Exception {
        GroupModel groupModel = initGroupModel(groupNo, userid, groupName);
        rongCloud.group.join(groupModel);
        try {
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param url
     *            发送请求的 URL
     * @param param
     *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            String nonce = String.valueOf(Double.valueOf(Math.random() * 1000000.0D).intValue());
            String timeMillis = String.valueOf(System.currentTimeMillis());
            String signature  = string2Sha1(appSecret + nonce + timeMillis);
            conn.setConnectTimeout(1000 * 30);
            conn.setRequestProperty("Host", "api-cn.ronghub.com");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("App-Key", appKey);
            conn.setRequestProperty("Nonce", nonce);
            conn.setRequestProperty("Timestamp", timeMillis);
            conn.setRequestProperty("Signature", signature);
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }
    private static String string2Sha1(String str){
        if(str==null||str.length()==0){
            return null;
        }
        char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9',
                'a','b','c','d','e','f'};
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
            mdTemp.update(str.getBytes("UTF-8"));
            byte[] md = mdTemp.digest();
            int j = md.length;
            char buf[] = new char[j*2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(buf);
        } catch (Exception e) {
            // TODO: handle exception
            return null;
        }
    }
//    public String initPortraitUri(List<String> headImg) {
//        List<String> picUrls = new ArrayList<>();
//        int i = 0;
//        for (String memberAccount : headImg) {
//            if (memberAccount != null && StringUtils.isNotBlank(memberAccount)) {
//                picUrls.add(memberAccount);
//                i++;
//                if (i >= 9) {
//                    break;
//                }
//            }
//        }
//        try {
//            // 生成九宫格群组头像
//            byte[] buff = ImageUtil.getCombinationOfhead(picUrls);
//            //上传到Oss
//            /*String url = dfsClient.uploadFile(buff, "jpg");
//            if (!Objects.equals(url, "")) {
//                return fileRoot + "/" + url;
//            }*/
//            return OssUploadUtil.uploadByteOSS(buff);
//        } catch (Exception e) {
//        }
//        return "";
//    }
    /*public static void main(String[] args) {
        try {
            TokenResult token = getToken("13688394165", "Crystal", "https://sinata.oss-cn-shenzhen.aliyuncs.com/Oo-logo.png");
            System.out.println("token");
            System.out.println(token);
            *//*if (SinataUtil.isNotEmpty(token)){
                if(token.code==200){
                    System.out.println(token.getToken());
                }
            }*//*
        } catch (Exception e) {
            System.out.println("kkkkkkk");
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }*/
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java
@@ -17,6 +17,16 @@
    private String terminalId;
    @ApiModelProperty("是否需要完善资料(0=否,1=是)")
    private Integer state = 0;
    @ApiModelProperty("融云token")
    private String rongYunToken;
    public String getRongYunToken() {
        return rongYunToken;
    }
    public void setRongYunToken(String rongYunToken) {
        this.rongYunToken = rongYunToken;
    }
    public Integer getId() {
        return id;
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RegisteredWarpper.java
@@ -42,6 +42,71 @@
    @ApiModelProperty("出租车资格证号")
    private String taxiAptitudeCard;
    @ApiModelProperty("省")
    private String province;
    @ApiModelProperty("省代码")
    private String provinceCode;
    @ApiModelProperty("市")
    private String city;
    @ApiModelProperty("市代码")
    private String cityCode;
    @ApiModelProperty("区")
    private String area;
    @ApiModelProperty("区代码")
    private String areaCode;
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    public String getAreaCode() {
        return areaCode;
    }
    public void setAreaCode(String areaCode) {
        this.areaCode = areaCode;
    }
    public String getArea() {
        return area;
    }
    public void setArea(String area) {
        this.area = area;
    }
    public String getCityCode() {
        return cityCode;
    }
    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getProvinceCode() {
        return provinceCode;
    }
    public void setProvinceCode(String provinceCode) {
        this.provinceCode = provinceCode;
    }
    public String getPhone() {
        return phone;
DriverQYTTravel/guns-admin/src/main/resources/application-dev.yml
@@ -29,14 +29,13 @@
                max-request-size: 100MB
                max-file-size: 100MB
    redis:
        host: 172.21.35.151
        port: 6512
        password: SC_cache@20#25
        host: 127.0.0.1
        port: 6379
        password: 123456
        database: 0
        timeout: 1000
        cluster:
            nodes: 172.21.35.151:6512,172.21.35.152:6512,172.21.35.153:6512,172.21.35.151:6513,172.21.35.152:6513,172.21.35.153:6513
            nodes: 127.0.1.1:6379
mybatis-plus:
    typeAliasesPackage: com.stylefeng.guns.modular
    global-config:
@@ -58,17 +57,16 @@
spring:
    datasource:
        url: jdbc:mysql://172.21.35.140:8066/traffic_scdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
        username: traffic_scusr
        password: QYT_sc@20#25
        db-name: traffic_scdb #用来搜集数据库的所有表
        url: jdbc:mysql://192.168.110.80:3306/qyttravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        db-name: qyttravel #用来搜集数据库的所有表
        filters: wall,mergeStat
---
spring:
    data:
        mongodb:
            uri: mongodb://qyt_jtcx:qyt_jtcx2025@172.21.35.195:27017,172.21.35.196:27017/traveling_track
            uri: mongodb://192.168.110.80:27017/traveling_track
---