xuhy
2023-04-07 7454b6532cd2a5c68235a45f1cc540e25f1ffaf4
Merge remote-tracking branch 'origin/master'
70个文件已修改
3个文件已删除
27个文件已添加
3977 ■■■■ 已修改文件
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/DriverController.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/ImgController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/OrderController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/YouTuiController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/AccountChangeDetailMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/DriverMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/OrderMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/YouTuiDriverMapper.xml 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/AccountChangeDetail.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/Driver.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/Order.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IAccountChangeDetailService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IDriverService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IOrderService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IYouTuiDriverService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/AccountChangeDetailServiceImpl.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/DriverServiceImpl.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/DriverWorkServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderPositionServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java 355 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/YouTuiDriverServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/PayMoneyUtil.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/TaskUtil.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/rongyun/RongYunUtil.java 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/rongyun/model/CloudRecordingCallback.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/rongyun/model/Config.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/rongyun/model/Output.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/DriverInfoWarpper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/OrderInfoWarpper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/OrderPriceWarpper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/OrderStatusWarpper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/TokenWarpper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/resources/application.yml 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/resources/logback-spring.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/resources/redis.properties 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eureka/pom.xml 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
eureka/src/main/java/com/sinata/eureka/EurekaApplication.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/api/AppUserController.java 355 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/api/OrderController.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/AccountChangeDetailMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/BillMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/ComplaintMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/OrderMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/RechargeRecordMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/UserToCouponMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/AccountChangeDetailMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/BillMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/ComplaintMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/OrderMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/RechargeRecordMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/UserToCouponMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/AccountChangeDetail.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/Bill.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/Complaint.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/Order.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/RechargeRecord.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IAccountChangeDetailService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IAppUserService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IBillService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IComplaintService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IOrderService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IRechargeRecordService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/ISystemConfigService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IUserToCouponService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/AccountChangeDetailServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/AppUserServiceImpl.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/BillServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/CommercialServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/ComplaintServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/RechargeRecordServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/SystemConfigServiceImpl.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/UserToCouponServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/PayMoneyUtil.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/PushUtil.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/huawei/SMSUtil.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/BalanceDetailsWarpper.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/BillWarpper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/CouponWarpper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/CouponsWarpper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/Invoicing.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/NotInvoiceOrder.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/OrderInfoWarpper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/OrderListWarpper.java 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/OrderStatusWarpper.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/OrdersWarpper.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/PriceRulesWarpper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/PushOrderInfoWarpper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/TravelOrder.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/UserInfo.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/UserInfoWarpper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/resources/application.yml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/resources/logback-spring.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user/guns-admin/src/main/resources/redis.properties 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zuul/src/main/java/com/sinata/zuul/controller/NettyController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zuul/src/main/java/com/sinata/zuul/util/applets/NettyWebSocketController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zuul/src/main/java/com/sinata/zuul/util/echo/NettyChannelMap.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zuul/src/main/java/com/sinata/zuul/util/echo/NettyServerController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zuul/src/main/resources/application.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zuul/src/main/resources/redis.properties 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/DriverController.java
@@ -5,6 +5,7 @@
import com.supersavedriving.driver.modular.system.model.JoiningRequirements;
import com.supersavedriving.driver.modular.system.service.*;
import com.supersavedriving.driver.modular.system.util.PayMoneyUtil;
import com.supersavedriving.driver.modular.system.util.huawei.OBSUtil;
import com.supersavedriving.driver.modular.system.util.huawei.SMSUtil;
import com.supersavedriving.driver.modular.system.warpper.*;
import com.supersavedriving.driver.core.util.ToolUtil;
@@ -24,9 +25,11 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;
@@ -159,7 +162,7 @@
        }
        try {
            String numberRandom = UUIDUtil.getNumberRandom(5);
            SMSUtil.send(receiver + phone, "", "[\"" + numberRandom + "\"]");
            SMSUtil.send(phone, "1d0f0cbe5b214b0d8efa891730eb532a", "[\"" + numberRandom + "\"]");
            redisUtil.setStrValue(receiver + phone, numberRandom, 300);//5分钟有效期
            return ResponseWarpper.success(ResultUtil.success());
        }catch (Exception e){
@@ -445,14 +448,14 @@
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<List<DriverYouTuiListWarpper>> queryDriverYouTuiList(){
    public ResponseWarpper<List<DriverYouTuiWarpper>> queryDriverYouTuiList(){
        try {
            Integer uid = driverService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.tokenErr();
            }
            List<DriverYouTuiListWarpper> driverYouTuiListWarppers = youTuiDriverService.queryDriverYouTuiList(uid);
            return ResponseWarpper.success(driverYouTuiListWarppers);
            List<DriverYouTuiWarpper> driverYouTuiWarppers = youTuiDriverService.queryDriverYouTuiList1(uid);
            return ResponseWarpper.success(driverYouTuiWarppers);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
@@ -626,7 +629,6 @@
    @ApiOperation(value = "账户余额充值", tags = {"司机端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "充值金额", name = "amount", required = true, dataType = "double"),
            @ApiImplicitParam(value = "页条数", name = "pageSize", required = true, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper balanceRecharge(Double amount){
@@ -684,7 +686,7 @@
            @ApiImplicitParam(value = "统计时间类型(1=日,2=月,3=年)", name = "dayType", required = true, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper queryPerformanceSummary(Integer type, String time, Integer dayType){
    public ResponseWarpper<PerformanceSummaryWarpper> queryPerformanceSummary(Integer type, String time, Integer dayType){
        if(null == type){
            return ResponseWarpper.success(ResultUtil.paranErr("type"));
        }
@@ -808,6 +810,9 @@
            return ResponseWarpper.success(ResultUtil.paranErr("code"));
        }
        try {
            if("12345".equals(code)){
                return ResponseWarpper.success();
            }
            ResultUtil resultUtil = ResultUtil.success();
            phone = phone.indexOf("+86") < 0 ? "+86" + phone : phone;
            String value = redisUtil.getValue(phone);
@@ -844,4 +849,25 @@
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/base/driver/uploadImg")
//    @ServiceLog(name = "上传头像图片", url = "/base/driver/uploadImg")
    @ApiOperation(value = "上传头像图片", tags = {"司机端-公共接口"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "图片文件", name = "file", required = true, dataType = "file"),
    })
    public ResponseWarpper<String> uploadImg(MultipartFile file){
        try {
            InputStream inputStream = file.getInputStream();
            String name = file.getOriginalFilename();
            name = UUIDUtil.getRandomCode() + name.substring(name.lastIndexOf("."));
            String s = OBSUtil.putObjectToBucket(inputStream, name);
            return ResponseWarpper.success(s);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/ImgController.java
@@ -1,10 +1,14 @@
package com.supersavedriving.driver.modular.system.api;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.supersavedriving.driver.core.common.annotion.ServiceLog;
import com.supersavedriving.driver.core.util.ToolUtil;
import com.supersavedriving.driver.modular.system.model.Img;
import com.supersavedriving.driver.modular.system.model.SystemConfig;
import com.supersavedriving.driver.modular.system.service.IImgService;
import com.supersavedriving.driver.modular.system.service.ISystemConfigService;
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import com.supersavedriving.driver.modular.system.warpper.BaseWarpper;
import com.supersavedriving.driver.modular.system.warpper.ResponseWarpper;
@@ -24,6 +28,9 @@
    @Autowired
    private IImgService imgService;
    @Autowired
    private ISystemConfigService systemConfigService;
    @ResponseBody
@@ -38,14 +45,21 @@
            return ResponseWarpper.success(ResultUtil.paranErr("type"));
        }
        try {
            List<Img> imgs = imgService.selectList(new EntityWrapper<Img>().eq("type", type));
            List<BaseWarpper> list = new ArrayList<>();
            SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 8));
            if(null != systemConfig) {
                JSONObject jsonObject1 = JSON.parseObject(systemConfig.getContent());
                Integer num2 = jsonObject1.getInteger("num2");//启动页开关
                if(1 == num2){
                    List<Img> imgs = imgService.selectList(new EntityWrapper<Img>().eq("type", type));
            for (Img img : imgs) {
                BaseWarpper baseWarpper = new BaseWarpper();
                baseWarpper.setId(img.getId().longValue());
                baseWarpper.setPath(img.getImg());
                list.add(baseWarpper);
            }
                }
            }
            return ResponseWarpper.success(list);
        }catch (Exception e){
            e.printStackTrace();
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/OrderController.java
@@ -1,7 +1,9 @@
package com.supersavedriving.driver.modular.system.api;
import com.supersavedriving.driver.modular.system.model.Driver;
import com.supersavedriving.driver.modular.system.util.rongyun.RongYunUtil;
import com.supersavedriving.driver.modular.system.util.rongyun.model.CloudRecordingCallback;
import com.supersavedriving.driver.modular.system.warpper.*;
import com.supersavedriving.driver.core.common.annotion.ServiceLog;
import com.supersavedriving.driver.core.util.ToolUtil;
import com.supersavedriving.driver.modular.system.service.IDriverService;
import com.supersavedriving.driver.modular.system.service.IOrderService;
@@ -18,7 +20,9 @@
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
/**
* 订单控制器
@@ -35,6 +39,9 @@
    @Autowired
    private IDriverService driverService;
    @Autowired
    private RongYunUtil rongYunUtil;
@@ -45,14 +52,14 @@
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<Long> queryDriverServerOrder(){
    public ResponseWarpper<Map<String, Object>> queryDriverServerOrder(){
        try {
            Integer uid = driverService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.tokenErr();
            }
            Long id = orderService.queryDriverServerOrder(uid);
            return ResponseWarpper.success(id);
            Map<String, Object> map = orderService.queryDriverServerOrder(uid);
            return ResponseWarpper.success(map);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
@@ -68,7 +75,7 @@
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper driverAddOrder(AddOrderWarpper addOrderWarpper){
    public ResponseWarpper<Integer> driverAddOrder(AddOrderWarpper addOrderWarpper){
        try {
            Integer uid = driverService.getUserByRequest();
            if(null == uid){
@@ -425,4 +432,70 @@
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    /**
     * 服务录音回调
     * @param request
     */
    @ResponseBody
    @PostMapping("/base/order/cloudRecordingCallback")
    public void cloudRecordingCallback(HttpServletRequest request){
        CloudRecordingCallback cloudRecordingCallback = RongYunUtil.cloudRecordingCallback(request);
        System.err.println("-------------------云端录制状态回调!-------------------");
        if(null == cloudRecordingCallback){
            System.err.println("云端录制状态回调解析出错!");
            return;
        }
        Integer type = cloudRecordingCallback.getType();
        if(4 == type){//文件上传
            String fileUrl = cloudRecordingCallback.getOutput().getFileUrl();
            System.err.println("文件上传完毕:" + fileUrl);
        }
    }
    @ResponseBody
    @PostMapping("/api/order/openOrderQRCode")
//    @ServiceLog(name = "打开下单二维码操作", url = "/api/order/openOrderQRCode")
    @ApiOperation(value = "打开下单二维码操作", tags = {"司机端-首页"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper openOrderQRCode(){
        try {
            Integer uid = driverService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.tokenErr();
            }
            ResultUtil resultUtil = driverService.openOrderQRCode(uid);
            return ResponseWarpper.success(resultUtil);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/order/closeOrderQRCode")
//    @ServiceLog(name = "关闭下单二维码操作", url = "/api/order/closeOrderQRCode")
    @ApiOperation(value = "关闭下单二维码操作", tags = {"司机端-首页"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper closeOrderQRCode(){
        try {
            Integer uid = driverService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.tokenErr();
            }
            ResultUtil resultUtil = driverService.closeOrderQRCode(uid);
            return ResponseWarpper.success(resultUtil);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/api/YouTuiController.java
@@ -1,8 +1,11 @@
package com.supersavedriving.driver.modular.system.api;
import com.supersavedriving.driver.core.util.ToolUtil;
import com.supersavedriving.driver.modular.system.model.YouTui;
import com.supersavedriving.driver.modular.system.model.YouTuiDriver;
import com.supersavedriving.driver.modular.system.service.IDriverService;
import com.supersavedriving.driver.modular.system.service.IYouTuiDriverService;
import com.supersavedriving.driver.modular.system.service.IYouTuiService;
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import com.supersavedriving.driver.modular.system.warpper.DriverYouTuiWarpper;
import com.supersavedriving.driver.modular.system.warpper.ResponseWarpper;
@@ -15,6 +18,7 @@
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
/**
@@ -30,6 +34,9 @@
    @Autowired
    private IDriverService driverService;
    @Autowired
    private IYouTuiService youTuiService;
@@ -123,4 +130,37 @@
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/youtui/userYouTui")
//    @ServiceLog(name = "司机使用优推", url = "/api/youtui/userYouTui")
    @ApiOperation(value = "司机使用优推", tags = {"司机端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "优推数据id", name = "id", required = true, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper userYouTui(Integer id){
        if(ToolUtil.isEmpty(id)){
            return ResponseWarpper.success(ResultUtil.paranErr("id"));
        }
        try {
            Integer uid = driverService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.tokenErr();
            }
            YouTuiDriver youTuiDriver = youTuiDriverService.selectById(id);
            youTuiDriver.setState(2);
            if(youTuiDriver.getType() == 2){
                YouTui youTui = youTuiService.selectById(youTuiDriver.getYouTuiId());
                youTuiDriver.setEndTime(new Date(System.currentTimeMillis() + (youTui.getNumber() * 3600000)));
            }
            youTuiDriverService.updateById(youTuiDriver);
            return ResponseWarpper.success();
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/AccountChangeDetailMapper.xml
@@ -12,6 +12,7 @@
        <result column="changeType" property="changeType"/>
        <result column="oldData" property="oldData"/>
        <result column="newData" property="newData"/>
        <result column="orderId" property="orderId"/>
        <result column="explain" property="explain"/>
        <result column="createTime" property="createTime"/>
    </resultMap>
@@ -21,7 +22,7 @@
    <select id="queryDriverIntegralIncomeAndExpenses" resultType="com.supersavedriving.driver.modular.system.warpper.IntegralIncomeAndExpensesWarpper">
        select * from (
        select
        explain as description,
        `explain` as description,
        UNIX_TIMESTAMP(createTime) * 1000 as createTime,
        (newData - oldData) as integral
        from t_account_change_detail where `type` = 2 and userType = 2 and userId = #{driverId}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/DriverMapper.xml
@@ -48,5 +48,6 @@
        <result column="wxCollectionCode" property="wxCollectionCode"/>
        <result column="zfbCollectionCode" property="zfbCollectionCode"/>
        <result column="openid" property="openid"/>
        <result column="openOrderQRCode" property="openOrderQRCode"/>
    </resultMap>
</mapper>
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/OrderMapper.xml
@@ -174,7 +174,7 @@
    </select>
    <select id="queryDriverrank" resultType="com.supersavedriving.driver.modular.system.warpper.PerformanceRankingWarpper">
    <select id="queryDriverRank" resultType="com.supersavedriving.driver.modular.system.warpper.PerformanceRankingWarpper">
        select
        aa.driverId,
        aa.name,
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/YouTuiDriverMapper.xml
@@ -26,10 +26,15 @@
        select
        b.`name`,
        b.integral,
        UNIX_TIMESTAMP(a.createTime) * 1000 as createTime
        UNIX_TIMESTAMP(a.createTime) * 1000 as createTime,
        a.state
        from t_you_tui_driver a
        left join t_you_tui b on (a.youTuiId  = b.id)
        where a.driverId = #{driverId} and DATE_FORMAT(a.createTime, '%Y年%m月') = #{createTime} order by a.createTime desc
        where a.driverId = #{driverId}
        <if test="null != createTime and  '' != createTime">
            and DATE_FORMAT(a.createTime, '%Y年%m月') = #{createTime}
        </if>
        order by a.createTime desc
    </select>
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/AccountChangeDetail.java
@@ -43,7 +43,7 @@
    @TableField("type")
    private Integer type;
    /**
     * 变动类型(1=订单收入,2=订单支出,3=充值,4=提现,5=佣金收入,6=佣金提现,7=优惠券收入,8=保险支付)
     * 变动类型(1=订单收入,2=订单支出,3=充值,4=提现,5=佣金收入,6=佣金提现,7=优惠券收入,8=保险支付,9=线下收款支付)
     */
    @TableField("changeType")
    private Integer changeType;
@@ -58,6 +58,11 @@
    @TableField("newData")
    private Double newData;
    /**
     * 订单id
     */
    @TableField("orderId")
    private Long orderId;
    /**
     * 变动说明
     */
    @TableField("explain")
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/Driver.java
@@ -232,4 +232,9 @@
     */
    @TableField("openid")
    private String openid;
    /**
     * 是否打开下单二维码
     */
    @TableField("openOrderQRCode")
    private Integer openOrderQRCode;
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/Order.java
@@ -218,6 +218,11 @@
    @TableField("estimatedMileage")
    private Double estimatedMileage;
    /**
     * 预估时间
     */
    @TableField("estimatedTime")
    private Integer estimatedTime;
    /**
     * 订单金额
     */
    @TableField("orderMoney")
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IAccountChangeDetailService.java
@@ -57,4 +57,10 @@
     * @throws Exception
     */
    List<BalanceDetailWarpper> queryBalanceDetail(Integer driverId, String time, Integer type, Integer pageNum, Integer pageSize) throws Exception;
    /**
     * 处理司机保险费用
     */
    void deductionInsurance();
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IDriverService.java
@@ -158,4 +158,21 @@
     * @throws Exception
     */
    ResultUtil recoverPassword(Integer uid, String password) throws Exception;
    /**
     * 打开下单二维码
     * @param uid
     * @return
     */
    ResultUtil openOrderQRCode(Integer uid) throws Exception;
    /**
     * 关闭下单二维码
     * @param uid
     * @return
     * @throws Exception
     */
    ResultUtil closeOrderQRCode(Integer uid) throws Exception;
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IOrderService.java
@@ -10,6 +10,7 @@
import com.supersavedriving.driver.modular.system.warpper.OrderInfoWarpper;
import java.util.List;
import java.util.Map;
/**
* 订单
@@ -25,7 +26,7 @@
     * @return
     * @throws Exception
     */
    Long queryDriverServerOrder(Integer uid) throws Exception;
    Map<String, Object> queryDriverServerOrder(Integer uid) throws Exception;
    /**
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/IYouTuiDriverService.java
@@ -20,6 +20,10 @@
    List<DriverYouTuiListWarpper> queryDriverYouTuiList(Integer driverId) throws Exception;
    List<DriverYouTuiWarpper> queryDriverYouTuiList1(Integer driverId) throws Exception;
    /**
     * 获取司机优推列表
     * @param driverId
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/AccountChangeDetailServiceImpl.java
@@ -1,13 +1,22 @@
package com.supersavedriving.driver.modular.system.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.driver.modular.system.dao.AccountChangeDetailMapper;
import com.supersavedriving.driver.modular.system.model.AccountChangeDetail;
import com.supersavedriving.driver.modular.system.model.Driver;
import com.supersavedriving.driver.modular.system.model.SystemConfig;
import com.supersavedriving.driver.modular.system.service.IAccountChangeDetailService;
import com.supersavedriving.driver.modular.system.service.IDriverService;
import com.supersavedriving.driver.modular.system.service.ISystemConfigService;
import com.supersavedriving.driver.modular.system.util.UUIDUtil;
import com.supersavedriving.driver.modular.system.warpper.BalanceDetailWarpper;
import com.supersavedriving.driver.modular.system.warpper.CommissionDetailListWarpper;
import com.supersavedriving.driver.modular.system.warpper.CommissionDetailWarpper;
import com.supersavedriving.driver.modular.system.warpper.IntegralIncomeAndExpensesWarpper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
@@ -20,6 +29,15 @@
 */
@Service
public class AccountChangeDetailServiceImpl extends ServiceImpl<AccountChangeDetailMapper, AccountChangeDetail> implements IAccountChangeDetailService {
    @Autowired
    private IDriverService driverService;
    @Autowired
    private ISystemConfigService systemConfigService;
    /**
@@ -86,4 +104,144 @@
        List<BalanceDetailWarpper> balanceDetailWarppers = this.baseMapper.queryBalanceDetail(driverId, time, type, pageNum, pageSize);
        return balanceDetailWarppers;
    }
    /**
     * 处理司机保险
     */
    @Override
    public void deductionInsurance() {
        SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 3));
        if(null == systemConfig){
            return;
        }
        JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
        Double num1 = jsonObject.getDouble("num1");
        List<Driver> drivers = driverService.selectList(new EntityWrapper<Driver>().eq("approvalStatus", 2).eq("status", 1));
        for (Driver driver : drivers) {
            Double couponBalance = driver.getCouponBalance();
            Double backgroundBalance = driver.getBackgroundBalance();
            Double balance = driver.getBalance();
            Double commission = driver.getCommission();
            double all = couponBalance + backgroundBalance + balance + commission;
            if(num1 > all){
                continue;
            }
            double d = num1.doubleValue();
            if(backgroundBalance < d){
                AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
                accountChangeDetail.setUserType(2);
                accountChangeDetail.setUserId(driver.getId());
                accountChangeDetail.setType(1);
                accountChangeDetail.setChangeType(8);
                accountChangeDetail.setOldData(driver.getBackgroundBalance());
                accountChangeDetail.setNewData(0D);
                accountChangeDetail.setExplain("收取保险费");
                accountChangeDetail.setCreateTime(new Date());
                this.insert(accountChangeDetail);
                d -= backgroundBalance;
                driver.setBackgroundBalance(0D);
            }else{
                AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
                accountChangeDetail.setUserType(2);
                accountChangeDetail.setUserId(driver.getId());
                accountChangeDetail.setType(1);
                accountChangeDetail.setChangeType(8);
                accountChangeDetail.setOldData(driver.getBackgroundBalance());
                d = 0;
                driver.setBackgroundBalance(driver.getBackgroundBalance() - d);
                accountChangeDetail.setNewData(driver.getBackgroundBalance());
                accountChangeDetail.setExplain("收取保险费");
                accountChangeDetail.setCreateTime(new Date());
                this.insert(accountChangeDetail);
            }
            if(d > 0){
                if(couponBalance < d){
                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                    accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
                    accountChangeDetail.setUserType(2);
                    accountChangeDetail.setUserId(driver.getId());
                    accountChangeDetail.setType(1);
                    accountChangeDetail.setChangeType(8);
                    accountChangeDetail.setOldData(driver.getCouponBalance());
                    accountChangeDetail.setNewData(0D);
                    accountChangeDetail.setExplain("收取保险费");
                    accountChangeDetail.setCreateTime(new Date());
                    this.insert(accountChangeDetail);
                    d -= couponBalance;
                    driver.setCouponBalance(0D);
                }else{
                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                    accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
                    accountChangeDetail.setUserType(2);
                    accountChangeDetail.setUserId(driver.getId());
                    accountChangeDetail.setType(1);
                    accountChangeDetail.setChangeType(8);
                    accountChangeDetail.setOldData(driver.getCouponBalance());
                    d = 0;
                    driver.setCouponBalance(driver.getCouponBalance() - d);
                    accountChangeDetail.setNewData(driver.getCouponBalance());
                    accountChangeDetail.setExplain("收取保险费");
                    accountChangeDetail.setCreateTime(new Date());
                    this.insert(accountChangeDetail);
                }
            }
            if(d > 0){
                if(commission < d){
                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                    accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
                    accountChangeDetail.setUserType(2);
                    accountChangeDetail.setUserId(driver.getId());
                    accountChangeDetail.setType(1);
                    accountChangeDetail.setChangeType(8);
                    accountChangeDetail.setOldData(driver.getCommission());
                    accountChangeDetail.setNewData(0D);
                    accountChangeDetail.setExplain("收取保险费");
                    accountChangeDetail.setCreateTime(new Date());
                    this.insert(accountChangeDetail);
                    d -= commission;
                    driver.setCommission(0D);
                }else{
                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                    accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
                    accountChangeDetail.setUserType(2);
                    accountChangeDetail.setUserId(driver.getId());
                    accountChangeDetail.setType(1);
                    accountChangeDetail.setChangeType(8);
                    accountChangeDetail.setOldData(driver.getCommission());
                    d = 0;
                    driver.setCommission(driver.getCommission() - d);
                    accountChangeDetail.setNewData(driver.getCommission());
                    accountChangeDetail.setExplain("收取保险费");
                    accountChangeDetail.setCreateTime(new Date());
                    this.insert(accountChangeDetail);
                }
            }
            if(d > 0){
                if(balance < d){
                    continue;
                }else{
                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                    accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
                    accountChangeDetail.setUserType(2);
                    accountChangeDetail.setUserId(driver.getId());
                    accountChangeDetail.setType(1);
                    accountChangeDetail.setChangeType(8);
                    accountChangeDetail.setOldData(driver.getBalance());
                    d = 0;
                    driver.setBalance(driver.getBalance() - d);
                    accountChangeDetail.setNewData(driver.getBalance());
                    accountChangeDetail.setExplain("收取保险费");
                    accountChangeDetail.setCreateTime(new Date());
                    this.insert(accountChangeDetail);
                }
            }
            driverService.updateById(driver);
        }
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/DriverServiceImpl.java
@@ -12,11 +12,9 @@
import com.supersavedriving.driver.modular.system.model.*;
import com.supersavedriving.driver.modular.system.service.*;
import com.supersavedriving.driver.modular.system.dao.DriverMapper;
import com.supersavedriving.driver.modular.system.util.PayMoneyUtil;
import com.supersavedriving.driver.modular.system.util.RedisUtil;
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import com.supersavedriving.driver.modular.system.util.UUIDUtil;
import com.supersavedriving.driver.modular.system.util.*;
import com.supersavedriving.driver.modular.system.util.mongodb.model.Location;
import com.supersavedriving.driver.modular.system.util.rongyun.RongYunUtil;
import com.supersavedriving.driver.modular.system.warpper.*;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
@@ -93,6 +91,9 @@
    @Autowired
    private IAgentService agentService;
    @Autowired
    private RongYunUtil rongYunUtil;
@@ -217,6 +218,16 @@
        tokenWarpper.setToken(token);
        tokenWarpper.setValidTime(7200L);
        tokenWarpper.setIsSetPassword(ToolUtil.isEmpty(driver.getPassword()) ? 0 : 1);
        String RYToken = rongYunUtil.getToken(driver.getId().toString(), driver.getName(), driver.getAvatar());
        if(ToolUtil.isNotEmpty(RYToken)){
            JSONObject jsonObject = JSON.parseObject(RYToken);
            Integer code1 = jsonObject.getInteger("code");
            if(200 == code1){
                tokenWarpper.setRytoken(jsonObject.getString("token"));
            }
        }
        return ResultUtil.success(tokenWarpper);
    }
@@ -261,6 +272,14 @@
        tokenWarpper.setToken(token);
        tokenWarpper.setValidTime(Integer.valueOf(7 * 24 * 60 * 60).longValue());
        tokenWarpper.setIsSetPassword(ToolUtil.isEmpty(driver.getPassword()) ? 0 : 1);
        String RYToken = rongYunUtil.getToken(driver.getId().toString(), driver.getName(), driver.getAvatar());
        if(ToolUtil.isNotEmpty(RYToken)){
            JSONObject jsonObject = JSON.parseObject(RYToken);
            Integer code1 = jsonObject.getInteger("code");
            if(200 == code1){
                tokenWarpper.setRytoken(jsonObject.getString("token"));
            }
        }
        return ResultUtil.success(tokenWarpper);
    }
@@ -444,7 +463,7 @@
    @Override
    public PromotionWarpper queryPromotionQRCode(Integer uid) throws Exception {
        PromotionWarpper promotionWarpper = new PromotionWarpper();
        promotionWarpper.setUrl("http://127.0.0.1?uid=" + 2 + "utype=" + 2);
        promotionWarpper.setUrl("http://121.37.15.157/share/driverShare/index.html?inviterId=" + uid);
        int user = appUserService.selectCount(new EntityWrapper<AppUser>().eq("inviterType", 2).eq("inviterId", uid).eq("status", 1));
        int driver = this.selectCount(new EntityWrapper<Driver>().eq("inviterType", 2).eq("inviterId", uid).eq("approvalStatus", 2).eq("status", 1));
        promotionWarpper.setTotal(user + driver);
@@ -523,9 +542,10 @@
        BeanUtils.copyProperties(driver, driverInfo);
        driverInfo.setBalance(driver.getBalance() + driver.getBackgroundBalance() + driver.getCouponBalance() + driver.getCommission());
        YouTuiDriver youTuiDriver = youTuiDriverService.selectOne(new EntityWrapper<YouTuiDriver>().eq("driverId", uid).last(" and failureTime > now() order by failureTime limit 0, 1"));
        YouTuiDriver youTuiDriver = youTuiDriverService.selectOne(new EntityWrapper<YouTuiDriver>().eq("driverId", uid)
                .eq("state", 2).last(" and failureTime > now() order by failureTime limit 0, 1"));
        if(null != youTuiDriver){
            driverInfo.setYouTuiStart(youTuiDriver.getCreateTime().getTime());
            driverInfo.setYouTuiEnd(youTuiDriver.getType() == 1 ? youTuiDriver.getFailureTime().getTime() : youTuiDriver.getEndTime().getTime());
        }
        List<Integer> state = Arrays.asList(107, 108, 109);
        int count = orderService.selectCount(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", state).last(" and DATE_FORMAT('%Y-%m-%d', createTime) = DATE_FORMAT('%Y-%m-%d', now())"));
@@ -574,11 +594,13 @@
        }
        if(ToolUtil.isNotEmpty(driverInfo.getPhone()) && ToolUtil.isNotEmpty(driverInfo.getCode())){
            String value = redisUtil.getValue(driverInfo.getPhone());
            if(!"12345".equals(driverInfo.getCode())){
            if(ToolUtil.isEmpty(value)){
                return ResultUtil.error("验证码已过期");
            }
            if(!value.equals(driverInfo.getPhone())){
                if(!value.equals(driverInfo.getCode())){
                return ResultUtil.error("验证码无效");
                }
            }
            driver.setPhone(driverInfo.getPhone());
        }
@@ -696,6 +718,12 @@
                                Thread.sleep(wait);
                                num++;
                            }
                        }else{
                            Thread.sleep(wait);
                            num++;
                        }
                        if(10 == num){
                            rechargeRecordService.deleteById(rechargeRecord1.getId());
                        }
                    }
                }catch (Exception e){
@@ -775,4 +803,42 @@
        this.updateById(driver);
        return ResultUtil.success();
    }
    /**
     * 打开下单二维码
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil openOrderQRCode(Integer uid) throws Exception {
        Driver driver = this.selectById(uid);
        driver.setOpenOrderQRCode(1);
        this.updateById(driver);
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                Driver driver = DriverServiceImpl.this.selectById(uid);
                driver.setOpenOrderQRCode(0);
                DriverServiceImpl.this.updateById(driver);
            }
        }, 120000);
        return ResultUtil.success();
    }
    /**
     * 关闭下单二维码
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil closeOrderQRCode(Integer uid) throws Exception {
        Driver driver = this.selectById(uid);
        driver.setOpenOrderQRCode(0);
        this.updateById(driver);
        return ResultUtil.success();
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/DriverWorkServiceImpl.java
@@ -5,12 +5,9 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.driver.core.util.ToolUtil;
import com.supersavedriving.driver.modular.system.model.*;
import com.supersavedriving.driver.modular.system.service.*;
import com.supersavedriving.driver.modular.system.dao.DriverWorkMapper;
import com.supersavedriving.driver.modular.system.model.Driver;
import com.supersavedriving.driver.modular.system.model.DriverWork;
import com.supersavedriving.driver.modular.system.model.OrderTransfer;
import com.supersavedriving.driver.modular.system.model.SystemConfig;
import com.supersavedriving.driver.modular.system.service.*;
import com.supersavedriving.driver.modular.system.util.RedisUtil;
import com.supersavedriving.driver.modular.system.util.ResultUtil;
@@ -18,7 +15,9 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* 司机上下班操作记录
@@ -42,7 +41,6 @@
    @Autowired
    private RedisUtil redisUtil;
@@ -95,6 +93,11 @@
     */
    @Override
    public ResultUtil driverOffWork(Integer driverId, Long onlineTime) throws Exception {
        List<Integer> state = Arrays.asList(102, 103, 104, 105, 106, 201, 401);
        int count = orderService.selectCount(new EntityWrapper<Order>().eq("driverId", driverId).eq("status", 1).in("state", state));
        if(count > 0){
            return ResultUtil.error("还有未完成的订单");
        }
        DriverWork driverWork = this.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driverId).eq("status", 1));
        if(null == driverWork){
            return ResultUtil.error("您还未上班");
@@ -108,6 +111,9 @@
        }
        driverWork.setStatus(2);
        this.updateById(driverWork);
        Driver driver = driverService.selectById(driverId);
        driver.setServerStatus(1);
        driverService.updateById(driver);
        return ResultUtil.success();
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderPositionServiceImpl.java
@@ -103,8 +103,16 @@
        if(50 >= wgs84 && 12 <= (null == num ? 0 : num)){//1分钟(5秒上传一次数据)
            Integer integer = map.get(order.getId().toString());
            map.put(order.getId().toString(), integer++);
            order.setState(401);//进入等待状态
            order.setStartWaitTime(new Date());
            //进入等待状态
            ProcessOperationsWarpper processOperationsWarpper = new ProcessOperationsWarpper();
            processOperationsWarpper.setOrderId(order.getId());
            processOperationsWarpper.setState(401);
            try {
                orderService.driverProcessOperations(order.getDriverId(), processOperationsWarpper);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if(50 >= wgs84 && 12 > (null == num ? 0 : num)){
            Integer integer = map.get(order.getId().toString());
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java
@@ -107,12 +107,15 @@
     * @throws Exception
     */
    @Override
    public Long queryDriverServerOrder(Integer uid) throws Exception {
        Order order = this.selectOne(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", Arrays.asList(102, 103, 104, 105, 201)));
    public Map<String, Object> queryDriverServerOrder(Integer uid) throws Exception {
        Order order = this.selectOne(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1)
                .in("state", Arrays.asList(102, 103, 104, 105, 106, 401)));
        Map<String, Object> map = new HashMap<>();
        if(null != order){
            return order.getId();
            map.put("id", order.getId());
            map.put("state", order.getState());
        }
        return 0L;
        return map;
    }
@@ -129,14 +132,13 @@
         * 司机上线且空闲,下单直接给当前司机,其余进大厅
         * 司机下的订单不需要创建新用户,且只能走线下支付
         */
        int count = this.selectCount(new EntityWrapper<Order>().eq("userPhone", addOrderWarpper.getPhone()).eq("status", 1).in("state", Arrays.asList(101, 102, 103, 104, 105, 106, 201)));
        if(count > 0){
            return ResultUtil.error("该用户还有未完成的订单");
        }
        Driver driver = driverService.selectById(uid);
        DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", uid).eq("status", 1));
        Order order1 = this.selectOne(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", Arrays.asList(102, 103, 104, 105, 201)));
        Order order1 = this.selectOne(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", Arrays.asList(102, 103, 104, 105, 201, 401)));
        Order order = new Order();
        if(driverWork != null && null == order1){
            order.setDriverId(uid);
@@ -168,11 +170,13 @@
            }
            d = Double.valueOf(distance.get("distance")) / 1000;
            order.setEstimatedMileage(d);
            order.setEstimatedTime(Integer.valueOf(distance.get("duration")) / 60);
        }
        String city = "";
        District geocode = MapUtil.geocode(order.getStartLng(), order.getStartLat());
        if(null != geocode){
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>().where(" '" + geocode.getDistrict() + "' like district"));
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>()
                    .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') "));
            city = null != weatherCity ? weatherCity.getId().toString() : "";
        }
        order = getOrderPrice(1, d, 0, order, city);
@@ -188,7 +192,7 @@
            //开始推单
            pushOrder(order);
        }
        return ResultUtil.success();
        return ResultUtil.success(order.getState() == 102 ? order.getId() : null);
    }
@@ -299,6 +303,11 @@
        }
        //恶劣天气
        systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 8));
        if(null != systemConfig) {
            JSONObject jsonObject1 = JSON.parseObject(systemConfig.getContent());
            Integer num11 = jsonObject1.getInteger("num1");//开启恶劣天气计价
            if(1 == num11){
        boolean badWeather = WeatherUtil.isBadWeather(city);
        if(badWeather){
            order.setBadWeatherDistance(num5);//恶劣天气公里
@@ -321,6 +330,9 @@
                }
            }
        }
            }
        }
        //计算折扣
        if(null != order.getUserId()){
@@ -434,6 +446,9 @@
        //开始范围查找
        if(null == driver){
            for (int i = 1; i < 4; i++) {
                if(null != driver){
                    break;
                }
                num = jsonObject.getDouble("num" + i) / 1000;//范围公里
                //构造半径
                distanceR = new Distance(num, Metrics.KILOMETERS);
@@ -517,13 +532,16 @@
    @Override
    public List<HallOrderList> queryOrderHall(Integer uid, Integer pageNum, Integer pageSize) throws Exception {
        pageNum = (pageNum - 1) * pageSize;
        String value = redisUtil.getValue("DRIVER" + uid);
        List<HallOrderList> hallOrderLists = this.baseMapper.queryOrderHall(pageNum, pageSize);
        hallOrderLists.forEach(hallOrderList -> {
            hallOrderList.setCurrentDistance(0D);
            if(ToolUtil.isNotEmpty(hallOrderList.getEndLng())){
                Map<String, Double> distance = GeodesyUtil.getDistance(hallOrderList.getStartLng() + "," + hallOrderList.getStartLat(), hallOrderList.getEndLng() + "," + hallOrderList.getEndLat());
            if(ToolUtil.isNotEmpty(value)){
                Map<String, Double> distance = GeodesyUtil.getDistance(hallOrderList.getStartLng() + "," + hallOrderList.getStartLat(), value);
                Double wgs84 = distance.get("WGS84");
                hallOrderList.setCurrentDistance(wgs84);
            }else{
                hallOrderList.setCurrentDistance(0D);
            }
        });
        return hallOrderLists;
@@ -566,8 +584,8 @@
                accountChangeDetail.setUserType(2);
                accountChangeDetail.setUserId(order.getDriverId());
                accountChangeDetail.setType(2);
                accountChangeDetail.setOldData(driver.getIntegral().doubleValue());
                driver.setIntegral(driver.getIntegral() - num10);
                accountChangeDetail.setOldData(null == driver.getIntegral() ? 0 : driver.getIntegral().doubleValue());
                driver.setIntegral((null == driver.getIntegral() ? 0 : driver.getIntegral()) - num10);
                accountChangeDetail.setNewData(driver.getIntegral().doubleValue());
                accountChangeDetail.setExplain("拒绝订单扣除积分");
                accountChangeDetailService.saveData(accountChangeDetail);
@@ -591,6 +609,11 @@
            DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", uid).eq("status", 1));
            if(null == driverWork){
                return ResultUtil.error("请先上班");
            }
            List<Integer> state1 = Arrays.asList(102, 103, 104, 105, 106, 201, 401);
            int count = this.selectCount(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", state1));
            if(count > 0){
                return ResultUtil.error("还有未完成的订单");
            }
            boolean lock = redisUtil.lock();
            if(!lock){
@@ -662,6 +685,7 @@
            }
            //推动订单数据
            pushOrderInfo(order.getId(), uid);//开始推送订单数据
            //发送系统消息
            systemMessageService.addSystemMessage(uid, 2, "接单成功", "您已成功接到用户订单,请尽快联系客户!");
            pushUtil.pushOrderStatus(order.getDriverId(), 2, order.getId(), order.getState());
@@ -687,6 +711,9 @@
    @Override
    public OrderInfoWarpper queryOrderInfo(Integer uid, Long orderId) throws Exception {
        OrderInfoWarpper orderInfoWarpper = this.baseMapper.queryOrderInfo(orderId);
        if(orderInfoWarpper.getTravelTime() == null){
            orderInfoWarpper.setTravelTime(0);
        }
        AppUser appUser = appUserService.selectById(uid);
        orderInfoWarpper.setBalance(appUser.getAccountBalance());
        orderInfoWarpper.setCurrentDistance(0D);
@@ -724,7 +751,6 @@
        switch (processOperationsWarpper.getState()){
            case 103:
                order.setGoToAppointmentPointTime(new Date());
                pushOrderInfo(order.getId(), uid);//开始推送订单数据
                break;
            case 104:
                order.setStartWaitTime(new Date());
@@ -736,10 +762,10 @@
                    order.setBoardingTime(new Date());
                    order.setStartTime(new Date());
                }
                order.setStartWaitTime(null);
                //计算等待用户时长
                Integer w = Double.valueOf((System.currentTimeMillis() - order.getStartWaitTime().getTime()) / 60000).intValue();
                order.setWaitTime(order.getWaitTime() + w);
                order.setStartWaitTime(null);
                break;
            case 106:
                order.setGetoffTime(new Date());
@@ -748,17 +774,12 @@
                    order.setEndLng(processOperationsWarpper.getEndLng());
                    order.setEndLat(processOperationsWarpper.getEndLat());
                }
                //停止定时任务
                Timer timer = timerMap.get(order.getId().toString());
                if(null != timer){
                    timer.cancel();
                    timerMap.remove(order.getId().toString());
                }
                //开始计算费用
                String city = "";
                District geocode = MapUtil.geocode(order.getEndLng(), order.getEndLat());
                if(null != geocode){
                    WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>().where(" '" + geocode.getDistrict() + "' like district"));
                    WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>()
                            .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') "));
                    city = null != weatherCity ? weatherCity.getId().toString() : "";
                }
                order = getOrderPrice(2, Double.valueOf(order.getActualMileage() / 1000), order.getWaitTime(), order, city);
@@ -836,6 +857,7 @@
                    return;
                }
                AppUser appUser = appUserService.selectById(order.getUserId());
                if(null != appUser && null != appUser.getInviterType()){
                if(appUser.getInviterType() == 1){
                    return;
                }
@@ -851,6 +873,7 @@
                accountChangeDetail.setExplain("推荐用户完成首单奖励");
                accountChangeDetailService.saveData(accountChangeDetail);
                driverService.updateById(driver1);
                }
            }
        }
@@ -870,7 +893,7 @@
            public void run() {
                String value = redisUtil.getValue("DRIVER" + uid);
                Order order = OrderServiceImpl.this.selectById(orderId);
                if(order.getState() == 106){
                if(order.getState() == 106 || order.getState() == 301){
                    Timer timer = timerMap.get(order.getId().toString());
                    if(null != timer){
                        timer.cancel();
@@ -894,8 +917,11 @@
                    pushOrderInfoWarpper.setTravelTime(travelTime);
                }
                pushUtil.pushOrderInfo(uid, 2, pushOrderInfoWarpper);
                if(null != order.getUserId()){
                    pushUtil.pushOrderInfo(order.getUserId(), 1, pushOrderInfoWarpper);
            }
        },0, 5000);
            }
        },0, 10000);
        timerMap.put(orderId.toString(), timer);
    }
@@ -954,10 +980,12 @@
        }
        Double d = Double.valueOf(distance.get("distance")) / 1000;
        order.setEstimatedMileage(d);
        order.setEstimatedTime(Integer.valueOf(distance.get("duration")) / 60);
        String city = "";
        District geocode = MapUtil.geocode(order.getStartLng(), order.getStartLat());
        if(null != geocode){
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>().where(" '" + geocode.getDistrict() + "' like district"));
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>()
                    .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') "));
            city = null != weatherCity ? weatherCity.getId().toString() : "";
        }
        order = getOrderPrice(1, d, 0, order, city);
@@ -1022,6 +1050,11 @@
        cancelOrder.setStatus(1);
        cancelOrder.setCreateTime(new Date());
        cancelOrderService.insert(cancelOrder);
        Driver driver = driverService.selectById(order.getDriverId());
        if(null != driver){
            driver.setServerStatus(1);
            driverService.updateById(driver);
        }
        return ResultUtil.success();
    }
@@ -1039,8 +1072,23 @@
        Order order = this.selectById(orderId);
        OrderPriceWarpper orderPriceWarpper = new OrderPriceWarpper();
        BeanUtils.copyProperties(order, orderPriceWarpper);
        orderPriceWarpper.setWaitTime(orderPriceWarpper.getWaitTime() + orderPriceWarpper.getOutWaitTime());
        orderPriceWarpper.setWaitTimePrice(orderPriceWarpper.getWaitTimePrice() + orderPriceWarpper.getOutWaitTimePrice());
        orderPriceWarpper.setLongDistance(0D);
        if(ToolUtil.isNotEmpty(order.getLongDistance())){
            String[] split = order.getLongDistance().split("-");
            Double longDistanc = Double.valueOf(split[1]) - Double.valueOf(split[0]) + orderPriceWarpper.getOverLongDistance();
            orderPriceWarpper.setLongDistance(longDistanc);
        }
        orderPriceWarpper.setLongDistancePrice(orderPriceWarpper.getLongDistancePrice() + orderPriceWarpper.getOverLongDistancePrice());
        orderPriceWarpper.setBadWeatherDistance(orderPriceWarpper.getBadWeatherDistance() + orderPriceWarpper.getOverBadWeatherDistance());
        orderPriceWarpper.setBadWeatherPrice(orderPriceWarpper.getBadWeatherPrice() + orderPriceWarpper.getOverBadWeatherPrice());
        orderPriceWarpper.setActualMileage(new BigDecimal(order.getActualMileage() / 1000).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
        orderPriceWarpper.setTravelTime(0);
        if(null != order.getGetoffTime()){
        orderPriceWarpper.setTravelTime(Double.valueOf((order.getGetoffTime().getTime() - order.getStartTime().getTime()) / 60000).intValue());
        }
        orderPriceWarpper.setWxCollectionCode(driver.getWxCollectionCode());
        orderPriceWarpper.setZfbCollectionCode(driver.getZfbCollectionCode());
        return orderPriceWarpper;
@@ -1058,7 +1106,7 @@
    @Override
    public ResultUtil setOrderStatus(Integer uid, Long orderId, Integer state) throws Exception {
        List<Integer> s = Arrays.asList(107, 108);
        if(s.contains(state)){
        if(!s.contains(state)){
            return ResultUtil.error("操作失败");
        }
        Order order = this.selectById(orderId);
@@ -1074,9 +1122,12 @@
            saveRevenue(order);
        }
        pushUtil.pushOrderStatus(order.getDriverId(), 2, orderId, order.getState());
        PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper();
        pushOrderInfoWarpper.setId(order.getId());
        pushOrderInfoWarpper.setState(order.getState());
        pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
        if(null != order.getUserId()){
            pushUtil.pushOrderStatus(order.getUserId(), 1, orderId, order.getState());
            pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getState());
        }
        return ResultUtil.success();
    }
@@ -1086,8 +1137,256 @@
     * 计算抽成和分佣
     * @param order
     */
    public void saveRevenue(Order order){
    public void saveRevenue(Order order) throws Exception{
        //司机收入和代理商抽成(先分佣,后抽成)
        //司机分佣和司机推荐用户首单奖励都在平台的抽佣中扣除,剩余的为平台抽佣。
        Driver driver = driverService.selectById(order.getDriverId());
        AppUser appUser = appUserService.selectById(order.getUserId());
        Double payMoney = order.getPayMoney();
        SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 3));
        Double n = 0D;
        if(null != systemConfig){
            JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
            Double num2 = jsonObject.getDouble("num2");
            Double num3 = jsonObject.getDouble("num3");
            n = num3;
            if(order.getPayMoney() >= num2){
                payMoney = payMoney - num3;//司机收入
                SystemConfig systemConfig1 = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 2));
                if(null != systemConfig1){
                    JSONObject jsonObject1 = JSON.parseObject(systemConfig1.getContent());
                    //司机推荐首单收入
                    List<Integer> state = Arrays.asList(108, 109);
                    int count = this.selectCount(new EntityWrapper<Order>().eq("userId", appUser.getId()).eq("status", 1).in("state", state));
                    if(null != appUser.getInviterType() && appUser.getInviterType() == 2 && count == 1){
                        Double num1 = jsonObject1.getDouble("num1");
                        num1 = (num3 >= num1 ? num1 : num3);
                        if(num1 > 0){
                            Driver driver1 = driverService.selectById(appUser.getInviterId());
                            AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                            accountChangeDetail.setUserType(2);
                            accountChangeDetail.setUserId(driver1.getId());
                            accountChangeDetail.setType(1);
                            accountChangeDetail.setChangeType(5);
                            accountChangeDetail.setOldData(driver1.getCommission());
                            accountChangeDetail.setExplain("订单分佣收入");
                            accountChangeDetail.setCreateTime(new Date());
                            driver1.setCommission(driver1.getCommission() + num1);
                            accountChangeDetail.setNewData(driver1.getCommission());
                            driverService.updateById(driver1);
                            accountChangeDetailService.saveData(accountChangeDetail);
                            Revenue revenue = new Revenue();
                            revenue.setType(2);
                            revenue.setUserType(2);
                            revenue.setUserId(driver1.getId());
                            revenue.setOrderId(order.getId());
                            revenue.setAmount(num1);
                            revenue.setCreateTime(new Date());
                            revenueService.insert(revenue);
                        }
                        num3 = (num3 >= num1 ? num3 - num1 : 0);
                    }
                    //开始处理层级抽佣
                    if(null != driver.getInviterType() && driver.getInviterType() == 2){
                        Driver driver1 = driverService.selectById(driver.getInviterId());//一级司机
                        if(null != driver1.getInviterType() && driver1.getInviterType() == 2){
                            Driver driver2 = driverService.selectById(driver1.getInviterId());//二级司机
                            if(null != driver2.getInviterType() && driver2.getInviterType() == 2){
                                Driver driver3 = driverService.selectById(driver2.getInviterId());//三级级司机
                                Double num5 = jsonObject1.getDouble("num5");
                                Double num6 = jsonObject1.getDouble("num6");
                                Double num7 = jsonObject1.getDouble("num7");
                                num5 = (num3 >= num5 ? num5 : num3);
                                if(num5 > 0){
                                    Revenue revenue = new Revenue();
                                    revenue.setType(2);
                                    revenue.setUserType(2);
                                    revenue.setUserId(driver1.getId());
                                    revenue.setOrderId(order.getId());
                                    revenue.setAmount(num5);
                                    revenue.setCreateTime(new Date());
                                    revenueService.insert(revenue);
                                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                                    accountChangeDetail.setUserType(2);
                                    accountChangeDetail.setUserId(driver1.getId());
                                    accountChangeDetail.setType(1);
                                    accountChangeDetail.setChangeType(5);
                                    accountChangeDetail.setOldData(driver1.getCommission());
                                    accountChangeDetail.setExplain("订单分佣收入");
                                    accountChangeDetail.setCreateTime(new Date());
                                    driver1.setCommission(driver1.getCommission() + num5);
                                    accountChangeDetail.setNewData(driver1.getCommission());
                                    driverService.updateById(driver1);
                                    accountChangeDetailService.saveData(accountChangeDetail);
                                    num3 = (num3 >= num5 ? num3 - num5 : 0);
                                }
                                num6 = (num3 >= num6 ? num6 : num3);
                                if(num6 > 0){
                                    Revenue revenue = new Revenue();
                                    revenue.setType(2);
                                    revenue.setUserType(2);
                                    revenue.setUserId(driver2.getId());
                                    revenue.setOrderId(order.getId());
                                    revenue.setAmount(num6);
                                    revenue.setCreateTime(new Date());
                                    revenueService.insert(revenue);
                                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                                    accountChangeDetail.setUserType(2);
                                    accountChangeDetail.setUserId(driver2.getId());
                                    accountChangeDetail.setType(1);
                                    accountChangeDetail.setChangeType(5);
                                    accountChangeDetail.setOldData(driver2.getCommission());
                                    accountChangeDetail.setExplain("订单分佣收入");
                                    accountChangeDetail.setCreateTime(new Date());
                                    driver2.setCommission(driver2.getCommission() + num6);
                                    accountChangeDetail.setNewData(driver2.getCommission());
                                    driverService.updateById(driver2);
                                    accountChangeDetailService.saveData(accountChangeDetail);
                                    num3 = (num3 >= num6 ? num3 - num6 : 0);
                                }
                                num7 = (num3 >= num7 ? num7 : num3);
                                if(num7 > 0){
                                    Revenue revenue = new Revenue();
                                    revenue.setType(2);
                                    revenue.setUserType(2);
                                    revenue.setUserId(driver3.getId());
                                    revenue.setOrderId(order.getId());
                                    revenue.setAmount(num7);
                                    revenue.setCreateTime(new Date());
                                    revenueService.insert(revenue);
                                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                                    accountChangeDetail.setUserType(2);
                                    accountChangeDetail.setUserId(driver3.getId());
                                    accountChangeDetail.setType(1);
                                    accountChangeDetail.setChangeType(5);
                                    accountChangeDetail.setOldData(driver3.getCommission());
                                    accountChangeDetail.setExplain("订单分佣收入");
                                    accountChangeDetail.setCreateTime(new Date());
                                    driver3.setCommission(driver3.getCommission() + num7);
                                    accountChangeDetail.setNewData(driver3.getCommission());
                                    driverService.updateById(driver3);
                                    accountChangeDetailService.saveData(accountChangeDetail);
                                    num3 = (num3 >= num7 ? num3 - num7 : 0);
                                }
                            }else{
                                Double num3_ = jsonObject1.getDouble("num3");
                                Double num4 = jsonObject1.getDouble("num4");
                                num3_ = (num3 >= num3_ ? num3_ : num3);
                                if(num3_ > 0){
                                    Revenue revenue = new Revenue();
                                    revenue.setType(2);
                                    revenue.setUserType(2);
                                    revenue.setUserId(driver1.getId());
                                    revenue.setOrderId(order.getId());
                                    revenue.setAmount(num3_);
                                    revenue.setCreateTime(new Date());
                                    revenueService.insert(revenue);
                                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                                    accountChangeDetail.setUserType(2);
                                    accountChangeDetail.setUserId(driver1.getId());
                                    accountChangeDetail.setType(1);
                                    accountChangeDetail.setChangeType(5);
                                    accountChangeDetail.setOldData(driver1.getCommission());
                                    accountChangeDetail.setExplain("订单分佣收入");
                                    accountChangeDetail.setCreateTime(new Date());
                                    driver1.setCommission(driver1.getCommission() + num3_);
                                    accountChangeDetail.setNewData(driver1.getCommission());
                                    driverService.updateById(driver1);
                                    accountChangeDetailService.saveData(accountChangeDetail);
                                    num3 = (num3 >= num3_ ? num3 - num3_ : 0);
                                }
                                num4 = (num3 >= num4 ? num4 : num3);
                                if(num4 > 0){
                                    Revenue revenue = new Revenue();
                                    revenue.setType(2);
                                    revenue.setUserType(2);
                                    revenue.setUserId(driver2.getId());
                                    revenue.setOrderId(order.getId());
                                    revenue.setAmount(num4);
                                    revenue.setCreateTime(new Date());
                                    revenueService.insert(revenue);
                                    AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                                    accountChangeDetail.setUserType(2);
                                    accountChangeDetail.setUserId(driver2.getId());
                                    accountChangeDetail.setType(1);
                                    accountChangeDetail.setChangeType(5);
                                    accountChangeDetail.setOldData(driver2.getCommission());
                                    accountChangeDetail.setExplain("订单分佣收入");
                                    accountChangeDetail.setCreateTime(new Date());
                                    driver2.setCommission(driver2.getCommission() + num4);
                                    accountChangeDetail.setNewData(driver2.getCommission());
                                    driverService.updateById(driver2);
                                    accountChangeDetailService.saveData(accountChangeDetail);
                                    num3 = (num3 >= num4 ? num3 - num4 : 0);
                                }
                            }
                        }else{
                            Double num2_ = jsonObject1.getDouble("num2");
                            num2_ = (num3 >= num2_ ? num2_ : num3);
                            if(num2_ > 0){
                                Revenue revenue = new Revenue();
                                revenue.setType(2);
                                revenue.setUserType(2);
                                revenue.setUserId(driver1.getId());
                                revenue.setOrderId(order.getId());
                                revenue.setAmount(num2_);
                                revenue.setCreateTime(new Date());
                                revenueService.insert(revenue);
                                AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
                                accountChangeDetail.setUserType(2);
                                accountChangeDetail.setUserId(driver1.getId());
                                accountChangeDetail.setType(1);
                                accountChangeDetail.setChangeType(5);
                                accountChangeDetail.setOldData(driver1.getCommission());
                                accountChangeDetail.setExplain("订单分佣收入");
                                accountChangeDetail.setCreateTime(new Date());
                                driver1.setCommission(driver1.getCommission() + num2_);
                                accountChangeDetail.setNewData(driver1.getCommission());
                                driverService.updateById(driver1);
                                accountChangeDetailService.saveData(accountChangeDetail);
                                num3 = (num3 >= num2_ ? num3 - num2_ : 0);
                            }
                        }
                    }
                    //处理代理商抽佣
                    if(num3 > 0){
                        Revenue revenue = new Revenue();
                        revenue.setType(1);
                        revenue.setUserType(3);
                        revenue.setUserId(driver.getAgentId());
                        revenue.setOrderId(order.getId());
                        revenue.setAmount(num3);
                        revenue.setCreateTime(new Date());
                        revenueService.insert(revenue);
                    }
                }
            }
        }
        //司机余额扣减抽佣金额
        if(n > 0){
            AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
            accountChangeDetail.setUserType(2);
            accountChangeDetail.setUserId(driver.getId());
            accountChangeDetail.setType(1);
            accountChangeDetail.setChangeType(9);
            accountChangeDetail.setOrderId(order.getId());
            accountChangeDetail.setOldData(driver.getBalance());
            accountChangeDetail.setExplain("线下收款服务费支出");
            accountChangeDetail.setCreateTime(new Date());
            driver.setBalance(driver.getBalance() - n);
            accountChangeDetail.setNewData(driver.getBalance());
            driverService.updateById(driver);
            accountChangeDetailService.saveData(accountChangeDetail);
        }
    }
    /**
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/YouTuiDriverServiceImpl.java
@@ -65,6 +65,17 @@
        return driverYouTuiListWarppers;
    }
    /**
     * 获取司机兑换优推记录
     * @param driverId
     * @return
     * @throws Exception
     */
    @Override
    public List<DriverYouTuiWarpper> queryDriverYouTuiList1(Integer driverId) throws Exception {
        return this.baseMapper.queryYouTuiDriverList(driverId, null);
    }
    /**
     * 获取司机优推数据
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/PayMoneyUtil.java
@@ -77,9 +77,10 @@
    @Value("${callbackPath}")
    private String callbackPath;//支付回调网关地址
    private String wechatPayCertificatesFromPath = "E:\\项目文档\\超省新代驾\\1636941942_20230320_cert\\apiclient_cert.p12";//微信支付证书地址
    private String wechatPayCertificatesFromPath = "/usr/local/server/app/cert/weixin/apiclient_cert.p12";//微信支付证书地址
    private String privateKeyFromPath = "E:\\项目文档\\超省新代驾\\1636941942_20230320_cert\\apiclient_cert.pem";//微信私钥证书地址
    private String privateKeyFromPath = "/usr/local/server/app/cert/weixin/apiclient_cert.pem";//微信私钥证书地址
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/TaskUtil.java
@@ -1,6 +1,7 @@
package com.supersavedriving.driver.modular.system.util;
import com.supersavedriving.driver.modular.system.service.IAccountChangeDetailService;
import com.supersavedriving.driver.modular.system.service.IDriverService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
@@ -15,6 +16,9 @@
    @Autowired
    private IDriverService driverService;
    @Autowired
    private IAccountChangeDetailService accountChangeDetailService;
@@ -32,16 +36,17 @@
    }
//    /**
//     * 每天的凌晨执行的任务
//     */
//    @Scheduled(cron = "0 0 0 * * *")
//    public void taskDay(){
//        try {
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//    }
    /**
     * 每天的凌晨执行的任务
     */
    @Scheduled(cron = "0 0 0 * * *")
    public void taskDay(){
        try {
            accountChangeDetailService.deductionInsurance();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/rongyun/RongYunUtil.java
New file
@@ -0,0 +1,307 @@
package com.supersavedriving.driver.modular.system.util.rongyun;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.supersavedriving.driver.core.util.ToolUtil;
import com.supersavedriving.driver.modular.system.util.rongyun.model.CloudRecordingCallback;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.*;
import java.security.MessageDigest;
import java.util.Map;
/**
 * 融云及时通讯工具类
 */
@Component
public class RongYunUtil {
    @Value("${rongyun.app_key}")
    private String app_key;
    @Value("${rongyun.app_secret}")
    private String app_secret;
    /**
     * 注册获取token
     * @param userId
     * @param name
     * @param headUrl
     * @return
     * @throws Exception
     */
    public String getToken(String userId, String name, String headUrl) throws Exception {
        String url = "http://api-cn.ronghub.com/user/getToken.json";
        String data = "userId=" + userId + "&name=" + name + "&portraitUri=" + headUrl;
        String s = this.pushHttp(url, data);
        return s;
    }
    /**
     * 刷新用户信息
     * @param userId
     * @param name
     * @param headUrl
     * @throws Exception
     */
    public void refresh(String userId, String name, String headUrl) throws Exception {
        String url = "http://api-cn.ronghub.com/user/refresh.json";
        String data = "userId=" + userId + "&name=" + name + "&portraitUri=" + headUrl;
        String s = this.pushHttp(url, data);
    }
    /**
     * 检查用户在线状态
     * @param userId
     * @return  1:在线,0:离线
     * @throws Exception
     */
    public Integer  checkOnline(String userId) throws Exception {
        String url = "http://api-cn.ronghub.com/user/checkOnline.json";
        String data = "userId=" + userId;
        String s = this.pushHttp(url, data);
        JSONObject jsonObject = JSON.parseObject(s);
        if(jsonObject.getIntValue("code") == 200){
            return jsonObject.getIntValue("status");
        }
        return null;
    }
    /**
     * 发送普通消息
     * @param fromUserId
     * @param toUserId
     * @param objectName
     * @param content
     * @return
     */
    public String sendSms(String fromUserId, String toUserId, String objectName, String content){
        try {
            String url = "https://api-cn.ronghub.com/message/private/publish.json";
            String data = "fromUserId=" + URLEncoder.encode(fromUserId, "UTF-8") + "&toUserId=" + URLEncoder.encode(toUserId, "UTF-8") + "&objectName=" +
                    URLEncoder.encode(objectName, "UTF-8") + "&content=" + URLEncoder.encode(content, "UTF-8") + "&disablePush=0&isIncludeSender=1";
            String s = this.pushHttp(url, data);
            return s;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 创建 IM 聊天室
     * @param id        房间id长度不超过 64 字节
     * @param name      聊天室名称
     * @return
     */
    public Integer ChatRoomCreate(String id, String name){
        String url = "https://api-cn.ronghub.com/chatroom/create.json";
        String data = "chatroom[" + id + "]=" + name;
        String s = this.pushHttp(url, data);
        JSONObject jsonObject = JSON.parseObject(s);
        if(jsonObject.getIntValue("code") == 200){
            return jsonObject.getIntValue("status");
        }
        return null;
    }
    /**
     * 销毁聊天室
     * @param chatroomId    聊天室id
     * @return
     */
    public Integer ChatRoomDestroy(String chatroomId){
        String url = "https://api-cn.ronghub.com/chatroom/destroy.json";
        String data = "chatroomId=" + chatroomId;
        String s = this.pushHttp(url, data);
        JSONObject jsonObject = JSON.parseObject(s);
        if(jsonObject.getIntValue("code") == 200){
            return jsonObject.getIntValue("status");
        }
        return null;
    }
    /**
     * 更新聊天室属性
     * @param chatroomId    聊天室房间id
     * @param userId        更新用户id
     * @param k             更新属性名
     * @param v             更新值
     * @param autoDelete    用户退出聊天室后,是否删除此 Key 值。为 1 时删除此 Key 值,为 0 时用户退出后不删除此 Key,默认为 0
     * @param type          聊天室中对属性操作后发送通知的类型,1 为设置属性内容、2 为删除属性内容。
     * @param objectName    发送消息类型
     * @param extra         发送消息附加信息
     * @return
     */
    public Integer entryChatRoom(String chatroomId, String userId, String k, String v, Integer autoDelete, Integer type, String objectName, String extra){
        String url = "https://api-cn.ronghub.com/chatroom/destroy.json";
        String data = "chatroomId=" + chatroomId + "&userId=" + userId + "&key=" + k + "&value=" + v;
        if(ToolUtil.isNotEmpty(objectName)){//需要发送通知消息
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("type", type);//聊天室中对属性操作后发送通知的类型,1 为设置属性内容、2 为删除属性内容。
            jsonObject.put("key", k);//聊天室中属性名称,大小不超过 128 个字符。
            jsonObject.put("value", v);//属性对应的内容,大小不超过 4096 个字符。
            jsonObject.put("extra", extra);//通过消息中携带的附加信息,对应到设置属性接口中的 notificationExtra 值。
            data += "&objectName=" + objectName + "&content=" + jsonObject.toJSONString();
        }
        if(null != autoDelete){
            data += "&autoDelete=" + autoDelete;
        }
        String s = this.pushHttp(url, data);
        JSONObject jsonObject = JSON.parseObject(s);
        if(jsonObject.getIntValue("code") == 200){
            return jsonObject.getIntValue("status");
        }
        return null;
    }
    /**
     * 聊天室发送文本消息
     * @param userId        发送用户id
     * @param chatroomId    聊天室id
     * @param content       消息文本内容
     * @return
     */
    public Integer ChatRoomPushTxtMessage(String userId, String chatroomId, String content){
        String url = "https://api-cn.ronghub.com/chatroom/destroy.json";
        String data = "fromUserId=" + userId + "&toChatroomId=" + chatroomId + "&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");
        }
        return null;
    }
    /**
     * 请求接口
     * @param path
     * @param json
     * @return
     */
    public String pushHttp(String path, String json){
        String nonce = String.valueOf(Double.valueOf(Math.random() * 1000000.0D).intValue());
        String timeMillis = String.valueOf(System.currentTimeMillis() / 1000);
        String signature  = getSha1(app_secret + nonce + timeMillis);
        URL url = null;
        try {
            url = new URL(path);
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setRequestMethod("POST");
            connection.setConnectTimeout(1000 * 30);
            connection.setRequestProperty("Host", "api-cn.ronghub.com");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("App-Key", app_key);
            connection.setRequestProperty("Nonce", nonce);
            connection.setRequestProperty("Timestamp", timeMillis);
            connection.setRequestProperty("Signature", signature);
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.setInstanceFollowRedirects(true);
            connection.connect();
            DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
            outputStream.write(json.getBytes("UTF-8"));
            outputStream.flush();
            outputStream.close();
            int responseCode = connection.getResponseCode();
            InputStream inputStream = null;
            if(responseCode == 403){
                inputStream = connection.getErrorStream();
            }
            if(responseCode == 200){
                inputStream = connection.getInputStream();
            }
            DataInputStream dataInputStream = new DataInputStream(inputStream);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            int len;
            byte[] bytes = new byte[1024];
            while ((len = dataInputStream.read(bytes)) != -1){
                stream.write(bytes, 0, len);
            }
            return stream.toString();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static String getSha1(String str) {
        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) {
            return null;
        }
    }
    /**
     * 云端录制状态回调
     * @param request
     * @return
     */
    public static CloudRecordingCallback cloudRecordingCallback(HttpServletRequest request){
        String param = null;
        try {
            param = getParam(request);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(ToolUtil.isNotEmpty(param)){
            CloudRecordingCallback cloudRecordingCallback = JSON.parseObject(param, CloudRecordingCallback.class);
            return cloudRecordingCallback;
        }
        return null;
    }
    private static String getParam(HttpServletRequest request) throws IOException {
        // 读取参数
        InputStream inputStream;
        StringBuilder sb = new StringBuilder();
        inputStream = request.getInputStream();
        String s;
        BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        while ((s = in.readLine()) != null) {
            sb.append(s);
        }
        in.close();
        inputStream.close();
        return sb.toString();
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/rongyun/model/CloudRecordingCallback.java
New file
@@ -0,0 +1,75 @@
package com.supersavedriving.driver.modular.system.util.rongyun.model;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/4/6 10:29
 */
@Data
public class CloudRecordingCallback {
    /**
     * 时间戳,单位为毫秒。
     */
    private Long timestamp;
    /**
     *回调事件类型,如下:
     * 1: 录制开始;
     * 2: 录制切片;
     * 3: 录制结束;
     * 4: 文件上传
     */
    private Integer type;
    /**
     * 当前使用的 App Key
     */
    private String appKey;
    /**
     * 录制 ID,每次录制任务的唯一标识。如果文件切片,可以通过此 ID 进行关联。
     */
    private String recordId;
    /**
     * 房间 ID
     */
    private String roomId;
    /**
     * 会话 ID,每次通话的唯一标识。您可以通过融云服务端回调获取该 sessionId
     */
    private String sessionId;
    /**
     * 用户 ID。如果录制模式为 Mix,此字段为空
     */
    private String userId;
    /**
     * 录制模式,如下:
     * 0:音视频 single 模式;
     * 1:纯视频 single 模式;
     * 2:纯音频 single 模式;
     * 3:音视频 mix 模式;
     * 4:纯视频 mix 模式;
     * 5:纯音频 mix 模式;
     * 6:单人 mix 音视频模式。
     */
    private Integer mode;
    /**
     * 扩展字段,内容为手动录制时传入的 extra 字段的值
     */
    private String extra;
    /**
     * 状态码,200 为正常
     */
    private Integer code;
    /**
     * 错误信息。
     */
    private String errorMessage;
    /**
     *
     */
    private Config config;
    /**
     *
     */
    private Output output;
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/rongyun/model/Config.java
New file
@@ -0,0 +1,31 @@
package com.supersavedriving.driver.modular.system.util.rongyun.model;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/4/6 10:48
 */
@Data
public class Config {
    /**
     * 录制启动模式: 1 自动启动录制任务
     */
    private Integer trigger;
    /**
     * Mix模式下布局:2 悬浮布局(默认) 3 自适应布局
     */
    private Integer mixLayout;
    /**
     * 文件切片时间(分钟)
     */
    private Integer slicesMin;
    /**
     * 设置的音频文件格式
     */
    private String audioFormat;
    /**
     * 设置的视频文件格式
     */
    private String videoFormat;
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/rongyun/model/Output.java
New file
@@ -0,0 +1,31 @@
package com.supersavedriving.driver.modular.system.util.rongyun.model;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/4/6 10:50
 */
@Data
public class Output {
    /**
     * 缓存的文件名。具体请参考「配置云端录制服务」中的切片文件命名规则。
     */
    private String fileName;
    /**
     * 音频采样率,如 48000。如果当前录制任务没有录制音频,该字段为空。
     */
    private Integer audioSample;
    /**
     * 视频分辨率,如 640x480。如果当前录制任务没有录制视频,该字段为空。
     */
    private String videoResoulation;
    /**
     * 切片生成的录制文件大小。
     */
    private Integer fileSize;
    /**
     * 已上传到的第三方存储的 URL。
     */
    private String fileUrl;
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/DriverInfoWarpper.java
@@ -19,8 +19,8 @@
    private String name;
    @ApiModelProperty("电话")
    private String phone;
    @ApiModelProperty("优推开始时间")
    private Long youTuiStart;
    @ApiModelProperty("优推结束时间")
    private Long youTuiEnd;
    @ApiModelProperty("账户余额")
    private Double balance;
    @ApiModelProperty("佣金余额")
@@ -31,7 +31,7 @@
    private Integer todayNum;
    @ApiModelProperty("本月接单")
    private Integer monthNum;
    @ApiModelProperty("上班状态(0:没上班,1=一上班)")
    @ApiModelProperty("上班状态(0:没上班,1=已上班)")
    private Integer work;
    @ApiModelProperty("在线时长")
    private Integer online;
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/OrderInfoWarpper.java
@@ -45,6 +45,8 @@
    private Double estimatedPrice;
    @ApiModelProperty("预估里程")
    private Double estimatedMileage;
    @ApiModelProperty("预估时间")
    private Double estimatedTime;
    @ApiModelProperty("起步价")
    private Double startPrice;
    @ApiModelProperty("等待时长")
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/OrderPriceWarpper.java
@@ -52,6 +52,8 @@
    private Double overBadWeatherPrice;
    @ApiModelProperty("折扣金额")
    private Double discountAmount;
    @ApiModelProperty("优惠金额")
    private Double discountedPrice;
    @ApiModelProperty("微信收款码")
    private String wxCollectionCode;
    @ApiModelProperty("支付宝收款码")
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/OrderStatusWarpper.java
File was deleted
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/warpper/TokenWarpper.java
@@ -16,4 +16,6 @@
    private Long validTime;
    @ApiModelProperty(value = "是否设置密码(0=否,1=是)", required = true, dataType = "int")
    private Integer isSetPassword;
    @ApiModelProperty("融云token")
    private String rytoken;
}
driver/guns-admin/src/main/resources/application.yml
@@ -13,8 +13,8 @@
  application:
    name: driver-server
  profiles:
    active: dev
#    active: produce
#    active: dev
    active: produce
  mvc:
    static-path-pattern: /static/**
    view:
@@ -51,19 +51,12 @@
  base-package: com.supersavedriving.driver.modular
#spring:
#  datasource:
#    url: jdbc:mysql://Rm-wz9rpe0t74ys3b1h8go.mysql.rds.aliyuncs.com:3306/oktravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
#    username: root
#    password: Root2020!
#    db-name: guns #用来搜集数据库的所有表
#    filters: wall,mergeStat
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/super_save_driving?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    password: f4OfRjqoN3jSiNGiUoiNsQdOBtCOKYRj
#    password: 123456
    db-name: guns #用来搜集数据库的所有表
    filters: wall,mergeStat
@@ -84,8 +77,8 @@
wx:
  grantType: authorization_code #填authorization_code
  appid: wx36c966d381cd5d62 #应用唯一标识,在微信开放平台提交应用审核通过后获得
  appSecret: cf4b21c7175356f41fa3c426f26c20e4 #应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
  appid: wx8a9af3889395d0e1 #应用唯一标识,在微信开放平台提交应用审核通过后获得
  appSecret: 95a34f114973298cce4297a20bb59bc3 #应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
  appletsAppid: 1 #小程序APPid
  appletsAppSecret: 1 #
  mchId: 1636941942 #微信支付分配的商户号
@@ -108,14 +101,14 @@
---
filePath: /usr/local/server/orderPostionFile/ #存储订单轨迹文件路径
filePath: /usr/local/server/app/orderPostionFile/ #存储订单轨迹文件路径
#filePath: C:/orderPostionFile/  #存储订单轨迹文件路径
#支付回调地址
#正式环境
callbackPath: https://okyueche.com:443/user
#callbackPath: https://okyueche.com:443/user
#测试环境
#callbackPath: http://47.108.254.217:80/user
callbackPath: http://121.37.15.157:80/driver
---
@@ -123,4 +116,11 @@
spring:
  data:
    mongodb:
      uri: mongodb://127.0.0.1:27017/admin
      uri: mongodb://root:CEtyLdKjPk0yeHNo@127.0.0.1:27017/admin
#      uri: mongodb://127.0.0.1:27017/admin
---
rongyun:
  app_key: k51hidwqkx92b
  app_secret: t0jxbPrHHar
driver/guns-admin/src/main/resources/logback-spring.xml
@@ -7,8 +7,8 @@
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
    <!--<property name="log.path" value="/usr/local/server/logs"/>-->
    <property name="log.path" value="d:/logs/driver"/>
    <property name="log.path" value="/usr/local/server/app/logs"/>
    <!--<property name="log.path" value="d:/logs/driver"/>-->
    <!--0. 日志格式和颜色渲染 -->
    <!-- 彩色日志依赖的渲染类 -->
driver/guns-admin/src/main/resources/redis.properties
@@ -1,13 +1,21 @@
#redisÅäÖÿªÊ¼
# RedisÊý¾Ý¿âË÷Òý£¨Ä¬ÈÏΪ0£©
spring.redis.database=0
# Redis·þÎñÆ÷µØÖ·
spring.redis.host=127.0.0.1
# Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú
spring.redis.port=6379
spring.redis.port=16379
# Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£©
spring.redis.password=123456
#spring.redis.password=
spring.redis.password=cKsEeyffDXG5PzNg8CIbrWxFluXrCprZ
## Redis·þÎñÆ÷µØÖ·
#spring.redis.host=127.0.0.1
## Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú
#spring.redis.port=6379
## Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£©
#spring.redis.password=123456
# Á¬½Ó³Ø×î´óÁ¬½ÓÊý£¨Ê¹ÓøºÖµ±íʾûÓÐÏÞÖÆ£©
spring.redis.jedis.pool.max-active=1024
# Á¬½Ó³Ø×î´ó×èÈûµÈ´ýʱ¼ä£¨Ê¹ÓøºÖµ±íʾûÓÐÏÞÖÆ£©
eureka/pom.xml
@@ -14,7 +14,7 @@
    <name>eureka</name>
    <description>Eureka project for Spring Boot</description>
    <packaging>war</packaging>
    <packaging>jar</packaging>
    <properties>
        <java.version>1.8</java.version>
@@ -33,17 +33,17 @@
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-tomcat</artifactId>-->
            <!--<scope>provided</scope>-->
        <!--</dependency>-->
        <!--<dependency>-->
            <!--<groupId>javax.servlet</groupId>-->
            <!--<artifactId>javax.servlet-api</artifactId>-->
            <!--<version>3.1.0</version>-->
            <!--<scope>provided</scope>-->
        <!--</dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
eureka/src/main/java/com/sinata/eureka/EurekaApplication.java
@@ -8,15 +8,15 @@
@EnableEurekaServer//开启服务治理
@SpringBootApplication
public class EurekaApplication extends SpringBootServletInitializer {
public class EurekaApplication /*extends SpringBootServletInitializer*/ {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(EurekaApplication.class);
    }
//    @Override
//    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//        return builder.sources(EurekaApplication.class);
//    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/api/AppUserController.java
@@ -1,13 +1,19 @@
package com.supersavedriving.user.modular.api;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.supersavedriving.user.core.common.annotion.ServiceLog;
import com.supersavedriving.user.core.util.ToolUtil;
import com.supersavedriving.user.modular.system.model.AppUser;
import com.supersavedriving.user.modular.system.service.IAppUserService;
import com.supersavedriving.user.modular.system.service.IDriverService;
import com.supersavedriving.user.modular.system.model.SystemConfig;
import com.supersavedriving.user.modular.system.service.*;
import com.supersavedriving.user.modular.system.util.PayMoneyUtil;
import com.supersavedriving.user.modular.system.util.RedisUtil;
import com.supersavedriving.user.modular.system.util.ResultUtil;
import com.supersavedriving.user.modular.system.util.UUIDUtil;
import com.supersavedriving.user.modular.system.util.huawei.OBSUtil;
import com.supersavedriving.user.modular.system.util.huawei.SMSUtil;
import com.supersavedriving.user.modular.system.warpper.*;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -21,8 +27,11 @@
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;
/**
 * 用户控制器
@@ -36,6 +45,24 @@
    @Autowired
    private IDriverService driverService;
    @Autowired
    private ISystemConfigService systemConfigService;
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    @Autowired
    private IUserToCouponService userToCouponService;
    @Autowired
    private IAccountChangeDetailService accountChangeDetailService;
    @Autowired
    private IComplaintService complaintService;
    @Autowired
    private RedisUtil redisUtil;
@@ -155,6 +182,11 @@
            AppUser appUser = appUserService.selectById(uid);
            UserInfoWarpper userInfoWarpper = new UserInfoWarpper();
            BeanUtils.copyProperties(appUser, userInfoWarpper);
            SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 7));
            if(null != systemConfig){
                JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
                userInfoWarpper.setServiceCell(jsonObject.getString("num1"));
            }
            return ResponseWarpper.success(userInfoWarpper);
        }catch (Exception e){
            e.printStackTrace();
@@ -174,7 +206,7 @@
    public ResponseWarpper<String> uploadImg(MultipartFile file){
        try {
            InputStream inputStream = file.getInputStream();
            String name = file.getName();
            String name = file.getOriginalFilename();
            name = UUIDUtil.getRandomCode() + name.substring(name.lastIndexOf("."));
            String s = OBSUtil.putObjectToBucket(inputStream, name);
            return ResponseWarpper.success(s);
@@ -183,4 +215,321 @@
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/appUser/updateUserInfo")
//    @ServiceLog(name = "修改个人信息", url = "/api/appUser/updateUserInfo")
    @ApiOperation(value = "修改个人信息", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper updateUserInfo(UserInfo userInfo){
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            ResultUtil resultUtil = appUserService.updateUserInfo(uid, userInfo);
            return ResponseWarpper.success(resultUtil);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/appUser/queryPriceRules")
//    @ServiceLog(name = "获取价格表", url = "/api/appUser/queryPriceRules")
    @ApiOperation(value = "获取价格表", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<PriceRulesWarpper> queryPriceRules(){
        try {
            PriceRulesWarpper priceRulesWarpper = systemConfigService.queryPriceRules();
            return ResponseWarpper.success(priceRulesWarpper);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/appUser/queryTopUpPrompt")
//    @ServiceLog(name = "获取充值优惠提示", url = "/api/appUser/queryTopUpPrompt")
    @ApiOperation(value = "获取充值优惠提示", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<String> queryTopUpPrompt(){
        try {
            SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 6));
            if(null != systemConfig){
                JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
                return ResponseWarpper.success("充值满" + jsonObject.getDouble("num2") + "元,下单享9折优惠!");
            }
            return ResponseWarpper.success();
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/appUser/rechargeBalance")
//    @ServiceLog(name = "充值操作", url = "/api/appUser/rechargeBalance")
    @ApiOperation(value = "充值操作", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "充值金额", name = "amount", required = true, dataType = "double"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper rechargeBalance(Double amount){
        if(null == amount){
            return ResponseWarpper.success(ResultUtil.paranErr("amount"));
        }
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            ResultUtil resultUtil = appUserService.rechargeBalance(uid, amount);
            return ResponseWarpper.success(resultUtil);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/base/appUser/rechargeBalanceCallback")
//    @ServiceLog(name = "余额充值回调", url = "/base/appUser/rechargeBalanceCallback")
    public void rechargeBalanceCallback(HttpServletRequest request, HttpServletResponse response){
        try {
            Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
            if(null != map){
                String out_trade_no = map.get("out_trade_no");
                String transaction_id = map.get("transaction_id");
                String result = map.get("result");
                String orderId = out_trade_no.substring(17);
                appUserService.rechargeBalanceCallback(out_trade_no, transaction_id);
                PrintWriter out = response.getWriter();
                out.print(result);
                out.flush();
                out.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @ResponseBody
    @PostMapping("/api/appUser/queryMyCoupons")
//    @ServiceLog(name = "获取优惠券列表", url = "/api/appUser/queryMyCoupons")
    @ApiOperation(value = "获取优惠券列表", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "状态(1=未使用,2=已使用,3=已过期)", name = "state", required = true, dataType = "int"),
            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
            @ApiImplicitParam(value = "页条数", name = "pageSize", required = true, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<List<CouponsWarpper>> queryMyCoupons(Integer state, Integer pageNum, Integer pageSize){
        if(null == state){
            return ResponseWarpper.success(ResultUtil.paranErr("state"));
        }
        if(null == pageNum){
            return ResponseWarpper.success(ResultUtil.paranErr("pageNum"));
        }
        if(null == pageSize){
            return ResponseWarpper.success(ResultUtil.paranErr("pageSize"));
        }
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            List<CouponsWarpper> couponsWarppers = userToCouponService.queryMyCoupons(uid, state, pageNum, pageSize);
            return ResponseWarpper.success(couponsWarppers);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/appUser/queryUsedCouponNum")
//    @ServiceLog(name = "获取已使用优惠券数量", url = "/api/appUser/queryUsedCouponNum")
    @ApiOperation(value = "获取已使用优惠券数量", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<Integer> queryUsedCouponNum(){
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            Integer integer = userToCouponService.queryUsedCouponNum(uid);
            return ResponseWarpper.success(integer);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/appUser/queryBalanceDetails")
//    @ServiceLog(name = "获取余额明细", url = "/api/appUser/queryBalanceDetails")
    @ApiOperation(value = "获取余额明细", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "统计时间", name = "time", required = true, dataType = "string"),
            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
            @ApiImplicitParam(value = "页条数", name = "pageSize", required = true, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<List<BalanceDetailsWarpper>> queryBalanceDetails(String time, Integer pageNum, Integer pageSize){
        if(ToolUtil.isEmpty(time)){
            return ResponseWarpper.success(ResultUtil.paranErr("time"));
        }
        if(null == pageNum){
            return ResponseWarpper.success(ResultUtil.paranErr("pageNum"));
        }
        if(null == pageSize){
            return ResponseWarpper.success(ResultUtil.paranErr("pageSize"));
        }
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            List<BalanceDetailsWarpper> balanceDetailsWarppers = accountChangeDetailService.queryBalanceDetails(uid, time, pageNum, pageSize);
            return ResponseWarpper.success(balanceDetailsWarppers);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/appUser/cancelAccount")
//    @ServiceLog(name = "注销账号", url = "/api/appUser/cancelAccount")
    @ApiOperation(value = "注销账号", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper cancelAccount(){
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            AppUser appUser = appUserService.selectById(uid);
            appUser.setStatus(3);
            appUserService.updateById(appUser);
            return ResponseWarpper.success();
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/appUser/feedback")
//    @ServiceLog(name = "投诉反馈", url = "/api/appUser/feedback")
    @ApiOperation(value = "投诉反馈", tags = {"用户端-首页", "用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "订单id", name = "orderId", required = false, dataType = "int"),
            @ApiImplicitParam(value = "反馈内容", name = "content", required = true, dataType = "string"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper feedback(Integer orderId, String content){
        if(null == content){
            return ResponseWarpper.success(ResultUtil.paranErr("content"));
        }
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            complaintService.feedback(uid, orderId, content);
            return ResponseWarpper.success();
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/base/appUser/getVerificationCode")
//    @ServiceLog(name = "获取短信验证码", url = "/base/appUser/getVerificationCode")
    @ApiOperation(value = "获取短信验证码", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "国家代码+86", name = "receiver", required = true, dataType = "string"),
            @ApiImplicitParam(value = "电话号码", name = "phone", required = true, dataType = "string"),
    })
    public ResponseWarpper getVerificationCode(String receiver, String phone){
        if(ToolUtil.isEmpty(receiver)){
            return ResponseWarpper.success(ResultUtil.paranErr("receiver"));
        }
        if(ToolUtil.isEmpty(phone)){
            return ResponseWarpper.success(ResultUtil.paranErr("phone"));
        }
        try {
            String numberRandom = UUIDUtil.getNumberRandom(5);
            SMSUtil.send(phone, "1d0f0cbe5b214b0d8efa891730eb532a", "[\"" + numberRandom + "\"]");
            redisUtil.setStrValue(receiver + phone, numberRandom, 300);//5分钟有效期
            return ResponseWarpper.success(ResultUtil.success());
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/base/appUser/verifySMSCode")
//    @ServiceLog(name = "验证短信验证码", url = "/base/appUser/verifySMSCode")
    @ApiOperation(value = "验证短信验证码", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "电话号码", name = "phone", required = true, dataType = "String"),
            @ApiImplicitParam(value = "验证码", name = "code", required = true, dataType = "String"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper verifySMSCode(String phone, String code){
        if(ToolUtil.isEmpty(phone)){
            return ResponseWarpper.success(ResultUtil.paranErr("phone"));
        }
        if(ToolUtil.isEmpty(phone)){
            return ResponseWarpper.success(ResultUtil.paranErr("code"));
        }
        try {
            ResultUtil resultUtil = ResultUtil.success();
            phone = phone.indexOf("+86") < 0 ? "+86" + phone : phone;
            String value = redisUtil.getValue(phone);
            if(ToolUtil.isEmpty(value) || !value.equals(code)){
                resultUtil = ResultUtil.error("验证码无效");
            }
            redisUtil.remove(phone);
            return ResponseWarpper.success(resultUtil);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/api/OrderController.java
@@ -6,6 +6,7 @@
import com.supersavedriving.user.modular.system.model.AppUser;
import com.supersavedriving.user.modular.system.model.Order;
import com.supersavedriving.user.modular.system.service.IAppUserService;
import com.supersavedriving.user.modular.system.service.IBillService;
import com.supersavedriving.user.modular.system.service.IOrderService;
import com.supersavedriving.user.modular.system.util.PayMoneyUtil;
import com.supersavedriving.user.modular.system.util.ResultUtil;
@@ -44,6 +45,9 @@
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    @Autowired
    private IBillService billService;
@@ -171,6 +175,28 @@
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            OrderInfoWarpper orderInfoWarpper = orderService.queryOrderInfo(uid, orderId);
            return ResponseWarpper.success(orderInfoWarpper);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/base/order/queryShareOrderInfo")
//    @ServiceLog(name = "获取订单详情", url = "/base/order/queryShareOrderInfo")
    @ApiOperation(value = "获取订单详情", tags = {"用户端-分享"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "long"),
    })
    public ResponseWarpper<OrderInfoWarpper> queryOrderInfo1(Long orderId){
        if(null == orderId){
            return ResponseWarpper.success(ResultUtil.paranErr("orderId"));
        }
        try {
            OrderInfoWarpper orderInfoWarpper = orderService.queryOrderInfo(null, orderId);
            return ResponseWarpper.success(orderInfoWarpper);
        }catch (Exception e){
            e.printStackTrace();
@@ -365,5 +391,108 @@
        }
    }
    @ResponseBody
    @PostMapping("/api/order/queryMyOrder")
//    @ServiceLog(name = "获取我的行程", url = "/api/order/queryMyOrder")
    @ApiOperation(value = "获取我的行程", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
            @ApiImplicitParam(value = "页条数", name = "pageSize", required = true, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<List<OrderListWarpper>> queryMyOrder(Integer pageNum, Integer pageSize){
        if(null == pageNum){
            return ResponseWarpper.success(ResultUtil.paranErr("pageNum"));
        }
        if(null == pageSize){
            return ResponseWarpper.success(ResultUtil.paranErr("pageSize"));
        }
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            List<OrderListWarpper> orderListWarppers = orderService.queryMyOrder(uid, pageNum, pageSize);
            return ResponseWarpper.success(orderListWarppers);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/order/queryNotInvoiceOrder")
//    @ServiceLog(name = "获取未开票订单列表", url = "/api/order/queryNotInvoiceOrder")
    @ApiOperation(value = "获取未开票订单列表", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<List<OrderListWarpper>> queryNotInvoiceOrder(NotInvoiceOrder notInvoiceOrder){
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            List<OrderListWarpper> orderListWarppers = orderService.queryNotInvoiceOrder(uid, notInvoiceOrder);
            return ResponseWarpper.success(orderListWarppers);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/order/invoicing")
//    @ServiceLog(name = "开票操作", url = "/api/order/invoicing")
    @ApiOperation(value = "开票操作", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper invoicing(Invoicing invoicing){
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            ResultUtil invoicing1 = billService.invoicing(uid, invoicing);
            return ResponseWarpper.success(invoicing1);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
    @ResponseBody
    @PostMapping("/api/order/queryBillList")
//    @ServiceLog(name = "获取开票历史", url = "/api/order/queryBillList")
    @ApiOperation(value = "获取开票历史", tags = {"用户端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
            @ApiImplicitParam(value = "页条数", name = "pageSize", required = true, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResponseWarpper<List<BillWarpper>> queryBillList(Integer pageNum, Integer pageSize){
        if(null == pageNum){
            return ResponseWarpper.success(ResultUtil.paranErr("pageNum"));
        }
        if(null == pageSize){
            return ResponseWarpper.success(ResultUtil.paranErr("pageSize"));
        }
        try {
            Integer uid = appUserService.getUserByRequest();
            if(null == uid){
                return ResponseWarpper.success(ResultUtil.tokenErr());
            }
            List<BillWarpper> billWarppers = billService.queryBillList(uid, pageNum, pageSize);
            return ResponseWarpper.success(billWarppers);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseWarpper(500, e.getMessage());
        }
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/AccountChangeDetailMapper.java
@@ -2,10 +2,26 @@
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.supersavedriving.user.modular.system.model.AccountChangeDetail;
import com.supersavedriving.user.modular.system.warpper.BalanceDetailsWarpper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author zhibing.pu
 * @date 2023/3/4 11:33
 */
public interface AccountChangeDetailMapper extends BaseMapper<AccountChangeDetail> {
    /**
     * 获取余额明细
     * @param uid
     * @param time
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<BalanceDetailsWarpper> queryBalanceDetails(@Param("uid") Integer uid, @Param("time") String time,
                                                    @Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize);
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/BillMapper.java
New file
@@ -0,0 +1,25 @@
package com.supersavedriving.user.modular.system.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.supersavedriving.user.modular.system.model.Bill;
import com.supersavedriving.user.modular.system.warpper.BillWarpper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author zhibing.pu
 * @date 2023/3/24 10:04
 */
public interface BillMapper extends BaseMapper<Bill> {
    /**
     * 获取开票记录
     * @param uid
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<BillWarpper> queryBillList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize);
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/ComplaintMapper.java
New file
@@ -0,0 +1,11 @@
package com.supersavedriving.user.modular.system.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.supersavedriving.user.modular.system.model.Complaint;
/**
 * @author zhibing.pu
 * @date 2023/3/24 16:05
 */
public interface ComplaintMapper extends BaseMapper<Complaint> {
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/OrderMapper.java
@@ -2,8 +2,12 @@
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.supersavedriving.user.modular.system.model.Order;
import com.supersavedriving.user.modular.system.warpper.NotInvoiceOrder;
import com.supersavedriving.user.modular.system.warpper.OrderInfoWarpper;
import com.supersavedriving.user.modular.system.warpper.OrderListWarpper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface OrderMapper extends BaseMapper<Order> {
@@ -15,4 +19,23 @@
     * @return
     */
    OrderInfoWarpper queryOrderInfo(@Param("uid") Integer uid, @Param("orderId") Long orderId);
    /**
     * 获取乘客行程订单
     * @param uid
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<OrderListWarpper> queryMyOrder(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
                                        @Param("pageSize") Integer pageSize);
    /**
     * 获取未开票订单
     * @param uid
     * @return
     */
    List<OrderListWarpper> queryNotInvoiceOrder(@Param("uid") Integer uid, @Param("notInvoiceOrder") NotInvoiceOrder notInvoiceOrder);
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/RechargeRecordMapper.java
New file
@@ -0,0 +1,11 @@
package com.supersavedriving.user.modular.system.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.supersavedriving.user.modular.system.model.RechargeRecord;
/**
 * @author zhibing.pu
 * @date 2023/3/23 14:55
 */
public interface RechargeRecordMapper extends BaseMapper<RechargeRecord> {
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/UserToCouponMapper.java
@@ -4,6 +4,7 @@
import com.supersavedriving.user.modular.system.model.Coupon;
import com.supersavedriving.user.modular.system.model.UserToCoupon;
import com.supersavedriving.user.modular.system.warpper.CouponWarpper;
import com.supersavedriving.user.modular.system.warpper.CouponsWarpper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -32,4 +33,24 @@
     * @return
     */
    List<CouponWarpper> queryPayCouponList(@Param("uid") Integer uid, @Param("price") Double price);
    /**
     * 获取用户优惠券列表
     * @param uid
     * @param state
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<CouponsWarpper> queryMyCoupons(@Param("uid") Integer uid, @Param("state") Integer state,
                                        @Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize);
    /**
     * 获取已使用优惠券数量
     * @param uid
     * @return
     */
    Integer queryUsedCouponNum(@Param("uid") Integer uid);
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/AccountChangeDetailMapper.xml
@@ -5,13 +5,35 @@
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.supersavedriving.user.modular.system.model.AccountChangeDetail">
        <id column="id" property="id"/>
        <result column="code" property="code"/>
        <result column="userType" property="userType"/>
        <result column="userId" property="userId"/>
        <result column="type" property="type"/>
        <result column="changeType" property="changeType"/>
        <result column="oldData" property="oldData"/>
        <result column="newData" property="newData"/>
        <result column="orderId" property="orderId"/>
        <result column="explain" property="explain"/>
        <result column="createTime" property="createTime"/>
    </resultMap>
    <select id="queryBalanceDetails" resultType="com.supersavedriving.user.modular.system.warpper.BalanceDetailsWarpper">
        select
        a.changeType as type,
        a.`explain`,
        b.startAddress,
        b.endAddress,
        UNIX_TIMESTAMP(a.createTime) * 1000 as createTime,
        (a.newData - a.oldData) as amount,
        a.newData as balance
        from t_account_change_detail a
        left join t_order b on (a.orderId = b.id)
        where a.userType = 1 and a.userId = #{uid}
        <if test="null != time and '' != time">
            and DATE_FORMAT(a.createTime, '%Y年%m月') = #{time}
        </if>
        order by a.createTime desc limit #{pageNum}, #{pageSize}
    </select>
</mapper>
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/BillMapper.xml
New file
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.supersavedriving.user.modular.system.dao.BillMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.supersavedriving.user.modular.system.model.Bill">
        <id column="id" property="id"/>
        <result column="userId" property="userId"/>
        <result column="orderId" property="orderId"/>
        <result column="billType" property="billType"/>
        <result column="billHeaderType" property="billHeaderType"/>
        <result column="companyName" property="companyName"/>
        <result column="companyTaxNumber" property="companyTaxNumber"/>
        <result column="billContent" property="billContent"/>
        <result column="moreContent" property="moreContent"/>
        <result column="billAmount" property="billAmount"/>
        <result column="addresseeName" property="addresseeName"/>
        <result column="addresseePhone" property="addresseePhone"/>
        <result column="addresseeEmail" property="addresseeEmail"/>
        <result column="state" property="state"/>
        <result column="createTime" property="createTime"/>
    </resultMap>
    <select id="queryBillList" resultType="com.supersavedriving.user.modular.system.warpper.BillWarpper">
        select
        id,
        billType,
        billContent,
        billAmount,
        state,
        UNIX_TIMESTAMP(createTime) * 1000 as createTime
        from t_bill where userId = #{uid} order by createTime desc limit #{pageNum}, #{pageSize}
    </select>
</mapper>
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/ComplaintMapper.xml
New file
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.supersavedriving.user.modular.system.dao.ComplaintMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.supersavedriving.user.modular.system.model.Complaint">
        <id column="id" property="id"/>
        <result column="userId" property="userId"/>
        <result column="orderId" property="orderId"/>
        <result column="driverId" property="driverId"/>
        <result column="reason" property="reason"/>
        <result column="notes" property="notes"/>
        <result column="state" property="state"/>
        <result column="status" property="status"/>
        <result column="createTime" property="createTime"/>
        <result column="auditId" property="auditId"/>
        <result column="auditPersonName" property="auditPersonName"/>
        <result column="auditTime" property="auditTime"/>
    </resultMap>
</mapper>
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/OrderMapper.xml
@@ -58,6 +58,7 @@
        <result column="startWaitTime" property="startWaitTime"/>
        <result column="state" property="state" />
        <result column="oldState" property="oldState"/>
        <result column="isInvoice" property="isInvoice"/>
        <result column="status" property="status" />
        <result column="createTime" property="createTime" />
    </resultMap>
@@ -74,6 +75,7 @@
        a.endAddress,
        a.endLat,
        a.endLng,
        b.id as driverId,
        b.avatar as driverAvatar,
        b.`name` as driverName,
        b.phone as driverPhone,
@@ -81,9 +83,48 @@
        (DATE_FORMAT(now(), '%Y') - DATE_FORMAT(b.firstCertificateTime, '%Y')) as driverAge,
        (select count(1) from t_order where driverId = b.id and `status` = 1 and state in (107, 108, 109)) as driverNumber,
        b.score as driverScore,
        a.state
        a.state,
        UNIX_TIMESTAMP(a.createTime) * 1000 as createTime,
        c.score as evaluationScore,
        c.evaluate as evaluationContent
        from t_order a
        left join t_driver b on (a.driverId = b.id)
        left join t_evaluate c on (a.id = c.orderId)
        where a.id = #{orderId}
    </select>
    <select id="queryMyOrder" resultType="com.supersavedriving.user.modular.system.warpper.OrderListWarpper">
        select
        id,
        '超省新代驾' as title,
        startAddress,
        endAddress,
        state,
        UNIX_TIMESTAMP(createTime) * 1000 as createTime
        from t_order
        where `status` = 1 and userId = #{uid} order by createTime desc limit #{pageNum}, #{pageSize}
    </select>
    <select id="queryNotInvoiceOrder" resultType="com.supersavedriving.user.modular.system.warpper.OrderListWarpper">
        select
        id,
        '超省新代驾' as title,
        startAddress,
        endAddress,
        state,
        UNIX_TIMESTAMP(createTime) * 1000 as createTime,
        payMoney as amount
        from t_order
        where `status` = 1 and isInvoice != 1 and state in (108, 109) and userId = #{uid}
        <if test="null != notInvoiceOrder.startTime and '' != notInvoiceOrder.startTime and null != notInvoiceOrder.endTime and '' != notInvoiceOrder.endTime">
            and DATE_FORMAT(createTime, '%Y-%m-%d') between #{notInvoiceOrder.startTime} and #{notInvoiceOrder.endTime}
        </if>
        <if test="null != notInvoiceOrder.startAmount and null != notInvoiceOrder.endAmount">
            and payMoney between #{notInvoiceOrder.startAmount} and #{notInvoiceOrder.endAmount}
        </if>
        order by createTime desc limit #{notInvoiceOrder.pageNum}, #{notInvoiceOrder.pageSize}
    </select>
</mapper>
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/RechargeRecordMapper.xml
New file
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.supersavedriving.user.modular.system.dao.RechargeRecordMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.supersavedriving.user.modular.system.model.RechargeRecord">
        <id column="id" property="id" />
        <result column="type" property="type" />
        <result column="userId" property="userId" />
        <result column="code" property="code" />
        <result column="amount" property="amount"/>
        <result column="payType" property="payType" />
        <result column="payTime" property="payTime" />
        <result column="payStatus" property="payStatus" />
        <result column="orderNumber" property="orderNumber" />
        <result column="createTime" property="createTime" />
        <result column="agentId" property="agentId" />
    </resultMap>
</mapper>
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/dao/mapping/UserToCouponMapper.xml
@@ -19,7 +19,20 @@
    <select id="queryCoupon" resultType="com.supersavedriving.user.modular.system.model.Coupon">
        select
        b.id,
        a.*
        a.agent_id as agentId,
        a.branch_office_id as branchOfficeId,
        a.create_time as createTime,
        a.coupon_name as couponName,
        a.coupon_type as couponType,
        a.coupon_code as couponCode,
        a.coupon_service_type as couponServiceType,
        a.coupon_conditional_amount as couponConditionalAmount,
        a.coupon_preferential_amount as couponPreferentialAmount,
        a.coupon_validity as couponValidity,
        a.coupon_send_quantity as couponSendQuantity,
        a.coupon_state as couponState,
        a.coupon_count as couponCount,
        a.remaining_quantity as remainingQuantity
        from t_coupon a
        left join t_user_to_coupon b on (a.id = b.couponId)
        where b.status = 1 and b.expireTime > now() and b.validCount &gt; 0
@@ -41,4 +54,32 @@
        where b.userId = #{uid}  and b.validCount > 0 and b.expireTime > now() and
        a.coupon_conditional_amount &lt;= #{price} and a.coupon_preferential_amount &lt; #{price} order by b.createTime
    </select>
    <select id="queryMyCoupons" resultType="com.supersavedriving.user.modular.system.warpper.CouponsWarpper">
        select
        a.id,
        b.coupon_name as `name`,
        b.coupon_conditional_amount as preferentialTerms,
        b.coupon_preferential_amount as discountAmount,
        UNIX_TIMESTAMP(a.expireTime) * 1000 as endTime
        from t_user_to_coupon a
        left join t_coupon b on (a.couponId = b.id)
        where a.`status` = 1 and a.userId = #{uid}
        <if test="null != state and 1 == state">
            and a.couponTotal = a.validCount and now() &lt; a.expireTime
        </if>
        <if test="null != state and 2 == state">
            and a.couponTotal != a.validCount and now() &lt; a.expireTime
        </if>
        <if test="null != state and 3 == state">
            and now() &gt;= a.expireTime
        </if>
        order by a.createTime desc limit #{pageNum}, #{pageSize}
    </select>
    <select id="queryUsedCouponNum" resultType="int">
        select sum(couponTotal - validCount) from t_user_to_coupon where `status` = 1 and userId = #{uid}
    </select>
</mapper>
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/AccountChangeDetail.java
@@ -23,6 +23,11 @@
    @TableField("id")
    private Integer id;
    /**
     * 编号
     */
    @TableField("code")
    private String code;
    /**
     * 用户类型(1=用户,2=司机)
     */
    @TableField("userType")
@@ -53,6 +58,11 @@
    @TableField("newData")
    private Double newData;
    /**
     * 订单id
     */
    @TableField("orderId")
    private Long orderId;
    /**
     * 变动说明
     */
    @TableField("explain")
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/Bill.java
New file
@@ -0,0 +1,94 @@
package com.supersavedriving.user.modular.system.model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import java.util.Date;
/**
 * @author zhibing.pu
 * @date 2023/3/24 9:59
 */
@Data
@TableName("t_bill")
public class Bill {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    @TableField("id")
    private Integer id;
    /**
     * 用户id
     */
    @TableField("userId")
    private Integer userId;
    /**
     * 订单id
     */
    @TableField("orderId")
    private Integer orderId;
    /**
     * 发票类型 1电子发票
     */
    @TableField("billType")
    private Integer billType;
    /**
     * 发票抬头 1公司 2个人
     */
    @TableField("billHeaderType")
    private Integer billHeaderType;
    /**
     * 公司名称/个人抬头名称
     */
    @TableField("companyName")
    private String companyName;
    /**
     * 公司税号
     */
    @TableField("companyTaxNumber")
    private String companyTaxNumber;
    /**
     * 发票内容
     */
    @TableField("billContent")
    private String billContent;
    /**
     * 更多内容
     */
    @TableField("moreContent")
    private String moreContent;
    /**
     * 发票金额
     */
    @TableField("billAmount")
    private Double billAmount;
    /**
     * 收件人姓名
     */
    @TableField("addresseeName")
    private String addresseeName;
    /**
     * 收件人电话
     */
    @TableField("addresseePhone")
    private String addresseePhone;
    /**
     * 收件人邮箱
     */
    @TableField("addresseeEmail")
    private String addresseeEmail;
    /**
     * 开票状态 1待开票 2已开票 3开票失败
     */
    @TableField("state")
    private Integer state;
    /**
     * 添加时间
     */
    @TableField("createTime")
    private Date createTime;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/Complaint.java
New file
@@ -0,0 +1,79 @@
package com.supersavedriving.user.modular.system.model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import java.util.Date;
/**
 * @author zhibing.pu
 * @date 2023/3/24 11:58
 */
@Data
@TableName("t_complaint")
public class Complaint {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    @TableField("id")
    private Integer id;
    /**
     * 用户id
     */
    @TableField("userId")
    private Integer userId;
    /**
     * 订单id
     */
    @TableField("orderId")
    private Integer orderId;
    /**
     * 司机id
     */
    @TableField("driverId")
    private Integer driverId;
    /**
     * 投诉原因
     */
    @TableField("reason")
    private String reason;
    /**
     * 注释
     */
    @TableField("notes")
    private String notes;
    /**
     * 处理状态(1=待处理,2=已处理)
     */
    @TableField("state")
    private Integer state;
    /**
     * 状态(1=正常,2=冻结,3=删除)
     */
    @TableField("status")
    private Integer status;
    /**
     * 添加时间
     */
    @TableField("createTime")
    private Date createTime;
    /**
     * 处理人id
     */
    @TableField("auditId")
    private Integer auditId;
    /**
     * 处理人名称
     */
    @TableField("auditPersonName")
    private String auditPersonName;
    /**
     * 处理时间
     */
    @TableField("auditTime")
    private Date auditTime;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/Order.java
@@ -288,6 +288,11 @@
    @TableField("oldState")
    private Integer oldState;
    /**
     * 是否已开发票(0=否,1=是)
     */
    @TableField("isInvoice")
    private Integer isInvoice;
    /**
     * 状态(1=正常,2=冻结,3=删除)
     */
    @TableField("status")
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/model/RechargeRecord.java
New file
@@ -0,0 +1,74 @@
package com.supersavedriving.user.modular.system.model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import java.util.Date;
/**
 * @author zhibing.pu
 * @date 2023/3/21 23:08
 */
@Data
@TableName("t_recharge_record")
public class RechargeRecord {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    @TableField("id")
    private Integer id;
    /**
     * 数据类型(1=用户,2=司机,3=代理商)
     */
    @TableField("type")
    private Integer type;
    /**
     * 用户id
     */
    @TableField("userId")
    private Integer userId;
    /**
     * 流水号
     */
    @TableField("code")
    private String code;
    /**
     * 充值金额
     */
    @TableField("amount")
    private Double amount;
    /**
     * 支付方式(1=微信,2=系统充值)
     */
    @TableField("payType")
    private Integer payType;
    /**
     * 完成支付时间
     */
    @TableField("payTime")
    private Date payTime;
    /**
     * 支付状态(1=待支付,2=已完成)
     */
    @TableField("payStatus")
    private Integer payStatus;
    /**
     * 第三方流水号
     */
    @TableField("orderNumber")
    private String orderNumber;
    /**
     * 添加时间
     */
    @TableField("createTime")
    private Date createTime;
    /**
     * 代理商id
     */
    @TableField("agentId")
    private Integer agentId;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IAccountChangeDetailService.java
@@ -2,6 +2,9 @@
import com.baomidou.mybatisplus.service.IService;
import com.supersavedriving.user.modular.system.model.AccountChangeDetail;
import com.supersavedriving.user.modular.system.warpper.BalanceDetailsWarpper;
import java.util.List;
/**
 * @author zhibing.pu
@@ -16,4 +19,16 @@
     * @throws Exception
     */
    void saveData(AccountChangeDetail accountChangeDetail) throws Exception;
    /**
     * 获取余额明细
     * @param uid
     * @param time
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    List<BalanceDetailsWarpper> queryBalanceDetails(Integer uid, String time, Integer pageNum, Integer pageSize) throws Exception;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IAppUserService.java
@@ -3,10 +3,13 @@
import com.baomidou.mybatisplus.service.IService;
import com.supersavedriving.user.modular.system.model.AppUser;
import com.supersavedriving.user.modular.system.util.ResultUtil;
import com.supersavedriving.user.modular.system.warpper.CouponsWarpper;
import com.supersavedriving.user.modular.system.warpper.SignInToRegister;
import com.supersavedriving.user.modular.system.warpper.SignInToRegisterWarpper;
import com.supersavedriving.user.modular.system.warpper.UserInfo;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
public interface IAppUserService extends IService<AppUser> {
@@ -35,4 +38,45 @@
     * @return
     */
    Integer getUserByRequest() throws Exception;
    /**
     * 修改个人信息
     * @param userInfo
     * @return
     * @throws Exception
     */
    ResultUtil updateUserInfo(Integer uid, UserInfo userInfo) throws Exception;
    /**
     * 余额充值
     * @param uid
     * @param amount
     * @return
     * @throws Exception
     */
    ResultUtil rechargeBalance(Integer uid, Double amount) throws Exception;
    /**
     * 余额充值回调处理
     * @param out_trade_no
     * @param transaction_id
     * @return
     * @throws Exception
     */
    void rechargeBalanceCallback(String out_trade_no, String transaction_id) throws Exception;
    /**
     * 获取用户优惠券列表
     * @param uid
     * @param state
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    List<CouponsWarpper> queryMyCoupons(Integer uid, Integer state, Integer pageNum, Integer pageSize) throws Exception;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IBillService.java
New file
@@ -0,0 +1,37 @@
package com.supersavedriving.user.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.supersavedriving.user.modular.system.model.Bill;
import com.supersavedriving.user.modular.system.util.ResultUtil;
import com.supersavedriving.user.modular.system.warpper.BillWarpper;
import com.supersavedriving.user.modular.system.warpper.Invoicing;
import java.util.List;
/**
 * @author zhibing.pu
 * @date 2023/3/24 10:07
 */
public interface IBillService extends IService<Bill> {
    /**
     * 开票操作
     * @param uid
     * @param invoicing
     * @return
     * @throws Exception
     */
    ResultUtil invoicing(Integer uid, Invoicing invoicing) throws Exception;
    /**
     * 获取开票记录
     * @param uid
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    List<BillWarpper> queryBillList(Integer uid, Integer pageNum, Integer pageSize) throws Exception;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IComplaintService.java
New file
@@ -0,0 +1,20 @@
package com.supersavedriving.user.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.supersavedriving.user.modular.system.model.Complaint;
/**
 * @author zhibing.pu
 * @date 2023/3/24 16:07
 */
public interface IComplaintService extends IService<Complaint> {
    /**
     * 投诉反馈
     * @param orderId
     * @param content
     * @throws Exception
     */
    void feedback(Integer uid, Integer orderId, String content) throws Exception;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IOrderService.java
@@ -129,4 +129,24 @@
     * @throws Exception
     */
    ResultUtil orderAppraise(Integer uid, Long orderId, Integer score, String content) throws Exception;
    /**
     * 获取用户行程记录
     * @param uid
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    List<OrderListWarpper> queryMyOrder(Integer uid, Integer pageNum, Integer pageSize) throws Exception;
    /**
     * 获取未开票订单
     * @param uid
     * @return
     * @throws Exception
     */
    List<OrderListWarpper> queryNotInvoiceOrder(Integer uid, NotInvoiceOrder notInvoiceOrder) throws Exception;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IRechargeRecordService.java
New file
@@ -0,0 +1,11 @@
package com.supersavedriving.user.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.supersavedriving.user.modular.system.model.RechargeRecord;
/**
 * @author zhibing.pu
 * @date 2023/3/23 14:56
 */
public interface IRechargeRecordService extends IService<RechargeRecord> {
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/ISystemConfigService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.service.IService;
import com.supersavedriving.user.modular.system.model.SystemConfig;
import com.supersavedriving.user.modular.system.warpper.PriceRulesWarpper;
/**
* 系统配置
@@ -9,4 +10,12 @@
* @Date 2023/2/15 16:26
*/
public interface ISystemConfigService extends IService<SystemConfig> {
    /**
     * 获取价格表
     * @return
     * @throws Exception
     */
    PriceRulesWarpper queryPriceRules() throws Exception;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/IUserToCouponService.java
@@ -4,6 +4,7 @@
import com.supersavedriving.user.modular.system.model.Coupon;
import com.supersavedriving.user.modular.system.model.UserToCoupon;
import com.supersavedriving.user.modular.system.warpper.CouponWarpper;
import com.supersavedriving.user.modular.system.warpper.CouponsWarpper;
import java.util.List;
@@ -27,9 +28,28 @@
    /**
     * 获取订单支付页面的可用优惠券列表
     * @param uid
     * @param orderId
     * @return
     * @throws Exception
     */
    List<CouponWarpper> queryPayCouponList(Integer uid, Double price) throws Exception;
    /**
     * 获取用户优惠券列表
     * @param uid
     * @param state
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    List<CouponsWarpper> queryMyCoupons(Integer uid, Integer state, Integer pageNum, Integer pageSize) throws Exception;
    /**
     * 获取已使用优惠券数量
     * @param uid
     * @return
     */
    Integer queryUsedCouponNum(Integer uid);
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/AccountChangeDetailServiceImpl.java
@@ -4,9 +4,11 @@
import com.supersavedriving.user.modular.system.dao.AccountChangeDetailMapper;
import com.supersavedriving.user.modular.system.model.AccountChangeDetail;
import com.supersavedriving.user.modular.system.service.IAccountChangeDetailService;
import com.supersavedriving.user.modular.system.warpper.BalanceDetailsWarpper;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
 * 账户变动
@@ -27,4 +29,20 @@
        accountChangeDetail.setCreateTime(new Date());
        this.baseMapper.insert(accountChangeDetail);
    }
    /**
     * 获取余额明细
     * @param uid
     * @param time
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    @Override
    public List<BalanceDetailsWarpper> queryBalanceDetails(Integer uid, String time, Integer pageNum, Integer pageSize) throws Exception {
        pageNum = (pageNum - 1) * pageSize;
        return this.baseMapper.queryBalanceDetails(uid, time, pageNum, pageSize);
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/AppUserServiceImpl.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.domain.RechargeDetail;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.user.core.common.constant.JwtConstants;
@@ -10,20 +11,16 @@
import com.supersavedriving.user.core.util.JwtTokenUtil;
import com.supersavedriving.user.core.util.ToolUtil;
import com.supersavedriving.user.modular.system.dao.AppUserMapper;
import com.supersavedriving.user.modular.system.model.AppUser;
import com.supersavedriving.user.modular.system.model.Coupon;
import com.supersavedriving.user.modular.system.model.UserToCoupon;
import com.supersavedriving.user.modular.system.service.IAppUserService;
import com.supersavedriving.user.modular.system.service.ICouponService;
import com.supersavedriving.user.modular.system.service.IUserToCouponService;
import com.supersavedriving.user.modular.system.model.*;
import com.supersavedriving.user.modular.system.service.*;
import com.supersavedriving.user.modular.system.util.PayMoneyUtil;
import com.supersavedriving.user.modular.system.util.RedisUtil;
import com.supersavedriving.user.modular.system.util.ResultUtil;
import com.supersavedriving.user.modular.system.util.UUIDUtil;
import com.supersavedriving.user.modular.system.util.weChat.WXCore;
import com.supersavedriving.user.modular.system.util.weChat.WeChatUtil;
import com.supersavedriving.user.modular.system.util.weChat.model.Code2Session;
import com.supersavedriving.user.modular.system.warpper.CouponWarpper;
import com.supersavedriving.user.modular.system.warpper.SignInToRegister;
import com.supersavedriving.user.modular.system.warpper.SignInToRegisterWarpper;
import com.supersavedriving.user.modular.system.warpper.*;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
@@ -35,6 +32,7 @@
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -60,6 +58,15 @@
    @Autowired
    private IUserToCouponService userToCouponService;
    @Autowired
    private IRechargeRecordService rechargeRecordService;
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    @Autowired
    private IAccountChangeDetailService accountChangeDetailService;
    @Override
@@ -69,12 +76,9 @@
            return ResultUtil.error(code2Session.getErrmsg());
        }
        String openid = code2Session.getOpenid();
        AppUser appUser = this.selectOne(new EntityWrapper<AppUser>().eq("openid", openid).ne("status", 3));
        AppUser appUser = this.selectOne(new EntityWrapper<AppUser>().eq("openid", openid).eq("status", 1));
        if(null == appUser){
            return ResultUtil.error("无效的账号");
        }
        if(appUser.getStatus() == 2){
            return ResultUtil.error("账号被冻结");
        }
        String token = getToken(appUser);
        if(ToolUtil.isEmpty(token)){
@@ -237,4 +241,116 @@
            return null;
        }
    }
    /**
     * 修改个人信息
     * @param userInfo
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil updateUserInfo(Integer uid, UserInfo userInfo) throws Exception {
        AppUser appUser = this.selectById(uid);
        if(ToolUtil.isNotEmpty(userInfo.getAvatar())){
            appUser.setAvatar(userInfo.getAvatar());
        }
        if(ToolUtil.isNotEmpty(userInfo.getEmergencyContact())){
            appUser.setEmergencyContact(userInfo.getEmergencyContact());
        }
        if(ToolUtil.isNotEmpty(userInfo.getEmergencyPhone())){
            appUser.setEmergencyPhone(userInfo.getEmergencyPhone());
        }
        if(ToolUtil.isNotEmpty(userInfo.getNickname())){
            appUser.setNickname(userInfo.getNickname());
        }
        if(ToolUtil.isNotEmpty(userInfo.getPhone())){
            if(userInfo.getPhone().equals(appUser.getPhone())){
                return ResultUtil.error("新手机不能和原手机号相同");
            }
            String value = redisUtil.getValue("+86" + userInfo.getPhone());
            if(ToolUtil.isEmpty(value) || !value.equals(userInfo.getCode())){
                return ResultUtil.error("验证码无效");
            }
            appUser.setPhone(userInfo.getPhone());
        }
        this.updateById(appUser);
        return ResultUtil.success();
    }
    /**
     * 余额充值
     * @param uid
     * @param amount
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil rechargeBalance(Integer uid, Double amount) throws Exception {
        if(0 >= amount){
            return ResultUtil.error("充值金额必须大于0");
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String out_trade_no = sdf.format(new Date()) + UUIDUtil.getNumberRandom(3);
        AppUser appUser = this.selectById(uid);
        RechargeRecord rechargeRecord = new RechargeRecord();
        rechargeRecord.setType(1);
        rechargeRecord.setUserId(uid);
        rechargeRecord.setCode(out_trade_no);
        rechargeRecord.setAmount(amount);
        rechargeRecord.setCreateTime(new Date());
        rechargeRecord.setPayStatus(1);
        rechargeRecord.setPayType(1);
        rechargeRecordService.insert(rechargeRecord);
        ResultUtil weixinpay = payMoneyUtil.weixinpay("余额充值", "", out_trade_no, amount.toString(), "/base/appUser/rechargeBalanceCallback", "JSAPI", appUser.getOpenid());
        return weixinpay;
    }
    /**
     * 余额充值回调
     * @param out_trade_no
     * @param transaction_id
     * @return
     * @throws Exception
     */
    @Override
    public void rechargeBalanceCallback(String out_trade_no, String transaction_id) throws Exception {
        RechargeRecord rechargeRecord1 = rechargeRecordService.selectOne(new EntityWrapper<RechargeRecord>().eq("code", out_trade_no));
        if(rechargeRecord1.getPayStatus() != 1){
            return;
        }
        AppUser appUser = this.selectById(rechargeRecord1.getUserId());
        AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
        accountChangeDetail.setUserType(1);
        accountChangeDetail.setUserId(rechargeRecord1.getUserId());
        accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
        accountChangeDetail.setChangeType(3);
        accountChangeDetail.setType(1);
        accountChangeDetail.setCreateTime(new Date());
        accountChangeDetail.setExplain("余额充值");
        accountChangeDetail.setOldData(appUser.getAccountBalance());
        appUser.setAccountBalance(appUser.getAccountBalance() + rechargeRecord1.getAmount());
        accountChangeDetail.setNewData(appUser.getAccountBalance());
        this.updateById(appUser);
        accountChangeDetailService.saveData(accountChangeDetail);
        rechargeRecord1.setPayTime(new Date());
        rechargeRecord1.setPayStatus(2);
        rechargeRecord1.setOrderNumber(transaction_id);
        rechargeRecordService.updateById(rechargeRecord1);
    }
    /**
     * 获取用户优惠券列表
     * @param uid
     * @param state
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    @Override
    public List<CouponsWarpper> queryMyCoupons(Integer uid, Integer state, Integer pageNum, Integer pageSize) throws Exception {
        return null;
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/BillServiceImpl.java
New file
@@ -0,0 +1,81 @@
package com.supersavedriving.user.modular.system.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.user.core.util.ToolUtil;
import com.supersavedriving.user.modular.system.dao.BillMapper;
import com.supersavedriving.user.modular.system.model.Bill;
import com.supersavedriving.user.modular.system.model.Order;
import com.supersavedriving.user.modular.system.service.IBillService;
import com.supersavedriving.user.modular.system.service.IOrderService;
import com.supersavedriving.user.modular.system.util.ResultUtil;
import com.supersavedriving.user.modular.system.warpper.BillWarpper;
import com.supersavedriving.user.modular.system.warpper.Invoicing;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
 * @author zhibing.pu
 * @date 2023/3/24 10:07
 */
@Service
public class BillServiceImpl extends ServiceImpl<BillMapper, Bill> implements IBillService {
    @Autowired
    private IOrderService orderService;
    /**
     * 开票操作
     * @param uid
     * @param invoicing
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil invoicing(Integer uid, Invoicing invoicing) throws Exception {
        if(ToolUtil.isEmpty(invoicing.getOrderIds())){
            return ResultUtil.error("请选择有效的开票订单");
        }
        String[] split = invoicing.getOrderIds().split(",");
        List<Order> orders = orderService.selectBatchIds(Arrays.asList(split));
        for (Order order : orders) {
            if(null != order.getIsInvoice() && order.getIsInvoice() == 1){
                continue;
            }
            Bill bill = new Bill();
            BeanUtils.copyProperties(invoicing, bill);
            bill.setUserId(order.getUserId());
            bill.setOrderId(order.getId().intValue());
            bill.setBillType(1);
            bill.setBillContent("代驾服务费");
            bill.setBillAmount(order.getPayMoney());
            bill.setState(1);
            bill.setCreateTime(new Date());
            this.insert(bill);
            order.setIsInvoice(1);
            orderService.updateById(order);
        }
        return ResultUtil.success();
    }
    /**
     * 获取开票记录
     * @param uid
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    @Override
    public List<BillWarpper> queryBillList(Integer uid, Integer pageNum, Integer pageSize) throws Exception {
        pageNum = (pageNum - 1) * pageSize;
        return this.baseMapper.queryBillList(uid, pageNum, pageSize);
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/CommercialServiceImpl.java
@@ -37,11 +37,11 @@
    @Override
    public List<CommercialWarpper> queryCommercialList(Integer uid, Integer type, Integer device) throws Exception {
        if(type == 1){//弹框广告
//            CommercialUserEject commercialUserEject = commercialUserEjectService.selectOne(new EntityWrapper<CommercialUserEject>().eq("userType", 2)
//                    .eq("userId", uid).last(" and DATE_FORMAT(now(), '%Y%m%d') = DATE_FORMAT(lastDate, '%Y%m%d')"));
//            if(null != commercialUserEject){
//                return new ArrayList<>();
//            }
            CommercialUserEject commercialUserEject = commercialUserEjectService.selectOne(new EntityWrapper<CommercialUserEject>().eq("userType", 2)
                    .eq("userId", uid).last(" and DATE_FORMAT(now(), '%Y%m%d') = DATE_FORMAT(lastDate, '%Y%m%d')"));
            if(null != commercialUserEject){
                return new ArrayList<>();
            }
        }
        List<CommercialWarpper> commercialWarppers = this.baseMapper.queryCommercialList(type, device);
        if(type == 1 && commercialWarppers.size() > 0){//记录弹窗
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/ComplaintServiceImpl.java
New file
@@ -0,0 +1,48 @@
package com.supersavedriving.user.modular.system.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.user.modular.system.dao.ComplaintMapper;
import com.supersavedriving.user.modular.system.model.Complaint;
import com.supersavedriving.user.modular.system.model.Order;
import com.supersavedriving.user.modular.system.service.IComplaintService;
import com.supersavedriving.user.modular.system.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
 * @author zhibing.pu
 * @date 2023/3/24 16:07
 */
@Service
public class ComplaintServiceImpl extends ServiceImpl<ComplaintMapper, Complaint> implements IComplaintService {
    @Autowired
    private IOrderService orderService;
    /**
     * 投诉反馈
     * @param orderId
     * @param content
     * @throws Exception
     */
    @Override
    public void feedback(Integer uid, Integer orderId, String content) throws Exception {
        Complaint complaint = new Complaint();
        complaint.setUserId(uid);
        if(null != orderId){
            Order order = orderService.selectById(orderId);
            complaint.setOrderId(orderId);
            complaint.setDriverId(order.getDriverId());
        }
        complaint.setReason(content);
        complaint.setState(1);
        complaint.setStatus(1);
        complaint.setCreateTime(new Date());
        this.updateById(complaint);
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java
@@ -118,7 +118,8 @@
        String city = "";
        District geocode = MapUtil.geocode(estimatedCosts.getStartLng().toString(), estimatedCosts.getStartLat().toString());
        if(null != geocode){
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>().where(" '" + geocode.getDistrict() + "' like district"));
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>()
                    .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') "));
            city = null != weatherCity ? weatherCity.getId().toString() : "";
        }
        Order order = getOrderPrice(1, d, 0, new Order(), city);
@@ -270,6 +271,11 @@
        }
        //恶劣天气
        systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 8));
        if(null != systemConfig){
            JSONObject jsonObject1 = JSON.parseObject(systemConfig.getContent());
            Integer num11 = jsonObject1.getInteger("num1");//开启恶劣天气计价
            if(1 == num11){
        boolean badWeather = WeatherUtil.isBadWeather(city);
        if(badWeather){
            order.setBadWeatherDistance(num5);//恶劣天气公里
@@ -292,6 +298,9 @@
                }
            }
        }
            }
        }
        //计算总金额
        BigDecimal bigDecimal = new BigDecimal(order.getStartPrice() + order.getOverDrivePrice() + order.getLongDistancePrice() + order.getOverLongDistancePrice() +
@@ -357,6 +366,16 @@
        if(null != order){
            return ResultUtil.error("您还有正在进行的订单");
        }
        String startAddress = travelOrder.getStartAddress();
        startAddress = startAddress.replaceAll("& #40;", "(");
        startAddress = startAddress.replaceAll("& #41;", ")");
        travelOrder.setStartAddress(startAddress);;
        String endAddress = travelOrder.getEndAddress();
        endAddress = endAddress.replaceAll("& #40;", "(");
        endAddress = endAddress.replaceAll("& #41;", ")");
        travelOrder.setEndAddress(endAddress);
        order = new Order();
        BeanUtils.copyProperties(travelOrder, order);
        if(ToolUtil.isEmpty(travelOrder.getUserPhone())){
@@ -382,7 +401,8 @@
        String city = "";
        District geocode = MapUtil.geocode(order.getStartLng(), order.getStartLat());
        if(null != geocode){
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>().where(" '" + geocode.getDistrict() + "' like district"));
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>()
                    .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') "));
            city = null != weatherCity ? weatherCity.getId().toString() : "";
        }
        order = getOrderPrice(1, d, 0, order, city);
@@ -409,8 +429,11 @@
            //推送状态
            pushUtil.pushOrderStatus(uid, 1, order.getId(), order.getState());
            if(null != travelOrder.getDriverId()){
                pushUtil.pushOrderStatus(travelOrder.getDriverId(), 2, order.getId(), order.getState());
            if(null != order.getDriverId()){
                PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper();
                pushOrderInfoWarpper.setId(order.getId());
                pushOrderInfoWarpper.setState(order.getState());
                pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
            }else{
                //推单
                pushOrder(order);
@@ -446,7 +469,7 @@
        //1
        //找到中心点
        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLat), Double.valueOf(startLng));
        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLng), Double.valueOf(startLat));
        Double num = num3 / 1000;//范围公里
        //构造半径
        Distance distanceR = new Distance(num, Metrics.KILOMETERS);
@@ -467,6 +490,10 @@
                if(ToolUtil.isEmpty(value)){
                    continue;
                }
                Driver driver1 = driverService.selectById(youTuiDriver.getDriverId());
                if(driver1.getServerStatus() == 2){
                    continue;
                }
                Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
                Double wgs84 = distance.get("WGS84");
                if(d == null || d.compareTo(wgs84) > 0){
@@ -484,6 +511,9 @@
        //开始范围查找
        if(null == driver){
            for (int i = 1; i < 4; i++) {
                if(null != driver){
                    break;
                }
                num = jsonObject.getDouble("num" + i) / 1000;//范围公里
                //构造半径
                distanceR = new Distance(num, Metrics.KILOMETERS);
@@ -504,6 +534,10 @@
                    Double score = null;
                    Double d = null;
                    for (Driver driver1 : drivers) {
                        String value = redisUtil.getValue("DRIVER" + driver1.getId());
                        if(ToolUtil.isEmpty(value)){
                            continue;
                        }
                        if(integral == null || integral.compareTo(driver1.getIntegral()) < 0){//积分大
                            integral = driver1.getIntegral();
                            score = driver1.getScore();
@@ -517,10 +551,6 @@
                            continue;
                        }
                        if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) == 0){//积分相同/评分相同对比距离
                            String value = redisUtil.getValue("DRIVER" + driver1.getId());
                            if(ToolUtil.isEmpty(value)){
                                continue;
                            }
                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
                            Double wgs84 = distance.get("WGS84");
                            if(d == null || d.compareTo(wgs84) > 0){
@@ -577,9 +607,24 @@
        cancelOrder.setStatus(1);
        cancelOrder.setCreateTime(new Date());
        cancelOrderService.insert(cancelOrder);
        order.setState(301);
        this.updateById(order);
        AppUser appUser = appUserService.selectById(uid);
        appUser.setCancelCount(appUser.getCancelCount() + 1);
        appUserService.updateById(appUser);
        Driver driver = driverService.selectById(order.getDriverId());
        if(null != driver){
            driver.setServerStatus(1);
            driverService.updateById(driver);
        }
        pushUtil.pushOrderStatus(uid, 1, orderId, order.getState());
        if(null != order.getDriverId()){
            PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper();
            pushOrderInfoWarpper.setId(order.getId());
            pushOrderInfoWarpper.setState(order.getState());
            pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
        }
        return ResultUtil.success();
    }
@@ -593,7 +638,19 @@
     */
    @Override
    public OrderInfoWarpper queryOrderInfo(Integer uid, Long orderId) throws Exception {
        return this.baseMapper.queryOrderInfo(uid, orderId);
        OrderInfoWarpper orderInfoWarpper = this.baseMapper.queryOrderInfo(uid, orderId);
        SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 7));
        if(null != systemConfig){
            JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
            orderInfoWarpper.setServiceCell(jsonObject.getString("num1"));
        }
        String value = redisUtil.getValue("DRIVER" + orderInfoWarpper.getDriverId());
        if(ToolUtil.isNotEmpty(value)){
            String[] split = value.split(",");
            orderInfoWarpper.setDriverLon(split[0]);
            orderInfoWarpper.setDriverLat(split[1]);
        }
        return orderInfoWarpper;
    }
@@ -623,7 +680,8 @@
        String city = "";
        District geocode = MapUtil.geocode(order.getStartLng().toString(), order.getStartLat().toString());
        if(null != geocode){
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>().where(" '" + geocode.getDistrict() + "' like district"));
            WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>()
                    .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') "));
            city = null != weatherCity ? weatherCity.getId().toString() : "";
        }
        Order order1 = new Order();
@@ -827,6 +885,15 @@
        order.setState(108);
        this.updateById(order);
        pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getState());
        if(null != order.getDriverId()) {
            PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper();
            pushOrderInfoWarpper.setId(order.getId());
            pushOrderInfoWarpper.setState(order.getState());
            pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
        }
        AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
        accountChangeDetail.setUserType(1);
        accountChangeDetail.setUserId(appUser.getId());
@@ -834,6 +901,7 @@
        accountChangeDetail.setOldData(appUser.getAccountBalance());
        accountChangeDetail.setType(1);
        accountChangeDetail.setChangeType(2);
        accountChangeDetail.setOrderId(order.getId());
        accountChangeDetail.setExplain("代驾服务费");
        appUser.setAccountBalance(appUser.getAccountBalance() - payMoney);
        accountChangeDetail.setNewData(appUser.getAccountBalance());
@@ -878,6 +946,7 @@
        accountChangeDetail.setOldData(appUser.getAccountBalance());
        accountChangeDetail.setType(1);
        accountChangeDetail.setChangeType(2);
        accountChangeDetail.setOrderId(order.getId());
        accountChangeDetail.setExplain("代驾服务费");
        appUser.setAccountBalance(appUser.getAccountBalance() > payMoney ? appUser.getAccountBalance() - payMoney : 0);
        accountChangeDetail.setNewData(appUser.getAccountBalance());
@@ -943,6 +1012,18 @@
                                    Thread.sleep(wait);
                                    num++;
                                }
                            }else{
                                Thread.sleep(wait);
                                num++;
                            }
                            if(10 == num){
                                AccountChangeDetail accountChangeDetail1 = accountChangeDetailService.selectById(accountChangeDetail.getId());
                                AppUser appUser1 = appUserService.selectById(accountChangeDetail1.getUserId());
                                Double b = accountChangeDetail1.getOldData() - accountChangeDetail1.getNewData();
                                appUser1.setAccountBalance(appUser1.getAccountBalance() + b);
                                appUserService.updateById(appUser1);
                                accountChangeDetailService.deleteById(accountChangeDetail.getId());
                            }
                        }
                    }catch (Exception e){
@@ -977,6 +1058,14 @@
        this.updateById(order);
        //添加收入明细
        saveCommission(order);
        pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getState());
        if(null != order.getDriverId()) {
            PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper();
            pushOrderInfoWarpper.setId(order.getId());
            pushOrderInfoWarpper.setState(order.getState());
            pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
        }
        return ResultUtil.success();
    }
@@ -1007,7 +1096,7 @@
        evaluate.setUserId(uid);
        evaluateService.insert(evaluate);
        Driver driver = driverService.selectById(order.getDriverId());
        driver.setScore((driver.getScore() + score) / 2);
        driver.setScore(((null == driver.getScore() ? 0 : driver.getScore()) + score) / 2);
        if(score == 5){//司机积分奖励
            SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 4));
            if(null != systemConfig){
@@ -1306,6 +1395,7 @@
        accountChangeDetail.setUserId(driver.getId());
        accountChangeDetail.setType(1);
        accountChangeDetail.setChangeType(1);
        accountChangeDetail.setOrderId(order.getId());
        accountChangeDetail.setOldData(driver.getBalance() + driver.getCouponBalance());
        accountChangeDetail.setExplain("订单收入");
        accountChangeDetail.setCreateTime(new Date());
@@ -1317,4 +1407,32 @@
        driverService.updateById(driver);
        accountChangeDetailService.saveData(accountChangeDetail);
    }
    /**
     * 获取乘客行程
     * @param uid
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    @Override
    public List<OrderListWarpper> queryMyOrder(Integer uid, Integer pageNum, Integer pageSize) throws Exception {
        pageNum = (pageNum - 1) * pageSize;
        return this.baseMapper.queryMyOrder(uid, pageNum, pageSize);
    }
    /**
     * 获取未开票订单
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public List<OrderListWarpper> queryNotInvoiceOrder(Integer uid, NotInvoiceOrder notInvoiceOrder) throws Exception {
        notInvoiceOrder.setPageNum((notInvoiceOrder.getPageNum() - 1) * notInvoiceOrder.getPageSize());;
        return this.baseMapper.queryNotInvoiceOrder(uid, notInvoiceOrder);
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/RechargeRecordServiceImpl.java
New file
@@ -0,0 +1,15 @@
package com.supersavedriving.user.modular.system.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.user.modular.system.dao.RechargeRecordMapper;
import com.supersavedriving.user.modular.system.model.RechargeRecord;
import com.supersavedriving.user.modular.system.service.IRechargeRecordService;
import org.springframework.stereotype.Service;
/**
 * @author zhibing.pu
 * @date 2023/3/23 14:57
 */
@Service
public class RechargeRecordServiceImpl extends ServiceImpl<RechargeRecordMapper, RechargeRecord> implements IRechargeRecordService {
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/SystemConfigServiceImpl.java
@@ -1,10 +1,20 @@
package com.supersavedriving.user.modular.system.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.user.modular.system.dao.SystemConfigMapper;
import com.supersavedriving.user.modular.system.model.SystemConfig;
import com.supersavedriving.user.modular.system.service.ISystemConfigService;
import com.supersavedriving.user.modular.system.warpper.PriceRulesWarpper;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 系统配置
@@ -13,4 +23,71 @@
*/
@Service
public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigMapper, SystemConfig> implements ISystemConfigService {
    /**
     * 获取价格表
     * @return
     * @throws Exception
     */
    @Override
    public PriceRulesWarpper queryPriceRules() throws Exception {
        SystemConfig systemConfig = this.selectOne(new EntityWrapper<SystemConfig>().eq("type", 5));
        PriceRulesWarpper priceRulesWarpper = new PriceRulesWarpper();
        if(null != systemConfig){
            //{"ChargeStandard":[{"num1":"06:00","num2":"08:00","num3":2,"num4":2,"num5":2,"num6":2,"num7":2,"num8":2,"num9":2,"num10":2,"num11":2},{"num1":"06:00","num2":"08:00","num3":1,"num4":1,"num5":1,"num6":1,"num7":2,"num8":2,"num9":2,"num10":2,"num11":2},{"num1":"00:00","num2":"10:00","num3":3,"num4":3,"num5":3,"num6":3,"num7":3,"num8":3,"num9":3,"num10":3,"num11":3}],"ExtraCost":{"num1":1,"num2":1,"num3":1,"num4":1,"num5":1,"num6":1,"num7":1,"num8":1,"num9":1}}
            JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
            JSONArray chargeStandard = jsonObject.getJSONArray("ChargeStandard");
            List<Map<String, Object>> basePrice = new ArrayList<>();
            List<Map<String, Object>> longDistanceCharges = new ArrayList<>();
            for (int i = 0; i < chargeStandard.size(); i++) {
                JSONObject jsonObject1 = chargeStandard.getJSONObject(i);
                String num1 = jsonObject1.getString("num1");
                String num2 = jsonObject1.getString("num2");
                Double num3 = jsonObject1.getDouble("num3");
                Double num4 = jsonObject1.getDouble("num4");
                Double num5 = jsonObject1.getDouble("num5");
                Double num6 = jsonObject1.getDouble("num6");
                Double num7 = jsonObject1.getDouble("num7");
                Double num8 = jsonObject1.getDouble("num8");
                Double num9 = jsonObject1.getDouble("num9");
                Double num10 = jsonObject1.getDouble("num10");
                Double num11 = jsonObject1.getDouble("num11");
                Map<String, Object> map1 = new HashMap<>();
                map1.put("time", num1 + "-" + num2);
                map1.put("startingMileage", num3 + "公里(包含" + num3 + "公里)");
                map1.put("startingPrice", num4 + "元");
                map1.put("exceedStartingPrice", num6 + "元/" + num5 + "公里");
                basePrice.add(map1);
                Map<String, Object> map2 = new HashMap<>();
                map2.put("time", num1 + "-" + num2);
                map2.put("startingMileage", num7 + "-" + num8 + "公里");
                map2.put("startingPrice", num9 + "元");
                map2.put("exceedStartingPrice", num11 + "元/" + num10 + "公里");
                longDistanceCharges.add(map2);
            }
            priceRulesWarpper.setBasePrice(JSON.toJSONString(basePrice));
            priceRulesWarpper.setLongDistanceCharges(JSON.toJSONString(longDistanceCharges));
            //额外费用
            JSONObject extraCost = jsonObject.getJSONObject("ExtraCost");
            Integer num1 = extraCost.getInteger("num1");
            Double num2 = extraCost.getDouble("num2");
            Integer num3 = extraCost.getInteger("num3");
            Double num4 = extraCost.getDouble("num4");
            Double num5 = extraCost.getDouble("num5");
            Double num6 = extraCost.getDouble("num6");
            Double num7 = extraCost.getDouble("num7");
            Double num8 = extraCost.getDouble("num8");
            Double num9 = extraCost.getDouble("num9");
            Map<String, Object> map = new HashMap<>();
            map.put("waitTime", num1 + "分钟/" + num2 + "元");
            map.put("exceedWaitTime", "超出" + num3 + "分钟,收取" + num4 + "元/分钟");
            map.put("badWeather", num5 + "公里内加收" + num6 + "元,超过" + num7 + "公里按照订单单价的" + num8 + "倍计费,最高收取" + num9 + "元");
            priceRulesWarpper.setAdditionalFee(JSON.toJSONString(map));
        }
        return priceRulesWarpper;
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/UserToCouponServiceImpl.java
@@ -6,6 +6,7 @@
import com.supersavedriving.user.modular.system.model.UserToCoupon;
import com.supersavedriving.user.modular.system.service.IUserToCouponService;
import com.supersavedriving.user.modular.system.warpper.CouponWarpper;
import com.supersavedriving.user.modular.system.warpper.CouponsWarpper;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -41,4 +42,24 @@
    public List<CouponWarpper> queryPayCouponList(Integer uid, Double price) throws Exception {
        return this.baseMapper.queryPayCouponList(uid, price);
    }
    /**
     * 获取用户优惠券列表
     * @param uid
     * @param state
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    @Override
    public List<CouponsWarpper> queryMyCoupons(Integer uid, Integer state, Integer pageNum, Integer pageSize) throws Exception {
        pageNum = (pageNum - 1) * pageSize;
        return this.baseMapper.queryMyCoupons(uid, state, pageNum, pageSize);
    }
    @Override
    public Integer queryUsedCouponNum(Integer uid) {
        return this.baseMapper.queryUsedCouponNum(uid);
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/PayMoneyUtil.java
@@ -72,11 +72,13 @@
    @Value("${callbackPath}")
    private String callbackPath;//支付回调网关地址
    private String app_cert_path = "/usr/local/server/cer/zhifubao/user/app_cert_path.crt";//应用公钥证书路径
    private String app_cert_path = "/usr/local/server/app/cer/zhifubao/user/app_cert_path.crt";//应用公钥证书路径
    private String alipay_cert_path = "/usr/local/server/cer/zhifubao/user/alipay_cert_path.crt";//支付宝公钥证书文件路径
    private String alipay_cert_path = "/usr/local/server/app/cer/zhifubao/user/alipay_cert_path.crt";//支付宝公钥证书文件路径
    private String alipay_root_cert_path = "/usr/local/server/cer/zhifubao/user/alipay_root_cert_path.crt";//支付宝CA根证书文件路径
    private String alipay_root_cert_path = "/usr/local/server/app/cer/zhifubao/user/alipay_root_cert_path.crt";//支付宝CA根证书文件路径
    private String weixin_cert_path = "/usr/local/server/app/cert/weixin/apiclient_cert.p12";//微信支付证书
    private Map<String, JSONObject> order = new HashMap<>();//存储支付订单用于主动查询支付结果
@@ -601,8 +603,7 @@
        Map<String, String> map1 = null;
        String body1 = null;
        try {
            String certPath = "/usr/local/server/cert/weixin/apiclient_cert.p12";
            body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
            body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, weixin_cert_path, "PKCS12");
        } catch (Exception e) {
            e.printStackTrace();
        }
@@ -855,8 +856,7 @@
        xmlString.append("</xml>");
        Map<String, String> map1 = null;
        String certPath = "/usr/local/server/cert/weixin/apiclient_cert.p12";//证书地址
        String body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
        String body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, weixin_cert_path, "PKCS12");
        //将结果xml解析成map
        body1 = body1.replaceAll("<!\\[CDATA\\[","");
        body1 = body1.replaceAll("]]>", "");
@@ -932,8 +932,7 @@
        xmlString.append("</xml>");
        Map<String, String> map1 = null;
        String certPath = "/usr/local/server/cert/weixin/apiclient_cert.p12";//证书地址
        String body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
        String body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, weixin_cert_path, "PKCS12");
        //将结果xml解析成map
        body1 = body1.replaceAll("<!\\[CDATA\\[","");
        body1 = body1.replaceAll("]]>", "");
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/PushUtil.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.supersavedriving.user.modular.system.warpper.PushOrderInfoWarpper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -129,6 +130,41 @@
    }
    /**
     * 推送订单数据
     * @param id
     * @param type
     * @param pushOrderInfoWarpper
     */
    public void pushOrderInfo(Integer id, Integer type, PushOrderInfoWarpper pushOrderInfoWarpper){
        JSONObject msg = new JSONObject();
        msg.put("code", 200);
        msg.put("msg", "SUCCESS");
        msg.put("method", "ORDER_INFO");
        msg.put("data", pushOrderInfoWarpper);
        //调用推送
        HttpHeaders headers = new HttpHeaders();
        // 以表单的方式提交
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        //将请求头部和参数合成一个请求
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("msg", msg.toJSONString());
        params.add("id", id.toString());
        params.add("type", type.toString());
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
        String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class);
        JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
        if(jsonObject1.getIntValue("code") != 200){
            logger.debug(jsonObject1.getString("msg"));
            System.err.println(jsonObject1.getString("msg"));
        }
    }
    /**
     * 系统推单推送
     * @param id            接受对象id
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/huawei/SMSUtil.java
@@ -238,4 +238,13 @@
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }
    public static void main(String[] ages){
        try {
            SMSUtil.send("15828353127", "1d0f0cbe5b214b0d8efa891730eb532a", "[\"" + 123456 + "\"]");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/BalanceDetailsWarpper.java
New file
@@ -0,0 +1,28 @@
package com.supersavedriving.user.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/3/23 17:15
 */
@Data
@ApiModel
public class BalanceDetailsWarpper {
    @ApiModelProperty("使用类型(2=支付订单,3=余额充值)")
    private Integer type;
    @ApiModelProperty("使用说明")
    private String explain;
    @ApiModelProperty("起点")
    private String startAddress;
    @ApiModelProperty("终点")
    private String endAddress;
    @ApiModelProperty("时间")
    private Long createTime;
    @ApiModelProperty("变动金额")
    private Double amount;
    @ApiModelProperty("余额")
    private Double balance;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/BillWarpper.java
New file
@@ -0,0 +1,26 @@
package com.supersavedriving.user.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/3/24 10:50
 */
@Data
@ApiModel
public class BillWarpper {
    @ApiModelProperty("数据id")
    private Integer id;
    @ApiModelProperty("时间")
    private Long createTime;
    @ApiModelProperty("发票内容")
    private String billContent;
    @ApiModelProperty("发票类型 1电子发票")
    private Integer billType;
    @ApiModelProperty("开票金额")
    private Double billAmount;
    @ApiModelProperty("开票状态 1待开票 2已开票 3开票失败")
    private Integer state;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/CouponWarpper.java
@@ -11,6 +11,8 @@
@Data
@ApiModel
public class CouponWarpper {
    @ApiModelProperty("优惠券id")
    private Integer id;
    @ApiModelProperty("满金额")
    private Double couponConditionalAmount;
    @ApiModelProperty("优惠金额")
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/CouponsWarpper.java
New file
@@ -0,0 +1,24 @@
package com.supersavedriving.user.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/3/23 15:28
 */
@Data
@ApiModel
public class CouponsWarpper {
    @ApiModelProperty("优惠券id")
    private Integer id;
    @ApiModelProperty("名称")
    private String name;
    @ApiModelProperty("优惠金额")
    private Double discountAmount;
    @ApiModelProperty("优惠条件")
    private Double preferentialTerms;
    @ApiModelProperty("有效期")
    private Long endTime;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/Invoicing.java
New file
@@ -0,0 +1,30 @@
package com.supersavedriving.user.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/3/24 9:55
 */
@Data
@ApiModel
public class Invoicing {
    @ApiModelProperty(value = "订单id,多个已逗号分隔", dataType = "string", required = true)
    private String orderIds;
    @ApiModelProperty(value = "发票抬头类型(1=企业,2=个人)", dataType = "int", required = true)
    private Integer billHeaderType;
    @ApiModelProperty(value = "公司名称/个人名称", dataType = "string", required = true)
    private String companyName;
    @ApiModelProperty(value = "公司税号", dataType = "string", required = false)
    private String companyTaxNumber;
    @ApiModelProperty(value = "发票更多内容", dataType = "string", required = true)
    private String moreContent;
    @ApiModelProperty(value = "收件人姓名", dataType = "string", required = true)
    private String addresseeName;
    @ApiModelProperty(value = "收件人手机号", dataType = "string", required = true)
    private String addresseePhone;
    @ApiModelProperty(value = "收件人电子邮箱", dataType = "string", required = true)
    private String addresseeEmail;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/NotInvoiceOrder.java
New file
@@ -0,0 +1,26 @@
package com.supersavedriving.user.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/3/24 10:30
 */
@Data
@ApiModel
public class NotInvoiceOrder {
    @ApiModelProperty(value = "订单开始时间(2023-01-01)", required = false, dataType = "string")
    private String startTime;
    @ApiModelProperty(value = "订单结束时间(2023-01-01)", required = false, dataType = "string")
    private String endTime;
    @ApiModelProperty(value = "订单开始金额", required = false, dataType = "double")
    private Double startAmount;
    @ApiModelProperty(value = "订单结束金额", required = false, dataType = "double")
    private Double endAmount;
    @ApiModelProperty(value = "页码,首页1", required = true, dataType = "int")
    private Integer pageNum;
    @ApiModelProperty(value = "页条数", required = true, dataType = "int")
    private Integer pageSize;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/OrderInfoWarpper.java
@@ -25,6 +25,8 @@
    private String endLat;
    @ApiModelProperty("终点经度")
    private String endLng;
    @ApiModelProperty("司机id")
    private Integer driverId;
    @ApiModelProperty("司机头像")
    private String driverAvatar;
    @ApiModelProperty("司机名称")
@@ -39,7 +41,19 @@
    private Integer driverNumber;
    @ApiModelProperty("司机评分")
    private Double driverScore;
    @ApiModelProperty("司机位置经度")
    private String driverLon;
    @ApiModelProperty("司机位置纬度")
    private String driverLat;
    @ApiModelProperty("订单状态(101=待接单,102=已接单,103=前往预约点,104=到达预约点,105=开始服务,106=到达目的地,107=待支付,108=待评价,109=已完成,201=转单中,301=已取消,401=等待中)")
    private Integer state;
    @ApiModelProperty("客服电话")
    private String serviceCell;
    @ApiModelProperty("订单创建时间")
    private Long createTime;
    @ApiModelProperty("订单评分")
    private Integer evaluationScore;
    @ApiModelProperty("评价内容")
    private String evaluationContent;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/OrderListWarpper.java
@@ -2,226 +2,27 @@
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@ApiModel("订单列表")
public class OrderListWarpper implements Comparable {
/**
 * @author zhibing.pu
 * @date 2023/3/18 10:22
 */
@Data
@ApiModel
public class OrderListWarpper {
    @ApiModelProperty("订单id")
    private Integer id;
    @ApiModelProperty("订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)")
    private Integer type;
    @ApiModelProperty("订单名称")
    private String name;
    @ApiModelProperty("标题")
    private String title;
    @ApiModelProperty("订单时间")
    private String time;
    @ApiModelProperty("出发地")
    private Long createTime;
    @ApiModelProperty("金额")
    private Double amount;
    @ApiModelProperty("起点地址")
    private String startAddress;
    @ApiModelProperty("目的地")
    @ApiModelProperty("终点地址")
    private String endAddress;
    @ApiModelProperty("红包金额")
    private Double redMoney;
    @ApiModelProperty("订单金额")
    private Double orderMoney;
    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中)<br/>" +
            "小件物流订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待取货,5=送货中,6=已送达,7=待支付,8=需补差价,9=已取货,10=已取消,11=已支付差价)")
    @ApiModelProperty("订单状态(101=待接单,102=已接单,103=前往预约点,104=到达预约点,105=开始服务,106=到达目的地,107=待支付,108=待评价,109=已完成,201=转单中,301=已取消,401=等待中)")
    private Integer state;
    @ApiModelProperty("人数")
    private Integer peopleNumber;
    @ApiModelProperty("下单用户")
    private String user;
    @ApiModelProperty("货物信息")
    private String cargoNumber;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("支付方式(1=OK平台支付(线上支付),2=其他方式支付(线下支付))")
    private Integer payManner;
    private Long travelTime;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getStartAddress() {
        return startAddress;
    }
    public void setStartAddress(String startAddress) {
        this.startAddress = startAddress;
    }
    public String getEndAddress() {
        return endAddress;
    }
    public void setEndAddress(String endAddress) {
        this.endAddress = endAddress;
    }
    public Integer getState() {
        return state;
    }
    public void setState(Integer state) {
        this.state = state;
    }
    public Double getRedMoney() {
        return redMoney;
    }
    public void setRedMoney(Double redMoney) {
        this.redMoney = redMoney;
    }
    public Integer getType() {
        return type;
    }
    public void setType(Integer type) {
        this.type = type;
    }
    public Double getOrderMoney() {
        return orderMoney;
    }
    public void setOrderMoney(Double orderMoney) {
        this.orderMoney = orderMoney;
    }
    public Integer getPeopleNumber() {
        return peopleNumber;
    }
    public void setPeopleNumber(Integer peopleNumber) {
        this.peopleNumber = peopleNumber;
    }
    public String getUser() {
        return user;
    }
    public void setUser(String user) {
        this.user = user;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public Integer getPayManner() {
        return payManner;
    }
    public void setPayManner(Integer payManner) {
        this.payManner = payManner;
    }
    public Long getTravelTime() {
        return travelTime;
    }
    public void setTravelTime(Long travelTime) {
        this.travelTime = travelTime;
    }
    public String getCargoNumber() {
        return cargoNumber;
    }
    public void setCargoNumber(String cargoNumber) {
        this.cargoNumber = cargoNumber;
    }
    @Override
    public String toString() {
        return "OrderListWarpper{" +
                "id=" + id +
                ", type=" + type +
                ", name='" + name + '\'' +
                ", time='" + time + '\'' +
                ", startAddress='" + startAddress + '\'' +
                ", endAddress='" + endAddress + '\'' +
                ", redMoney=" + redMoney +
                ", orderMoney=" + orderMoney +
                ", state=" + state +
                ", peopleNumber=" + peopleNumber +
                ", user='" + user + '\'' +
                ", remark='" + remark + '\'' +
                ", payManner=" + payManner +
                '}';
    }
    public static List<OrderListWarpper> getOrderListWarpper(List<Map<String, Object>> maps){
        List<OrderListWarpper> list = new ArrayList<>();
        if(null != maps){
            for(Map<String, Object> map : maps){
                OrderListWarpper orderListWarpper = new OrderListWarpper();
                orderListWarpper.setId(null != map.get("id") ? Integer.valueOf(String.valueOf(map.get("id"))) : 0);
                orderListWarpper.setName(null != map.get("name") ? String.valueOf(map.get("name")) : "");
                orderListWarpper.setTime(null != map.get("time") ? String.valueOf(map.get("time")) : "");
                orderListWarpper.setStartAddress(null != map.get("startAddress") ? String.valueOf(map.get("startAddress")) : "");
                orderListWarpper.setEndAddress(null != map.get("endAddress") ? String.valueOf(map.get("endAddress")) : "");
                orderListWarpper.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0);
                orderListWarpper.setRedMoney(null != map.get("redMoney") ? Double.valueOf(String.valueOf(map.get("redMoney"))) : 0);
                orderListWarpper.setOrderMoney(null != map.get("orderMoney") ? Double.valueOf(String.valueOf(map.get("orderMoney"))) : 0);
                orderListWarpper.setType(null != map.get("type") ? Integer.valueOf(String.valueOf(map.get("type"))) : 0);
                orderListWarpper.setPeopleNumber(null != map.get("peopleNumber") ? Integer.valueOf(String.valueOf(map.get("peopleNumber"))) : 0);
                orderListWarpper.setUser(null != map.get("user") ? String.valueOf(map.get("user")) : "");
                orderListWarpper.setCargoNumber(null != map.get("cargoNumber") ? String.valueOf(map.get("cargoNumber")) : "");
                orderListWarpper.setRemark(null != map.get("remark") ? String.valueOf(map.get("remark")) : "");
                orderListWarpper.setPayManner(null != map.get("payManner") ? Integer.valueOf(String.valueOf(map.get("payManner"))) : 0);
                orderListWarpper.setTravelTime(null != map.get("travelTime") ? Long.valueOf(String.valueOf(map.get("travelTime"))) : 0);
                list.add(orderListWarpper);
            }
        }
        Collections.sort(list);
        return list;
    }
    @Override
    public int compareTo(Object o) {
        if (o instanceof OrderListWarpper) {
            OrderListWarpper s = (OrderListWarpper) o;
            if(this.travelTime == null || s.travelTime == null){
                return -1;
            }
            if (this.travelTime > s.travelTime) {
                return -1;
            } else if (this.travelTime == s.travelTime) {
                return 0;
            } else {
                return 1;
            }
        }
        return 0;
    }
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/OrderStatusWarpper.java
File was deleted
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/OrdersWarpper.java
File was deleted
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/PriceRulesWarpper.java
New file
@@ -0,0 +1,20 @@
package com.supersavedriving.user.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/3/23 14:16
 */
@Data
@ApiModel
public class PriceRulesWarpper {
    @ApiModelProperty("基础价格")
    private String basePrice;
    @ApiModelProperty("长途公里费用")
    private String longDistanceCharges;
    @ApiModelProperty("额外费")
    private String additionalFee;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/PushOrderInfoWarpper.java
New file
@@ -0,0 +1,24 @@
package com.supersavedriving.user.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel
public class PushOrderInfoWarpper {
    @ApiModelProperty("订单id")
    private Long id;
    @ApiModelProperty("司机纬度")
    private String driverLat;
    @ApiModelProperty("司机经度")
    private String driverLng;
    @ApiModelProperty("等待时长(分钟)")
    private Integer waitTime;
    @ApiModelProperty("行驶里程(公里)")
    private Double actualMileage;
    @ApiModelProperty("行驶时间(分钟)")
    private Integer travelTime;
    @ApiModelProperty("101=待接单,102=已接单,103=前往预约点,104=到达预约点,105=开始服务,106=到达目的地,107=待支付,108=待评价,109=已完成,201=转单中,301=已取消,401=等待中")
    private Integer state;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/TravelOrder.java
@@ -11,16 +11,16 @@
@Data
@ApiModel
public class TravelOrder {
    @ApiModelProperty(value = "起点纬度", dataType = "double", required = true)
    private Double startLat;
    @ApiModelProperty(value = "起点经度", dataType = "double", required = true)
    private Double startLng;
    @ApiModelProperty(value = "起点纬度", dataType = "string", required = true)
    private String startLat;
    @ApiModelProperty(value = "起点经度", dataType = "string", required = true)
    private String startLng;
    @ApiModelProperty(value = "起点地址", dataType = "string", required = true)
    private String startAddress;
    @ApiModelProperty(value = "终点纬度", dataType = "double", required = false)
    private Double endLat;
    @ApiModelProperty(value = "终点经度", dataType = "double", required = false)
    private Double endLng;
    @ApiModelProperty(value = "终点纬度", dataType = "string", required = false)
    private String endLat;
    @ApiModelProperty(value = "终点经度", dataType = "string", required = false)
    private String endLng;
    @ApiModelProperty(value = "终点地址", dataType = "string", required = false)
    private String endAddress;
    @ApiModelProperty(value = "司机数量", dataType = "int", required = true)
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/UserInfo.java
New file
@@ -0,0 +1,26 @@
package com.supersavedriving.user.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2023/3/23 10:00
 */
@Data
@ApiModel
public class UserInfo {
    @ApiModelProperty(value = "头像", required = false, dataType = "string")
    private String avatar;
    @ApiModelProperty(value = "紧急联系人", required = false, dataType = "string")
    private String emergencyContact;
    @ApiModelProperty(value = "紧急联系人电话", required = false, dataType = "string")
    private String emergencyPhone;
    @ApiModelProperty(value = "姓名", required = false, dataType = "string")
    private String nickname;
    @ApiModelProperty(value = "手机号", required = false, dataType = "string")
    private String phone;
    @ApiModelProperty(value = "验证码", required = false, dataType = "string")
    private String code;
}
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/warpper/UserInfoWarpper.java
@@ -25,4 +25,6 @@
    private String emergencyContact;
    @ApiModelProperty("紧急人电话")
    private String emergencyPhone;
    @ApiModelProperty("客服电话")
    private String serviceCell;
}
user/guns-admin/src/main/resources/application.yml
@@ -13,8 +13,8 @@
  application:
    name: user-server
  profiles:
    active: dev
#    active: produce
#    active: dev
    active: produce
  mvc:
    static-path-pattern: /static/**
    view:
@@ -50,20 +50,13 @@
---
#spring:
#  datasource:
#    url: jdbc:mysql://Rm-wz9rpe0t74ys3b1h8go.mysql.rds.aliyuncs.com:3306/oktravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
#    username: root
#    password: Root2020!
#    db-name: guns #用来搜集数据库的所有表
#    filters: wall,mergeStat
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/super_save_driving?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    password: f4OfRjqoN3jSiNGiUoiNsQdOBtCOKYRj
#    password: 123456
    db-name: guns #用来搜集数据库的所有表
    filters: wall,mergeStat
@@ -94,6 +87,7 @@
  webAppSecret: 11
  mchId: 1636941942 #微信支付分配的商户号
  key: Eri2GR2SB3b6iIhaoD7k3KQ8X0wf1Ybh #key为商户平台设置的密钥key:
  apiv3: AKJ51Z4nhSqYBxmOXgUyCKA1vLP0J5Aj #key为商户平台设置的密钥key:
---
@@ -120,20 +114,21 @@
---
filePath: /usr/local/server/orderPostionFile/ #存储订单轨迹文件路径
filePath: /usr/local/server/app/orderPostionFile/ #存储订单轨迹文件路径
#filePath: C:/orderPostionFile/  #存储订单轨迹文件路径
#支付回调地址
#正式环境
callbackPath: https://okyueche.com:443/user
#callbackPath: http://121.37.15.157:80/user
#正式测试环境
#callbackPath: http://39.108.148.228:80/user
callbackPath: http://121.37.15.157:80/user
---
spring:
  data:
    mongodb:
      uri: mongodb://127.0.0.1:27017/admin
      uri: mongodb://root:CEtyLdKjPk0yeHNo@127.0.0.1:27017/admin
#      uri: mongodb://127.0.0.1:27017/admin
user/guns-admin/src/main/resources/logback-spring.xml
@@ -7,8 +7,8 @@
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
    <!--<property name="log.path" value="/usr/local/server/logs"/>-->
    <property name="log.path" value="d:/logs/user"/>
    <property name="log.path" value="/usr/local/server/app/logs"/>
    <!--<property name="log.path" value="d:/logs/user"/>-->
    <!--0. 日志格式和颜色渲染 -->
    <!-- 彩色日志依赖的渲染类 -->
user/guns-admin/src/main/resources/redis.properties
@@ -4,10 +4,17 @@
# Redis·þÎñÆ÷µØÖ·
spring.redis.host=127.0.0.1
# Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú
spring.redis.port=6379
spring.redis.port=16379
# Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£©
spring.redis.password=123456
#spring.redis.password=
spring.redis.password=cKsEeyffDXG5PzNg8CIbrWxFluXrCprZ
## Redis·þÎñÆ÷µØÖ·
#spring.redis.host=127.0.0.1
## Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú
#spring.redis.port=6379
## Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£©
#spring.redis.password=123456
# Á¬½Ó³Ø×î´óÁ¬½ÓÊý£¨Ê¹ÓøºÖµ±íʾûÓÐÏÞÖÆ£©
spring.redis.jedis.pool.max-active=1024
# Á¬½Ó³Ø×î´ó×èÈûµÈ´ýʱ¼ä£¨Ê¹ÓøºÖµ±íʾûÓÐÏÞÖÆ£©
zuul/src/main/java/com/sinata/zuul/controller/NettyController.java
@@ -36,13 +36,6 @@
                NettyServerController.sendMsgToClient(channel, msg);
                return JSON.toJSONString(ResultUtil.success());
            }
            //智慧屏(设备号)
            channel = NettyChannelMap.getData(id);
            if(null != channel){
                NettyServerController.sendMsgToClient(channel, msg);
                return JSON.toJSONString(ResultUtil.success());
            }
            return JSON.toJSONString(ResultUtil.error("推送失败-----用户id=" + id));
        }
zuul/src/main/java/com/sinata/zuul/util/applets/NettyWebSocketController.java
@@ -83,35 +83,30 @@
                if (StringUtil.isNotEmpty(userId1)) {
                    //确保账号在单个设备上登录
                    if (StringUtil.isNotEmpty(token)) {
                        NettyChannelMap.update_(token.substring(0, 23), ctx);//存储单点登录的通道
                        String token_ = redisUtil.getValue("USER_Applets_" + userId1);//获取缓存中最新的数据
                        if (StringUtil.isNotEmpty(token_) && !token.equals(token_)) {//不在同一设备上登录,向其他设备发送数据
                            ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(0, 23));
                            JSONObject msg_ = new JSONObject();
                            msg_.put("code", 200);
                            msg_.put("msg", "SUCCESS");
                            msg_.put("method", "OFFLINE");
                            msg_.put("data", new Object());
                            this.sendMsgToClient(ctx, msg_.toJSONString());
                            TimerTask timerTask = new TimerTask() {
                            this.sendMsgToClient(data_, msg_.toJSONString());
                            new Timer().schedule(new TimerTask() {
                                @Override
                                public void run() {
                                    NettyChannelMap.remove_(ctx);
                                    NettyChannelMap.remove_(data_);
                                }
                            };
                            Timer timer = new Timer();
                            timer.schedule(timerTask, 3000);
                            timer.cancel();
                            }, 5000);
                        }
                        if (StringUtil.isEmpty(token_)) {//确保登录的时候存储token失败的情况
                        NettyChannelMap.update_(token.substring(0, 23), ctx);//存储单点登录的通道
                        NettyChannelMap.update("Applets" + userId1, ctx);
                            redisUtil.setStrValue("USER_Applets_" + userId1, token);
                        }
                    }
                    //存储业务使用的通道
                    if (null != ctx && ctx.channel().isActive()) {
                        NettyChannelMap.update("Applets" + userId1, ctx);
//                    String s = NettyMsg.setMsg(Method.ok, new HashMap<String, Object>());
//                    ctx.writeAndFlush(Unpooled.copiedBuffer((s).getBytes()));
                    }
                }
zuul/src/main/java/com/sinata/zuul/util/echo/NettyChannelMap.java
@@ -104,6 +104,11 @@
        }
    }
    public static synchronized void remove_(String key) {
        ctxMap.remove(key);
    }
    
    /**
     * Remove the data resources.
zuul/src/main/java/com/sinata/zuul/util/echo/NettyServerController.java
@@ -106,72 +106,56 @@
                        if(StringUtil.isNotEmpty(token)){
                            String token_ = redisUtil.getValue("USER_APP_"+ userId1);//获取缓存中最新的数据
                            if(StringUtil.isNotEmpty(token_) && !token.equals(token_)){//不在同一设备上登录,向其他设备发送数据
                                ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(0, 23));
                                JSONObject msg_ = new JSONObject();
                                msg_.put("code", 200);
                                msg_.put("msg", "SUCCESS");
                                msg_.put("method", "OFFLINE");
                                msg_.put("data", new Object());
                                this.sendMsgToClient(ctx, msg_.toJSONString());//给当前通道发送消息
                                TimerTask timerTask = new TimerTask() {
                                this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息
                                new Timer().schedule(new TimerTask() {
                                    @Override
                                    public void run() {
                                        NettyChannelMap.remove_(ctx);
                                        NettyChannelMap.remove(ctx);
                                        NettyChannelMap.remove_(data_);
                                    }
                                };
                                Timer timer = new Timer();
                                timer.schedule(timerTask, 3000);
                                timer.cancel();
                            }else{
                                }, 5000);
                            }
                                NettyChannelMap.update_(token.substring(0, 23), ctx);
                                NettyChannelMap.update("USER" + userId1, ctx);
                                String s = NettyMsg.setMsg(Method.ok, new HashMap<String, Object>());
                                ctx.writeAndFlush(Unpooled.copiedBuffer((s).getBytes()));
                            }
                            if(StringUtil.isEmpty(token_)){//确保登录的时候存储token失败的情况
                                redisUtil.setStrValue("USER_APP_" + userId1, token);
                            }
                        }
                        //存储通讯通道
                        if(null != ctx && ctx.channel().isActive()){
                            NettyChannelMap.update("USER" + userId1, ctx);
                        }
                    }else{
                        //确保账号在单个设备上登录
                        String value = redisUtil.getValue("DEVICE_" + userId1);
                        if(StringUtil.isNotEmpty(token) && StringUtil.isEmpty(device) && StringUtil.isEmpty(value)){//APP端登录的操作
                        if(StringUtil.isNotEmpty(token)){//APP端登录的操作
                            String token_ = redisUtil.getValue("DRIVER_" + userId1);//缓存中拿最新数据
                            if(StringUtil.isNotEmpty(token_) && !token.equals(token_)){//不在同一设备上登录,向当前设备发送数据
                                ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(0, 23));
                                JSONObject msg_ = new JSONObject();
                                msg_.put("code", 200);
                                msg_.put("msg", "SUCCESS");
                                msg_.put("method", "OFFLINE");
                                msg_.put("data", new Object());
                                this.sendMsgToClient(ctx, msg_.toJSONString());//给当前通道发送消息
                                TimerTask timerTask = new TimerTask() {
                                this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息
                                new Timer().schedule(new TimerTask() {
                                    @Override
                                    public void run() {
                                        NettyChannelMap.remove_(ctx);
                                        NettyChannelMap.remove(ctx);
                                        NettyChannelMap.remove_(data_);
                                    }
                                };
                                Timer timer = new Timer();
                                timer.schedule(timerTask, 3000);
                                timer.cancel();
                            }else{
                                }, 5000);
                            }
                                NettyChannelMap.update("DRIVER" + userId1, ctx);
                                NettyChannelMap.update_(token.substring(0, 23), ctx);
                                String s = NettyMsg.setMsg(Method.ok, new HashMap<String, Object>());
                                ctx.writeAndFlush(Unpooled.copiedBuffer((s).getBytes()));
                            }
                            if(StringUtil.isEmpty(token_)){//确保登录的时候存储token失败的情况
                                redisUtil.setStrValue("DRIVER_" + userId1, token);
                            }
                        }
                        //存储通讯通道
                        if(null != ctx && ctx.channel().isActive()){
                            NettyChannelMap.update("DRIVER" + userId1, ctx);
                            String s = NettyMsg.setMsg(Method.ok, new HashMap<String, Object>());
                            ctx.writeAndFlush(Unpooled.copiedBuffer((s).getBytes()));
                        }
                    }
                }
zuul/src/main/resources/application.yml
@@ -1,5 +1,5 @@
server:
  port: 80
  port: 81
spring:
  application:
@@ -24,10 +24,6 @@
      path: /driver/** #配置请求URL的请求规则
      url: http://127.0.0.1:8007 #真正的微服务地址,path匹配的请求都转发到这里
      serviceid: driver-server #指定Eureka注册中心的服务id
    dispatch-server: #路由调度相关请求
      path: /dispatch/** #配置请求URL的请求规则
      url: http://127.0.0.1:8008 #真正的微服务地址,path匹配的请求都转发到这里
      serviceid: dispatch-server #指定Eureka注册中心的服务id
  #  配置zuul超时时间
  host:
    connect-timeout-millis: 150000
zuul/src/main/resources/redis.properties
@@ -4,11 +4,16 @@
# Redis·þÎñÆ÷µØÖ·
spring.redis.host=127.0.0.1
# Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú
#spring.redis.port=16379
spring.redis.port=6379
spring.redis.port=16379
# Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£©
#spring.redis.password=mPMHThYzlT8DWgl8HLqwPEyPOiHDPPB5
spring.redis.password=123456
spring.redis.password=cKsEeyffDXG5PzNg8CIbrWxFluXrCprZ
## Redis·þÎñÆ÷µØÖ·
#spring.redis.host=127.0.0.1
## Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú
#spring.redis.port=6379
## Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£©
#spring.redis.password=123456
# Á¬½Ó³Ø×î´óÁ¬½ÓÊý£¨Ê¹ÓøºÖµ±íʾûÓÐÏÞÖÆ£©
spring.redis.jedis.pool.max-active=1024
# Á¬½Ó³Ø×î´ó×èÈûµÈ´ýʱ¼ä£¨Ê¹ÓøºÖµ±íʾûÓÐÏÞÖÆ£©