Pu Zhibing
7 天以前 0b5d21c6338bb3bd094a5bf2379001c4e9772eb5
Merge remote-tracking branch 'origin/master'

# Conflicts:
# DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java
# DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
# DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/SM4Util.java
# DriverQYTTravel/guns-admin/src/main/resources/application-dev.yml
# DriverQYTTravel/guns-admin/src/main/resources/application.yml
# UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
# UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
# UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
26个文件已修改
7个文件已删除
1662 ■■■■ 已修改文件
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | 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 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Car.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICarService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CarServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/NCOSSUtil.java 486 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/rongyun/RongYunUtil.java 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/rongyun/model/Config.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/rongyun/model/Output.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/TokenUtil.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZhengLianConfig.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/TokenRequest.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/TradeTerminalInfo.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RegisteredWarpper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderStatusWarpper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java
@@ -7,6 +7,7 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.stylefeng.guns.config.properties.GunsProperties;
import com.stylefeng.guns.core.util.DateUtil;
@@ -39,6 +40,8 @@
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.*;
import org.springframework.util.Base64Utils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
@@ -55,6 +58,7 @@
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -529,13 +533,11 @@
    @ApiOperation(value = "个人的小程序码(分享码)/链接", tags = {"司机端-首页"}, notes = "")
    @GetMapping("/api/driver/person-code")
    @GetMapping("/api/driver/personCode")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
    })
    public ResultUtil<HashMap<String, String>> createQRcode(HttpServletRequest request) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
    public ResultUtil<HashMap<String, Object>> personCode(HttpServletRequest request) {
        try {
            Integer uid = driverService.getUserIdFormRedis(request);
            if (null == uid) {
@@ -543,37 +545,26 @@
            }
            Driver driver = driverService.selectById(uid);
            String accessToken=null;
            Object img = redisTemplate.opsForValue().get("DRIVER_WX_IMG" + uid);
            // 获取调用凭证accessToken
            if(ToolUtil.isEmpty(driver.getShareImg())|| ToolUtil.isEmpty(driver.getShareImg())){
            if(ToolUtil.isEmpty(driver.getShareLink())|| ToolUtil.isEmpty(img)){
                accessToken = getAccessToken();
            }
            String img=driver.getShareImg();
            int index=0;
            if(ToolUtil.isEmpty(driver.getShareImg())) {
                index=1;
            if(ToolUtil.isEmpty(img)) {
                RestTemplate rest = new RestTemplate();
                String imgUrl = "";
                String url = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=" + accessToken;
                Map<String, Object> param = new HashMap<>();
                param.put("path", "pages/home/home?driverId=" + uid);
                param.put("width", 430); //二维码尺寸
                MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
                HttpEntity requestEntity = new HttpEntity(param, headers);
                ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
                byte[] result = entity.getBody();
                inputStream = new ByteArrayInputStream(result);
                HttpRequest post = HttpUtil.createPost(url);
                post.body(JSON.toJSONString(param));
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                // 最后上传生成的文件名
                String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpg";
                // oss中的文件夹名
                String objectName = sdf.format(new Date()) + "/" + finalFileName;
                String key = "imgs/management/" + objectName;
                String object = NCOSSUtil.putObject(qianYunTongConfig.getBucketName(), key, inputStream);
                System.out.println(object);
                driver.setShareImg(object);
                img= object;
                byte[] result = post.execute().bodyBytes();
                // base64
                img = Base64.getEncoder().encodeToString(result);
                redisTemplate.opsForValue().set("DRIVER_WX_IMG" + uid, img,30, TimeUnit.DAYS);
            }
            String urlLink = driver.getShareLink();
@@ -598,42 +589,13 @@
                driverService.updateById(driver);
            }
            HashMap<String, String> stringStringHashMap = new HashMap<>();
            HashMap<String, Object> stringStringHashMap = new HashMap<>();
            stringStringHashMap.put("url_link",urlLink);
            stringStringHashMap.put("img",img);
//            inputStream = new ByteArrayInputStream(result);
//
//            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//            // 最后上传生成的文件名
//            String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpg";
//            // oss中的文件夹名
//            String objectName = sdf.format(new Date()) + "/" + finalFileName;
//            // 上传oss
////            ossUtil.uploadFile2OSS(inputStream, objectName);
////            //获取文件的URl地址
////            imgUrl = ossUtil.getImgUrl(objectName);
//            log.info("imgUrl: "+imgUrl);
            return ResultUtil.success(stringStringHashMap);
        } catch (Exception e) {
            log.error("调用小程序生成微信永久小程序码URL接口异常", e);
        }finally {
            if(inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(outputStream != null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return ResultUtil.error("获取二维码失败");
    }
@@ -1617,9 +1579,10 @@
    @ApiOperation(value = "通过区code获取服务商", tags = {"司机端-注册"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "区code", name = "areaCode", required = true, dataType = "String"),
            @ApiImplicitParam(value = "name", name = "name", required = false, dataType = "String"),
    })
    public ResultUtil<List<CompanyVo>> getCompany(String areaCode){
    public ResultUtil<List<CompanyVo>> getCompany(String areaCode,String name){
        try {
            ArrayList<CompanyVo> companyVos = new ArrayList<>();
@@ -1627,7 +1590,12 @@
            if(companyCities.isEmpty()){
                return ResultUtil.success(companyVos);
            }
            List<Company> companies = companyService.selectList(new EntityWrapper<Company>().ne("type", 1).ne("flag", 3).in("id", companyCities.stream().map(CompanyCity::getCompanyId).collect(Collectors.toList())));
            Wrapper<Company> in = new EntityWrapper<Company>().ne("type", 1).ne("flag", 3).in("id", companyCities.stream().map(CompanyCity::getCompanyId).collect(Collectors.toList()));
            if(ToolUtil.isNotEmpty( name)){
                in.like("name", name);
            }
            List<Company> companies = companyService.selectList(in);
            for (Company company : companies) {
                CompanyVo companyVo = new CompanyVo(company.getId(), company.getName());
                companyVos.add(companyVo);
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.stylefeng.guns.core.util.DateUtil;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityInfoWrapper;
import com.stylefeng.guns.modular.crossCity.warpper.OrderWarpper;
import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics;
@@ -63,6 +64,10 @@
    private ISysTimeoutMoneyService sysTimeoutMoneyService;
    @Autowired
    private IOpenCityService openCityService;
    @Autowired
    private ICarService carService;
@@ -257,6 +262,18 @@
            if(null == driverWork1){
                return ResultUtil.error("您已下班,无法接单");
            }
            Driver driver = driverService.selectById(uid);
            //判断车辆是否正在使用中
            Car car = carService.selectById(driver.getCarId());
            if(car.getUseDriverId() != null && !car.getUseDriverId().equals(uid)){
                return ResultUtil.error("当前绑定车辆正在使用中,请更换车辆");
            }else if(car.getUseDriverId()==null){
                car.setUseDriverId(uid);
                carService.updateById(car);
            }
            return orderService.grabOrder(orderId, orderType, uid);
        }catch (Exception e){
            e.printStackTrace();
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java
@@ -29,4 +29,7 @@
    List<Map<String, Object>> queryIdleDataFromId(@Param("id") Integer id);
    void updateUseState(@Param("uid") Integer uid);
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml
@@ -23,7 +23,9 @@
        <result column="addType" property="addType"/>
        <result column="addObjectId" property="addObjectId"/>
    </resultMap>
    <update id="updateUseState">
            update t_car set useDriverId = null where useDriverId  = #{uid}
    </update>
    <select id="queryIdleData" resultType="map">
@@ -71,7 +73,8 @@
    <select id="queryIdleDataFromId" resultType="java.util.Map">
        select
            a.id as id,
            CONCAT(a.carLicensePlate, '-',c.`name`, b.`name`, ' ', a.carColor) as name
            CONCAT(a.carLicensePlate, '-',c.`name`, b.`name`, ' ', a.carColor) as name,
            a.useDriverId as useDriverId
        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)
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Car.java
@@ -104,6 +104,21 @@
    @TableField("addObjectId")
    private Integer addObjectId;
    /**
     * 使用司机id
     */
    @TableField("useDriverId")
    private Integer useDriverId;
    public Integer getUseDriverId() {
        return useDriverId;
    }
    public void setUseDriverId(Integer useDriverId) {
        this.useDriverId = useDriverId;
    }
    public Integer getId() {
        return id;
    }
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICarService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.service.IService;
import com.stylefeng.guns.modular.system.model.Car;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import org.apache.ibatis.annotations.Param;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
@@ -62,4 +63,10 @@
     */
    ResultUtil addCar(Integer modelId, String color, String licensePlate, Date time, String drivingLicensePhoto,
                      String carPhoto, String insurancePhoto, Integer uid) throws Exception;
    boolean useState(@Param("carId") Integer carId, @Param("uid") Integer uid);
    void updateUseState(Integer carId, Integer uid);
    void updateUseState(Integer uid);
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CarServiceImpl.java
@@ -66,7 +66,7 @@
//                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())){
            if(stringObjectMap.get("useDriverId").toString().equals(uid.toString())){
                map.put("useState", 1);
            }else {
                map.put("useState", 0);
@@ -159,4 +159,27 @@
        this.insert(car);
        return ResultUtil.success();
    }
    @Override
    public boolean useState(Integer carId, Integer uid) {
        Car car = carMapper.selectById(carId);
        if(car.getUseDriverId()!=null || !car.getUseDriverId().equals(uid)){
            return false;
        }
        return true;
    }
    @Override
    public void updateUseState(Integer carId, Integer uid) {
        carMapper.updateUseState(uid);
        Car car = carMapper.selectById(carId);
        car.setUseDriverId(uid);
        this.baseMapper.updateById(car);
    }
    @Override
    public void updateUseState(Integer uid) {
        carMapper.updateUseState(uid);
    }
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -407,6 +407,7 @@
        driver.setCityCode(registeredWarpper.getCityCode());
        driver.setProvince(registeredWarpper.getProvince());
        driver.setProvinceCode(registeredWarpper.getProvinceCode());
        driver.setCompanyId(registeredWarpper.getCompanyId());
        String code = registeredWarpper.getAreaCode();
        Company query = companyCityService.query(code);
@@ -633,6 +634,10 @@
            driverWorkMapper.updateById(driverWork);
            driver.setState(1);
            //   更新车辆使用状态
            carService.updateUseState(uid);
            new Thread(new Runnable() {
                @Override
                public void run() {
@@ -649,6 +654,18 @@
                    return ResultUtil.error("车辆正在使用中");
                }
            }
            //判断车辆是否正在使用中
            Car car = carService.selectById(driver.getCarId());
            if(car.getUseDriverId() != null && !car.getUseDriverId().equals(uid)){
                return ResultUtil.error("当前绑定车辆正在使用中,请更换车辆");
            }else if(car.getUseDriverId()==null){
                car.setUseDriverId(uid);
                carService.updateById(car);
            }
            driverWork = new DriverWork();
            driverWork.setState(1);
            driverWork.setDriverId(uid);
@@ -696,6 +713,9 @@
            driverWorkMapper.updateById(driverWork);
            driver.setState(1);
            //   更新车辆使用状态
            carService.updateUseState(uid);
            new Thread(new Runnable() {
                @Override
                public void run() {
@@ -705,6 +725,18 @@
                }
            }).start();
        }else{
            //判断车辆是否正在使用中
            Car car = carService.selectById(driver.getCarId());
            if(car.getUseDriverId() != null && !car.getUseDriverId().equals(uid)){
                return ResultUtil.error("当前绑定车辆正在使用中,请更换车辆");
            }else if(car.getUseDriverId()==null){
                car.setUseDriverId(uid);
                carService.updateById(car);
            }
            driverWork = new DriverWork();
            driverWork.setState(1);
            driverWork.setDriverId(uid);
@@ -896,10 +928,17 @@
        if(driver.getState() == 3){
            return ResultUtil.error("还在服务中,不能更换");
        }
        boolean idle = carService.idle(carId);
//        boolean idle = carService.idle(carId);
        // 修改是否别司机在使用
        boolean idle = carService.useState(carId,uid);
        if(!idle){
            return ResultUtil.error("当前车辆已经有其他司机在使用,请更换车辆");
        }
        // 将所有绑定他的车 =null
        carService.updateUseState(carId,uid);
        Car car = carService.selectById(carId);
        car.setUseDriverId(uid);
        carService.updateById( car);
        driver.setCarId(carId);
        this.updateById(driver);
        return ResultUtil.success();
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/NCOSSUtil.java
@@ -1,243 +1,243 @@
package com.stylefeng.guns.modular.system.util.qianyuntong;
import com.heredata.hos.HOS;
import com.heredata.hos.HOSClientBuilder;
import com.heredata.hos.model.CreateBucketRequest;
import com.heredata.hos.model.HOSObject;
import com.heredata.hos.model.PutObjectRequest;
import com.heredata.hos.model.PutObjectResult;
import com.heredata.hos.model.bucket.Bucket;
import com.heredata.model.VoidResult;
import com.stylefeng.guns.modular.system.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.InputStream;
/**
 * OSS 工具类
 * @author zhibing.pu
 * @Date 2025/6/23 17:50
 */
@Slf4j
public class NCOSSUtil {
    private static QianYunTongConfig qianYunTongConfig = SpringContextsUtil.getBean(QianYunTongConfig.class).getQianYunTongConfig();;
    /**
     * 创建桶
     * @param bucketName
     * @return
     */
    public static Boolean createBucket(String bucketName) {
        /**
         * endPoint:HOS的基础路径(公共前缀)
         * account:账户的ID
         * accessKey:向UAAS服务请求到的access_key
         * secretKey:向UAAS服务请求到的secret_key
         */
        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
        try {
            // 创建请求对象,并且设置创建桶名为"example"的桶
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
            VoidResult result = hos.createBucket(createBucketRequest);
            if (result.getResponse().isSuccessful()) {
                log.info("创建桶成功:" + bucketName);
                return true;
            }
        } catch (Exception e){
            log.info("创建桶失败:" + bucketName);
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 查询桶详情
     * @param bucketName
     * @return
     */
    public static Bucket getBucketInfo(String bucketName) {
        /**
         * endPoint:HOS的基础路径(公共前缀)
         * account:账户的ID
         * accessKey:向UAAS服务请求到的access_key
         * secretKey:向UAAS服务请求到的secret_key
         */
        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
        try {
            // 查询桶名为"example"的详情
            Bucket bucket = hos.getBucketInfo(bucketName);
            return bucket;
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 删除桶
     * @param bucketName
     * @return
     */
    public static Boolean deleteBucket(String bucketName) {
        /**
         * endPoint:HOS的基础路径(公共前缀)
         * account:账户的ID
         * accessKey:向UAAS服务请求到的access_key
         * secretKey:向UAAS服务请求到的secret_key
         */
        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
        try {
            VoidResult result = hos.deleteBucket(bucketName);
            if (result.getResponse().isSuccessful()) {
                log.info("删除桶成功:" + bucketName);
                return true;
            }
        } catch (Exception e){
            log.info("删除桶成功:" + bucketName);
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 设置桶策略
     * @param bucketName    桶名
     * @param policyText    策略规则字符串
     * {
     *   // 策略配置的版本号,由用户定义
     *   "Version": "2012-10-17",
     *   //  策略规则配置,可指定多条策略规则
     *   "Statement": [{
     *     // 策略规则ID,可用户指定,如不指定则服务自动生成一条
     *     "Sid": "sid",
     *     // 策略规则指定的HOS API接口标识,可参照下表填写
     *     "Action": [
     *       "action"
     *     ],
     *     // 策略规则效果,具体表现为允许或拒绝,有效值为Allow(允许),Deny(拒绝);
     *     "Effect": "Allow",
     *     // 策略规则指定的资源参照下面resource配置
     *     "Resource": "resource",
     *     // 策略规则指定的授权人 参照下面Principal配置
     *     "Principal": {
     *       "HWS": [
     *         "account_id:root"
     *       ]
     *     }
     *   }
     *   ]
     * }
     * @return
     */
    public static Boolean setBucketPolicy(String bucketName, String policyText) {
        /**
         * endPoint:HOS的基础路径(公共前缀)
         * account:账户的ID
         * accessKey:向UAAS服务请求到的access_key
         * secretKey:向UAAS服务请求到的secret_key
         */
        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
        // 桶策略字符串
        try {
            VoidResult result = hos.setBucketPolicy(bucketName, policyText);
            if (result.getResponse().isSuccessful()) {
                log.info("设置桶策略成功:" + bucketName);
                return true;
            }
        } catch (Exception e) {
            log.info("设置桶策略失败:" + bucketName);
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 上传对象
     * @param bucketName    桶名称
     * @param key           存储文件名
     * @param inputStream      上传文件流
     * @return  对象唯一标识
     */
    public static String putObject(String bucketName, String key, InputStream inputStream) {
        /**
         * endPoint:HOS的基础路径(公共前缀)
         * account:账户的ID
         * accessKey:向UAAS服务请求到的access_key
         * secretKey:向UAAS服务请求到的secret_key
         */
        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
        try {
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key , inputStream);
            PutObjectResult example = hos.putObject(putObjectRequest);
            if (example.getResponse().isSuccessful()) {
                log.info("上传对象成功:" + bucketName + "--->" + key);
                return example.getETag();
            }
        } catch (Exception e) {
            log.info("上传对象成功:" + bucketName);
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 查询对象
     * @param bucketName    桶名称
     * @param key           存储文件名
     * @return
     */
    public static HOSObject getObject(String bucketName, String key) {
        /**
         * endPoint:HOS的基础路径(公共前缀)
         * account:账户的ID
         * accessKey:向UAAS服务请求到的access_key
         * secretKey:向UAAS服务请求到的secret_key
         */
        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
        try {
            HOSObject example = hos.getObject(bucketName, key);
            if (example.getResponse().isSuccessful()) {
                log.info("查询对象成功:" + bucketName + "--->" + key);
                return example;
            }
        } catch (Exception e) {
            log.info("查询对象失败:" + bucketName);
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 删除对象
     * @param bucketName     桶名称
     * @param key          存储文件名
     * @return
     */
    public static Boolean deleteObject(String bucketName, String key) {
        /**
         * endPoint:HOS的基础路径(公共前缀)
         * account:账户的ID
         * accessKey:向UAAS服务请求到的access_key
         * secretKey:向UAAS服务请求到的secret_key
         */
        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
        try {
            VoidResult example = hos.deleteObject(bucketName, key);
            if (example.getResponse().isSuccessful()) {
                log.info("删除对象成功:" + bucketName + "--->" + key);
                return true;
            }
        } catch (Exception e) {
            log.info("删除对象失败:" + bucketName + "--->" + key);
            e.printStackTrace();
        }
        return false;
    }
}
//package com.stylefeng.guns.modular.system.util.qianyuntong;
//
//import com.heredata.hos.HOS;
//import com.heredata.hos.HOSClientBuilder;
//import com.heredata.hos.model.CreateBucketRequest;
//import com.heredata.hos.model.HOSObject;
//import com.heredata.hos.model.PutObjectRequest;
//import com.heredata.hos.model.PutObjectResult;
//import com.heredata.hos.model.bucket.Bucket;
//import com.heredata.model.VoidResult;
//import com.stylefeng.guns.modular.system.util.SpringContextsUtil;
//import lombok.extern.slf4j.Slf4j;
//
//import java.io.InputStream;
//
///**
// * OSS 工具类
// * @author zhibing.pu
// * @Date 2025/6/23 17:50
// */
//@Slf4j
//public class NCOSSUtil {
//
//    private static QianYunTongConfig qianYunTongConfig = SpringContextsUtil.getBean(QianYunTongConfig.class).getQianYunTongConfig();;
//
//    /**
//     * 创建桶
//     * @param bucketName
//     * @return
//     */
//    public static Boolean createBucket(String bucketName) {
//        /**
//         * endPoint:HOS的基础路径(公共前缀)
//         * account:账户的ID
//         * accessKey:向UAAS服务请求到的access_key
//         * secretKey:向UAAS服务请求到的secret_key
//         */
//        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
//        try {
//            // 创建请求对象,并且设置创建桶名为"example"的桶
//            CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
//            VoidResult result = hos.createBucket(createBucketRequest);
//            if (result.getResponse().isSuccessful()) {
//                log.info("创建桶成功:" + bucketName);
//                return true;
//            }
//        } catch (Exception e){
//            log.info("创建桶失败:" + bucketName);
//            e.printStackTrace();
//        }
//        return false;
//    }
//
//
//    /**
//     * 查询桶详情
//     * @param bucketName
//     * @return
//     */
//    public static Bucket getBucketInfo(String bucketName) {
//        /**
//         * endPoint:HOS的基础路径(公共前缀)
//         * account:账户的ID
//         * accessKey:向UAAS服务请求到的access_key
//         * secretKey:向UAAS服务请求到的secret_key
//         */
//        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
//        try {
//            // 查询桶名为"example"的详情
//            Bucket bucket = hos.getBucketInfo(bucketName);
//            return bucket;
//        } catch (Exception e){
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//
//    /**
//     * 删除桶
//     * @param bucketName
//     * @return
//     */
//    public static Boolean deleteBucket(String bucketName) {
//        /**
//         * endPoint:HOS的基础路径(公共前缀)
//         * account:账户的ID
//         * accessKey:向UAAS服务请求到的access_key
//         * secretKey:向UAAS服务请求到的secret_key
//         */
//        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
//        try {
//            VoidResult result = hos.deleteBucket(bucketName);
//            if (result.getResponse().isSuccessful()) {
//                log.info("删除桶成功:" + bucketName);
//                return true;
//            }
//        } catch (Exception e){
//            log.info("删除桶成功:" + bucketName);
//            e.printStackTrace();
//        }
//        return false;
//    }
//
//
//    /**
//     * 设置桶策略
//     * @param bucketName    桶名
//     * @param policyText    策略规则字符串
//     * {
//     *   // 策略配置的版本号,由用户定义
//     *   "Version": "2012-10-17",
//     *   //  策略规则配置,可指定多条策略规则
//     *   "Statement": [{
//     *     // 策略规则ID,可用户指定,如不指定则服务自动生成一条
//     *     "Sid": "sid",
//     *     // 策略规则指定的HOS API接口标识,可参照下表填写
//     *     "Action": [
//     *       "action"
//     *     ],
//     *     // 策略规则效果,具体表现为允许或拒绝,有效值为Allow(允许),Deny(拒绝);
//     *     "Effect": "Allow",
//     *     // 策略规则指定的资源参照下面resource配置
//     *     "Resource": "resource",
//     *     // 策略规则指定的授权人 参照下面Principal配置
//     *     "Principal": {
//     *       "HWS": [
//     *         "account_id:root"
//     *       ]
//     *     }
//     *   }
//     *   ]
//     * }
//     * @return
//     */
//    public static Boolean setBucketPolicy(String bucketName, String policyText) {
//        /**
//         * endPoint:HOS的基础路径(公共前缀)
//         * account:账户的ID
//         * accessKey:向UAAS服务请求到的access_key
//         * secretKey:向UAAS服务请求到的secret_key
//         */
//        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
//        // 桶策略字符串
//        try {
//            VoidResult result = hos.setBucketPolicy(bucketName, policyText);
//            if (result.getResponse().isSuccessful()) {
//                log.info("设置桶策略成功:" + bucketName);
//                return true;
//            }
//        } catch (Exception e) {
//            log.info("设置桶策略失败:" + bucketName);
//            e.printStackTrace();
//        }
//        return false;
//    }
//
//
//    /**
//     * 上传对象
//     * @param bucketName    桶名称
//     * @param key           存储文件名
//     * @param inputStream      上传文件流
//     * @return  对象唯一标识
//     */
//    public static String putObject(String bucketName, String key, InputStream inputStream) {
//        /**
//         * endPoint:HOS的基础路径(公共前缀)
//         * account:账户的ID
//         * accessKey:向UAAS服务请求到的access_key
//         * secretKey:向UAAS服务请求到的secret_key
//         */
//        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
//        try {
//            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key , inputStream);
//            PutObjectResult example = hos.putObject(putObjectRequest);
//            if (example.getResponse().isSuccessful()) {
//                log.info("上传对象成功:" + bucketName + "--->" + key);
//                return example.getETag();
//            }
//        } catch (Exception e) {
//            log.info("上传对象成功:" + bucketName);
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//
//    /**
//     * 查询对象
//     * @param bucketName    桶名称
//     * @param key           存储文件名
//     * @return
//     */
//    public static HOSObject getObject(String bucketName, String key) {
//        /**
//         * endPoint:HOS的基础路径(公共前缀)
//         * account:账户的ID
//         * accessKey:向UAAS服务请求到的access_key
//         * secretKey:向UAAS服务请求到的secret_key
//         */
//        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
//        try {
//            HOSObject example = hos.getObject(bucketName, key);
//            if (example.getResponse().isSuccessful()) {
//                log.info("查询对象成功:" + bucketName + "--->" + key);
//                return example;
//            }
//        } catch (Exception e) {
//            log.info("查询对象失败:" + bucketName);
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//
//    /**
//     * 删除对象
//     * @param bucketName     桶名称
//     * @param key          存储文件名
//     * @return
//     */
//    public static Boolean deleteObject(String bucketName, String key) {
//        /**
//         * endPoint:HOS的基础路径(公共前缀)
//         * account:账户的ID
//         * accessKey:向UAAS服务请求到的access_key
//         * secretKey:向UAAS服务请求到的secret_key
//         */
//        HOS hos = new HOSClientBuilder().build(qianYunTongConfig.getEndPoint(), qianYunTongConfig.getAccount(), qianYunTongConfig.getAccessKey(), qianYunTongConfig.getSecretKey());
//        try {
//            VoidResult example = hos.deleteObject(bucketName, key);
//            if (example.getResponse().isSuccessful()) {
//                log.info("删除对象成功:" + bucketName + "--->" + key);
//                return true;
//            }
//        } catch (Exception e) {
//            log.info("删除对象失败:" + bucketName + "--->" + key);
//            e.printStackTrace();
//        }
//        return false;
//    }
//}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/rongyun/RongYunUtil.java
File was deleted
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/rongyun/model/Config.java
File was deleted
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/rongyun/model/Output.java
File was deleted
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/TokenUtil.java
File was deleted
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZhengLianConfig.java
File was deleted
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/TokenRequest.java
File was deleted
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/TradeTerminalInfo.java
File was deleted
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RegisteredWarpper.java
@@ -60,6 +60,17 @@
    @ApiModelProperty("区代码")
    private String areaCode;
    @ApiModelProperty("公司id")
    private Integer companyId;
    public Integer getCompanyId() {
        return companyId;
    }
    public void setCompanyId(Integer companyId) {
        this.companyId = companyId;
    }
    public String getProvince() {
        return province;
    }
DriverQYTTravel/guns-admin/src/main/resources/application-dev.yml
@@ -34,8 +34,8 @@
        password: 123456
        database: 0
        timeout: 1000
        cluster:
            nodes: 192.168.110.80:6379
#        cluster:
#            nodes: 127.0.0.1:6379
mybatis-plus:
    typeAliasesPackage: com.stylefeng.guns.modular
    global-config:
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -597,6 +597,41 @@
    }
    @ResponseBody
    @PostMapping("/api/order/addAppeal")
    @ApiOperation(value = "发起申诉", tags = {"用户端-服务中"}, notes = "",response = OrderInfoWarpper.class)
    @ApiImplicitParams({
            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=城际)", name = "orderType", required = true, dataType = "int"),
            @ApiImplicitParam(value = "申诉描述", name = "abnormalIntro", required = true, dataType = "String"),
            @ApiImplicitParam(value = "申诉图片", name = "abnormalImg", required = true, dataType = "String"),
            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResultUtil<OrderInfoWarpper> addAppeal(Integer orderId, Integer orderType,String abnormalIntro, String abnormalImg, HttpServletRequest request){
        try {
            Integer uid = userInfoService.getUserIdFormRedis(request);
            if(null == uid){
                return ResultUtil.tokenErr();
            }
            switch (orderType){
                case 1://专车
                     orderPrivateCarService.addAppeal(uid, orderId,abnormalIntro,abnormalImg);
                    break;
                case 2://出租车
                    orderTaxiService.addAppeal(uid,orderId,abnormalIntro,abnormalImg);
                    break;
                case 3://跨城
                     orderCrossCityService.addAppeal(uid,orderId,abnormalIntro,abnormalImg);
                    break;
            }
            return ResultUtil.success();
        }catch (Exception e){
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    /**
     * 获取服务中的详情数据
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml
@@ -349,7 +349,12 @@
        h.remark as cancelRemark,
        CONCAT(j.startTime, '-', j.endTime) as lineShiftTime,
        a.holidayFee,
        a.discountAmount as taxiCardMoney
        a.discountAmount as taxiCardMoney,
        a.responsibilityType,
        a.abnormalStatus,
        a.abnormalRemark,
        a.abnormalIntro,
        a.abnormalImg
        from t_order_cross_city a
        left join t_driver b on (a.driverId = b.id)
        left join t_car c on (a.carId = c.id)
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java
@@ -352,8 +352,51 @@
    @TableField("billNo")
    private String billNo;
    /**
     * 是否异常订单 1否 2是
     */
    @TableField("abnormal")
    private Integer abnormal;
    /**
     * 乘客反馈情况
     */
    @TableField("abnormalIntro")
    private String abnormalIntro;
    /**
     * 乘客反馈图片
     */
    @TableField("abnormalImg")
    private String abnormalImg;
    private String splitAllocation;
    public Integer getAbnormal() {
        return abnormal;
    }
    public void setAbnormal(Integer abnormal) {
        this.abnormal = abnormal;
    }
    public String getAbnormalIntro() {
        return abnormalIntro;
    }
    public void setAbnormalIntro(String abnormalIntro) {
        this.abnormalIntro = abnormalIntro;
    }
    public String getAbnormalImg() {
        return abnormalImg;
    }
    public void setAbnormalImg(String abnormalImg) {
        this.abnormalImg = abnormalImg;
    }
    public String getBillNo() {
        return billNo;
    }
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java
@@ -321,4 +321,10 @@
     * 获取未支付的跨城订单
     */
    List<UnPayOrderVO> getUnpayCrossCityOrders(Integer uid) throws Exception;
    /**
     * 添加申诉
     */
    void addAppeal(Integer uid, Integer orderId,String abnormalIntro, String abnormalImg);
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -1419,6 +1419,13 @@
        if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
            map.put("state", map.get("oldState"));
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) ==7 &&  (map.get("responsibilityType")==null || Integer.valueOf(String.valueOf(map.get("responsibilityType")))<4)){
            map.put("appealButton", 1);
        }
        if(map.get("abnormalIntro")!=null){
            map.put("appealStatus", 1);
        }
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(map.get("startLon").toString(), map.get("startLat").toString());
        map.put("startCity", geocode.get("city"));
        geocode = gdMapGeocodingUtil.geocode(map.get("endLon").toString(), map.get("endLat").toString());
@@ -2682,4 +2689,16 @@
        }
        return unPayOrderVOList;
    }
    @Override
    public void addAppeal(Integer uid, Integer orderId, String abnormalIntro, String abnormalImg) {
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        if(orderCrossCity.getState()!=7 || orderCrossCity.getAbnormalIntro()!=null){
            throw new RuntimeException("此订单无法申诉");
        }
        orderCrossCity.setAbnormalIntro(abnormalIntro);
        orderCrossCity.setAbnormalImg(abnormalImg);
        orderCrossCity.setAbnormal(1);
        this.baseMapper.updateById(orderCrossCity);
    }
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml
@@ -385,7 +385,12 @@
        a.waitRule,
        a.chargeRule,
        a.chargeRules,
        a.discountAmount as taxiCardMoney
        a.discountAmount as taxiCardMoney,
        a.responsibilityType,
        a.abnormalStatus,
        a.abnormalRemark,
        a.abnormalIntro,
        a.abnormalImg
        from t_order_private_car a
        left join t_driver b on (a.driverId = b.id)
        left join t_car c on (a.carId = c.id)
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java
@@ -418,6 +418,25 @@
    @TableField("pid")
    private Integer pid;
    /**
     * 是否异常订单 1否 2是
     */
    @TableField("abnormal")
    private Integer abnormal;
    /**
     * 乘客反馈情况
     */
    @TableField("abnormalIntro")
    private String abnormalIntro;
    /**
     * 乘客反馈图片
     */
    @TableField("abnormalImg")
    private String abnormalImg;
    private Integer totalPeopleNum;
    /**
     * 预估里程(米)
@@ -430,6 +449,30 @@
    private String splitAllocation;
    public Integer getAbnormal() {
        return abnormal;
    }
    public void setAbnormal(Integer abnormal) {
        this.abnormal = abnormal;
    }
    public String getAbnormalIntro() {
        return abnormalIntro;
    }
    public void setAbnormalIntro(String abnormalIntro) {
        this.abnormalIntro = abnormalIntro;
    }
    public String getAbnormalImg() {
        return abnormalImg;
    }
    public void setAbnormalImg(String abnormalImg) {
        this.abnormalImg = abnormalImg;
    }
    public Integer getSpellSuccess() {
        return spellSuccess;
    }
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java
@@ -324,4 +324,10 @@
     * 获取专车未支付的订单
     */
    List<UnPayOrderVO> getUnpayPrivateOrders(Integer uid);
    /**
     * 添加申诉
     */
    void addAppeal(Integer uid, Integer orderId,String abnormalIntro, String abnormalImg);
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.ServiceException;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.util.ToolUtil;
@@ -1106,6 +1107,119 @@
        }
        return resultUtil;
    }
    @Override
    public Map<String, Object> queryOrderInfo(Integer uid, Integer orderId) throws Exception {
        Map<String, Object> map = orderPrivateCarMapper.queryOrderInfo(orderId);
        if(null == map){
            OrderTaxi orderTaxi = orderTaxiService.selectOne(new EntityWrapper<OrderTaxi>()
                    .eq("userId", uid)
                    .eq("isDelete", 1)
                    .in("state", Arrays.asList(2, 3, 4, 5, 6, 7))
            );
            return orderTaxiService.queryOrderInfo(orderTaxi.getId());
        }
        if(null != map.get("reassignNotice") && Integer.valueOf(String.valueOf(map.get("reassignNotice"))) == 2){//改派完成,重新获取了新的司机数据,开始修改数据防止继续调用
            OrderPrivateCar orderPrivateCar = this.selectById(orderId);
            orderPrivateCar.setReassignNotice(0);
            this.updateById(orderPrivateCar);
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
            map.put("state", map.get("oldState"));
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) ==7 &&  (map.get("responsibilityType")==null || Integer.valueOf(String.valueOf(map.get("responsibilityType")))<4)){
            map.put("appealButton", 1);
        }
        if(map.get("abnormalIntro")!=null){
            map.put("appealStatus", 1);
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) != 8 && Integer.valueOf(String.valueOf(map.get("state"))) != 9){
            map.put("redPacketMoney", null);
            map.put("couponMoney", null);
        }
        String driverId = (String) redisTemplate.opsForValue().get("DEVICE_" + map.get("driverId"));
        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
        map.put("orderType", 1);
        return map;
    }
    /**
     * 获取服务中的订单数据
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        if(null == orderPrivateCar){
            return orderTaxiService.queryOrderServer(orderId, uid);
        }
        //计算预计距离和剩余时间
        String value = (String) redisTemplate.opsForValue().get("DRIVER" + String.valueOf(orderPrivateCar.getDriverId()));
        if(null == value || "".equals(value)){
            System.err.println("司机没有上传位置信息");
            //调用获取轨迹中的数据
            List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 2);
            if(list.size() > 0){
                Map<String, Object> map = list.get(list.size() - 1);
                value = map.get("lon") + "," + map.get("lat");
            }
        }
        OrderServerWarpper orderServerWarpper = new OrderServerWarpper();
        orderServerWarpper.setOrderId(orderPrivateCar.getId());
        orderServerWarpper.setOrderType(1);
        orderServerWarpper.setState(orderPrivateCar.getState());
        orderServerWarpper.setLon(null != value ? value.split(",")[0] : "0.0");
        orderServerWarpper.setLat(null != value ? value.split(",")[1] : "0.0");
        orderServerWarpper.setReassignNotice(orderPrivateCar.getReassignNotice());
        if(orderPrivateCar.getState() == 2 || orderPrivateCar.getState() == 3){//前往预约地
            // TODO: 2023/11/4 无法修改
            Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), 1);
            String d = "0";
            String t = "0";
            if(null == distance){
                System.err.println("查询距离出错了");
            }else{
                d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
            }
            orderServerWarpper.setReservationMileage(d);
            orderServerWarpper.setReservationTime(t);
            orderServerWarpper.setServedMileage("0");
            orderServerWarpper.setServedTime("0");
            orderServerWarpper.setLaveMileage("0");
            orderServerWarpper.setLaveTime("0");
        }
        if(orderPrivateCar.getState() == 5 || orderPrivateCar.getState() == 6){//服务中
            // TODO: 2023/11/4 无法修改
            Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), 1);
            String d = "0";
            String t = "0";
            if(null == distance){
                System.err.println("查询距离出错了");
            }else{
                d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
            }
            orderServerWarpper.setReservationMileage("0");
            orderServerWarpper.setReservationTime("0");
            orderServerWarpper.setServedMileage(String.valueOf((null == orderPrivateCar.getMileage() ? 0 : orderPrivateCar.getMileage()) / 1000));
            orderServerWarpper.setServedTime(Long.valueOf((new Date().getTime() - orderPrivateCar.getStartServiceTime().getTime()) / 60000).intValue() + "");
            orderServerWarpper.setLaveMileage(d);
            orderServerWarpper.setLaveTime(t);
        }
        return orderServerWarpper;
    }
    
    @Override
    public synchronized String getOrderNum() throws Exception {
@@ -2687,4 +2801,20 @@
            }
        }).start();
    }
    @Override
    public void addAppeal(Integer uid, Integer orderId,String abnormalIntro, String abnormalImg) {
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        if(orderPrivateCar.getState()!=7 || orderPrivateCar.getAbnormalIntro()!=null){
            throw new RuntimeException("此订单无法申诉");
        }
        orderPrivateCar.setAbnormalIntro(abnormalIntro);
        orderPrivateCar.setAbnormalImg(abnormalImg);
        orderPrivateCar.setAbnormal(1);
        this.baseMapper.updateById(orderPrivateCar);
    }
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java
@@ -167,6 +167,82 @@
    private String time;
    @ApiModelProperty("申诉按钮 1显示 0不显示")
    private Integer appealButton=0;
    @ApiModelProperty("申诉状态 0未申诉 1申诉中")
    private Integer appealStatus=0;
    @ApiModelProperty("处理状态 1审核中 2已处理")
    private Integer abnormalStatus;
    @ApiModelProperty("处理结果")
    private String abnormalRemark;
    @ApiModelProperty("乘客反馈情况")
    private String abnormalIntro;
    @ApiModelProperty("乘客反馈情况图片")
    private String abnormalImg;
    @ApiModelProperty("1平台全责 2司机全责 3乘客全责 4平台部分 5司机部分")
    private String responsibilityType;
    public Integer getAbnormalStatus() {
        return abnormalStatus;
    }
    public void setAbnormalStatus(Integer abnormalStatus) {
        this.abnormalStatus = abnormalStatus;
    }
    public String getAbnormalRemark() {
        return abnormalRemark;
    }
    public void setAbnormalRemark(String abnormalRemark) {
        this.abnormalRemark = abnormalRemark;
    }
    public String getAbnormalIntro() {
        return abnormalIntro;
    }
    public void setAbnormalIntro(String abnormalIntro) {
        this.abnormalIntro = abnormalIntro;
    }
    public String getAbnormalImg() {
        return abnormalImg;
    }
    public void setAbnormalImg(String abnormalImg) {
        this.abnormalImg = abnormalImg;
    }
    public String getResponsibilityType() {
        return responsibilityType;
    }
    public void setResponsibilityType(String responsibilityType) {
        this.responsibilityType = responsibilityType;
    }
    public Integer getAppealStatus() {
        return appealStatus;
    }
    public void setAppealStatus(Integer appealStatus) {
        this.appealStatus = appealStatus;
    }
    public Integer getAppealButton() {
        return appealButton;
    }
    public void setAppealButton(Integer appealButton) {
        this.appealButton = appealButton;
    }
    public String getTime() {
        return time;
    }
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderStatusWarpper.java
@@ -14,6 +14,8 @@
    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)")
    private Integer state;
    public Integer getOrderId() {
        return orderId;
    }
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml
@@ -258,7 +258,12 @@
        h.reason as cancelReason,
        h.remark as cancelRemark,
        a.holidayFee,
        a.discountAmount as taxiCardMoney
        a.discountAmount as taxiCardMoney,
        a.responsibilityType,
        a.abnormalStatus,
        a.abnormalRemark,
        a.abnormalIntro,
        a.abnormalImg
        from t_order_taxi a
        left join t_driver b on (a.driverId = b.id)
        left join t_car c on (a.carId = c.id)
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java
@@ -356,8 +356,52 @@
    @TableField("bindId")
    private String bindId;
    /**
     * 是否异常订单 1否 2是
     */
    @TableField("abnormal")
    private Integer abnormal;
    /**
     * 乘客反馈情况
     */
    @TableField("abnormalIntro")
    private String abnormalIntro;
    /**
     * 乘客反馈图片
     */
    @TableField("abnormalImg")
    private String abnormalImg;
    private String splitAllocation;
    public Integer getAbnormal() {
        return abnormal;
    }
    public void setAbnormal(Integer abnormal) {
        this.abnormal = abnormal;
    }
    public String getAbnormalIntro() {
        return abnormalIntro;
    }
    public void setAbnormalIntro(String abnormalIntro) {
        this.abnormalIntro = abnormalIntro;
    }
    public String getAbnormalImg() {
        return abnormalImg;
    }
    public void setAbnormalImg(String abnormalImg) {
        this.abnormalImg = abnormalImg;
    }
    public Integer getId() {
        return id;
    }
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java
@@ -303,4 +303,11 @@
     */
    List<UnPayOrderVO> getUnpayTaxiOrders(Integer uid);
    /**
     * 添加申诉
     * @param uid
     * @param orderId
     */
    void addAppeal(Integer uid, Integer orderId,String abnormalIntro, String abnormalImg);
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -1737,6 +1737,13 @@
        if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
            map.put("state", map.get("oldState"));
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) ==7 &&  (map.get("responsibilityType")==null || Integer.valueOf(String.valueOf(map.get("responsibilityType")))<4)){
            map.put("appealButton", 1);
        }
        if(map.get("abnormalIntro")!=null){
            map.put("appealStatus", 1);
        }
        String driverId = (String) redisTemplate.opsForValue().get("DEVICE_" + map.get("driverId"));
        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
        map.put("orderType", 2);
@@ -2287,4 +2294,16 @@
        
        return unPayOrderVOList;
    }
    @Override
    public void addAppeal(Integer uid, Integer orderId, String abnormalIntro, String abnormalImg) {
        OrderTaxi orderTaxi = this.selectById(orderId);
        if(orderTaxi.getState()!=7 || orderTaxi.getAbnormalIntro()!=null){
            throw new RuntimeException("此订单无法申诉");
        }
        orderTaxi.setAbnormalIntro(abnormalIntro);
        orderTaxi.setAbnormalImg(abnormalImg);
        orderTaxi.setAbnormal(1);
        this.baseMapper.updateById(orderTaxi);
    }
}