From c16f3bf0b16707214c3ad8acadbe5b77d35d4ccf Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期四, 09 一月 2025 16:23:51 +0800
Subject: [PATCH] 初始化

---
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java                             |   27 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount1Mapper.java                 |   11 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/LineSiteController.java                |   73 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java                              |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java                        |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/RoleController.java                       |  230 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java                                  |   71 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ProblemController.java                                  |   92 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityInvite.java                        |  162 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java                |  711 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java                           |   12 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java                      |   50 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOpenCityBusinessService.java                |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Verified.java                                  |  134 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICancleOrderService.java                     |   18 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java                            |   94 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IntegralOrderMapper.java                         |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Complaint.java                                 |  148 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java                                      |  116 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/controller/OrderPrivateCarController.java      |  154 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineMapper.xml                        |   36 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/mapping/TCharteredServiceMapper.xml        |   55 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml              |  594 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityHistoryMapper.java                 |   24 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPositionMapper.xml                  |   27 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemPrice.java                               |   90 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SensitiveWords.java                            |   64 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LocationMapper.xml                    |   36 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserRedPacketRecord.java                       |  176 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserRedPacketRecordMapper.java                   |   42 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java                                    |  896 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PushOrderMapper.xml                      |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VersionManagementMapper.xml              |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LinePriceMapper.xml                   |   23 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java                                           |   39 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java                                |   98 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LogController.java                        |   84 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IServerCarModelService.java                  |   32 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponRecordService.java                 |   16 
 UserNTTravel/guns-admin/src/main/resources/ehcache.xml                                                                       |   57 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/BaseWarpper.java                             |  146 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/KaptchaController.java                    |  114 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVersionManagementService.java               |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java                    |  101 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml                            |   71 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java                 |  113 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LinePrice.java                              |  120 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IWithdrawalService.java                      |   41 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderService.java                           |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/FrequentPassengersServiceImpl.java      |   11 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java                           |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml                    |   18 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIntegralGoodsService.java                   |   21 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverOrdersMapper.java                          |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OpenCityBusinessMapper.xml               |   62 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserCouponRecord.java                          |  234 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java                              |  103 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/model/OrderLogistics.java                    |  878 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/warpper/OrderTaxiWarpper.java                          |  226 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java                               |   93 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserInfoService.java                        |  228 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IntegralOrderMapper.xml                  |   32 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/CouponController.java                                   |  145 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/NoticeController.java                     |  138 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/controller/OrderTransferController.java            |  217 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysReformistMapper.xml                   |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OpenCityBusinessServiceImpl.java        |  120 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/model/OrderCharteredCar.java                   |  264 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserInfoWarpper.java                         |  183 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Advertisement.java                             |  127 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRedPacketRecordService.java                 |    8 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCharteredServiceService.java               |   35 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java                         |  894 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PhoneMapper.java                                 |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java                             |   29 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LineSiteWarpper.java                      |  235 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRedenvelopeMapper.xml        |   39 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginController.java                      |  134 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/ICarMapper.java                               |   14 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDFalconUtil.java                               |  224 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVerifiedService.java                        |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java                        |  125 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java                                |   43 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserRedPacketRecordServiceImpl.java     |   59 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/KaiPiaoUtil.java                             |  118 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java                                         |  127 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ComplaintMapper.java                             |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/IntegralGoodsWarpper.java                    |   84 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRegisteredMapper.xml         |   45 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TActivityGeneralization.java                   |  169 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java        | 1842 +
 UserNTTravel/guns-admin/src/main/resources/redis.properties                                                                  |   23 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/TransactionDetailsMapper.java                      |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IntegralGoodsMapper.java                         |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java                                         |   46 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java                          |   50 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OpenCityMapper.xml                       |   61 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Feedback.java                                  |  176 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java                                  |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OpenCityServiceImpl.java                |   69 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserRedPacketRecordService.java             |   40 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/AdvertisementWarpper.java                    |  103 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CompanyCityMapper.java                           |   10 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ObsUploadUtil.java                              |   76 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java                       |   61 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/ICar.java                                   |  272 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Agreement.java                                 |   59 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java                                  |   80 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml                         |   23 
 UserNTTravel/guns-admin/pom.xml                                                                                              |  272 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverWorkMapper.java                            |   10 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/MenuController.java                       |  244 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ProblemWarpper.java                          |   78 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/server/impl/OrderTransferServiceImpl.java          | 1443 +
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginLogController.java                   |   69 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserCouponRecordMapper.xml               |  125 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml                    |   55 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java              |   53 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/TNoticeController.java                                  |   50 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RedPacketRecordMapper.java                       |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderDriverWarpper.java                      |  181 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java                         |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SystemException.java                            |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Site.java                                   |  176 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineSite.java                               |   82 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ICBCPayUtil.java                                |  673 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/model/OrderTransferCar.java                        | 1035 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java                                        |   78 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OpenCityBusinessMapper.java                      |   29 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCitySiteMapper.java                         |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CancleOrder.java                               |  104 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java                                        |   32 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml                    |   70 
 UserNTTravel/guns-admin/src/main/resources/application.yml                                                                   |  122 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java                          |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysIntegralMapper.java                           |   10 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java                       |   38 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java                            |   33 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/SptBlueInvOpenDemo.java                      |  154 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java                    |   96 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/mapping/OrderCharteredCarMapper.xml        |   59 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TActivityGeneralizationMapper.java               |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java                          |   36 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPushOrderService.java                       |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyCityServiceImpl.java             |   74 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java                    |   48 
 UserNTTravel/guns-admin/src/main/resources/META-INF/spring-devtools.properties                                               |    1 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CompanyCity.java                               |  104 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java                              |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthIntercepter.java                            |   37 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java                         |  100 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/BlackboardController.java                 |   35 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/IntegralOrder.java                             |  175 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java                              |  154 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml                         |  335 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java                        |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java                          |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IProblemService.java                         |   32 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java                                         |   70 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Expense.java                                   |  123 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java                    |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysReformist.java                              |  102 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java                                   |  384 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IntegralOrderServiceImpl.java           |   84 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsSpreadService.java |   12 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GeodesyUtil.java                                |   71 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityBalanceMapper.java                   |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java                |   28 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderFrequentPassengersServiceImpl.java |   11 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/PaymentRecordMapper.java                           |   23 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CompanyCityMapper.xml                    |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/server/IOrderTransferService.java                  |  279 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java    | 1441 +
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java                              |   29 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverWork.java                                |  105 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java                          |   76 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OpenCityBusiness.java                          |   45 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiSendSms.java                                 |  123 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SensitiveWordsMapper.java                        |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java                         |   61 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPosition.java                             |  148 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VerifiedServiceImpl.java                |   60 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OpenCityMapper.java                              |   25 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISystemNoticeService.java                    |   65 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java                              |   44 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java                                  |  356 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPhoneService.java                           |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Line.java                                   |  113 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HuaWeiSMSUtil.java                              |  170 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dto/CharteredCarDto.java                       |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPositionMapper.java                         |   20 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCancelService.java                     |   48 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/UserMgrController.java                    |  373 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Invoice.java                                   |  218 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IInvoiceService.java                         |   29 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOrdersServiceImpl.java            |   50 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java                             |   54 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CancleOrderServiceImpl.java             |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SystemNoticeServiceImpl.java            |  115 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineSiteMapper.xml                    |   58 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/GetMobile.java                                            |   87 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/FeedbackMapper.java                              |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TActivityGeneralizationServiceImpl.java |   23 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRegisteredService.java          |   20 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/OrderCharteredCarMapper.java               |   27 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverOrders.java                              |   62 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/RedisConfig.java                                             |   46 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemPriceMapper.java                           |   20 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java                  |   10 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java                                  |   75 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Location.java                               |  203 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java                    |   90 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java                                             |  211 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LocationMapper.java                           |   18 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java                                  |  105 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java                                      |  232 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/RedEnvelopeController.java                              |  143 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserCouponRecordMapper.java                      |   55 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SensitiveWordsMapper.xml                 |   11 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java                          |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml                           |   42 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java   |   33 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderFrequentPassengersMapper.java               |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IComplaintService.java                       |   18 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityInviteMapper.xml             |   42 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/InvoiceData.java                      |   14 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java                                |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverOrdersService.java                    |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java                                    |  104 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityHistory.java                     |  145 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java                  |   27 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/util/CreatAndSendUtil.java                   |  106 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WithdrawalServiceImpl.java              |  159 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityRegisteredMapper.xml       |   28 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/AgreementServiceImpl.java               |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java                    |   73 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthService.java                                |   51 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/FrequentPassengersController.java                       |  135 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ProblemMapper.xml                        |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICompanyCityService.java                     |   27 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java                 |   90 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java   |  980 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JuHeUtil.java                                   |   44 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOpenCityService.java                        |   27 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TNoticesServiceImpl.java                |   32 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICompanyService.java                         |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java                             |   36 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRegisteredMapper.java                |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java                                      |  208 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java                              |   57 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/GlobalInfo.java                       |   56 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/OrderLogisticsMapper.java                |   61 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ComplaintMapper.xml                      |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ApplicationRunnerUtil.java                      |   99 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/WithdrawalMapper.xml                     |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java                               |   15 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ServerCarModelController.java                           |  101 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityHistoryMapper.xml          |   53 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/InvoiceDetails.java                   |   56 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SmsrecordServiceImpl.java               |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java                              |   33 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ServerCarModelMapper.java                        |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/server/IOrderCharteredCarService.java          |   59 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/controller/OrderCharteredCarController.java    |   96 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java                                  |  128 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/model/SiteDto.java                                 |   12 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderServerWarpper.java                      |  128 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/AgreementMapper.xml                      |   27 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java                                    |  115 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java                               |   62 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java                          |   23 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java                        |   73 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineServiceImpl.java                  |   73 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java                    |   47 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml             |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/ChargeInfo.java                       |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/SiteMapper.java                               |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/TransactionDetailsMapper.xml               |   18 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/model/OrderLogisticsSpread.java              |  106 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCharteredService.java                         |  233 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java                | 1383 +
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderEvaluateMapper.xml                  |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OpenCity.java                                  |  115 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java                    |   61 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java             |   69 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount1Mapper.xml          |   32 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java                        |   24 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiApiUtil.java                                 |   51 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml                       |   41 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java                     |   94 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java                            |   15 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java                                         |   18 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PhoneMapper.xml                          |   68 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java                                   |  122 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/AdvertisementServiceImpl.java           |   40 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCancelServiceImpl.java             |   84 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java                                   |  911 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VersionManagementServiceImpl.java       |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderEvaluateMapper.java                         |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java                            |   48 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/AgreementController.java                                |   48 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java                                           |   48 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthenticationKit.java                          |  233 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/AgreementMapper.java                             |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java                            |   97 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ExpenseMapper.java                               |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/AdvertisementController.java                            |   48 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ILineService.java                          |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TNoticeWarpper.java                          |   78 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java                                |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemNoticeMapper.java                          |   47 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/WithdrawalMapper.java                            |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/FeedbackController.java                                 |   58 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java                               |  178 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java                     | 1035 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Problem.java                                   |  134 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/InvoiceMapper.java                               |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java                                            |  186 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java                       |   49 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PushOrderServiceImpl.java               |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderEvaluate.java                             |  136 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/WithdrawalController.java                               |  114 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/FeedbackServiceImpl.java                |   62 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java                                |  153 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java                                   |   29 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java                                   |   59 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java                                                |   93 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java                             |   28 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java                                         |  218 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ProblemServiceImpl.java                 |   72 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java                                  |  128 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityBalanceService.java             |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java                              |   55 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarService.java                                |   76 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPositionService.java                   |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/OrderTaxiController.java                    |   90 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java           |   98 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VersionManagementMapper.java                     |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java                         |   60 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LineWarpper.java                          |   85 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HashKit.java                                    |  109 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CancleOrderMapper.xml                    |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/InvoiceMapper.xml                        |   35 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/TransactionDetails.java                          |  164 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java                        |   50 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java                            |   46 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverWorkMapper.xml                     |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/FrequentPassengers.java                        |  128 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IntegralGoodsServiceImpl.java           |   44 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java                           |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PushOrderMapper.java                             |   20 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java                                |   25 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderFrequentPassengersService.java         |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java                                      |  127 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/InvoiceController.java                                  |  104 
 UserNTTravel/guns-admin/src/main/resources/logback-spring.xml                                                                |  119 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java                |  261 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/dao/mapping/OrderTransferMapper.xml                |  546 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineShift.java                              |  117 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderFrequentPassengersMapper.xml        |   12 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java                                     |   36 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRegisteredServiceImpl.java  |   35 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IFeedbackService.java                        |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PushOrder.java                                 |  118 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DriverInfoWarpper.java                       |  168 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/SiteController.java                    |   96 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ChinaMobileUtil.java                            |  128 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java                          |   27 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java                             |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/OrderLogisticsSpreadMapper.java          |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/NettyController.java                                    |   91 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java                                 |  188 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/HttpUtils.java                                            |  312 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/PhoneController.java                                    |   72 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityWarpper.java                |  241 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/ServerCarModel.java                            |  120 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java                        |  716 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml                           |   77 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java                          |   63 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITNoticesService.java                        |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java                           |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java             |   39 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/VersionManagementController.java                        |   60 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineMapper.java                               |   28 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VersionWarpper.java                          |   84 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRedenvelopeMapper.java               |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java                                      |   80 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WeChatUtil.java                                 |  209 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java                                |  123 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java                               |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/AdvertisementMapper.java                         |   20 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java     |  239 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java            |  279 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IFrequentPassengersService.java              |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java                                      |  140 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java                          |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java                                        |   36 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java                                  |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysReformistMapper.java                          |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderEvaluateWarpper.java                    |   66 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml                         |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/RedPacketRecord.java                           |  162 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TNoticesMapper.xml                       |   66 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java                     |   10 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java                                       |  201 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MinistryOfTransport.java                        | 1063 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml                           |  177 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRegistered.java                    |  162 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpClientUtil.java                             |  346 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ServerCarModelWarpper.java                   |  121 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java                             |   33 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java                   |  143 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml                        |  397 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml          |  546 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Smsrecord.java                                 |  106 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRedenvelopeService.java         |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/AdvertisementMapper.xml                  |   43 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java                            |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java                                   |  133 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IAgreementService.java                       |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/TCharteredServiceMapper.java               |   43 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java                                  |   53 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CancleOrderMapper.java                           |   18 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderEvaluateServiceImpl.java           |  127 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityBalanceMapper.xml            |   74 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java            |   28 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/FeedbackMapper.xml                       |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount1.java                     |  134 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/VersionManagement.java                         |  120 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IntegralGoodsMapper.xml                  |   39 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineSiteServiceImpl.java              |  158 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/server/impl/OrderCharteredCarServiceImpl.java  |  183 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LocationWarpper.java                      |  128 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserCouponRecordServiceImpl.java        |  112 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java                            |   68 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OpenCityController.java                                 |  125 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserCouponRecordService.java                |   69 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java                                            |   33 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java                   |   20 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/SystemNoticeWarpper.java                     |  124 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RedPacketRecordServiceImpl.java         |   18 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java                        |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TNotices.java                                  |  160 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml                   |   46 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml                         |   38 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverServiceService.java                   |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java                        |   52 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/dao/OrderTransferMapper.java                       |   91 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SystemNoticeController.java                             |  174 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java                                   |   54 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CompanyMapper.java                               |   18 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IAdvertisementService.java                   |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityInviteMapper.java                    |   14 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemPriceMapper.xml                    |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java                |   20 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java                                    |   47 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponRecordMapper.java                       |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemNoticeMapper.xml                   |   51 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java                                   |   78 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml                           |   79 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TravelRecordWarpper.java                     |  101 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/BaseBean.java                                  |  107 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderFrequentPassengers.java                   |   66 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HMACSHA1.java                                   |   63 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CouponWarpper.java                           |  124 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/MinistryOfTransportController.java                      |   37 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java                                           |  174 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml                           |   37 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java                               |  105 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCharteredServiceServiceImpl.java       |   29 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityRegisteredMapper.java              |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIntegralOrderService.java                   |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/IOrderLogisticsService.java           |  198 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java                                                |  105 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java                  |  116 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TNoticesMapper.java                              |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarServiceMapper.xml                     |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityBalance.java                       |  260 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/IntegralGoodsController.java                            |  140 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java                                      |   50 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ExpenseMapper.xml                        |   20 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java                                 |  769 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/LineController.java                    |  123 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ComplaintServiceImpl.java               |   57 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Withdrawal.java                                |  220 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverServiceMapper.java                         |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/SiteWarpper.java                          |   43 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java                                    |  134 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NettyServiceImpl.java                   |   86 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderEvaluateService.java                   |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysIntegral.java                               |   62 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java                         |  138 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/FrequentPassengersMapper.java                    |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRedenvelopeServiceImpl.java |   32 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/ITransactionDetailsService.java                |   23 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java                                       |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RedPacketRecordMapper.xml                |   35 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UrlLinkUtil.java                                |   50 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java                               | 1210 +
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarServiceMapper.java                            |   11 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ILineSiteService.java                      |   29 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/Configuration.java                              |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/InvoiceWarpper.java                          |  104 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java                                |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverService.java                             |   62 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Phone.java                                     |   90 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/MaterialInfo.java                     |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SmsrecordMapper.java                             |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ServerCarModelServiceImpl.java          |  419 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java                  |   37 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverOrdersMapper.xml                   |   25 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISmsrecordService.java                       |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/IntegralOrderWarpper.java                    |   74 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/util/Jisuan.java                             |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/mapping/OrderLogisticsSpreadMapper.xml   |   14 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/EndPushWarpper.java                          |   47 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java                          |   51 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ProblemMapper.java                               |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MD5AndKL.java                                   |  112 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderStatusWarpper.java                      |   38 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml                       |   12 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Company.java                                   |  704 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserCallbackController.java                             |  332 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java                                     |   15 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java                           |   24 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityRegistered.java                  |  134 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineSiteMapper.java                           |   22 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/IntegralGoods.java                             |  148 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java                                |  102 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/TaxiCallbackController.java                 |   23 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INettyService.java                           |   30 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/SiteMapper.xml                        |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/mapping/OrderLogisticsMapper.xml         |  207 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponRecordServiceImpl.java         |   20 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java                                    | 1750 +
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CompanyMapper.xml                        |  121 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/AliSms.java                                    |    8 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VerifiedMapper.java                              |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftMapper.java                          |   13 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java                              |   27 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IPaymentRecordService.java                     |   35 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java                                          |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VerifiedWarpper.java                         |   69 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponRecord.java                           |  162 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityBalanceServiceImpl.java     |   34 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java                     |  405 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java                         |  239 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemNotice.java                              |  147 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java                 | 1388 +
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java                                           |   81 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserRedPacketRecordMapper.xml            |  103 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/email/KaiPiaoEmail.java                      |   86 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/SiteServiceImpl.java                  |  133 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysIntegralMapper.xml                    |   17 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/TransactionDetailsServiceImpl.java        |   48 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml                       |  191 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftMapper.xml                   |   29 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java                          |   28 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PhoneServiceImpl.java                   |   92 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRedenvelope.java                   |  162 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AmapGeocoding.java                              |  111 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/UrlEncoderUtils.java                            |   44 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ServerCarModelMapper.xml                 |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyServiceImpl.java                 |   12 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java                  |  180 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderWarpper.java                            |  267 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/TaxiDriverController.java                   |   52 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java                    |   24 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DeptController.java                       |  164 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ISiteService.java                          |   39 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/IOrderLogisticsSpreadService.java     |    7 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCitySite.java                             |  165 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java                               |   92 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java                                            |  290 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VerifiedMapper.xml                       |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DictController.java                       |  142 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java                                  |   45 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/WithdrawalWarpper.java                       |  101 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineShiftDriver.java                        |  134 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SmsrecordMapper.xml                      |   14 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java                   |  333 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverServiceMapper.xml                  |   26 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/FrequentPassengersMapper.xml             |   16 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/ReturnData.java                       |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java                            |   68 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/PaymentRecord.java                               |  176 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java          |  140 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Car.java                                       |  272 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceServiceImpl.java           |   31 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LinePriceMapper.java                          |   19 
 UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITActivityGeneralizationService.java         |   17 
 591 files changed, 68,172 insertions(+), 0 deletions(-)

diff --git a/UserNTTravel/guns-admin/pom.xml b/UserNTTravel/guns-admin/pom.xml
new file mode 100644
index 0000000..5f5ce18
--- /dev/null
+++ b/UserNTTravel/guns-admin/pom.xml
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.stylefeng</groupId>
+        <artifactId>guns-parent</artifactId>
+        <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>guns-admin</artifactId>
+    <name>guns-admin</name>
+    <description>guns 的spring boot版本</description>
+
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.17</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+        <!--整合hystrix-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.stylefeng</groupId>
+            <artifactId>guns-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.stylefeng</groupId>
+            <artifactId>guns-generator</artifactId>
+        </dependency>
+
+        <!--spring boot依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>2.11.3</version>
+        </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>
+
+
+        <!--shiro依赖-->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-core</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-ehcache</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.ehcache</groupId>
+            <artifactId>ehcache</artifactId>
+        </dependency>
+
+        <!--需要分布式session的话需要放开注释-->
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.session</groupId>-->
+            <!--<artifactId>spring-session-data-redis</artifactId>-->
+        <!--</dependency>-->
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.boot</groupId>-->
+            <!--<artifactId>spring-boot-starter-data-redis</artifactId>-->
+        <!--</dependency>-->
+
+        <dependency>
+            <groupId>com.github.penggle</groupId>
+            <artifactId>kaptcha</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.ibeetl</groupId>
+            <artifactId>beetl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>2.9.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.8.10.ALL</version>
+        </dependency>
+        <!-- oos对象存储 -->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.8.0</version>
+        </dependency>
+        <!--华为云的obs-->
+        <dependency>
+            <groupId>com.huaweicloud</groupId>
+            <artifactId>esdk-obs-java</artifactId>
+            <version>3.19.5</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.4.3</version>
+        </dependency>
+
+        <!-- 计算两坐标间的直线距离 -->
+        <dependency>
+            <groupId>org.gavaghan</groupId>
+            <artifactId>geodesy</artifactId>
+            <version>1.1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+        </dependency>
+    </dependencies>
+
+
+    <build>
+        <!--打包jar包方式-->
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork><!-- 如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart -->
+                </configuration>
+            </plugin>
+        </plugins>
+
+        <!--打包war包引入本地jar的打包方式-->
+        <!--<plugins>-->
+            <!--<plugin>-->
+                <!--<groupId>org.apache.maven.plugins</groupId>-->
+                <!--<artifactId>maven-war-plugin</artifactId>-->
+                <!--<configuration>-->
+                    <!--&lt;!&ndash; 设置成false,否则检查web.xml是否存在。因为springboot是没有web.xml的 &ndash;&gt;-->
+                    <!--<failOnMissingWebXml>false</failOnMissingWebXml>-->
+                    <!--&lt;!&ndash;打包后的项目名&ndash;&gt;-->
+                    <!--&lt;!&ndash;<warName>example</warName>&ndash;&gt;-->
+                    <!--<webResources>-->
+                        <!--<resource>-->
+                            <!--&lt;!&ndash;把本地lib里面的jar复制到lib&ndash;&gt;-->
+                            <!--<directory>${project.basedir}/lib</directory>-->
+                            <!--<targetPath>WEB-INF/lib/</targetPath>-->
+                            <!--<includes>-->
+                                <!--<include>**/*.jar</include>-->
+                            <!--</includes>-->
+                        <!--</resource>-->
+                    <!--</webResources>-->
+                <!--</configuration>-->
+            <!--</plugin>-->
+        <!--</plugins>-->
+
+
+        <resources>
+            <resource>
+                <directory>lib</directory>
+                <targetPath>/BOOT-INF/lib/</targetPath>
+                <includes>
+                    <include>**/*.jar</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/webapp</directory>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+
+</project>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
new file mode 100644
index 0000000..1fc265a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
@@ -0,0 +1,93 @@
+package com.stylefeng.guns;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * SpringBoot方式启动类
+ *
+ * @author stylefeng
+ * @Date 2017/5/21 12:06
+ */
+@EnableEurekaClient//注册为服务提供者
+@SpringBootApplication
+@EnableScheduling//开启定时任务
+@EnableTransactionManagement//启动事务功能
+public class GunsApplication /*extends SpringBootServletInitializer*/ {
+
+    private final static Logger logger = LoggerFactory.getLogger(GunsApplication.class);
+
+    public static void main(String[] args) {
+//            try {
+
+
+            SpringApplication.run(GunsApplication.class, args);
+//            }catch (Exception e){
+//                e.printStackTrace();
+//            }
+            logger.info("GunsApplication is success!");
+
+
+    }
+
+    /**
+     * 向Spring容器中定义RestTemplate对象
+     * @return
+     */
+    @Bean //SpringCloud内部服务质检使用服务名调用
+    @LoadBalanced
+    public RestTemplate internalRestTemplate() {
+        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
+        connectionManager.setDefaultSocketConfig(SocketConfig.custom().setTcpNoDelay(true).build());
+        connectionManager.setDefaultMaxPerRoute(100);//最大并发连接
+        connectionManager.setMaxTotal(200); // 总的最大连接数
+        HttpClient httpClient = HttpClientBuilder.create().setConnectionManager(connectionManager).build();
+        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
+        httpRequestFactory.setConnectionRequestTimeout(30 * 1000);
+        httpRequestFactory.setConnectTimeout(30 * 3000);
+        httpRequestFactory.setReadTimeout(30 * 3000);
+        RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
+        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
+        return restTemplate;
+    }
+
+    @Bean //通过ip地址调用
+    public RestTemplate restTemplate() {
+        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
+        connectionManager.setDefaultSocketConfig(SocketConfig.custom().setTcpNoDelay(true).build());
+        connectionManager.setDefaultMaxPerRoute(100);//最大并发连接
+        connectionManager.setMaxTotal(200); // 总的最大连接数
+        HttpClient httpClient = HttpClientBuilder.create().setConnectionManager(connectionManager).build();
+        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
+        httpRequestFactory.setConnectionRequestTimeout(30 * 1000);
+        httpRequestFactory.setConnectTimeout(30 * 3000);
+        httpRequestFactory.setReadTimeout(30 * 3000);
+        RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
+        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
+        return restTemplate;
+    }
+
+
+//    @Override
+//    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
+//        return builder.sources(GunsApplication.class);
+//    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java
new file mode 100644
index 0000000..18e63c5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * Guns Web程序启动类
+ *
+ * @author fengshuonan
+ * @date 2017-05-21 9:43
+ */
+public class GunsServletInitializer extends SpringBootServletInitializer {
+
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
+        return builder.sources(GunsApplication.class);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java
new file mode 100644
index 0000000..7c1358d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.config;
+
+import net.sf.ehcache.CacheManager;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.ehcache.EhCacheCacheManager;
+import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+
+/**
+ * ehcache配置
+ *
+ * @author fengshuonan
+ * @date 2017-05-20 23:11
+ */
+@Configuration
+@EnableCaching
+public class EhCacheConfig {
+
+    /**
+     * EhCache的配置
+     */
+    @Bean
+    public EhCacheCacheManager cacheManager(CacheManager cacheManager) {
+        return new EhCacheCacheManager(cacheManager);
+    }
+
+    /**
+     * EhCache的配置
+     */
+    @Bean
+    public EhCacheManagerFactoryBean ehcache() {
+        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
+        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
+		ehCacheManagerFactoryBean.setShared(true);//共享缓存,避免tomcat启动报错
+        return ehCacheManagerFactoryBean;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/RedisConfig.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/RedisConfig.java
new file mode 100644
index 0000000..d459612
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/RedisConfig.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+@Configuration
+@PropertySource("classpath:redis.properties")
+public class RedisConfig {
+    @Value("${spring.redis.host}")
+    private String host;
+
+    @Value("${spring.redis.port}")
+    private int port;
+
+    @Value("${spring.redis.timeout}")
+    private int timeout;
+
+    @Value("${spring.redis.jedis.pool.max-idle}")
+    private int maxIdle;
+
+    @Value("${spring.redis.jedis.pool.max-wait}")
+    private long maxWaitMillis;
+
+    @Value("${spring.redis.password}")
+    private String password;
+
+    @Value("${spring.redis.block-when-exhausted}")
+    private boolean  blockWhenExhausted;
+
+    @Bean
+    public JedisPool redisPoolFactory()  throws Exception{
+        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
+        jedisPoolConfig.setMaxIdle(maxIdle);
+        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
+        // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
+        jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
+        // 是否启用pool的jmx管理功能, 默认true
+        jedisPoolConfig.setJmxEnabled(true);
+        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
+        return jedisPool;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java
new file mode 100644
index 0000000..ef9a5bc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java
@@ -0,0 +1,15 @@
+package com.stylefeng.guns.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+
+/**
+ * spring session配置
+ *
+ * @author fengshuonan
+ * @date 2017-07-13 21:05
+ */
+//@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)  //session过期时间  如果部署多机环境,需要打开注释
+@ConditionalOnProperty(prefix = "guns", name = "spring-session-open", havingValue = "true")
+public class SpringSessionConfig {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java
new file mode 100644
index 0000000..96c7d11
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.config;
+
+import io.swagger.annotations.ApiOperation;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * swagger配置类
+ *
+ * @author fengshuonan
+ * @date 2017年6月1日19:42:59
+ */
+@Configuration
+@EnableSwagger2
+@ConditionalOnProperty(prefix = "guns", name = "swagger-open", havingValue = "true")
+public class SwaggerConfig{
+
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))                         //这里采用包含注解的方式来确定要显示的接口
+                //.apis(RequestHandlerSelectors.basePackage("com.stylefeng.guns.modular.system.controller"))    //这里采用包扫描的方式来确定要显示的接口
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("未来出行 Doc")
+                .description("所有接口前需要加 /user 前缀,例如:/user/base/agreement/queryByType <br>" +
+                        "所有以 /api/*** 路径的接口需要上传签名参数sign")
+//                .termsOfServiceUrl("http://git.oschina.net/naan1993/guns")
+                .contact("stylefeng")
+                .version("1.0")
+                .build();
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java
new file mode 100644
index 0000000..d9e3fce
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java
@@ -0,0 +1,125 @@
+package com.stylefeng.guns.config.datasource;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
+import com.stylefeng.guns.core.config.properties.DruidProperties;
+import com.stylefeng.guns.core.config.properties.MutiDataSourceProperties;
+import com.stylefeng.guns.core.datascope.DataScopeInterceptor;
+import com.stylefeng.guns.core.mutidatasource.DynamicDataSource;
+import com.stylefeng.guns.core.mutidatasource.aop.MultiSourceExAop;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import java.sql.SQLException;
+import java.util.HashMap;
+
+/**
+ * 多数据源配置<br/>
+ * <p>
+ * 注:由于引入多数据源,所以让spring事务的aop要在多数据源切换aop的后面
+ *
+ * @author stylefeng
+ * @Date 2017/5/20 21:58
+ */
+@Configuration
+@ConditionalOnProperty(prefix = "guns.muti-datasource", name = "open", havingValue = "true")
+@EnableTransactionManagement(order = 2)
+@MapperScan(basePackages = {"com.stylefeng.guns.modular.*.dao","com.stylefeng.guns.multi.mapper"})
+public class MultiDataSourceConfig {
+
+    @Bean
+    @ConfigurationProperties(prefix = "guns.muti-datasource")
+    public MutiDataSourceProperties mutiDataSourceProperties() {
+        return new MutiDataSourceProperties();
+    }
+
+    @Bean
+    public MultiSourceExAop multiSourceExAop() {
+        return new MultiSourceExAop();
+    }
+
+    /**
+     * guns的数据源
+     */
+    private DruidDataSource dataSource(DruidProperties druidProperties) {
+        DruidDataSource dataSource = new DruidDataSource();
+        druidProperties.config(dataSource);
+        return dataSource;
+    }
+
+    /**
+     * 多数据源,第二个数据源
+     */
+    private DruidDataSource bizDataSource(DruidProperties druidProperties, MutiDataSourceProperties mutiDataSourceProperties) {
+        DruidDataSource dataSource = new DruidDataSource();
+        druidProperties.config(dataSource);
+        mutiDataSourceProperties.config(dataSource);
+        return dataSource;
+    }
+
+    /**
+     * 多数据源连接池配置
+     */
+    @Bean
+    public DynamicDataSource mutiDataSource(DruidProperties druidProperties, MutiDataSourceProperties mutiDataSourceProperties) {
+
+        DruidDataSource dataSourceGuns = dataSource(druidProperties);
+        DruidDataSource bizDataSource = bizDataSource(druidProperties, mutiDataSourceProperties);
+
+        try {
+            dataSourceGuns.init();
+            bizDataSource.init();
+        } catch (SQLException sql) {
+            sql.printStackTrace();
+        }
+
+        DynamicDataSource dynamicDataSource = new DynamicDataSource();
+        HashMap<Object, Object> hashMap = new HashMap<>();
+        hashMap.put(mutiDataSourceProperties.getDataSourceNames()[0], dataSourceGuns);
+        hashMap.put(mutiDataSourceProperties.getDataSourceNames()[1], bizDataSource);
+        dynamicDataSource.setTargetDataSources(hashMap);
+        dynamicDataSource.setDefaultTargetDataSource(dataSourceGuns);
+        return dynamicDataSource;
+    }
+
+    /**
+     * mybatis-plus分页插件
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+
+    /**
+     * 数据范围mybatis插件
+     */
+    @Bean
+    public DataScopeInterceptor dataScopeInterceptor() {
+        return new DataScopeInterceptor();
+    }
+
+    /**
+     * 乐观锁mybatis插件
+     */
+    @Bean
+    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+        return new OptimisticLockerInterceptor();
+    }
+
+    /**
+     * 事务配置
+     *
+     * @author stylefeng
+     * @Date 2018/6/27 23:11
+     */
+    @Bean
+    public DataSourceTransactionManager dataSourceTransactionManager(DynamicDataSource mutiDataSource) {
+        return new DataSourceTransactionManager(mutiDataSource);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java
new file mode 100644
index 0000000..6496133
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java
@@ -0,0 +1,61 @@
+package com.stylefeng.guns.config.datasource;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
+import com.stylefeng.guns.core.config.properties.DruidProperties;
+import com.stylefeng.guns.core.datascope.DataScopeInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * 多数据源配置
+ *
+ * @author stylefeng
+ * @Date 2017/5/20 21:58
+ */
+@Configuration
+@ConditionalOnProperty(prefix = "guns.muti-datasource", name = "open", havingValue = "false", matchIfMissing = true)
+@EnableTransactionManagement
+@MapperScan(basePackages = {"com.stylefeng.guns.modular.*.dao"})
+public class SingleDataSourceConfig {
+
+    /**
+     * 单数据源连接池配置
+     */
+    @Bean
+    public DruidDataSource dataSource(DruidProperties druidProperties) {
+        DruidDataSource dataSource = new DruidDataSource();
+        druidProperties.config(dataSource);
+        return dataSource;
+    }
+
+    /**
+     * mybatis-plus分页插件
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+
+    /**
+     * 数据范围mybatis插件
+     */
+    @Bean
+    public DataScopeInterceptor dataScopeInterceptor() {
+        return new DataScopeInterceptor();
+    }
+
+    /**
+     * 乐观锁mybatis插件
+     */
+    @Bean
+    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+        return new OptimisticLockerInterceptor();
+    }
+
+}
+
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java
new file mode 100644
index 0000000..e1dc4cb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java
@@ -0,0 +1,103 @@
+package com.stylefeng.guns.config.properties;
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+/**
+ * beetl配置(如果需要配置别的配置可参照这个形式自己添加)
+ *
+ * @author fengshuonan
+ * @date 2017-05-24 20:37
+ */
+@Configuration
+@ConfigurationProperties(prefix = BeetlProperties.BEETLCONF_PREFIX)
+public class BeetlProperties {
+
+    public static final String BEETLCONF_PREFIX = "beetl";
+
+    private String delimiterStatementStart;
+
+    private String delimiterStatementEnd;
+
+    private String resourceTagroot;
+
+    private String resourceTagsuffix;
+
+    private String resourceAutoCheck;
+
+    @Value("${spring.mvc.view.prefix}")
+    private String prefix;
+
+    public Properties getProperties(){
+        Properties properties = new Properties();
+        if(ToolUtil.isNotEmpty(delimiterStatementStart)){
+            if(delimiterStatementStart.startsWith("\\")){
+                delimiterStatementStart = delimiterStatementStart.substring(1);
+            }
+            properties.setProperty("DELIMITER_STATEMENT_START",delimiterStatementStart);
+        }
+        if(ToolUtil.isNotEmpty(delimiterStatementEnd)){
+            properties.setProperty("DELIMITER_STATEMENT_END",delimiterStatementEnd);
+        }else{
+            properties.setProperty("DELIMITER_STATEMENT_END","null");
+        }
+        if(ToolUtil.isNotEmpty(resourceTagroot)){
+            properties.setProperty("RESOURCE.tagRoot",resourceTagroot);
+        }
+        if(ToolUtil.isNotEmpty(resourceTagsuffix)){
+            properties.setProperty("RESOURCE.tagSuffix",resourceTagsuffix);
+        }
+        if(ToolUtil.isNotEmpty(resourceAutoCheck)){
+            properties.setProperty("RESOURCE.autoCheck",resourceAutoCheck);
+        }
+        return properties;
+    }
+
+    public String getPrefix() {
+        return prefix;
+    }
+
+    public String getDelimiterStatementStart() {
+        return delimiterStatementStart;
+    }
+
+    public void setDelimiterStatementStart(String delimiterStatementStart) {
+        this.delimiterStatementStart = delimiterStatementStart;
+    }
+
+    public String getDelimiterStatementEnd() {
+        return delimiterStatementEnd;
+    }
+
+    public void setDelimiterStatementEnd(String delimiterStatementEnd) {
+        this.delimiterStatementEnd = delimiterStatementEnd;
+    }
+
+    public String getResourceTagroot() {
+        return resourceTagroot;
+    }
+
+    public void setResourceTagroot(String resourceTagroot) {
+        this.resourceTagroot = resourceTagroot;
+    }
+
+    public String getResourceTagsuffix() {
+        return resourceTagsuffix;
+    }
+
+    public void setResourceTagsuffix(String resourceTagsuffix) {
+        this.resourceTagsuffix = resourceTagsuffix;
+    }
+
+    public String getResourceAutoCheck() {
+        return resourceAutoCheck;
+    }
+
+    public void setResourceAutoCheck(String resourceAutoCheck) {
+        this.resourceAutoCheck = resourceAutoCheck;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java
new file mode 100644
index 0000000..b260140
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java
@@ -0,0 +1,105 @@
+package com.stylefeng.guns.config.properties;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+
+import static com.stylefeng.guns.core.util.ToolUtil.getTempPath;
+import static com.stylefeng.guns.core.util.ToolUtil.isEmpty;
+
+/**
+ * guns项目配置
+ *
+ * @author stylefeng
+ * @Date 2017/5/23 22:31
+ */
+@Component
+@ConfigurationProperties(prefix = GunsProperties.PREFIX)
+public class GunsProperties {
+
+    public static final String PREFIX = "guns";
+
+    private Boolean kaptchaOpen = false;
+
+    private Boolean swaggerOpen = false;
+
+    private String fileUploadPath;
+
+    private Boolean haveCreatePath = false;
+
+    private Boolean springSessionOpen = false;
+
+    /**
+     * session 失效时间(默认为30分钟 单位:秒)
+     */
+    private Integer sessionInvalidateTime = 30 * 60;
+
+    /**
+     * session 验证失效时间(默认为15分钟 单位:秒)
+     */
+    private Integer sessionValidationInterval = 15 * 60;
+
+    public String getFileUploadPath() {
+        //如果没有写文件上传路径,保存到临时目录
+        if (isEmpty(fileUploadPath)) {
+            return getTempPath();
+        } else {
+            //判断有没有结尾符,没有得加上
+            if (!fileUploadPath.endsWith(File.separator)) {
+                fileUploadPath = fileUploadPath + File.separator;
+            }
+            //判断目录存不存在,不存在得加上
+            if (!haveCreatePath) {
+                File file = new File(fileUploadPath);
+                file.mkdirs();
+                haveCreatePath = true;
+            }
+            return fileUploadPath;
+        }
+    }
+
+    public void setFileUploadPath(String fileUploadPath) {
+        this.fileUploadPath = fileUploadPath;
+    }
+
+    public Boolean getKaptchaOpen() {
+        return kaptchaOpen;
+    }
+
+    public void setKaptchaOpen(Boolean kaptchaOpen) {
+        this.kaptchaOpen = kaptchaOpen;
+    }
+
+    public Boolean getSwaggerOpen() {
+        return swaggerOpen;
+    }
+
+    public void setSwaggerOpen(Boolean swaggerOpen) {
+        this.swaggerOpen = swaggerOpen;
+    }
+
+    public Boolean getSpringSessionOpen() {
+        return springSessionOpen;
+    }
+
+    public void setSpringSessionOpen(Boolean springSessionOpen) {
+        this.springSessionOpen = springSessionOpen;
+    }
+
+    public Integer getSessionInvalidateTime() {
+        return sessionInvalidateTime;
+    }
+
+    public void setSessionInvalidateTime(Integer sessionInvalidateTime) {
+        this.sessionInvalidateTime = sessionInvalidateTime;
+    }
+
+    public Integer getSessionValidationInterval() {
+        return sessionValidationInterval;
+    }
+
+    public void setSessionValidationInterval(Integer sessionValidationInterval) {
+        this.sessionValidationInterval = sessionValidationInterval;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java
new file mode 100644
index 0000000..748ed06
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.config.web;
+
+import com.stylefeng.guns.config.properties.BeetlProperties;
+import com.stylefeng.guns.core.beetl.BeetlConfiguration;
+import org.beetl.core.resource.ClasspathResourceLoader;
+import org.beetl.ext.spring.BeetlSpringViewResolver;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * web 配置类
+ *
+ * @author fengshuonan
+ * @date 2016年11月12日 下午5:03:32
+ */
+@Configuration
+public class BeetlConfig {
+
+    @Autowired
+    BeetlProperties beetlProperties;
+
+    /**
+     * beetl的配置
+     */
+    @Bean(initMethod = "init")
+    public BeetlConfiguration beetlConfiguration() {
+        BeetlConfiguration beetlConfiguration = new BeetlConfiguration();
+        beetlConfiguration.setResourceLoader(new ClasspathResourceLoader(BeetlConfig.class.getClassLoader(), beetlProperties.getPrefix()));
+        beetlConfiguration.setConfigProperties(beetlProperties.getProperties());
+        return beetlConfiguration;
+    }
+
+    /**
+     * beetl的视图解析器
+     */
+    @Bean
+    public BeetlSpringViewResolver beetlViewResolver() {
+        BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();
+        beetlSpringViewResolver.setConfig(beetlConfiguration());
+        beetlSpringViewResolver.setContentType("text/html;charset=UTF-8");
+        beetlSpringViewResolver.setOrder(0);
+        return beetlSpringViewResolver;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java
new file mode 100644
index 0000000..e05c67f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java
@@ -0,0 +1,218 @@
+package com.stylefeng.guns.config.web;
+
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.intercept.GunsUserFilter;
+import com.stylefeng.guns.core.shiro.ShiroDbRealm;
+import org.apache.shiro.cache.CacheManager;
+import org.apache.shiro.cache.ehcache.EhCacheManager;
+import org.apache.shiro.codec.Base64;
+import org.apache.shiro.session.mgt.SessionManager;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.CookieRememberMeManager;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.apache.shiro.web.servlet.Cookie;
+import org.apache.shiro.web.servlet.ShiroHttpSession;
+import org.apache.shiro.web.servlet.SimpleCookie;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.apache.shiro.web.session.mgt.ServletContainerSessionManager;
+import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.Filter;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * shiro权限管理的配置
+ *
+ * @author fengshuonan
+ * @date 2016年11月14日 下午3:03:44
+ */
+@Configuration
+public class ShiroConfig {
+
+    /**
+     * 安全管理器
+     */
+    @Bean
+    public DefaultWebSecurityManager securityManager(CookieRememberMeManager rememberMeManager, CacheManager cacheShiroManager, SessionManager sessionManager) {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        securityManager.setRealm(this.shiroDbRealm());
+        securityManager.setCacheManager(cacheShiroManager);
+        securityManager.setRememberMeManager(rememberMeManager);
+        securityManager.setSessionManager(sessionManager);
+        return securityManager;
+    }
+
+    /**
+     * spring session管理器(多机环境)
+     */
+    @Bean
+    @ConditionalOnProperty(prefix = "guns", name = "spring-session-open", havingValue = "true")
+    public ServletContainerSessionManager servletContainerSessionManager() {
+        return new ServletContainerSessionManager();
+    }
+
+    /**
+     * session管理器(单机环境)
+     */
+    @Bean
+    @ConditionalOnProperty(prefix = "guns", name = "spring-session-open", havingValue = "false")
+    public DefaultWebSessionManager defaultWebSessionManager(CacheManager cacheShiroManager, GunsProperties gunsProperties) {
+        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
+        sessionManager.setCacheManager(cacheShiroManager);
+        sessionManager.setSessionValidationInterval(gunsProperties.getSessionValidationInterval() * 1000);
+        sessionManager.setGlobalSessionTimeout(gunsProperties.getSessionInvalidateTime() * 1000);
+        sessionManager.setDeleteInvalidSessions(true);
+        sessionManager.setSessionValidationSchedulerEnabled(true);
+        Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
+        cookie.setName("shiroCookie");
+        cookie.setHttpOnly(true);
+        sessionManager.setSessionIdCookie(cookie);
+        return sessionManager;
+    }
+
+    /**
+     * 缓存管理器 使用Ehcache实现
+     */
+    @Bean
+    public CacheManager getCacheShiroManager(EhCacheManagerFactoryBean ehcache) {
+        EhCacheManager ehCacheManager = new EhCacheManager();
+        ehCacheManager.setCacheManager(ehcache.getObject());
+        return ehCacheManager;
+    }
+
+    /**
+     * 项目自定义的Realm
+     */
+    @Bean
+    public ShiroDbRealm shiroDbRealm() {
+        return new ShiroDbRealm();
+    }
+
+    /**
+     * rememberMe管理器, cipherKey生成见{@code Base64Test.java}
+     */
+    @Bean
+    public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) {
+        CookieRememberMeManager manager = new CookieRememberMeManager();
+        manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA=="));
+        manager.setCookie(rememberMeCookie);
+        return manager;
+    }
+
+    /**
+     * 记住密码Cookie
+     */
+    @Bean
+    public SimpleCookie rememberMeCookie() {
+        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
+        simpleCookie.setHttpOnly(true);
+        simpleCookie.setMaxAge(7 * 24 * 60 * 60);//7天
+        return simpleCookie;
+    }
+
+    /**
+     * Shiro的过滤器链
+     */
+    @Bean
+    public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) {
+        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
+        shiroFilter.setSecurityManager(securityManager);
+        /**
+         * 默认的登陆访问url
+         */
+        shiroFilter.setLoginUrl("/login");
+        /**
+         * 登陆成功后跳转的url
+         */
+        shiroFilter.setSuccessUrl("/");
+        /**
+         * 没有权限跳转的url
+         */
+        shiroFilter.setUnauthorizedUrl("/global/error");
+
+        /**
+         * 覆盖默认的user拦截器(默认拦截器解决不了ajax请求 session超时的问题,若有更好的办法请及时反馈作者)
+         */
+        HashMap<String, Filter> myFilters = new HashMap<>();
+        myFilters.put("user", new GunsUserFilter());
+        shiroFilter.setFilters(myFilters);
+
+        /**
+         * 配置shiro拦截器链
+         *
+         * anon  不需要认证
+         * authc 需要认证
+         * user  验证通过或RememberMe登录的都可以
+         *
+         * 当应用开启了rememberMe时,用户下次访问时可以是一个user,但不会是authc,因为authc是需要重新认证的
+         *
+         * 顺序从上到下,优先级依次降低
+         *
+         * api开头的接口,走rest api鉴权,不走shiro鉴权
+         *
+         */
+        Map<String, String> hashMap = new LinkedHashMap<>();
+        hashMap.put("/swagger-ui.html", "anon");
+        hashMap.put("/swagger-resources/**", "anon");
+        hashMap.put("/v2/**", "anon");
+        hashMap.put("/webjars/**", "anon");
+        hashMap.put("/swagger-resources/configuration/ui/**", "anon");
+        hashMap.put("/swagger-resources/configuration/security/**", "anon");
+
+        hashMap.put("/base/**", "anon");
+        hashMap.put("/api/driver/queryDriverInfo", "anon");
+        hashMap.put("/api/frequentPassengers/queryFrequentPassengersList", "anon");
+        hashMap.put("/api/**", "anon");//api不走shiro验证
+        hashMap.put("/static/**", "anon");
+        hashMap.put("/gunsApi/**", "anon");
+        hashMap.put("/login", "anon");
+        hashMap.put("/global/sessionError", "anon");
+        hashMap.put("/kaptcha", "anon");
+        hashMap.put("/**", "user");
+
+
+        shiroFilter.setFilterChainDefinitionMap(hashMap);
+        return shiroFilter;
+    }
+
+    /**
+     * 在方法中 注入 securityManager,进行代理控制
+     */
+    @Bean
+    public MethodInvokingFactoryBean methodInvokingFactoryBean(DefaultWebSecurityManager securityManager) {
+        MethodInvokingFactoryBean bean = new MethodInvokingFactoryBean();
+        bean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");
+        bean.setArguments(new Object[]{securityManager});
+        return bean;
+    }
+
+    /**
+     * Shiro生命周期处理器:
+     * 用于在实现了Initializable接口的Shiro bean初始化时调用Initializable接口回调(例如:UserRealm)
+     * 在实现了Destroyable接口的Shiro bean销毁时调用 Destroyable接口回调(例如:DefaultSecurityManager)
+     */
+    @Bean
+    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+
+    /**
+     * 启用shrio授权注解拦截方式,AOP式方法级权限检查
+     */
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor =
+                new AuthorizationAttributeSourceAdvisor();
+        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+        return authorizationAttributeSourceAdvisor;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java
new file mode 100644
index 0000000..20e6b8e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java
@@ -0,0 +1,174 @@
+package com.stylefeng.guns.config.web;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.alibaba.druid.support.http.WebStatFilter;
+import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator;
+import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.intercept.RestApiInteceptor;
+import com.stylefeng.guns.core.listener.ConfigListener;
+import com.stylefeng.guns.core.xss.XssFilter;
+import org.springframework.aop.Advisor;
+import org.springframework.aop.support.DefaultPointcutAdvisor;
+import org.springframework.aop.support.JdkRegexpMethodPointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.context.request.RequestContextListener;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import java.util.Arrays;
+import java.util.Properties;
+
+/**
+ * web 配置类
+ *
+ * @author fengshuonan
+ * @date 2016年11月12日 下午5:03:32
+ */
+@Configuration
+public class WebConfig extends WebMvcConfigurerAdapter {
+
+    @Autowired
+    private GunsProperties gunsProperties;
+
+    /**
+     * 增加swagger的支持
+     */
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        if (gunsProperties.getSwaggerOpen()) {
+            registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
+            registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+        }
+    }
+
+    /**
+     * 增加对rest api鉴权的spring mvc拦截器
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new RestApiInteceptor()).addPathPatterns("/api/**");
+    }
+
+    /**
+     * druidServlet注册
+     */
+    @Bean
+    public ServletRegistrationBean druidServletRegistration() {
+        ServletRegistrationBean registration = new ServletRegistrationBean(new StatViewServlet());
+        registration.addUrlMappings("/druid/*");
+        return registration;
+    }
+
+    /**
+     * druid监控 配置URI拦截策略
+     */
+    @Bean
+    public FilterRegistrationBean druidStatFilter() {
+        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
+        //添加过滤规则.
+        filterRegistrationBean.addUrlPatterns("/*");
+        //添加不需要忽略的格式信息.
+        filterRegistrationBean.addInitParameter(
+                "exclusions", "/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid,/druid/*");
+        //用于session监控页面的用户名显示 需要登录后主动将username注入到session里
+        filterRegistrationBean.addInitParameter("principalSessionName", "username");
+        return filterRegistrationBean;
+    }
+
+    /**
+     * druid数据库连接池监控
+     */
+    @Bean
+    public DruidStatInterceptor druidStatInterceptor() {
+        return new DruidStatInterceptor();
+    }
+
+    @Bean
+    public JdkRegexpMethodPointcut druidStatPointcut() {
+        JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut();
+        String patterns = "com.stylefeng.guns.modular.*.service.*";
+        //可以set多个
+        druidStatPointcut.setPatterns(patterns);
+        return druidStatPointcut;
+    }
+
+    /**
+     * druid数据库连接池监控
+     */
+    @Bean
+    public BeanTypeAutoProxyCreator beanTypeAutoProxyCreator() {
+        BeanTypeAutoProxyCreator beanTypeAutoProxyCreator = new BeanTypeAutoProxyCreator();
+        beanTypeAutoProxyCreator.setTargetBeanType(DruidDataSource.class);
+        beanTypeAutoProxyCreator.setInterceptorNames("druidStatInterceptor");
+        return beanTypeAutoProxyCreator;
+    }
+
+    /**
+     * druid 为druidStatPointcut添加拦截
+     *
+     * @return
+     */
+    @Bean
+    public Advisor druidStatAdvisor() {
+        return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor());
+    }
+
+    /**
+     * xssFilter注册
+     */
+    @Bean
+    public FilterRegistrationBean xssFilterRegistration() {
+        XssFilter xssFilter = new XssFilter();
+        xssFilter.setUrlExclusion(Arrays.asList("/notice/update", "/notice/add"));
+        FilterRegistrationBean registration = new FilterRegistrationBean(xssFilter);
+        registration.addUrlPatterns("/*");
+        return registration;
+    }
+
+    /**
+     * RequestContextListener注册
+     */
+    @Bean
+    public ServletListenerRegistrationBean<RequestContextListener> requestContextListenerRegistration() {
+        return new ServletListenerRegistrationBean<>(new RequestContextListener());
+    }
+
+    /**
+     * ConfigListener注册
+     */
+    @Bean
+    public ServletListenerRegistrationBean<ConfigListener> configListenerRegistration() {
+        return new ServletListenerRegistrationBean<>(new ConfigListener());
+    }
+
+    /**
+     * 验证码生成相关
+     */
+    @Bean
+    public DefaultKaptcha kaptcha() {
+        Properties properties = new Properties();
+        properties.put("kaptcha.border", "no");
+        properties.put("kaptcha.border.color", "105,179,90");
+        properties.put("kaptcha.textproducer.font.color", "blue");
+        properties.put("kaptcha.image.width", "125");
+        properties.put("kaptcha.image.height", "45");
+        properties.put("kaptcha.textproducer.font.size", "45");
+        properties.put("kaptcha.session.key", "code");
+        properties.put("kaptcha.textproducer.char.length", "4");
+        properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
+        Config config = new Config(properties);
+        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+        defaultKaptcha.setConfig(config);
+        return defaultKaptcha;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java
new file mode 100644
index 0000000..5f4f745
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java
@@ -0,0 +1,123 @@
+package com.stylefeng.guns.core.aop;
+
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.common.exception.InvalidKaptchaException;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogManager;
+import com.stylefeng.guns.core.log.factory.LogTaskFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.CredentialsException;
+import org.apache.shiro.authc.DisabledAccountException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpStatus;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import java.lang.reflect.UndeclaredThrowableException;
+
+import static com.stylefeng.guns.core.support.HttpKit.getIp;
+import static com.stylefeng.guns.core.support.HttpKit.getRequest;
+
+/**
+ * 全局的的异常拦截器(拦截所有的控制器)(带有@RequestMapping注解的方法上都会拦截)
+ *
+ * @author fengshuonan
+ * @date 2016年11月12日 下午3:19:56
+ */
+@ControllerAdvice
+@Order(-1)
+public class GlobalExceptionHandler {
+
+    private Logger log = LoggerFactory.getLogger(this.getClass());
+
+    /**
+     * 拦截业务异常
+     */
+    @ExceptionHandler(GunsException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ResponseBody
+    public ErrorTip notFount(GunsException e) {
+        LogManager.me().executeLog(LogTaskFactory.exceptionLog(ShiroKit.getUser().getId(), e));
+        getRequest().setAttribute("tip", e.getMessage());
+        log.error("业务异常:", e);
+        return new ErrorTip(e.getCode(), e.getMessage());
+    }
+
+    /**
+     * 用户未登录异常
+     */
+    @ExceptionHandler(AuthenticationException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    public String unAuth(AuthenticationException e) {
+        log.error("用户未登陆:", e);
+        return "/login.html";
+    }
+
+    /**
+     * 账号被冻结异常
+     */
+    @ExceptionHandler(DisabledAccountException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    public String accountLocked(DisabledAccountException e, Model model) {
+        String username = getRequest().getParameter("username");
+        LogManager.me().executeLog(LogTaskFactory.loginLog(username, "账号被冻结", getIp()));
+        model.addAttribute("tips", "账号被冻结");
+        return "/login.html";
+    }
+
+    /**
+     * 账号密码错误异常
+     */
+    @ExceptionHandler(CredentialsException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    public String credentials(CredentialsException e, Model model) {
+        String username = getRequest().getParameter("username");
+        LogManager.me().executeLog(LogTaskFactory.loginLog(username, "账号密码错误", getIp()));
+        model.addAttribute("tips", "账号密码错误");
+        return "/login.html";
+    }
+
+    /**
+     * 验证码错误异常
+     */
+    @ExceptionHandler(InvalidKaptchaException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public String credentials(InvalidKaptchaException e, Model model) {
+        String username = getRequest().getParameter("username");
+        LogManager.me().executeLog(LogTaskFactory.loginLog(username, "验证码错误", getIp()));
+        model.addAttribute("tips", "验证码错误");
+        return "/login.html";
+    }
+
+    /**
+     * 无权访问该资源异常
+     */
+    @ExceptionHandler(UndeclaredThrowableException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    @ResponseBody
+    public ErrorTip credentials(UndeclaredThrowableException e) {
+        getRequest().setAttribute("tip", "权限异常");
+        log.error("权限异常!", e);
+        return new ErrorTip(BizExceptionEnum.NO_PERMITION.getCode(), BizExceptionEnum.NO_PERMITION.getMessage());
+    }
+
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(RuntimeException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ResponseBody
+    public ErrorTip notFount(RuntimeException e) {
+        LogManager.me().executeLog(LogTaskFactory.exceptionLog(ShiroKit.getUser().getId(), e));
+        getRequest().setAttribute("tip", "服务器未知运行时异常");
+        log.error("运行时异常:", e);
+        return new ErrorTip(BizExceptionEnum.SERVER_ERROR.getCode(), BizExceptionEnum.SERVER_ERROR.getMessage());
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java
new file mode 100644
index 0000000..d5123f4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java
@@ -0,0 +1,105 @@
+package com.stylefeng.guns.core.aop;
+
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+import com.stylefeng.guns.core.log.LogManager;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.log.factory.LogTaskFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.support.HttpKit;
+import com.stylefeng.guns.core.util.Contrast;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * 日志记录
+ *
+ * @author fengshuonan
+ * @date 2016年12月6日 下午8:48:30
+ */
+@Aspect
+@Component
+public class LogAop {
+
+    private Logger log = LoggerFactory.getLogger(this.getClass());
+
+    @Pointcut(value = "@annotation(com.stylefeng.guns.core.common.annotion.BussinessLog)")
+    public void cutService() {
+    }
+
+    @Around("cutService()")
+    public Object recordSysLog(ProceedingJoinPoint point) throws Throwable {
+
+        //先执行业务
+        Object result = point.proceed();
+
+        try {
+            handle(point);
+        } catch (Exception e) {
+            log.error("日志记录出错!", e);
+        }
+
+        return result;
+    }
+
+    private void handle(ProceedingJoinPoint point) throws Exception {
+
+        //获取拦截的方法名
+        Signature sig = point.getSignature();
+        MethodSignature msig = null;
+        if (!(sig instanceof MethodSignature)) {
+            throw new IllegalArgumentException("该注解只能用于方法");
+        }
+        msig = (MethodSignature) sig;
+        Object target = point.getTarget();
+        Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
+        String methodName = currentMethod.getName();
+
+        //如果当前用户未登录,不做日志
+        ShiroUser user = ShiroKit.getUser();
+        if (null == user) {
+            return;
+        }
+
+        //获取拦截方法的参数
+        String className = point.getTarget().getClass().getName();
+        Object[] params = point.getArgs();
+
+        //获取操作名称
+        BussinessLog annotation = currentMethod.getAnnotation(BussinessLog.class);
+        String bussinessName = annotation.value();
+        String key = annotation.key();
+        Class dictClass = annotation.dict();
+
+        StringBuilder sb = new StringBuilder();
+        for (Object param : params) {
+            sb.append(param);
+            sb.append(" & ");
+        }
+
+        //如果涉及到修改,比对变化
+        String msg;
+        if (bussinessName.indexOf("修改") != -1 || bussinessName.indexOf("编辑") != -1) {
+            Object obj1 = LogObjectHolder.me().get();
+            Map<String, String> obj2 = HttpKit.getRequestParameters();
+            msg = Contrast.contrastObj(dictClass, key, obj1, obj2);
+        } else {
+            Map<String, String> parameters = HttpKit.getRequestParameters();
+            AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
+            msg = Contrast.parseMutiKey(dictMap,key,parameters);
+        }
+
+        LogManager.me().executeLog(LogTaskFactory.bussinessLog(user.getId(), bussinessName, className, methodName, msg));
+    }
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java
new file mode 100644
index 0000000..13e9d6c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.stylefeng.guns.core.aop;
+
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.shiro.check.PermissionCheckManager;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.naming.NoPermissionException;
+import java.lang.reflect.Method;
+
+/**
+ * AOP 权限自定义检查
+ */
+@Aspect
+@Component
+@Order(200)
+public class PermissionAop {
+
+    @Pointcut(value = "@annotation(com.stylefeng.guns.core.common.annotion.Permission)")
+    private void cutPermission() {
+
+    }
+
+    @Around("cutPermission()")
+    public Object doPermission(ProceedingJoinPoint point) throws Throwable {
+        MethodSignature ms = (MethodSignature) point.getSignature();
+        Method method = ms.getMethod();
+        Permission permission = method.getAnnotation(Permission.class);
+        Object[] permissions = permission.value();
+        if (permissions == null || permissions.length == 0) {
+            //检查全体角色
+            boolean result = PermissionCheckManager.checkAll();
+            if (result) {
+                return point.proceed();
+            } else {
+                throw new NoPermissionException();
+            }
+        } else {
+            //检查指定角色
+            boolean result = PermissionCheckManager.check(permissions);
+            if (result) {
+                return point.proceed();
+            } else {
+                throw new NoPermissionException();
+            }
+        }
+
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java
new file mode 100644
index 0000000..fa53e22
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java
@@ -0,0 +1,71 @@
+package com.stylefeng.guns.core.beetl;
+
+import com.stylefeng.guns.core.tag.DictSelectorTag;
+import com.stylefeng.guns.core.util.KaptchaUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.beetl.core.Context;
+import org.beetl.core.Function;
+import org.beetl.core.Tag;
+import org.beetl.core.TagFactory;
+import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.env.Environment;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * beetl拓展配置,绑定一些工具类,方便在模板中直接调用
+ *
+ * @author stylefeng
+ * @Date 2018/2/22 21:03
+ */
+public class BeetlConfiguration extends BeetlGroupUtilConfiguration {
+
+    @Autowired
+    Environment env;
+
+    @Autowired
+    ApplicationContext applicationContext;
+
+    @Autowired
+    DictSelectorTag dictSelectorTag;
+
+
+
+    @Override
+    public void initOther() {
+        groupTemplate.registerFunctionPackage("shiro", new ShiroExt());
+        groupTemplate.registerFunctionPackage("tool", new ToolUtil());
+        groupTemplate.registerFunctionPackage("kaptcha", new KaptchaUtil());
+        groupTemplate.registerTagFactory("dictSelector", new TagFactory() {
+            @Override
+            public Tag createTag() {
+                return dictSelectorTag;
+            }
+        });
+
+        groupTemplate.registerFunction("env", new Function() {
+            @Override
+            public String call(Object[] paras, Context ctx) {
+                String key = (String)paras[0];
+                String value =  env.getProperty(key);
+                if(value!=null) {
+                    return getStr(value);
+                }
+                if(paras.length==2) {
+                    return (String)paras[1];
+                }
+                return null;
+            }
+
+            protected String getStr(String str) {
+                try {
+                    return new String(str.getBytes("iso8859-1"),"UTF-8");
+                } catch (UnsupportedEncodingException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java
new file mode 100644
index 0000000..55e7234
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.stylefeng.guns.core.beetl;
+
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.beetl.core.GroupTemplate;
+
+import com.stylefeng.guns.core.shiro.ShiroUser;
+
+public class ShiroExt {
+    private static final String NAMES_DELIMETER = ",";
+
+    /**
+     * 获取当前 Subject
+     *
+     * @return Subject
+     */
+    protected static Subject getSubject() {
+        return SecurityUtils.getSubject();
+    }
+
+    /**
+     * 获取封装的 ShiroUser
+     *
+     * @return ShiroUser
+     */
+    public ShiroUser getUser() {
+        if (isGuest()) {
+            return null;
+        } else {
+            return (ShiroUser) getSubject().getPrincipals().getPrimaryPrincipal();
+        }
+    }
+
+    /**
+     * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用
+     *
+     * @param roleName 角色名
+     * @return 属于该角色:true,否则false
+     */
+    public boolean hasRole(String roleName) {
+        return getSubject() != null && roleName != null
+                && roleName.length() > 0 && getSubject().hasRole(roleName);
+    }
+
+    /**
+     * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。
+     *
+     * @param roleName 角色名
+     * @return 不属于该角色:true,否则false
+     */
+    public boolean lacksRole(String roleName) {
+        return !hasRole(roleName);
+    }
+
+    /**
+     * 验证当前用户是否属于以下任意一个角色。
+     *
+     * @param roleNames 角色列表
+     * @return 属于:true,否则false
+     */
+    public boolean hasAnyRoles(String roleNames) {
+        boolean hasAnyRole = false;
+        Subject subject = getSubject();
+        if (subject != null && roleNames != null && roleNames.length() > 0) {
+            for (String role : roleNames.split(NAMES_DELIMETER)) {
+                if (subject.hasRole(role.trim())) {
+                    hasAnyRole = true;
+                    break;
+                }
+            }
+        }
+        return hasAnyRole;
+    }
+
+    /**
+     * 验证当前用户是否属于以下所有角色。
+     *
+     * @param roleNames 角色列表
+     * @return 属于:true,否则false
+     */
+    public boolean hasAllRoles(String roleNames) {
+        boolean hasAllRole = true;
+        Subject subject = getSubject();
+        if (subject != null && roleNames != null && roleNames.length() > 0) {
+            for (String role : roleNames.split(NAMES_DELIMETER)) {
+                if (!subject.hasRole(role.trim())) {
+                    hasAllRole = false;
+                    break;
+                }
+            }
+        }
+        return hasAllRole;
+    }
+
+    /**
+     * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用
+     *
+     * @param permission 权限名
+     * @return 拥有权限:true,否则false
+     */
+    public boolean hasPermission(String permission) {
+        return getSubject() != null && permission != null
+                && permission.length() > 0
+                && getSubject().isPermitted(permission);
+    }
+
+    /**
+     * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。
+     *
+     * @param permission 权限名
+     * @return 拥有权限:true,否则false
+     */
+    public boolean lacksPermission(String permission) {
+        return !hasPermission(permission);
+    }
+
+    /**
+     * 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用
+     *
+     * @return 通过身份验证:true,否则false
+     */
+    public boolean authenticated() {
+        return getSubject() != null && getSubject().isAuthenticated();
+    }
+
+    /**
+     * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。
+     *
+     * @return 没有通过身份验证:true,否则false
+     */
+    public boolean notAuthenticated() {
+        return !authenticated();
+    }
+
+    /**
+     * 认证通过或已记住的用户。与guset搭配使用。
+     *
+     * @return 用户:true,否则 false
+     */
+    public boolean isUser() {
+        return getSubject() != null && getSubject().getPrincipal() != null;
+    }
+
+    /**
+     * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用
+     *
+     * @return 访客:true,否则false
+     */
+    public boolean isGuest() {
+        return !isUser();
+    }
+
+    /**
+     * 输出当前用户信息,通常为登录帐号信息。
+     *
+     * @return 当前用户信息
+     */
+    public String principal() {
+        if (getSubject() != null) {
+            Object principal = getSubject().getPrincipal();
+            return principal.toString();
+        }
+        return "";
+    }
+
+    public static void main(String[] args) {
+        GroupTemplate gt = new GroupTemplate();
+        gt.registerFunctionPackage("shiro", new ShiroExt());
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java
new file mode 100644
index 0000000..369be8b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.core.common.annotion;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+import com.stylefeng.guns.core.common.constant.dictmap.base.SystemDict;
+
+import java.lang.annotation.*;
+
+/**
+ * 标记需要做业务日志的方法
+ *
+ * @author fengshuonan
+ * @date 2017-03-31 12:46
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface BussinessLog {
+
+    /**
+     * 业务的名称,例如:"修改菜单"
+     */
+    String value() default "";
+
+    /**
+     * 被修改的实体的唯一标识,例如:菜单实体的唯一标识为"id"
+     */
+    String key() default "id";
+
+    /**
+     * 字典(用于查找key的中文名称和字段的中文名称)
+     */
+    Class<? extends AbstractDictMap> dict() default SystemDict.class;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java
new file mode 100644
index 0000000..bfb1500
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.core.common.annotion;
+
+import java.lang.annotation.*;
+
+/**
+ * 权限注解 用于检查权限 规定访问权限
+ *
+ * @example @Permission({role1,role2})
+ * @example @Permission
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface Permission {
+
+    /**
+     * <p>角色英文名称</p>
+     * <p>使用注解时加上这个值表示限制只有某个角色的才可以访问对应的资源</p>
+     * <p>常用在某些资源限制只有超级管理员角色才可访问</p>
+     */
+    String[] value() default {};
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java
new file mode 100644
index 0000000..1b2b5d8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.core.common.constant;
+
+/**
+ * 系统常量
+ *
+ * @author fengshuonan
+ * @date 2017年2月12日 下午9:42:53
+ */
+public interface Const {
+
+    /**
+     * 系统默认的管理员密码
+     */
+    String DEFAULT_PWD = "111111";
+
+    /**
+     * 管理员角色的名字
+     */
+    String ADMIN_NAME = "administrator";
+
+    /**
+     * 管理员id
+     */
+    Integer ADMIN_ID = 1;
+
+    /**
+     * 超级管理员角色id
+     */
+    Integer ADMIN_ROLE_ID = 1;
+
+    /**
+     * 接口文档的菜单名
+     */
+    String API_MENU_NAME = "接口文档";
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java
new file mode 100644
index 0000000..b2b534f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java
@@ -0,0 +1,15 @@
+package com.stylefeng.guns.core.common.constant;
+
+/**
+ * 
+ * 多数据源的枚举
+ *
+ * @author fengshuonan
+ * @date 2017年3月5日 上午10:15:02
+ */
+public interface DatasourceEnum {
+
+	String DATA_SOURCE_GUNS = "dataSourceGuns";			//guns数据源
+	
+	String DATA_SOURCE_BIZ = "dataSourceBiz";			//其他业务的数据源
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java
new file mode 100644
index 0000000..75472c8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.core.common.constant;
+
+/**
+ * jwt相关配置
+ *
+ * @author fengshuonan
+ * @date 2017-08-23 9:23
+ */
+public interface JwtConstants {
+
+    String AUTH_HEADER = "Authorization";
+
+    String SECRET = "defaultSecret";
+
+    Long EXPIRATION = 604800L;
+
+    String AUTH_PATH = "/gunsApi/auth";
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java
new file mode 100644
index 0000000..a24800f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java
@@ -0,0 +1,15 @@
+package com.stylefeng.guns.core.common.constant.cache;
+
+/**
+ * 所有缓存名称的集合
+ *
+ * @author fengshuonan
+ * @date 2017-04-24 21:56
+ */
+public interface Cache {
+
+    /**
+     * 常量缓存
+     */
+    String CONSTANT = "CONSTANT";
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java
new file mode 100644
index 0000000..a7a93cd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.core.common.constant.cache;
+
+/**
+ * 缓存标识前缀集合,常用在ConstantFactory类中
+ *
+ * @author fengshuonan
+ * @date 2017-04-25 9:37
+ */
+public interface CacheKey {
+
+    /**
+     * 角色名称(多个)
+     */
+    String ROLES_NAME = "roles_name_";
+
+    /**
+     * 角色名称(单个)
+     */
+    String SINGLE_ROLE_NAME = "single_role_name_";
+
+    /**
+     * 角色英文名称
+     */
+    String SINGLE_ROLE_TIP = "single_role_tip_";
+
+    /**
+     * 部门名称
+     */
+    String DEPT_NAME = "dept_name_";
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java
new file mode 100644
index 0000000..0436003
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 用于删除业务的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class DeleteDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("roleId","角色名称");
+        put("deptId", "部门名称");
+        put("menuId", "菜单名称");
+        put("dictId", "字典名称");
+        put("noticeId", "标题");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+        putFieldWrapperMethodName("roleId","getCacheObject");
+        putFieldWrapperMethodName("deptId","getCacheObject");
+        putFieldWrapperMethodName("menuId","getCacheObject");
+        putFieldWrapperMethodName("dictId","getCacheObject");
+        putFieldWrapperMethodName("noticeId","getCacheObject");
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java
new file mode 100644
index 0000000..eb44e1c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 部门的映射
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class DeptDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("deptId", "部门名称");
+        put("num", "部门排序");
+        put("pid", "上级名称");
+        put("simplename", "部门简称");
+        put("fullname", "部门全称");
+        put("tips", "备注");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+        putFieldWrapperMethodName("deptId", "getDeptName");
+        putFieldWrapperMethodName("pid", "getDeptName");
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java
new file mode 100644
index 0000000..a04927f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 字典map
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:43
+ */
+public class DictMap extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("dictId","字典名称");
+        put("dictName","字典名称");
+        put("dictValues","字典内容");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java
new file mode 100644
index 0000000..f7b7bf9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 日志的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class LogDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("tips","备注");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java
new file mode 100644
index 0000000..4b60184
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 菜单的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class MenuDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("menuId","菜单id");
+        put("id","菜单id");
+        put("code","菜单编号");
+        put("pcode","菜单父编号");
+        put("name","菜单名称");
+        put("icon","菜单图标");
+        put("url","url地址");
+        put("num","菜单排序号");
+        put("levels","菜单层级");
+        put("tips","备注");
+        put("status","菜单状态");
+        put("isopen","是否打开");
+        put("","");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java
new file mode 100644
index 0000000..a0a13c9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 通知的映射
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class NoticeMap extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("title", "标题");
+        put("content", "内容");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java
new file mode 100644
index 0000000..08389af
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 角色的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class RoleDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("roleId","角色名称");
+        put("num","角色排序");
+        put("pid","角色的父级");
+        put("name","角色名称");
+        put("deptid","部门名称");
+        put("tips","备注");
+        put("ids","资源名称");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+        putFieldWrapperMethodName("pid","getSingleRoleName");
+        putFieldWrapperMethodName("deptid","getDeptName");
+        putFieldWrapperMethodName("roleId","getSingleRoleName");
+        putFieldWrapperMethodName("ids","getMenuNames");
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java
new file mode 100644
index 0000000..cc34eb5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 用户的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class UserDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("userId","账号");
+        put("avatar","头像");
+        put("account","账号");
+        put("name","名字");
+        put("birthday","生日");
+        put("sex","性别");
+        put("email","电子邮件");
+        put("phone","电话");
+        put("roleid","角色名称");
+        put("deptid","部门名称");
+        put("roleIds","角色名称集合");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+        putFieldWrapperMethodName("sex","getSexName");
+        putFieldWrapperMethodName("deptid","getDeptName");
+        putFieldWrapperMethodName("roleid","getSingleRoleName");
+        putFieldWrapperMethodName("userId","getUserAccountById");
+        putFieldWrapperMethodName("roleIds","getRoleName");
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java
new file mode 100644
index 0000000..9f091a3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java
@@ -0,0 +1,53 @@
+package com.stylefeng.guns.core.common.constant.dictmap.base;
+
+import java.util.HashMap;
+
+/**
+ * 字典映射抽象类
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 14:58
+ */
+public abstract class AbstractDictMap {
+
+    protected HashMap<String, String> dictory = new HashMap<>();
+    protected HashMap<String, String> fieldWarpperDictory = new HashMap<>();
+
+    public AbstractDictMap(){
+        put("id","主键id");
+        init();
+        initBeWrapped();
+    }
+
+    /**
+     * 初始化字段英文名称和中文名称对应的字典
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:39
+     */
+    public abstract void init();
+
+    /**
+     * 初始化需要被包装的字段(例如:性别为1:男,2:女,需要被包装为汉字)
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:35
+     */
+    protected abstract void initBeWrapped();
+
+    public String get(String key) {
+        return this.dictory.get(key);
+    }
+
+    public void put(String key, String value) {
+        this.dictory.put(key, value);
+    }
+
+    public String getFieldWarpperMethodName(String key){
+        return this.fieldWarpperDictory.get(key);
+    }
+
+    public void putFieldWrapperMethodName(String key,String methodName){
+        this.fieldWarpperDictory.put(key,methodName);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java
new file mode 100644
index 0000000..110633e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.core.common.constant.dictmap.base;
+
+/**
+ * 系统相关的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:48
+ */
+public class SystemDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java
new file mode 100644
index 0000000..9d86da3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.core.common.constant.dictmap.factory;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.constant.factory.IConstantFactory;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+
+import java.lang.reflect.Method;
+
+/**
+ * 字典字段的包装器(从ConstantFactory中获取包装值)
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:12
+ */
+public class DictFieldWarpperFactory {
+
+    public static Object createFieldWarpper(Object parameter, String methodName) {
+        IConstantFactory constantFactory = ConstantFactory.me();
+        try {
+            Method method = IConstantFactory.class.getMethod(methodName, parameter.getClass());
+            return method.invoke(constantFactory, parameter);
+        } catch (Exception e) {
+            try {
+                Method method = IConstantFactory.class.getMethod(methodName, Integer.class);
+                return method.invoke(constantFactory, Integer.parseInt(parameter.toString()));
+            } catch (Exception e1) {
+                throw new GunsException(BizExceptionEnum.ERROR_WRAPPER_FIELD);
+            }
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java
new file mode 100644
index 0000000..ccfc26b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java
@@ -0,0 +1,333 @@
+package com.stylefeng.guns.core.common.constant.factory;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.stylefeng.guns.core.common.constant.cache.Cache;
+import com.stylefeng.guns.core.common.constant.cache.CacheKey;
+import com.stylefeng.guns.core.common.constant.state.ManagerStatus;
+import com.stylefeng.guns.core.common.constant.state.MenuStatus;
+import com.stylefeng.guns.modular.system.dao.*;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.support.StrKit;
+import com.stylefeng.guns.core.util.Convert;
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 常量的生产工厂
+ *
+ * @author fengshuonan
+ * @date 2017年2月13日 下午10:55:21
+ */
+@Component
+@DependsOn("springContextHolder")
+public class ConstantFactory implements IConstantFactory {
+
+    private RoleMapper roleMapper = SpringContextHolder.getBean(RoleMapper.class);
+    private DeptMapper deptMapper = SpringContextHolder.getBean(DeptMapper.class);
+    private DictMapper dictMapper = SpringContextHolder.getBean(DictMapper.class);
+    private UserMapper userMapper = SpringContextHolder.getBean(UserMapper.class);
+    private MenuMapper menuMapper = SpringContextHolder.getBean(MenuMapper.class);
+    private NoticeMapper noticeMapper = SpringContextHolder.getBean(NoticeMapper.class);
+
+    public static IConstantFactory me() {
+        return SpringContextHolder.getBean("constantFactory");
+    }
+
+    /**
+     * 根据用户id获取用户名称
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 23:41
+     */
+    @Override
+    public String getUserNameById(Integer userId) {
+        User user = userMapper.selectById(userId);
+        if (user != null) {
+            return user.getName();
+        } else {
+            return "--";
+        }
+    }
+
+    /**
+     * 根据用户id获取用户账号
+     *
+     * @author stylefeng
+     * @date 2017年5月16日21:55:371
+     */
+    @Override
+    public String getUserAccountById(Integer userId) {
+        User user = userMapper.selectById(userId);
+        if (user != null) {
+            return user.getAccount();
+        } else {
+            return "--";
+        }
+    }
+
+    /**
+     * 通过角色ids获取角色名称
+     */
+    @Override
+    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleIds")
+    public String getRoleName(String roleIds) {
+        Integer[] roles = Convert.toIntArray(roleIds);
+        StringBuilder sb = new StringBuilder();
+        for (int role : roles) {
+            Role roleObj = roleMapper.selectById(role);
+            if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
+                sb.append(roleObj.getName()).append(",");
+            }
+        }
+        return StrKit.removeSuffix(sb.toString(), ",");
+    }
+
+    /**
+     * 通过角色id获取角色名称
+     */
+    @Override
+    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId")
+    public String getSingleRoleName(Integer roleId) {
+        if (0 == roleId) {
+            return "--";
+        }
+        Role roleObj = roleMapper.selectById(roleId);
+        if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
+            return roleObj.getName();
+        }
+        return "";
+    }
+
+    /**
+     * 通过角色id获取角色英文名称
+     */
+    @Override
+    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_TIP + "'+#roleId")
+    public String getSingleRoleTip(Integer roleId) {
+        if (0 == roleId) {
+            return "--";
+        }
+        Role roleObj = roleMapper.selectById(roleId);
+        if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
+            return roleObj.getTips();
+        }
+        return "";
+    }
+
+    /**
+     * 获取部门名称
+     */
+    @Override
+    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.DEPT_NAME + "'+#deptId")
+    public String getDeptName(Integer deptId) {
+        Dept dept = deptMapper.selectById(deptId);
+        if (ToolUtil.isNotEmpty(dept) && ToolUtil.isNotEmpty(dept.getFullname())) {
+            return dept.getFullname();
+        }
+        return "";
+    }
+
+    /**
+     * 获取菜单的名称们(多个)
+     */
+    @Override
+    public String getMenuNames(String menuIds) {
+        Integer[] menus = Convert.toIntArray(menuIds);
+        StringBuilder sb = new StringBuilder();
+        for (int menu : menus) {
+            Menu menuObj = menuMapper.selectById(menu);
+            if (ToolUtil.isNotEmpty(menuObj) && ToolUtil.isNotEmpty(menuObj.getName())) {
+                sb.append(menuObj.getName()).append(",");
+            }
+        }
+        return StrKit.removeSuffix(sb.toString(), ",");
+    }
+
+    /**
+     * 获取菜单名称
+     */
+    @Override
+    public String getMenuName(Long menuId) {
+        if (ToolUtil.isEmpty(menuId)) {
+            return "";
+        } else {
+            Menu menu = menuMapper.selectById(menuId);
+            if (menu == null) {
+                return "";
+            } else {
+                return menu.getName();
+            }
+        }
+    }
+
+    /**
+     * 获取菜单名称通过编号
+     */
+    @Override
+    public String getMenuNameByCode(String code) {
+        if (ToolUtil.isEmpty(code)) {
+            return "";
+        } else {
+            Menu param = new Menu();
+            param.setCode(code);
+            Menu menu = menuMapper.selectOne(param);
+            if (menu == null) {
+                return "";
+            } else {
+                return menu.getName();
+            }
+        }
+    }
+
+    /**
+     * 获取字典名称
+     */
+    @Override
+    public String getDictName(Integer dictId) {
+        if (ToolUtil.isEmpty(dictId)) {
+            return "";
+        } else {
+            Dict dict = dictMapper.selectById(dictId);
+            if (dict == null) {
+                return "";
+            } else {
+                return dict.getName();
+            }
+        }
+    }
+
+    /**
+     * 获取通知标题
+     */
+    @Override
+    public String getNoticeTitle(Integer dictId) {
+        if (ToolUtil.isEmpty(dictId)) {
+            return "";
+        } else {
+            Notice notice = noticeMapper.selectById(dictId);
+            if (notice == null) {
+                return "";
+            } else {
+                return notice.getTitle();
+            }
+        }
+    }
+
+    /**
+     * 根据字典名称和字典中的值获取对应的名称
+     */
+    @Override
+    public String getDictsByName(String name, Integer val) {
+        Dict temp = new Dict();
+        temp.setName(name);
+        Dict dict = dictMapper.selectOne(temp);
+        if (dict == null) {
+            return "";
+        } else {
+            Wrapper<Dict> wrapper = new EntityWrapper<>();
+            wrapper = wrapper.eq("pid", dict.getId());
+            List<Dict> dicts = dictMapper.selectList(wrapper);
+            for (Dict item : dicts) {
+                if (item.getNum() != null && item.getNum().equals(val)) {
+                    return item.getName();
+                }
+            }
+            return "";
+        }
+    }
+
+    /**
+     * 获取性别名称
+     */
+    @Override
+    public String getSexName(Integer sex) {
+        return getDictsByName("性别", sex);
+    }
+
+    /**
+     * 获取用户登录状态
+     */
+    @Override
+    public String getStatusName(Integer status) {
+        return ManagerStatus.valueOf(status);
+    }
+
+    /**
+     * 获取菜单状态
+     */
+    @Override
+    public String getMenuStatusName(Integer status) {
+        return MenuStatus.valueOf(status);
+    }
+
+    /**
+     * 查询字典
+     */
+    @Override
+    public List<Dict> findInDict(Integer id) {
+        if (ToolUtil.isEmpty(id)) {
+            return null;
+        } else {
+            EntityWrapper<Dict> wrapper = new EntityWrapper<>();
+            List<Dict> dicts = dictMapper.selectList(wrapper.eq("pid", id));
+            if (dicts == null || dicts.size() == 0) {
+                return null;
+            } else {
+                return dicts;
+            }
+        }
+    }
+
+    /**
+     * 获取被缓存的对象(用户删除业务)
+     */
+    @Override
+    public String getCacheObject(String para) {
+        return LogObjectHolder.me().get().toString();
+    }
+
+    /**
+     * 获取子部门id
+     */
+    @Override
+    public List<Integer> getSubDeptId(Integer deptid) {
+        Wrapper<Dept> wrapper = new EntityWrapper<>();
+        wrapper = wrapper.like("pids", "%[" + deptid + "]%");
+        List<Dept> depts = this.deptMapper.selectList(wrapper);
+
+        ArrayList<Integer> deptids = new ArrayList<>();
+
+        if(depts != null && depts.size() > 0){
+            for (Dept dept : depts) {
+                deptids.add(dept.getId());
+            }
+        }
+
+        return deptids;
+    }
+
+    /**
+     * 获取所有父部门id
+     */
+    @Override
+    public List<Integer> getParentDeptIds(Integer deptid) {
+        Dept dept = deptMapper.selectById(deptid);
+        String pids = dept.getPids();
+        String[] split = pids.split(",");
+        ArrayList<Integer> parentDeptIds = new ArrayList<>();
+        for (String s : split) {
+            parentDeptIds.add(Integer.valueOf(StrKit.removeSuffix(StrKit.removePrefix(s, "["), "]")));
+        }
+        return parentDeptIds;
+    }
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java
new file mode 100644
index 0000000..fc0a07b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java
@@ -0,0 +1,116 @@
+package com.stylefeng.guns.core.common.constant.factory;
+
+import com.stylefeng.guns.modular.system.model.Dict;
+
+import java.util.List;
+
+/**
+ * 常量生产工厂的接口
+ *
+ * @author fengshuonan
+ * @date 2017-06-14 21:12
+ */
+public interface IConstantFactory {
+
+    /**
+     * 根据用户id获取用户名称
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 23:41
+     */
+    String getUserNameById(Integer userId);
+
+    /**
+     * 根据用户id获取用户账号
+     *
+     * @author stylefeng
+     * @date 2017年5月16日21:55:371
+     */
+    String getUserAccountById(Integer userId);
+
+    /**
+     * 通过角色ids获取角色名称
+     */
+    String getRoleName(String roleIds);
+
+    /**
+     * 通过角色id获取角色名称
+     */
+    String getSingleRoleName(Integer roleId);
+
+    /**
+     * 通过角色id获取角色英文名称
+     */
+    String getSingleRoleTip(Integer roleId);
+
+    /**
+     * 获取部门名称
+     */
+    String getDeptName(Integer deptId);
+
+    /**
+     * 获取菜单的名称们(多个)
+     */
+    String getMenuNames(String menuIds);
+
+    /**
+     * 获取菜单名称
+     */
+    String getMenuName(Long menuId);
+
+    /**
+     * 获取菜单名称通过编号
+     */
+    String getMenuNameByCode(String code);
+
+    /**
+     * 获取字典名称
+     */
+    String getDictName(Integer dictId);
+
+    /**
+     * 获取通知标题
+     */
+    String getNoticeTitle(Integer dictId);
+
+    /**
+     * 根据字典名称和字典中的值获取对应的名称
+     */
+    String getDictsByName(String name, Integer val);
+
+    /**
+     * 获取性别名称
+     */
+    String getSexName(Integer sex);
+
+    /**
+     * 获取用户登录状态
+     */
+    String getStatusName(Integer status);
+
+    /**
+     * 获取菜单状态
+     */
+    String getMenuStatusName(Integer status);
+
+    /**
+     * 查询字典
+     */
+    List<Dict> findInDict(Integer id);
+
+    /**
+     * 获取被缓存的对象(用户删除业务)
+     */
+    String getCacheObject(String para);
+
+    /**
+     * 获取子部门id
+     */
+    List<Integer> getSubDeptId(Integer deptid);
+
+    /**
+     * 获取所有父部门id
+     */
+    List<Integer> getParentDeptIds(Integer deptid);
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java
new file mode 100644
index 0000000..ae01578
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java
@@ -0,0 +1,96 @@
+package com.stylefeng.guns.core.common.constant.factory;
+
+import com.stylefeng.guns.core.support.StrKit;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 组合字符串生产者
+ *
+ * @author fengshuonan
+ * @date 2017-04-27 16:42
+ */
+public class MutiStrFactory {
+
+    /**
+     * 每个条目之间的分隔符
+     */
+    public static final String ITEM_SPLIT = ";";
+
+    /**
+     * 属性之间的分隔符
+     */
+    public static final String ATTR_SPLIT = ":";
+
+    /**
+     * 拼接字符串的id
+     */
+    public static final String MUTI_STR_ID = "ID";
+
+    /**
+     * 拼接字符串的CODE
+     */
+    public static final String MUTI_STR_CODE = "CODE";
+
+    /**
+     * 拼接字符串的NAME
+     */
+    public static final String MUTI_STR_NAME = "NAME";
+
+    /**
+     * 拼接字符串的NUM
+     */
+    public static final String MUTI_STR_NUM = "NUM";
+
+    /**
+     * 解析一个组合字符串(例如:  "1:启用;2:禁用;3:冻结"  这样的字符串)
+     *
+     * @author fengshuonan
+     * @Date 2017/4/27 16:44
+     */
+    public static List<Map<String,String>> parseKeyValue(String mutiString){
+        if(ToolUtil.isEmpty(mutiString)){
+            return new ArrayList<>();
+        }else{
+            ArrayList<Map<String,String>> results = new ArrayList<>();
+            String[] items = StrKit.split(StrKit.removeSuffix(mutiString, ITEM_SPLIT), ITEM_SPLIT);
+            for (String item : items) {
+                String[] attrs = item.split(ATTR_SPLIT);
+                HashMap<String, String> itemMap = new HashMap<>();
+                itemMap.put(MUTI_STR_CODE,attrs[0]);
+                itemMap.put(MUTI_STR_NAME,attrs[1]);
+                itemMap.put(MUTI_STR_NUM,attrs[2]);
+                results.add(itemMap);
+            }
+            return results;
+        }
+    }
+
+    /**
+     * 解析id:key:value这样类型的字符串
+     *
+     * @author fengshuonan
+     * @Date 2017/4/28 11:06
+     */
+    public static List<Map<String,String>> parseIdKeyValue(String mutiString){
+        if(ToolUtil.isEmpty(mutiString)){
+            return new ArrayList<>();
+        }else{
+            ArrayList<Map<String,String>> results = new ArrayList<>();
+            String[] items = StrKit.split(StrKit.removeSuffix(mutiString, ITEM_SPLIT), ITEM_SPLIT);
+            for (String item : items) {
+                String[] attrs = item.split(ATTR_SPLIT);
+                HashMap<String, String> itemMap = new HashMap<>();
+                itemMap.put(MUTI_STR_CODE,attrs[0]);
+                itemMap.put(MUTI_STR_NAME,attrs[1]);
+                itemMap.put(MUTI_STR_NUM,attrs[2]);
+                results.add(itemMap);
+            }
+            return results;
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java
new file mode 100644
index 0000000..9fd65e0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.core.common.constant.factory;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.common.constant.state.Order;
+import com.stylefeng.guns.core.support.HttpKit;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * BootStrap Table默认的分页参数创建
+ *
+ * @author fengshuonan
+ * @date 2017-04-05 22:25
+ */
+public class PageFactory<T> {
+
+    public Page<T> defaultPage() {
+        HttpServletRequest request = HttpKit.getRequest();
+        int limit = Integer.valueOf(request.getParameter("limit"));     //每页多少条数据
+        int offset = Integer.valueOf(request.getParameter("offset"));   //每页的偏移量(本页当前有多少条)
+        String sort = request.getParameter("sort");         //排序字段名称
+        String order = request.getParameter("order");       //asc或desc(升序或降序)
+        if (ToolUtil.isEmpty(sort)) {
+            Page<T> page = new Page<>((offset / limit + 1), limit);
+            page.setOpenSort(false);
+            return page;
+        } else {
+            Page<T> page = new Page<>((offset / limit + 1), limit, sort);
+            if (Order.ASC.getDes().equals(order)) {
+                page.setAsc(true);
+            } else {
+                page.setAsc(false);
+            }
+            return page;
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java
new file mode 100644
index 0000000..18c15a7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java
@@ -0,0 +1,51 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 业务日志类型
+ *
+ * @author fengshuonan
+ * @Date 2017年1月22日 下午12:14:59
+ */
+public enum BizLogType {
+
+    ALL(0, null),//全部日志
+    BUSSINESS(1, "业务日志"),
+    EXCEPTION(2, "异常日志");
+
+    Integer val;
+    String message;
+
+    BizLogType(Integer val, String message) {
+        this.val = val;
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public Integer getVal() {
+        return val;
+    }
+
+    public void setVal(Integer val) {
+        this.val = val;
+    }
+
+    public static String valueOf(Integer value) {
+        if (value == null) {
+            return null;
+        } else {
+            for (BizLogType bizLogType : BizLogType.values()) {
+                if (bizLogType.getVal().equals(value)) {
+                    return bizLogType.getMessage();
+                }
+            }
+            return null;
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java
new file mode 100644
index 0000000..d4cffc3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java
@@ -0,0 +1,52 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 是否是菜单的枚举
+ *
+ * @author fengshuonan
+ * @date 2017年6月1日22:50:11
+ */
+public enum ExpenseState {
+
+    SUBMITING(1, "待提交"),
+    CHECKING(2, "待审核"),
+    PASS(3, "审核通过"),
+    UN_PASS(4, "未通过");
+
+    int code;
+    String message;
+
+    ExpenseState(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public static String valueOf(Integer status) {
+        if (status == null) {
+            return "";
+        } else {
+            for (ExpenseState s : ExpenseState.values()) {
+                if (s.getCode() == status) {
+                    return s.getMessage();
+                }
+            }
+            return "";
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java
new file mode 100644
index 0000000..2c2a823
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 业务是否成功的日志记录
+ *
+ * @author fengshuonan
+ * @Date 2017年1月22日 下午12:14:59
+ */
+public enum LogSucceed {
+
+    SUCCESS("成功"),
+    FAIL("失败");
+
+    String message;
+
+    LogSucceed(String message) {
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java
new file mode 100644
index 0000000..1c44232
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 日志类型
+ *
+ * @author fengshuonan
+ * @Date 2017年1月22日 下午12:14:59
+ */
+public enum LogType {
+
+    LOGIN("登录日志"),
+    LOGIN_FAIL("登录失败日志"),
+    EXIT("退出日志"),
+    EXCEPTION("异常日志"),
+    BUSSINESS("业务日志");
+
+    String message;
+
+    LogType(String message) {
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java
new file mode 100644
index 0000000..0de9d4f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java
@@ -0,0 +1,49 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 管理员的状态
+ *
+ * @author fengshuonan
+ * @Date 2017年1月10日 下午9:54:13
+ */
+public enum ManagerStatus {
+
+    OK(1, "启用"), FREEZED(2, "冻结"), DELETED(3, "被删除");
+
+    int code;
+    String message;
+
+    ManagerStatus(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public static String valueOf(Integer value) {
+        if (value == null) {
+            return "";
+        } else {
+            for (ManagerStatus ms : ManagerStatus.values()) {
+                if (ms.getCode() == value) {
+                    return ms.getMessage();
+                }
+            }
+            return "";
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java
new file mode 100644
index 0000000..f0c5841
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 菜单是否打开的状态
+ *
+ * @author fengshuonan
+ * @Date 2017年4月8日10:12:15
+ */
+public enum MenuOpenStatus {
+
+    OPEN(1, "打开"),
+    CLOSE(0, "关闭");
+
+    int code;
+    String message;
+
+    MenuOpenStatus(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public static String valueOf(Integer status) {
+        if (status == null) {
+            return "";
+        } else {
+            for (MenuOpenStatus s : MenuOpenStatus.values()) {
+                if (s.getCode() == status) {
+                    return s.getMessage();
+                }
+            }
+            return "";
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java
new file mode 100644
index 0000000..940fe84
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 菜单的状态
+ *
+ * @author fengshuonan
+ * @Date 2017年1月22日 下午12:14:59
+ */
+public enum MenuStatus {
+
+    ENABLE(1, "启用"),
+    DISABLE(0, "禁用");
+
+    int code;
+    String message;
+
+    MenuStatus(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public static String valueOf(Integer status) {
+        if (status == null) {
+            return "";
+        } else {
+            for (MenuStatus s : MenuStatus.values()) {
+                if (s.getCode() == status) {
+                    return s.getMessage();
+                }
+            }
+            return "";
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java
new file mode 100644
index 0000000..5856284
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 数据库排序
+ *
+ * @author fengshuonan
+ * @Date 2017年5月31日20:48:41
+ */
+public enum Order {
+
+    ASC("asc"), DESC("desc");
+
+    private String des;
+
+    Order(String des) {
+        this.des = des;
+    }
+
+    public String getDes() {
+        return des;
+    }
+
+    public void setDes(String des) {
+        this.des = des;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java
new file mode 100644
index 0000000..9360484
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java
@@ -0,0 +1,100 @@
+package com.stylefeng.guns.core.common.exception;
+
+import com.stylefeng.guns.core.exception.ServiceExceptionEnum;
+
+/**
+ * @author fengshuonan
+ * @Description 所有业务异常的枚举
+ * @date 2016年11月12日 下午5:04:51
+ */
+public enum BizExceptionEnum implements ServiceExceptionEnum {
+
+    /**
+     * 字典
+     */
+    DICT_EXISTED(400, "字典已经存在"),
+    ERROR_CREATE_DICT(500, "创建字典失败"),
+    ERROR_WRAPPER_FIELD(500, "包装字典属性失败"),
+    ERROR_CODE_EMPTY(500, "字典类型不能为空"),
+
+    /**
+     * 文件上传
+     */
+    FILE_READING_ERROR(400, "FILE_READING_ERROR!"),
+    FILE_NOT_FOUND(400, "FILE_NOT_FOUND!"),
+    UPLOAD_ERROR(500, "上传图片出错"),
+
+    /**
+     * 权限和数据问题
+     */
+    DB_RESOURCE_NULL(400, "数据库中没有该资源"),
+    NO_PERMITION(405, "权限异常"),
+    REQUEST_INVALIDATE(400, "请求数据格式不正确"),
+    INVALID_KAPTCHA(400, "验证码不正确"),
+    CANT_DELETE_ADMIN(600, "不能删除超级管理员"),
+    CANT_FREEZE_ADMIN(600, "不能冻结超级管理员"),
+    CANT_CHANGE_ADMIN(600, "不能修改超级管理员角色"),
+
+    /**
+     * 账户问题
+     */
+    USER_ALREADY_REG(401, "该用户已经注册"),
+    NO_THIS_USER(400, "没有此用户"),
+    USER_NOT_EXISTED(400, "没有此用户"),
+    ACCOUNT_FREEZED(401, "账号被冻结"),
+    OLD_PWD_NOT_RIGHT(402, "原密码不正确"),
+    TWO_PWD_NOT_MATCH(405, "两次输入密码不一致"),
+
+    /**
+     * 错误的请求
+     */
+    MENU_PCODE_COINCIDENCE(400, "菜单编号和副编号不能一致"),
+    EXISTED_THE_MENU(400, "菜单编号重复,不能添加"),
+    DICT_MUST_BE_NUMBER(400, "字典的值必须为数字"),
+    REQUEST_NULL(400, "请求有错误"),
+    SESSION_TIMEOUT(400, "会话超时"),
+    SERVER_ERROR(500, "服务器异常"),
+
+    /**
+     * token异常
+     */
+    TOKEN_EXPIRED(600, "token过期"),
+    TOKEN_ERROR(600, "token验证失败"),
+
+    /**
+     * 签名异常
+     */
+    SIGN_ERROR(700, "签名验证失败"),
+
+    /**
+     * 其他
+     */
+    AUTH_REQUEST_ERROR(400, "账号密码错误");
+
+    BizExceptionEnum(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    private Integer code;
+
+    private String message;
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java
new file mode 100644
index 0000000..78581cd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java
@@ -0,0 +1,10 @@
+package com.stylefeng.guns.core.common.exception;
+
+/**
+ * 验证码错误异常
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 23:52
+ */
+public class InvalidKaptchaException extends RuntimeException {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java
new file mode 100644
index 0000000..5ff14b5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.stylefeng.guns.core.intercept;
+
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.web.filter.AccessControlFilter;
+import org.apache.shiro.web.util.WebUtils;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Filter that allows access to resources if the accessor is a known user, which is defined as
+ * having a known principal.  This means that any user who is authenticated or remembered via a
+ * 'remember me' feature will be allowed access from this filter.
+ * <p/>
+ * If the accessor is not a known user, then they will be redirected to the {@link #setLoginUrl(String) loginUrl}</p>
+ *
+ * @since 0.9
+ */
+public class GunsUserFilter extends AccessControlFilter {
+
+    /**
+     * Returns <code>true</code> if the request is a
+     * {@link #isLoginRequest(javax.servlet.ServletRequest, javax.servlet.ServletResponse) loginRequest} or
+     * if the current {@link #getSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) subject}
+     * is not <code>null</code>, <code>false</code> otherwise.
+     *
+     * @return <code>true</code> if the request is a
+     * {@link #isLoginRequest(javax.servlet.ServletRequest, javax.servlet.ServletResponse) loginRequest} or
+     * if the current {@link #getSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) subject}
+     * is not <code>null</code>, <code>false</code> otherwise.
+     */
+    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
+        if (isLoginRequest(request, response)) {
+            return true;
+        } else {
+            Subject subject = getSubject(request, response);
+            // If principal is not null, then the user is known and should be allowed access.
+            return subject.getPrincipal() != null;
+        }
+    }
+
+    /**
+     * This default implementation simply calls
+     * {@link #saveRequestAndRedirectToLogin(javax.servlet.ServletRequest, javax.servlet.ServletResponse) saveRequestAndRedirectToLogin}
+     * and then immediately returns <code>false</code>, thereby preventing the chain from continuing so the redirect may
+     * execute.
+     */
+    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
+        HttpServletRequest httpServletRequest = WebUtils.toHttp(request);
+        HttpServletResponse httpServletResponse = WebUtils.toHttp(response);
+
+        /**
+         * 如果是ajax请求则不进行跳转
+         */
+        if (httpServletRequest.getHeader("x-requested-with") != null
+                && httpServletRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
+            httpServletResponse.setHeader("sessionstatus", "timeout");
+            return false;
+        } else {
+
+            /**
+             * 第一次点击页面
+             */
+            String referer = httpServletRequest.getHeader("Referer");
+            if (referer == null) {
+                saveRequestAndRedirectToLogin(request, response);
+                return false;
+            } else {
+
+                /**
+                 * 从别的页面跳转过来的
+                 */
+                if (ShiroKit.getSession().getAttribute("sessionFlag") == null) {
+                    httpServletRequest.setAttribute("tips", "session超时");
+                    httpServletRequest.getRequestDispatcher("/login").forward(request, response);
+                    return false;
+                } else {
+                    saveRequestAndRedirectToLogin(request, response);
+                    return false;
+                }
+            }
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java
new file mode 100644
index 0000000..1415e13
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java
@@ -0,0 +1,62 @@
+package com.stylefeng.guns.core.intercept;
+
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.common.constant.JwtConstants;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.util.JwtTokenUtil;
+import com.stylefeng.guns.core.util.RenderUtil;
+import io.jsonwebtoken.JwtException;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * Rest Api接口鉴权
+ *
+ * @author stylefeng
+ * @Date 2018/7/20 23:11
+ */
+public class RestApiInteceptor extends HandlerInterceptorAdapter {
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        if (handler instanceof org.springframework.web.servlet.resource.ResourceHttpRequestHandler) {
+            return true;
+        }
+        HandlerMethod handlerMethod = (HandlerMethod) handler;
+        return check(request, response, handlerMethod);
+    }
+
+    private boolean check(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) {
+        if (request.getServletPath().equals(JwtConstants.AUTH_PATH)) {
+            return true;
+        }
+        final String requestHeader = request.getHeader(JwtConstants.AUTH_HEADER);
+        String authToken;
+        if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
+            authToken = requestHeader.substring(7);
+
+            //验证token是否过期,包含了验证jwt是否正确
+            try {
+                boolean flag = JwtTokenUtil.isTokenExpired(authToken);
+                if (flag) {
+                    RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_EXPIRED.getCode(), BizExceptionEnum.TOKEN_EXPIRED.getMessage()));
+                    return false;
+                }
+            } catch (JwtException e) {
+                //有异常就是token解析失败
+                RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_ERROR.getCode(), BizExceptionEnum.TOKEN_ERROR.getMessage()));
+                return false;
+            }
+        } else {
+            //header没有带Bearer字段
+            RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_ERROR.getCode(), BizExceptionEnum.TOKEN_ERROR.getMessage()));
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java
new file mode 100644
index 0000000..acafeaf
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.core.intercept;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.util.HttpSessionHolder;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+
+/**
+ * 静态调用session的拦截器
+ *
+ * @author fengshuonan
+ * @date 2016年11月13日 下午10:15:42
+ */
+@Aspect
+@Component
+public class SessionHolderInterceptor extends BaseController {
+
+    @Pointcut("execution(* com.stylefeng.guns.*..controller.*.*(..))")
+    public void cutService() {
+    }
+
+    @Around("cutService()")
+    public Object sessionKit(ProceedingJoinPoint point) throws Throwable {
+        HttpSessionHolder.put(super.getHttpServletRequest().getSession());
+        try {
+            return point.proceed();
+        } finally {
+            HttpSessionHolder.remove();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java
new file mode 100644
index 0000000..18089f5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.stylefeng.guns.core.listener;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * ServletContext监听器
+ *
+ * @author stylefeng
+ * @Date 2018/2/22 21:07
+ */
+public class ConfigListener implements ServletContextListener {
+
+    private static Map<String, String> conf = new HashMap<>();
+
+    public static Map<String, String> getConf() {
+        return conf;
+    }
+
+    @Override
+    public void contextDestroyed(ServletContextEvent arg0) {
+        conf.clear();
+    }
+
+    @Override
+    public void contextInitialized(ServletContextEvent evt) {
+        ServletContext sc = evt.getServletContext();
+
+        //项目发布,当前运行环境的绝对路径
+        conf.put("realPath", sc.getRealPath("/").replaceFirst("/", ""));
+
+        //servletContextPath,默认""
+        conf.put("contextPath", sc.getContextPath());
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java
new file mode 100644
index 0000000..8d5e20e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.core.log;
+
+import java.util.TimerTask;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 日志管理器
+ *
+ * @author fengshuonan
+ * @date 2017-03-30 16:29
+ */
+public class LogManager {
+
+    //日志记录操作延时
+    private final int OPERATE_DELAY_TIME = 10;
+
+    //异步操作记录日志的线程池
+    private ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
+
+    private LogManager() {
+    }
+
+    public static LogManager logManager = new LogManager();
+
+    public static LogManager me() {
+        return logManager;
+    }
+
+    public void executeLog(TimerTask task) {
+        executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java
new file mode 100644
index 0000000..f43d81b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.core.log;
+
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.WebApplicationContext;
+
+import java.io.Serializable;
+
+/**
+ * 被修改的bean临时存放的地方
+ *
+ * @author fengshuonan
+ * @date 2017-03-31 11:19
+ */
+@Component
+@Scope(scopeName = WebApplicationContext.SCOPE_SESSION)
+public class LogObjectHolder implements Serializable{
+
+    private Object object = null;
+
+    public void set(Object obj) {
+        this.object = obj;
+    }
+
+    public Object get() {
+        return object;
+    }
+
+    public static LogObjectHolder me(){
+        LogObjectHolder bean = SpringContextHolder.getBean(LogObjectHolder.class);
+        return bean;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java
new file mode 100644
index 0000000..3094dd9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.core.log.factory;
+
+import com.stylefeng.guns.core.common.constant.state.LogSucceed;
+import com.stylefeng.guns.core.common.constant.state.LogType;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+
+import java.util.Date;
+
+/**
+ * 日志对象创建工厂
+ *
+ * @author fengshuonan
+ * @date 2016年12月6日 下午9:18:27
+ */
+public class LogFactory {
+
+    /**
+     * 创建操作日志
+     */
+    public static OperationLog createOperationLog(LogType logType, Integer userId, String bussinessName, String clazzName, String methodName, String msg, LogSucceed succeed) {
+        OperationLog operationLog = new OperationLog();
+        operationLog.setLogtype(logType.getMessage());
+        operationLog.setLogname(bussinessName);
+        operationLog.setUserid(userId);
+        operationLog.setClassname(clazzName);
+        operationLog.setMethod(methodName);
+        operationLog.setCreatetime(new Date());
+        operationLog.setSucceed(succeed.getMessage());
+        operationLog.setMessage(msg);
+        return operationLog;
+    }
+
+    /**
+     * 创建登录日志
+     */
+    public static LoginLog createLoginLog(LogType logType, Integer userId, String msg, String ip) {
+        LoginLog loginLog = new LoginLog();
+        loginLog.setLogname(logType.getMessage());
+        loginLog.setUserid(userId);
+        loginLog.setCreatetime(new Date());
+        loginLog.setSucceed(LogSucceed.SUCCESS.getMessage());
+        loginLog.setIp(ip);
+        loginLog.setMessage(msg);
+        return loginLog;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java
new file mode 100644
index 0000000..2c29451
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java
@@ -0,0 +1,102 @@
+package com.stylefeng.guns.core.log.factory;
+
+import com.stylefeng.guns.core.common.constant.state.LogSucceed;
+import com.stylefeng.guns.core.common.constant.state.LogType;
+import com.stylefeng.guns.modular.system.dao.LoginLogMapper;
+import com.stylefeng.guns.modular.system.dao.OperationLogMapper;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+import com.stylefeng.guns.core.db.Db;
+import com.stylefeng.guns.core.log.LogManager;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.TimerTask;
+
+/**
+ * 日志操作任务创建工厂
+ *
+ * @author fengshuonan
+ * @date 2016年12月6日 下午9:18:27
+ */
+public class LogTaskFactory {
+
+    private static Logger logger = LoggerFactory.getLogger(LogManager.class);
+    private static LoginLogMapper loginLogMapper = Db.getMapper(LoginLogMapper.class);
+    private static OperationLogMapper operationLogMapper = Db.getMapper(OperationLogMapper.class);
+
+    public static TimerTask loginLog(final Integer userId, final String ip) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                try {
+                    LoginLog loginLog = LogFactory.createLoginLog(LogType.LOGIN, userId, null, ip);
+                    loginLogMapper.insert(loginLog);
+                } catch (Exception e) {
+                    logger.error("创建登录日志异常!", e);
+                }
+            }
+        };
+    }
+
+    public static TimerTask loginLog(final String username, final String msg, final String ip) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                LoginLog loginLog = LogFactory.createLoginLog(
+                        LogType.LOGIN_FAIL, null, "账号:" + username + "," + msg, ip);
+                try {
+                    loginLogMapper.insert(loginLog);
+                } catch (Exception e) {
+                    logger.error("创建登录失败异常!", e);
+                }
+            }
+        };
+    }
+
+    public static TimerTask exitLog(final Integer userId, final String ip) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                LoginLog loginLog = LogFactory.createLoginLog(LogType.EXIT, userId, null,ip);
+                try {
+                    loginLogMapper.insert(loginLog);
+                } catch (Exception e) {
+                    logger.error("创建退出日志异常!", e);
+                }
+            }
+        };
+    }
+
+    public static TimerTask bussinessLog(final Integer userId, final String bussinessName, final String clazzName, final String methodName, final String msg) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                OperationLog operationLog = LogFactory.createOperationLog(
+                        LogType.BUSSINESS, userId, bussinessName, clazzName, methodName, msg, LogSucceed.SUCCESS);
+                try {
+                    operationLogMapper.insert(operationLog);
+                } catch (Exception e) {
+                    logger.error("创建业务日志异常!", e);
+                }
+            }
+        };
+    }
+
+    public static TimerTask exceptionLog(final Integer userId, final Exception exception) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                String msg = ToolUtil.getExceptionMsg(exception);
+                OperationLog operationLog = LogFactory.createOperationLog(
+                        LogType.EXCEPTION, userId, "", null, null, msg, LogSucceed.FAIL);
+                try {
+                    operationLogMapper.insert(operationLog);
+                } catch (Exception e) {
+                    logger.error("创建异常日志异常!", e);
+                }
+            }
+        };
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java
new file mode 100644
index 0000000..2a95558
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java
@@ -0,0 +1,78 @@
+package com.stylefeng.guns.core.shiro;
+
+import com.stylefeng.guns.core.shiro.factory.IShiro;
+import com.stylefeng.guns.core.shiro.factory.ShiroFactroy;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.authc.credential.CredentialsMatcher;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ShiroDbRealm extends AuthorizingRealm {
+
+    /**
+     * 登录认证
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)
+            throws AuthenticationException {
+        IShiro shiroFactory = ShiroFactroy.me();
+        UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
+        User user = shiroFactory.user(token.getUsername());
+        ShiroUser shiroUser = shiroFactory.shiroUser(user);
+        return shiroFactory.info(shiroUser, user, super.getName());
+    }
+
+    /**
+     * 权限认证
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        IShiro shiroFactory = ShiroFactroy.me();
+        ShiroUser shiroUser = (ShiroUser) principals.getPrimaryPrincipal();
+        List<Integer> roleList = shiroUser.getRoleList();
+
+        Set<String> permissionSet = new HashSet<>();
+        Set<String> roleNameSet = new HashSet<>();
+
+        for (Integer roleId : roleList) {
+            List<String> permissions = shiroFactory.findPermissionsByRoleId(roleId);
+            if (permissions != null) {
+                for (String permission : permissions) {
+                    if (ToolUtil.isNotEmpty(permission)) {
+                        permissionSet.add(permission);
+                    }
+                }
+            }
+            String roleName = shiroFactory.findRoleNameByRoleId(roleId);
+            roleNameSet.add(roleName);
+        }
+
+        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
+        info.addStringPermissions(permissionSet);
+        info.addRoles(roleNameSet);
+        return info;
+    }
+
+    /**
+     * 设置认证加密方式
+     */
+    @Override
+    public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
+        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
+        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
+        md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
+        super.setCredentialsMatcher(md5CredentialsMatcher);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java
new file mode 100644
index 0000000..eedfe1c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java
@@ -0,0 +1,290 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.stylefeng.guns.core.shiro;
+
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.shiro.crypto.hash.SimpleHash;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.util.ByteSource;
+
+import java.util.List;
+
+/**
+ * shiro工具类
+ *
+ * @author dafei, Chill Zhuang
+ */
+public class ShiroKit {
+
+    private static final String NAMES_DELIMETER = ",";
+
+    /**
+     * 加盐参数
+     */
+    public final static String hashAlgorithmName = "MD5";
+
+    /**
+     * 循环次数
+     */
+    public final static int hashIterations = 1024;
+
+    /**
+     * shiro密码加密工具类
+     *
+     * @param credentials 密码
+     * @param saltSource 密码盐
+     * @return
+     */
+    public static String md5(String credentials, String saltSource) {
+        ByteSource salt = new Md5Hash(saltSource);
+        return new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations).toString();
+    }
+
+    /**
+     * 获取随机盐值
+     * @param length
+     * @return
+     */
+    public static String getRandomSalt(int length) {
+        return ToolUtil.getRandomString(length);
+    }
+
+    /**
+     * 获取当前 Subject
+     *
+     * @return Subject
+     */
+    public static Subject getSubject() {
+        return SecurityUtils.getSubject();
+    }
+
+    /**
+     * 获取封装的 ShiroUser
+     *
+     * @return ShiroUser
+     */
+    public static ShiroUser getUser() {
+        if (isGuest()) {
+            return null;
+        } else {
+            return (ShiroUser) getSubject().getPrincipals().getPrimaryPrincipal();
+        }
+    }
+
+    /**
+     * 从shiro获取session
+     *
+     */
+    public static Session getSession() {
+        return getSubject().getSession();
+    }
+
+    /**
+     * 获取shiro指定的sessionKey
+     *
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getSessionAttr(String key) {
+        Session session = getSession();
+        return session != null ? (T) session.getAttribute(key) : null;
+    }
+
+    /**
+     * 设置shiro指定的sessionKey
+     *
+     */
+    public static void setSessionAttr(String key, Object value) {
+        Session session = getSession();
+        session.setAttribute(key, value);
+    }
+
+    /**
+     * 移除shiro指定的sessionKey
+     */
+    public static void removeSessionAttr(String key) {
+        Session session = getSession();
+        if (session != null)
+            session.removeAttribute(key);
+    }
+
+    /**
+     * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用
+     *
+     * @param roleName
+     *            角色名
+     * @return 属于该角色:true,否则false
+     */
+    public static boolean hasRole(String roleName) {
+        return getSubject() != null && roleName != null
+                && roleName.length() > 0 && getSubject().hasRole(roleName);
+    }
+
+    /**
+     * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。
+     *
+     * @param roleName
+     *            角色名
+     * @return 不属于该角色:true,否则false
+     */
+    public static boolean lacksRole(String roleName) {
+        return !hasRole(roleName);
+    }
+
+    /**
+     * 验证当前用户是否属于以下任意一个角色。
+     *
+     * @param roleNames
+     *            角色列表
+     * @return 属于:true,否则false
+     */
+    public static boolean hasAnyRoles(String roleNames) {
+        boolean hasAnyRole = false;
+        Subject subject = getSubject();
+        if (subject != null && roleNames != null && roleNames.length() > 0) {
+            for (String role : roleNames.split(NAMES_DELIMETER)) {
+                if (subject.hasRole(role.trim())) {
+                    hasAnyRole = true;
+                    break;
+                }
+            }
+        }
+        return hasAnyRole;
+    }
+
+    /**
+     * 验证当前用户是否属于以下所有角色。
+     *
+     * @param roleNames
+     *            角色列表
+     * @return 属于:true,否则false
+     */
+    public static boolean hasAllRoles(String roleNames) {
+        boolean hasAllRole = true;
+        Subject subject = getSubject();
+        if (subject != null && roleNames != null && roleNames.length() > 0) {
+            for (String role : roleNames.split(NAMES_DELIMETER)) {
+                if (!subject.hasRole(role.trim())) {
+                    hasAllRole = false;
+                    break;
+                }
+            }
+        }
+        return hasAllRole;
+    }
+
+    /**
+     * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用
+     *
+     * @param permission
+     *            权限名
+     * @return 拥有权限:true,否则false
+     */
+    public static boolean hasPermission(String permission) {
+        return getSubject() != null && permission != null
+                && permission.length() > 0
+                && getSubject().isPermitted(permission);
+    }
+
+    /**
+     * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。
+     *
+     * @param permission
+     *            权限名
+     * @return 拥有权限:true,否则false
+     */
+    public static boolean lacksPermission(String permission) {
+        return !hasPermission(permission);
+    }
+
+    /**
+     * 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用
+     *
+     * @return 通过身份验证:true,否则false
+     */
+    public static boolean isAuthenticated() {
+        return getSubject() != null && getSubject().isAuthenticated();
+    }
+
+    /**
+     * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。
+     *
+     * @return 没有通过身份验证:true,否则false
+     */
+    public static boolean notAuthenticated() {
+        return !isAuthenticated();
+    }
+
+    /**
+     * 认证通过或已记住的用户。与guset搭配使用。
+     *
+     * @return 用户:true,否则 false
+     */
+    public static boolean isUser() {
+        return getSubject() != null && getSubject().getPrincipal() != null;
+    }
+
+    /**
+     * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用
+     *
+     * @return 访客:true,否则false
+     */
+    public static boolean isGuest() {
+        return !isUser();
+    }
+
+    /**
+     * 输出当前用户信息,通常为登录帐号信息。
+     *
+     * @return 当前用户信息
+     */
+    public static String principal() {
+        if (getSubject() != null) {
+            Object principal = getSubject().getPrincipal();
+            return principal.toString();
+        }
+        return "";
+    }
+
+    /**
+     * 获取当前用户的部门数据范围的集合
+     */
+    public static List<Integer> getDeptDataScope() {
+        Integer deptId = getUser().getDeptId();
+        List<Integer> subDeptIds = ConstantFactory.me().getSubDeptId(deptId);
+        subDeptIds.add(deptId);
+        return subDeptIds;
+    }
+
+    /**
+     * 判断当前用户是否是超级管理员
+     */
+    public static boolean isAdmin() {
+        List<Integer> roleList = ShiroKit.getUser().getRoleList();
+        for (Integer integer : roleList) {
+            String singleRoleTip = ConstantFactory.me().getSingleRoleTip(integer);
+            if (singleRoleTip.equals(Const.ADMIN_NAME)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java
new file mode 100644
index 0000000..4a91414
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java
@@ -0,0 +1,81 @@
+package com.stylefeng.guns.core.shiro;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息
+ *
+ * @author fengshuonan
+ * @date 2016年12月5日 上午10:26:43
+ */
+public class ShiroUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer id;          // 主键ID
+    public String account;      // 账号
+    public String name;         // 姓名
+    public Integer deptId;      // 部门id
+    public List<Integer> roleList; // 角色集
+    public String deptName;        // 部门名称
+    public List<String> roleNames; // 角色名称集
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Integer deptId) {
+        this.deptId = deptId;
+    }
+
+    public List<Integer> getRoleList() {
+        return roleList;
+    }
+
+    public void setRoleList(List<Integer> roleList) {
+        this.roleList = roleList;
+    }
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public List<String> getRoleNames() {
+        return roleNames;
+    }
+
+    public void setRoleNames(List<String> roleNames) {
+        this.roleNames = roleNames;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java
new file mode 100644
index 0000000..b93a834
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.stylefeng.guns.core.shiro.check;
+
+/**
+ * 检查用接口
+ */
+public interface ICheck {
+
+    /**
+     * 检查当前登录用户是否拥有指定的角色访问当
+     */
+    boolean check(Object[] permissions);
+
+    /**
+     * 检查当前登录用户是否拥有当前请求的servlet的权限
+     */
+    boolean checkAll();
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java
new file mode 100644
index 0000000..89f602f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.stylefeng.guns.core.shiro.check;
+
+import com.stylefeng.guns.core.listener.ConfigListener;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.support.CollectionKit;
+import com.stylefeng.guns.core.support.HttpKit;
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 权限自定义检查
+ */
+@Service
+@DependsOn("springContextHolder")
+@Transactional(readOnly = true)
+public class PermissionCheckFactory implements ICheck {
+
+    public static ICheck me() {
+        return SpringContextHolder.getBean(ICheck.class);
+    }
+
+    @Override
+    public boolean check(Object[] permissions) {
+        ShiroUser user = ShiroKit.getUser();
+        if (null == user) {
+            return false;
+        }
+        String join = CollectionKit.join(permissions, ",");
+        if (ShiroKit.hasAnyRoles(join)) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean checkAll() {
+        HttpServletRequest request = HttpKit.getRequest();
+        ShiroUser user = ShiroKit.getUser();
+        if (null == user) {
+            return false;
+        }
+        String requestURI = request.getRequestURI().replaceFirst(ConfigListener.getConf().get("contextPath"), "");
+        String[] str = requestURI.split("/");
+        if (str.length > 3) {
+            requestURI = "/" + str[1] + "/" + str[2];
+        }
+        if (ShiroKit.hasPermission(requestURI)) {
+            return true;
+        }
+        return false;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java
new file mode 100644
index 0000000..690f728
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.stylefeng.guns.core.shiro.check;
+
+import com.stylefeng.guns.core.util.SpringContextHolder;
+
+/**
+ * 权限检查管理器(入口)
+ */
+public class PermissionCheckManager {
+    private final static PermissionCheckManager me = new PermissionCheckManager();
+
+    private ICheck defaultCheckFactory = SpringContextHolder.getBean(ICheck.class);
+
+    public static PermissionCheckManager me() {
+        return me;
+    }
+
+    private PermissionCheckManager() {
+    }
+
+    public PermissionCheckManager(ICheck checkFactory) {
+        this.defaultCheckFactory = checkFactory;
+    }
+
+    public void setDefaultCheckFactory(ICheck defaultCheckFactory) {
+        this.defaultCheckFactory = defaultCheckFactory;
+    }
+
+    public static boolean check(Object[] permissions) {
+        return me.defaultCheckFactory.check(permissions);
+    }
+
+    public static boolean checkAll() {
+        return me.defaultCheckFactory.checkAll();
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java
new file mode 100644
index 0000000..c701170
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.core.shiro.factory;
+
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+
+import java.util.List;
+
+/**
+ * 定义shirorealm所需数据的接口
+ *
+ * @author fengshuonan
+ * @date 2016年12月5日 上午10:23:34
+ */
+public interface IShiro {
+
+    /**
+     * 根据账号获取登录用户
+     *
+     * @param account 账号
+     */
+    User user(String account);
+
+    /**
+     * 根据系统用户获取Shiro的用户
+     *
+     * @param user 系统用户
+     */
+    ShiroUser shiroUser(User user);
+
+    /**
+     * 获取权限列表通过角色id
+     *
+     * @param roleId 角色id
+     */
+    List<String> findPermissionsByRoleId(Integer roleId);
+
+    /**
+     * 根据角色id获取角色名称
+     *
+     * @param roleId 角色id
+     */
+    String findRoleNameByRoleId(Integer roleId);
+
+    /**
+     * 获取shiro的认证信息
+     */
+    SimpleAuthenticationInfo info(ShiroUser shiroUser, User user, String realmName);
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java
new file mode 100644
index 0000000..970a268
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java
@@ -0,0 +1,98 @@
+package com.stylefeng.guns.core.shiro.factory;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.constant.state.ManagerStatus;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.Convert;
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import com.stylefeng.guns.modular.system.dao.MenuMapper;
+import com.stylefeng.guns.modular.system.dao.UserMapper;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.shiro.authc.CredentialsException;
+import org.apache.shiro.authc.LockedAccountException;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.shiro.util.ByteSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@DependsOn("springContextHolder")
+@Transactional(readOnly = true)
+public class ShiroFactroy implements IShiro {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private MenuMapper menuMapper;
+
+    public static IShiro me() {
+        return SpringContextHolder.getBean(IShiro.class);
+    }
+
+    @Override
+    public User user(String account) {
+
+        User user = userMapper.getByAccount(account);
+
+        // 账号不存在
+        if (null == user) {
+            throw new CredentialsException();
+        }
+        // 账号被冻结
+        if (user.getStatus() != ManagerStatus.OK.getCode()) {
+            throw new LockedAccountException();
+        }
+        return user;
+    }
+
+    @Override
+    public ShiroUser shiroUser(User user) {
+        ShiroUser shiroUser = new ShiroUser();
+
+        shiroUser.setId(user.getId());
+        shiroUser.setAccount(user.getAccount());
+        shiroUser.setDeptId(user.getDeptid());
+        shiroUser.setDeptName(ConstantFactory.me().getDeptName(user.getDeptid()));
+        shiroUser.setName(user.getName());
+
+        Integer[] roleArray = Convert.toIntArray(user.getRoleid());
+        List<Integer> roleList = new ArrayList<Integer>();
+        List<String> roleNameList = new ArrayList<String>();
+        for (int roleId : roleArray) {
+            roleList.add(roleId);
+            roleNameList.add(ConstantFactory.me().getSingleRoleName(roleId));
+        }
+        shiroUser.setRoleList(roleList);
+        shiroUser.setRoleNames(roleNameList);
+
+        return shiroUser;
+    }
+
+    @Override
+    public List<String> findPermissionsByRoleId(Integer roleId) {
+        return menuMapper.getResUrlsByRoleId(roleId);
+    }
+
+    @Override
+    public String findRoleNameByRoleId(Integer roleId) {
+        return ConstantFactory.me().getSingleRoleTip(roleId);
+    }
+
+    @Override
+    public SimpleAuthenticationInfo info(ShiroUser shiroUser, User user, String realmName) {
+        String credentials = user.getPassword();
+
+        // 密码加盐处理
+        String source = user.getSalt();
+        ByteSource credentialsSalt = new Md5Hash(source);
+        return new SimpleAuthenticationInfo(shiroUser, credentials, credentialsSalt, realmName);
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java
new file mode 100644
index 0000000..a07afe1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java
@@ -0,0 +1,201 @@
+package com.stylefeng.guns.core.tag;
+
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Dict;
+import com.stylefeng.guns.modular.system.service.IDictService;
+import org.beetl.core.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典标签渲染
+ *
+ * @author zhangjiajia
+ * @Date 2018年6月4日17:33:32
+ */
+@Component
+@Scope("prototype")
+public class DictSelectorTag extends Tag {
+
+    @Autowired
+    IDictService iDictService;
+
+    @Override
+    public void render(){
+        //String tagName = (String) this.args[0];
+        Map attrs = (Map) args[1];
+        if(ToolUtil.isEmpty(attrs.get("code"))){
+            throw new GunsException(BizExceptionEnum.ERROR_CODE_EMPTY);
+        }
+
+        //字典类型编码
+        String code = attrs.get("code").toString();
+        //控件显示类型select 选择框,radio 单选按钮,checkbox 多选按钮
+        String type = ToolUtil.isNotEmpty(attrs.get("type"))?attrs.get("type").toString():"select";
+        //开启多选
+        String multiple = ToolUtil.isNotEmpty(attrs.get("multiple"))?attrs.get("multiple").toString():"";
+        //字典名称
+        String label = ToolUtil.isNotEmpty(attrs.get("label"))?attrs.get("label").toString():"";
+        //提示
+        String placeholder = (ToolUtil.isNotEmpty(attrs.get("placeholder"))?attrs.get("placeholder").toString():"");
+        //宽度
+        String width = ToolUtil.isNotEmpty(attrs.get("width"))?attrs.get("width").toString():"248";
+        //默认值
+        String value = ToolUtil.isNotEmpty(attrs.get("value"))?attrs.get("value").toString():"";
+        //id
+        String id = ToolUtil.isNotEmpty(attrs.get("id"))?attrs.get("id").toString():"";
+        //name
+        String name = ToolUtil.isNotEmpty(attrs.get("name"))?attrs.get("name").toString():"";
+        //分割线
+        String underline = ToolUtil.isNotEmpty(attrs.get("underline"))?attrs.get("underline").toString():"";
+        //onchange事件
+        String onchange = ToolUtil.isNotEmpty(attrs.get("onchange"))?attrs.get("onchange").toString():"";
+        //readonly属性
+        String readonly = ToolUtil.isNotEmpty(attrs.get("readonly"))?attrs.get("readonly").toString():"";
+        //disabled属性
+        String disabled = ToolUtil.isNotEmpty(attrs.get("disabled"))?attrs.get("disabled").toString():"";
+        //searchnum 下拉选项数量达到多少启用搜索,默认10
+        int searchnum = ToolUtil.isNum(attrs.get("searchnum"))?Integer.parseInt(attrs.get("searchnum").toString()):10;
+        //根据code查询字典数据
+        List<Dict>  list = iDictService.selectByParentCode(code);
+
+        StringBuffer html = new StringBuffer();
+        html.append("<div class=\"form-group\">\r\n");
+        html.append("<label class=\"col-sm-3 control-label\">"+label+"</label>\r\n");
+        html.append("<div class=\"col-sm-9\">\r\n");
+
+        //单选按钮
+        if("radio".equals(type)) {
+
+            list.forEach(obj->{
+                html.append("<label class=\"radio-inline i-checks\">\r\n<input type=\"radio\" ");
+                //判断控件是否禁用
+                if("true".equals(disabled)||"disabled".equals(disabled)) {
+                    html.append("disabled ");
+                }else{
+                    if(ToolUtil.isNotEmpty(name)){
+                        html.append("name=\""+name+"\" ");
+                    }
+                }
+                if("true".equals(readonly)||"disabled".equals(readonly)) {
+                    html.append("disabled ");
+                }
+                if(ToolUtil.isNotEmpty(value)&&value.equals(obj.getCode())){
+                    html.append("checked ");
+                }
+
+                html.append("value=\""+obj.getCode()+"\" >"+obj.getName()+"</label>\r\n");
+            });
+
+        //多选按钮
+        }else if("checkbox".equals(type)){
+            list.forEach(obj->{
+                html.append("<label class=\"checkbox-inline i-checks\">\r\n<input type=\"checkbox\" ");
+                //判断控件是否禁用
+                if("true".equals(disabled)||"disabled".equals(disabled)) {
+                    html.append("disabled ");
+                }else{
+                    if(ToolUtil.isNotEmpty(name)){
+                        html.append("name=\""+name+"\" ");
+                    }
+                }
+                if("true".equals(readonly)||"disabled".equals(readonly)) {
+                    html.append("disabled ");
+                }
+                if(ToolUtil.isNotEmpty(value)&&value.equals(obj.getCode())){
+                    html.append("checked ");
+                }
+
+                html.append("value=\""+obj.getCode()+"\" >"+obj.getName()+"</label>\r\n");
+            });
+
+        //默认select
+        }else{
+            //开启多选
+            if("true".equals(multiple)){
+                if(list.size()>=searchnum) {
+                    html.append("<select multiple ");
+                }else{
+                    html.append("<select multiple=\"multiple\" size=\"10\" ");
+                }
+            }else{
+                html.append("<select ");
+            }
+
+            //判断控件是否启用提示
+            if(ToolUtil.isNotEmpty(placeholder)){
+                html.append(" data-placeholder=\""+placeholder+"\" ");
+            }
+
+            //判断控件是否禁用
+            if("true".equals(disabled)||"disabled".equals(disabled)) {
+                html.append("disabled=\"disabled\" ");
+            }else{
+                //启用
+                if(ToolUtil.isNotEmpty(id)){
+                    html.append("id=\""+id+"\" ");
+                }
+
+                if(ToolUtil.isNotEmpty(name)){
+                    html.append("name=\""+name+"\" ");
+                }
+            }
+
+            //判断是否启用搜索框
+            //判断下拉数据,如果查询出来的条数达到启用搜索的数量就启用
+
+
+            if(list.size()>=searchnum){
+                html.append("class=\"form-control chosen-select\" style=\"width:"+width+"px\"  tabindex=\"1\" \r\n");
+            } else{
+                html.append("class=\"form-control\" style=\"width:"+width+"px\" \r\n");
+            }
+
+            //判断控件是否只读
+            if("true".equals(readonly)||"readonly".equals(readonly)) {
+                if(list.size()>=searchnum) {
+                    html.append("disabled=\"disabled\" ");
+                }else{
+                    html.append("onfocus=\"this.defaultIndex=this.selectedIndex;\" onchange=\"this.selectedIndex=this.defaultIndex;\" ");
+                }
+            }
+
+            //判断是否绑定onchange事件
+            if(ToolUtil.isNotEmpty(onchange)){
+                html.append("onchange=\""+onchange+"($(this).children('option:selected').val())\" ");
+            }
+
+            html.append(">");
+            if(ToolUtil.isNotEmpty(placeholder)){
+                html.append("<option value=\"\">"+placeholder+"</option>\r\n");
+            }
+            //将查询出来的数据添加到select中
+            list.forEach(obj->{
+                if(ToolUtil.isNotEmpty(value)&&value.equals(obj.getCode())){
+                    html.append("<option selected value=\""+obj.getCode()+"\">"+obj.getName()+"</option>\r\n");
+                }else{
+                    html.append("<option value=\""+obj.getCode()+"\">"+obj.getName()+"</option>\r\n");
+                }
+            });
+            html.append("</select>\r\n");
+        }
+
+        html.append("</div>\r\n</div>\r\n");
+        //判断是否添加分割线
+        if(ToolUtil.isNotEmpty(underline) && "true".equals(underline)) {
+            html.append("<div class=\"hr-line-dashed\" ></div >\r\n");
+        }
+
+        try{
+            this.ctx.byteWriter.writeString(html.toString());
+        }catch (IOException e){
+            throw new RuntimeException("输出字典标签错误");
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java
new file mode 100644
index 0000000..ffba2f2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.node.MenuNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * api接口文档显示过滤
+ *
+ * @author fengshuonan
+ * @date 2017-08-17 16:55
+ */
+public class ApiMenuFilter extends MenuNode {
+
+    public static List<MenuNode> build(List<MenuNode> nodes) {
+
+        //如果关闭了接口文档,则不显示接口文档菜单
+        GunsProperties gunsProperties = SpringContextHolder.getBean(GunsProperties.class);
+        if (!gunsProperties.getSwaggerOpen()) {
+            List<MenuNode> menuNodesCopy = new ArrayList<>();
+            for (MenuNode menuNode : nodes) {
+                if (Const.API_MENU_NAME.equals(menuNode.getName())) {
+                    continue;
+                } else {
+                    menuNodesCopy.add(menuNode);
+                }
+            }
+            nodes = menuNodesCopy;
+        }
+
+        return nodes;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java
new file mode 100644
index 0000000..72facc7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java
@@ -0,0 +1,211 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+import com.stylefeng.guns.core.common.constant.dictmap.factory.DictFieldWarpperFactory;
+import com.stylefeng.guns.core.support.StrKit;
+
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 对比两个对象的变化的工具类
+ *
+ * @author fengshuonan
+ * @Date 2017/3/31 10:36
+ */
+public class Contrast {
+
+    //记录每个修改字段的分隔符
+    public static final String separator = ";;;";
+
+    /**
+     * 比较两个对象,并返回不一致的信息
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:34
+     */
+    public static String contrastObj(Object pojo1, Object pojo2) {
+        String str = "";
+        try {
+            Class clazz = pojo1.getClass();
+            Field[] fields = pojo1.getClass().getDeclaredFields();
+            int i = 1;
+            for (Field field : fields) {
+                if ("serialVersionUID".equals(field.getName())) {
+                    continue;
+                }
+                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
+                Method getMethod = pd.getReadMethod();
+                Object o1 = getMethod.invoke(pojo1);
+                Object o2 = getMethod.invoke(pojo2);
+                if (o1 == null || o2 == null) {
+                    continue;
+                }
+                if (o1 instanceof Date) {
+                    o1 = DateUtil.getDay((Date) o1);
+                }
+                if (!o1.toString().equals(o2.toString())) {
+                    if (i != 1) {
+                        str += separator;
+                    }
+                    str += "字段名称" + field.getName() + ",旧值:" + o1 + ",新值:" + o2;
+                    i++;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return str;
+    }
+
+    /**
+     * 比较两个对象pojo1和pojo2,并输出不一致信息
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:34
+     */
+    public static String contrastObj(Class dictClass, String key, Object pojo1, Map<String, String> pojo2) throws IllegalAccessException, InstantiationException {
+        AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
+        String str = parseMutiKey(dictMap, key, pojo2) + separator;
+        try {
+            Class clazz = pojo1.getClass();
+            Field[] fields = pojo1.getClass().getDeclaredFields();
+            int i = 1;
+            for (Field field : fields) {
+                if ("serialVersionUID".equals(field.getName())) {
+                    continue;
+                }
+                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
+                Method getMethod = pd.getReadMethod();
+                Object o1 = getMethod.invoke(pojo1);
+                Object o2 = pojo2.get(StrKit.firstCharToLowerCase(getMethod.getName().substring(3)));
+                if (o1 == null || o2 == null) {
+                    continue;
+                }
+                if (o1 instanceof Date) {
+                    o1 = DateUtil.getDay((Date) o1);
+                } else if (o1 instanceof Integer) {
+                    o2 = Integer.parseInt(o2.toString());
+                }
+                if (!o1.toString().equals(o2.toString())) {
+                    if (i != 1) {
+                        str += separator;
+                    }
+                    String fieldName = dictMap.get(field.getName());
+                    String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(field.getName());
+                    if (fieldWarpperMethodName != null) {
+                        Object o1Warpper = DictFieldWarpperFactory.createFieldWarpper(o1, fieldWarpperMethodName);
+                        Object o2Warpper = DictFieldWarpperFactory.createFieldWarpper(o2, fieldWarpperMethodName);
+                        str += "字段名称:" + fieldName + ",旧值:" + o1Warpper + ",新值:" + o2Warpper;
+                    } else {
+                        str += "字段名称:" + fieldName + ",旧值:" + o1 + ",新值:" + o2;
+                    }
+                    i++;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return str;
+    }
+
+    /**
+     * 比较两个对象pojo1和pojo2,并输出不一致信息
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:34
+     */
+    public static String contrastObjByName(Class dictClass, String key, Object pojo1, Map<String, String> pojo2) throws IllegalAccessException, InstantiationException {
+        AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
+        String str = parseMutiKey(dictMap, key, pojo2) + separator;
+        try {
+            Class clazz = pojo1.getClass();
+            Field[] fields = pojo1.getClass().getDeclaredFields();
+            int i = 1;
+            for (Field field : fields) {
+                if ("serialVersionUID".equals(field.getName())) {
+                    continue;
+                }
+                String prefix = "get";
+                int prefixLength = 3;
+                if (field.getType().getName().equals("java.lang.Boolean")) {
+                    prefix = "is";
+                    prefixLength = 2;
+                }
+                Method getMethod = null;
+                try {
+                    getMethod = clazz.getDeclaredMethod(prefix + StrKit.firstCharToUpperCase(field.getName()));
+                } catch (java.lang.NoSuchMethodException e) {
+                    System.err.println("this className:" + clazz.getName() + " is not methodName: " + e.getMessage());
+                    continue;
+                }
+                Object o1 = getMethod.invoke(pojo1);
+                Object o2 = pojo2.get(StrKit.firstCharToLowerCase(getMethod.getName().substring(prefixLength)));
+                if (o1 == null || o2 == null) {
+                    continue;
+                }
+                if (o1 instanceof Date) {
+                    o1 = DateUtil.getDay((Date) o1);
+                } else if (o1 instanceof Integer) {
+                    o2 = Integer.parseInt(o2.toString());
+                }
+                if (!o1.toString().equals(o2.toString())) {
+                    if (i != 1) {
+                        str += separator;
+                    }
+                    String fieldName = dictMap.get(field.getName());
+                    String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(field.getName());
+                    if (fieldWarpperMethodName != null) {
+                        Object o1Warpper = DictFieldWarpperFactory.createFieldWarpper(o1, fieldWarpperMethodName);
+                        Object o2Warpper = DictFieldWarpperFactory.createFieldWarpper(o2, fieldWarpperMethodName);
+                        str += "字段名称:" + fieldName + ",旧值:" + o1Warpper + ",新值:" + o2Warpper;
+                    } else {
+                        str += "字段名称:" + fieldName + ",旧值:" + o1 + ",新值:" + o2;
+                    }
+                    i++;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return str;
+    }
+
+    /**
+     * 解析多个key(逗号隔开的)
+     *
+     * @author stylefeng
+     * @Date 2017/5/16 22:19
+     */
+    public static String parseMutiKey(AbstractDictMap dictMap, String key, Map<String, String> requests) {
+        StringBuilder sb = new StringBuilder();
+        if (key.indexOf(",") != -1) {
+            String[] keys = key.split(",");
+            for (String item : keys) {
+                String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(item);
+                String value = requests.get(item);
+                if (fieldWarpperMethodName != null) {
+                    Object valueWarpper = DictFieldWarpperFactory.createFieldWarpper(value, fieldWarpperMethodName);
+                    sb.append(dictMap.get(item) + "=" + valueWarpper + ",");
+                } else {
+                    sb.append(dictMap.get(item) + "=" + value + ",");
+                }
+            }
+            return StrKit.removeSuffix(sb.toString(), ",");
+        } else {
+            String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(key);
+            String value = requests.get(key);
+            if (fieldWarpperMethodName != null) {
+                Object valueWarpper = DictFieldWarpperFactory.createFieldWarpper(value, fieldWarpperMethodName);
+                sb.append(dictMap.get(key) + "=" + valueWarpper);
+            } else {
+                sb.append(dictMap.get(key) + "=" + value);
+            }
+            return sb.toString();
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/GetMobile.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/GetMobile.java
new file mode 100644
index 0000000..eea7047
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/GetMobile.java
@@ -0,0 +1,87 @@
+package com.stylefeng.guns.core.util;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpResponse;
+import org.apache.http.util.EntityUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class GetMobile {
+
+    public static String getPhone(String accessToken,String androidOrIos){
+
+
+        String host = "http://verifystar.market.alicloudapi.com";
+        String path = "/api/v1/mobile/info";
+        String method = "POST";
+        String appcode = "b7d32437d08149099457dcb50fb57df2";
+        Map<String, String> headers = new HashMap<String, String>();
+        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
+        headers.put("Authorization", "APPCODE " + appcode);
+        //根据API的要求,定义相对应的Content-Type
+        headers.put("Content-Type", "application/json; charset=UTF-8");
+        //需要给X-Ca-Nonce的值生成随机字符串,每次请求不能相同
+        headers.put("X-Ca-Nonce", UUID.randomUUID().toString());
+        Map<String, String> querys = new HashMap<String, String>();
+        if(androidOrIos.equals("android")){
+            querys.put("appkey", "5f02e3cc978eea07661bde20");
+            querys.put("verifyId", "");
+        }else{
+            querys.put("appkey", "5ee43367978eea081640dca7");
+            querys.put("verifyId", "");
+        }
+        /*;*/
+        String bodys = "{\"token\":\""+accessToken+"\"}";
+        try {
+            /**
+             * 重要提示如下:
+             * HttpUtils请从
+             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
+             * 下载
+             *
+             * 相应的依赖请参照
+             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
+             */
+
+            HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
+            System.out.println(response.toString());
+            return  EntityUtils.toString(response.getEntity());
+            //获取response的body
+            //System.out.println(EntityUtils.toString(response.getEntity()));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return  null;
+        }
+       /* DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G9Zez9H4B36vakPXGy4", "BOVPUeZndKVbrPOq6Ef5j6oiydB3XZ");
+        IAcsClient client = new DefaultAcsClient(profile);
+
+        GetMobileRequest request = new GetMobileRequest();
+        request.setRegionId("cn-hangzhou");
+        request.setAccessToken(accessToken);
+
+        try {
+            GetMobileResponse response = client.getAcsResponse(request);
+            才
+        } catch (ServerException e) {
+            e.printStackTrace();
+            return  null;
+        } catch (ClientException e) {
+            System.out.println("ErrCode:" + e.getErrCode());
+            System.out.println("ErrMsg:" + e.getErrMsg());
+            System.out.println("RequestId:" + e.getRequestId());
+            return  null;
+        }*/
+    }
+    public static void main(String[] args) {
+        //String response = GetMobile.getPhone("eyAgIm8iIDogImlPUyIsICAiayIgOiAiY2lNVmw2S0ZyM0xlWlJOQVNSNTdZXC9WV1FZS3BCZlVSR1pQa1I5OFJFWmVJWmF3OHJGM0NVSDZQZVwvNzRPVTBSalpoZE5QT002NHl3b05yZlJkWUlrUkxVY29hdm10Rkg1ODhrNjJmXC9vdTEzalN2ZDduZDlscXFLWm5Ca2hQZzBBa09yS2M1dlwvWWY0U05lUjd4RHh6MUJoOUVYbkxnbHFEclZqVW85TXQ5XC9ieXk2SmVNVVB3UzhqRHM2N3VwUEg0SWRTNElqUUxCUXVHb1FyM1ltb1lpUnQ2R29YWlJCRzhDbndUTVBrSHM4YXNMQzRGVUpmZHcxbFlzN0srNGlyTGJSdXVacTg1NW9NMEo5b05FOExmdDZGTFpmVWVQY0d0WlwvTnhIMnFXM1ZIU3NtUEgxdHlkTzdUeGRmVUM1cEo2SmhRclVvNEdIazBXVHF3RTlCYlFnPT0iLCAgImMiIDogIkVjS0dHSzB5TjA2Tm9vSjhYV1h1K3d6eGdodElDaGpqOUtHRlliSjl4ZjhQMUR6UERsYVdRcGcxMHg5SkdNV2hcL2wyVDd4bXNxSUZmWERDZlBjZ05NdFY2dVZueEU1aGFTUUdPbFowekp4Z2JPZ3ZrR2ZkbVJvOGZFSGhEQ0czM1RYNHR5ZHJXUGFuQTBBSmo3VjljaGN0d25UT0ZzSG82WlhLOWZsQUlSbHpmNE1yaGZsRkhtTVRoejQ1UG01cHhtSlh5N3EyVlZTK0tEbU9GU2lzNlwvMnByK24zQWttazYxZ0RVUUhYV2FoVFwvYzc0dzhrTDhWYlliM3dOc0VkVEh2ZDhzYjlPbFNpVHNJUHNFUVJ6Wm9JRFJUaE5pWVg1U3VwNklQXC9LTFlLOFdaSlJWamU2QUpLT2JOakEybTlleTM0Sys2MUhtQktPNmNwTlZ4TTJITlJERjRzcG9lWStYdnhTT1pVcExaSWxXd3NFdUtUeVVBSzJUMHpOUmZBQVhlOWR6alBcL2lHSFU3aitwUWlaaU1XbHg5WGtIREM3MjNkXC80b3d2dEluem9yVlBNNjJQTzJsWWttOEt4TVVTYlRRTnBVNGZzRzlXcHB0cFJRR0JFUTYyNmxlNFFZeWdaSWxjZXlcL1VJOWlLWDVWTzhCU01VUnNoZUdNU29HejF2dmw2QUVmdTdBNm0raUhUYkxOd01uQkM3VHZ4TlYxNmd4M2dWRGtha0ZGNEdZTjZsWm0zMkNnT2hVakhlODMrUXFHNXhNNkZxUlBnMWN0QzRRN05DZFpHNUN5UEZVd2dRcUx3MFFWaE9IRnNZTFwvU3p3T1JUMFFlb0h3T1piZ3FmNU96T0k1TFwvelRqNEFJV3ZqejlteWNJZVc3cXMzXC9IdnJXck5GM3lSZCtYTml5a2d6d1RDMnZjaXRrSkszSVBENjlEVVRVVzBCNllvdng2ako5QW5xZXdUc1J3Nlp4ZXcra0xpXC9HTlB0K0hHRGVjclVZcFpwOFQ5ckN6QkM0Z0ZEa0ZOQ0Z2UkJKSE5JVGkrRGNUeWhVZz09In0=","ios");
+        JSONObject json = JSONObject.parseObject("{\"success\":true,\"data\":{\"mobile\":\"15608199082\",\"score\":null,\"activeScore\":null,\"aesEncryptKey\":null},\"code\":2001,\"message\":\"gain mobile&#39;s result success\",\"requestId\":\"21D1E797-2B22-4D0E-B31D-AC470F7E06E7\"}");
+        String phone = json.getJSONObject("data").getString("mobile");
+        //JSONObject json = JSONObject.parseObject(response);
+        if(json.getInteger("code")!=2003){
+            System.out.println("1111="+ phone);
+        }
+        System.out.println( phone);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/HttpUtils.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/HttpUtils.java
new file mode 100644
index 0000000..f32411f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/HttpUtils.java
@@ -0,0 +1,312 @@
+package com.stylefeng.guns.core.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicNameValuePair;
+
+public class HttpUtils {
+
+    /**
+     * get
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doGet(String host, String path, String method,
+                                     Map<String, String> headers,
+                                     Map<String, String> querys)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpGet request = new HttpGet(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * post form
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param bodys
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPost(String host, String path, String method,
+                                      Map<String, String> headers,
+                                      Map<String, String> querys,
+                                      Map<String, String> bodys)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (bodys != null) {
+            List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
+
+            for (String key : bodys.keySet()) {
+                nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
+            }
+            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
+            formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
+            request.setEntity(formEntity);
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Post String
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param body
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPost(String host, String path, String method,
+                                      Map<String, String> headers,
+                                      Map<String, String> querys,
+                                      String body)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (StringUtils.isNotBlank(body)) {
+            request.setEntity(new StringEntity(body, "utf-8"));
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Post stream
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param body
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPost(String host, String path, String method,
+                                      Map<String, String> headers,
+                                      Map<String, String> querys,
+                                      byte[] body)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (body != null) {
+            request.setEntity(new ByteArrayEntity(body));
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Put String
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param body
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPut(String host, String path, String method,
+                                     Map<String, String> headers,
+                                     Map<String, String> querys,
+                                     String body)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPut request = new HttpPut(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (StringUtils.isNotBlank(body)) {
+            request.setEntity(new StringEntity(body, "utf-8"));
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Put stream
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param body
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPut(String host, String path, String method,
+                                     Map<String, String> headers,
+                                     Map<String, String> querys,
+                                     byte[] body)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPut request = new HttpPut(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (body != null) {
+            request.setEntity(new ByteArrayEntity(body));
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Delete
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doDelete(String host, String path, String method,
+                                        Map<String, String> headers,
+                                        Map<String, String> querys)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        return httpClient.execute(request);
+    }
+
+    private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
+        StringBuilder sbUrl = new StringBuilder();
+        sbUrl.append(host);
+        if (!StringUtils.isBlank(path)) {
+            sbUrl.append(path);
+        }
+        if (null != querys) {
+            StringBuilder sbQuery = new StringBuilder();
+            for (Map.Entry<String, String> query : querys.entrySet()) {
+                if (0 < sbQuery.length()) {
+                    sbQuery.append("&");
+                }
+                if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
+                    sbQuery.append(query.getValue());
+                }
+                if (!StringUtils.isBlank(query.getKey())) {
+                    sbQuery.append(query.getKey());
+                    if (!StringUtils.isBlank(query.getValue())) {
+                        sbQuery.append("=");
+                        sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
+                    }
+                }
+            }
+            if (0 < sbQuery.length()) {
+                sbUrl.append("?").append(sbQuery);
+            }
+        }
+
+        return sbUrl.toString();
+    }
+
+    private static HttpClient wrapClient(String host) {
+        HttpClient httpClient = new DefaultHttpClient();
+        if (host.startsWith("https://")) {
+            sslClient(httpClient);
+        }
+
+        return httpClient;
+    }
+
+    private static void sslClient(HttpClient httpClient) {
+        try {
+            SSLContext ctx = SSLContext.getInstance("TLS");
+            X509TrustManager tm = new X509TrustManager() {
+                public X509Certificate[] getAcceptedIssuers() {
+                    return null;
+                }
+                public void checkClientTrusted(X509Certificate[] xcs, String str) {
+
+                }
+                public void checkServerTrusted(X509Certificate[] xcs, String str) {
+
+                }
+            };
+            ctx.init(null, new TrustManager[] { tm }, null);
+            SSLSocketFactory ssf = new SSLSocketFactory(ctx);
+            ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+            ClientConnectionManager ccm = httpClient.getConnectionManager();
+            SchemeRegistry registry = ccm.getSchemeRegistry();
+            registry.register(new Scheme("https", 443, ssf));
+        } catch (KeyManagementException ex) {
+            throw new RuntimeException(ex);
+        } catch (NoSuchAlgorithmException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java
new file mode 100644
index 0000000..0b2eb41
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.core.common.constant.JwtConstants;
+import io.jsonwebtoken.*;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>jwt token工具类</p>
+ * <pre>
+ *     jwt的claim里一般包含以下几种数据:
+ *         1. iss -- token的发行者
+ *         2. sub -- 该JWT所面向的用户
+ *         3. aud -- 接收该JWT的一方
+ *         4. exp -- token的失效时间
+ *         5. nbf -- 在此时间段之前,不会被处理
+ *         6. iat -- jwt发布时间
+ *         7. jti -- jwt唯一标识,防止重复使用
+ * </pre>
+ *
+ * @author fengshuonan
+ * @Date 2017/8/25 10:59
+ */
+@Component
+public class JwtTokenUtil {
+
+    /**
+     * 获取用户名从token中
+     */
+    public static String getUsernameFromToken(String token) {
+        return getClaimFromToken(token).getSubject();
+    }
+
+    /**
+     * 获取jwt发布时间
+     */
+    public static Date getIssuedAtDateFromToken(String token) {
+        return getClaimFromToken(token).getIssuedAt();
+    }
+
+    /**
+     * 获取jwt失效时间
+     */
+    public static Date getExpirationDateFromToken(String token) {
+        return getClaimFromToken(token).getExpiration();
+    }
+
+    /**
+     * 获取jwt接收者
+     */
+    public static String getAudienceFromToken(String token) {
+        return getClaimFromToken(token).getAudience();
+    }
+
+    /**
+     * 获取私有的jwt claim
+     */
+    public static String getPrivateClaimFromToken(String token, String key) {
+        return getClaimFromToken(token).get(key).toString();
+    }
+
+    /**
+     * 获取jwt的payload部分
+     */
+    public static Claims getClaimFromToken(String token) {
+        return Jwts.parser()
+                .setSigningKey(JwtConstants.SECRET)
+                .parseClaimsJws(token)
+                .getBody();
+    }
+
+    /**
+     * 解析token是否正确,不正确会报异常<br>
+     */
+    public static void parseToken(String token) throws JwtException {
+        Jwts.parser().setSigningKey(JwtConstants.SECRET).parseClaimsJws(token).getBody();
+    }
+
+    /**
+     * <pre>
+     *  验证token是否失效
+     *  true:过期   false:没过期
+     * </pre>
+     */
+    public static Boolean isTokenExpired(String token) {
+        try {
+            final Date expiration = getExpirationDateFromToken(token);
+            return expiration.before(new Date());
+        } catch (ExpiredJwtException expiredJwtException) {
+            return true;
+        }
+    }
+
+    /**
+     * 生成token(通过用户名和签名时候用的随机数)
+     */
+    public static String generateToken(String userId) {
+        Map<String, Object> claims = new HashMap<>();
+        return doGenerateToken(claims, userId);
+    }
+
+    /**
+     * 生成token
+     */
+    private static String doGenerateToken(Map<String, Object> claims, String subject) {
+        final Date createdDate = new Date();
+        final Date expirationDate = new Date(createdDate.getTime() + JwtConstants.EXPIRATION * 1000);
+
+        return Jwts.builder()
+                .setClaims(claims)
+                .setSubject(subject)
+                .setIssuedAt(createdDate)
+                .setExpiration(expirationDate)
+                .signWith(SignatureAlgorithm.HS512, JwtConstants.SECRET)
+                .compact();
+    }
+
+    /**
+     * 获取混淆MD5签名用的随机字符串
+     */
+    public static String getRandomKey() {
+        return ToolUtil.getRandomString(6);
+    }
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java
new file mode 100644
index 0000000..719de81
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.config.properties.GunsProperties;
+
+/**
+ * 验证码工具类
+ */
+public class KaptchaUtil {
+
+    /**
+     * 获取验证码开关
+     */
+    public static Boolean getKaptchaOnOff() {
+        return SpringContextHolder.getBean(GunsProperties.class).getKaptchaOpen();
+    }
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/controller/OrderCharteredCarController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/controller/OrderCharteredCarController.java
new file mode 100644
index 0000000..e35ba25
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/controller/OrderCharteredCarController.java
@@ -0,0 +1,96 @@
+package com.stylefeng.guns.modular.CharteredCar.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.modular.CharteredCar.dto.CharteredCarDto;
+import com.stylefeng.guns.modular.CharteredCar.server.IOrderCharteredCarService;
+import com.stylefeng.guns.modular.system.model.ServerCarModel;
+import com.stylefeng.guns.modular.system.model.TCharteredService;
+import com.stylefeng.guns.modular.system.service.IServerCarModelService;
+import com.stylefeng.guns.modular.system.service.ITCharteredServiceService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+@Api
+@RestController
+@RequestMapping("/api/orderCharteredCar")
+public class OrderCharteredCarController {
+
+    @Autowired
+    private IOrderCharteredCarService orderCharteredCarService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IServerCarModelService serverCarModelService;
+    @Autowired
+    private ITCharteredServiceService charteredService;
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    @ApiOperation(value = "根据tag查询包车,全部传-1", tags = {"用户端-包车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(value = "服务车型id", name = "serverCarModelId", required = true, dataType = "int")
+    })
+    public ResultUtil<List<TCharteredService>> list(Integer serverCarModelId){
+        EntityWrapper<TCharteredService> tCharteredServiceEntityWrapper = new EntityWrapper<>();
+        tCharteredServiceEntityWrapper.eq("status",1);
+        if (serverCarModelId!=-1){
+            tCharteredServiceEntityWrapper.eq("serverCarModelId",serverCarModelId);
+        }
+        List<TCharteredService> tCharteredServices = charteredService.selectList(tCharteredServiceEntityWrapper);
+        for (TCharteredService tCharteredService : tCharteredServices) {
+            ServerCarModel serverCarModel = serverCarModelService.selectById(tCharteredService.getServerCarModelId());
+            if (serverCarModel!=null) {
+                tCharteredService.setServerCarModelName(serverCarModel.getName());
+            }
+        }
+        return ResultUtil.success(tCharteredServices);
+    }
+
+    @ResponseBody
+    @RequestMapping(value = "/tag", method = RequestMethod.POST)
+    @ApiOperation(value = "获取包车tag", tags = {"用户端-包车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<ServerCarModel>> orderCharteredCar(){
+        List<ServerCarModel> serverCarModels = serverCarModelService.selectList(new EntityWrapper<ServerCarModel>().eq("type", 3).eq("state", 1));
+        return ResultUtil.success(serverCarModels);
+    }
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/orderCharteredCar", method = RequestMethod.POST)
+    @ApiOperation(value = "提交包车订单", tags = {"用户端-包车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil orderCharteredCar(@RequestBody CharteredCarDto charteredCarDto, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            charteredCarDto.setUserId(uid);
+           return   orderCharteredCarService.createOrder(charteredCarDto);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/OrderCharteredCarMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/OrderCharteredCarMapper.java
new file mode 100644
index 0000000..8a7481d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/OrderCharteredCarMapper.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.CharteredCar.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.CharteredCar.model.OrderCharteredCar;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface OrderCharteredCarMapper extends BaseMapper<OrderCharteredCar> {
+
+
+    List<OrderCharteredCar> query(@Param("start") Date start, @Param("end") Date end);
+
+
+    /**
+     * 获取用户的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryMyOrderList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
+                                               @Param("size") Integer size);
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/TCharteredServiceMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/TCharteredServiceMapper.java
new file mode 100644
index 0000000..1b2478a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/TCharteredServiceMapper.java
@@ -0,0 +1,43 @@
+package com.stylefeng.guns.modular.CharteredCar.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCharteredService;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 包车服务 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface TCharteredServiceMapper extends BaseMapper<TCharteredService> {
+
+    /**
+     * 获取包车管理管理列表
+     * @param page
+     * @param beginTime
+     * @param endTime
+     * @param serviceName
+     * @param serverCarModelId
+     * @param startPrice
+     * @param endPrice
+     * @param status
+     * @return
+     */
+    List<Map<String, Object>> getCharteredServiceList(@Param("page") Page<Map<String, Object>> page,
+                                                      @Param("beginTime")String beginTime,
+                                                      @Param("endTime")String endTime,
+                                                      @Param("serviceName")String serviceName,
+                                                      @Param("serverCarModelId")Integer serverCarModelId,
+                                                      @Param("startPrice")BigDecimal startPrice,
+                                                      @Param("endPrice")BigDecimal endPrice,
+                                                      @Param("status")Integer status);
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/mapping/OrderCharteredCarMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/mapping/OrderCharteredCarMapper.xml
new file mode 100644
index 0000000..ca3d4e2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/mapping/OrderCharteredCarMapper.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.CharteredCar.dao.OrderCharteredCarMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.CharteredCar.model.OrderCharteredCar">
+        <id column="id" property="id"/>
+        <result column="userId" property="userId"/>
+        <result column="companyId" property="companyId"/>
+        <result column="orderNumber" property="orderNumber"/>
+        <result column="traveltime" property="traveltime"/>
+        <result column="carTime" property="carTime"/>
+        <result column="serverCarModelId" property="serverCarModelId"/>
+        <result column="modelUse" property="modelUse"/>
+        <result column="peopleNumber" property="peopleNumber"/>
+        <result column="contactPerson" property="contactPerson"/>
+        <result column="contactPhone" property="contactPhone"/>
+        <result column="state" property="state"/>
+        <result column="remark" property="remark"/>
+        <result column="isDelete" property="isDelete"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+
+    <select id="query" resultType="OrderCharteredCar">
+        select
+        id as id,
+        userId as userId,
+        companyId as companyId,
+        orderNumber as orderNumber,
+        traveltime as traveltime,
+        carTime as carTime,
+        serverCarModelId as serverCarModelId,
+        modelUse as modelUse,
+        peopleNumber as peopleNumber,
+        contactPerson as contactPerson,
+        contactPhone as contactPhone,
+        state as state,
+        remark as remark,
+        isDelete as isDelete,
+        insertTime as insertTime
+        from t_order_chartered_car where isDelete = 1 and insertTime between #{start} and #{end}
+    </select>
+
+
+
+    <select id="queryMyOrderList" resultType="map">
+        select
+        id as orderId,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+        DATE_FORMAT(traveltime, '%Y-%m-%d') as time,
+        carTime as carTime,
+        (select name from t_server_carmodel where state = 1 and type = 3 and id = a.serverCarModelId) as serverCarModel,
+        (6) as orderType,
+        state as state
+        from t_order_chartered_car as a where userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/mapping/TCharteredServiceMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/mapping/TCharteredServiceMapper.xml
new file mode 100644
index 0000000..7d69c70
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dao/mapping/TCharteredServiceMapper.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.CharteredCar.dao.TCharteredServiceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TCharteredService">
+        <id column="id" property="id" />
+        <result column="serviceName" property="serviceName" />
+        <result column="themePicture" property="themePicture" />
+        <result column="serverCarModelId" property="serverCarModelId" />
+        <result column="serviceMoney" property="serviceMoney" />
+        <result column="carType" property="carType" />
+        <result column="status" property="status" />
+        <result column="isDelete" property="isDelete" />
+        <result column="insertTime" property="insertTime" />
+        <result column="priceRule" property="priceRule" />
+        <result column="priceRulePicture" property="priceRulePicture" />
+        <result column="cancelRule" property="cancelRule" />
+        <result column="cancelRulePicture" property="cancelRulePicture" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, serviceName, themePicture, serverCarModelId, serviceMoney, carType, status,isDelete,insertTime,priceRule,priceRulePicture,cancelRule,cancelRulePicture
+    </sql>
+    <select id="getCharteredServiceList" resultType="java.util.Map">
+        select
+        tcs.id, tcs.serviceName, tcs.themePicture, tcs.serverCarModelId, tcs.serviceMoney, tcs.carType, tcs.status,
+        tcs.isDelete,tcs.insertTime,tcs.priceRule,tcs.priceRulePicture,tcs.cancelRule,tcs.cancelRulePicture,tsc.name serverCarModelName
+        from t_chartered_service tcs
+        left join t_server_carmodel tsc on tcs.serverCarModelId = tsc.id
+        where tcs.isDelete=1
+        <if test="beginTime!=null and endTime!=null and beginTime!='' and endTime!=''">
+            and tcs.insertTime between CONCAT('',#{beginTime},' 00:00:00') and CONCAT('',#{endTime},' 23:59:59')
+        </if>
+        <if test="serviceName!=null and serviceName!=''">
+            and tcs.serviceName like concat('%',#{serviceName},'%')
+        </if>
+        <if test="serverCarModelId!=null">
+            and tcs.serverCarModelId=#{serverCarModelId}
+        </if>
+        <if test="startPrice != null and endPrice != null">
+            and tcs.serviceMoney &gt;= #{startPrice}
+            and tcs.serviceMoney &lt;= #{endPrice}
+        </if>
+        <if test="serverCarModelId!=null">
+            and tcs.serverCarModelId=#{serverCarModelId}
+        </if>
+        <if test="status!=null">
+            and tcs.status=#{status}
+        </if>
+        order by tcs.insertTime desc
+    </select>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dto/CharteredCarDto.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dto/CharteredCarDto.java
new file mode 100644
index 0000000..ef85262
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/dto/CharteredCarDto.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.modular.CharteredCar.dto;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+@Data
+public class CharteredCarDto {
+    @ApiModelProperty("出行时间")
+    private String traveltime;
+    @ApiModelProperty("用车时间")
+    private double carTime;
+    @ApiModelProperty("车型id")
+    private Integer serverCarModelId;
+    @ApiModelProperty("联系人")
+    private String contactPerson;
+    @ApiModelProperty("联系人电话")
+    private String contactPhone;
+    @ApiModelProperty("备注")
+    private String newRemark;
+    private Integer userId;
+    private Double startLon;
+    private Double startLat;
+    private String startAddress;
+    private Double endLon;
+    private Double endLat;
+    private String endAddress;
+
+    private Integer serviceId;
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/model/OrderCharteredCar.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/model/OrderCharteredCar.java
new file mode 100644
index 0000000..92dbfeb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/model/OrderCharteredCar.java
@@ -0,0 +1,264 @@
+package com.stylefeng.guns.modular.CharteredCar.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;
+
+/**
+ * 包车订单
+ */
+@TableName("t_order_chartered_car")
+@Data
+public class OrderCharteredCar {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 订单编号
+     */
+    @TableField("orderNumber")
+    private String orderNumber;
+    /**
+     * 出行时间
+     */
+    @TableField("traveltime")
+    private Date traveltime;
+    /**
+     * 用车时长
+     */
+    @TableField("carTime")
+    private double carTime;
+    /**
+     * 车型
+     */
+    @TableField("serverCarModelId")
+    private Integer serverCarModelId;
+
+    @TableField("serviceId")
+    private Integer serviceId;
+    /**
+     * 车型用途
+     */
+    @TableField("modelUse")
+    private String modelUse;
+    /**
+     * 乘车人数
+     */
+    @TableField("peopleNumber")
+    private Integer peopleNumber;
+    /**
+     * 联系人
+     */
+    @TableField("contactPerson")
+    private String contactPerson;
+    /**
+     * 联系电话
+     */
+    @TableField("contactPhone")
+    private String contactPhone;
+    /**
+     * 状态(1=待处理,2=已处理,3=已取消)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    @TableField("newRemark")
+    private String newRemark;
+
+    @TableField("startLon")
+    private Double startLon;
+    /**
+     * 起点纬度
+     */
+    @TableField("startLat")
+    private Double startLat;
+    /**
+     * 起点
+     */
+    @TableField("startAddress")
+    private String startAddress;
+    /**
+     * 目的地经度
+     */
+    @TableField("endLon")
+    private Double endLon;
+    /**
+     * 目的地纬度
+     */
+    @TableField("endLat")
+    private Double endLat;
+    /**
+     * 目的地
+     */
+    @TableField("endAddress")
+    private String endAddress;
+    /**
+     * 删除状态(1=否,2=是)
+     */
+    @TableField("isDelete")
+    private Integer isDelete;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getOrderNumber() {
+        return orderNumber;
+    }
+
+    public void setOrderNumber(String orderNumber) {
+        this.orderNumber = orderNumber;
+    }
+
+    public Date getTraveltime() {
+        return traveltime;
+    }
+
+    public void setTraveltime(Date traveltime) {
+        this.traveltime = traveltime;
+    }
+
+
+    public void setCarTime(double carTime) {
+        this.carTime = carTime;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public String getModelUse() {
+        return modelUse;
+    }
+
+    public void setModelUse(String modelUse) {
+        this.modelUse = modelUse;
+    }
+
+    public Integer getPeopleNumber() {
+        return peopleNumber;
+    }
+
+    public void setPeopleNumber(Integer peopleNumber) {
+        this.peopleNumber = peopleNumber;
+    }
+
+    public String getContactPerson() {
+        return contactPerson;
+    }
+
+    public void setContactPerson(String contactPerson) {
+        this.contactPerson = contactPerson;
+    }
+
+    public String getContactPhone() {
+        return contactPhone;
+    }
+
+    public void setContactPhone(String contactPhone) {
+        this.contactPhone = contactPhone;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderCharteredCar{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", companyId=" + companyId +
+                ", orderNumber='" + orderNumber + '\'' +
+                ", traveltime=" + traveltime +
+                ", carTime=" + carTime +
+                ", serverCarModelId=" + serverCarModelId +
+                ", modelUse='" + modelUse + '\'' +
+                ", peopleNumber=" + peopleNumber +
+                ", contactPerson='" + contactPerson + '\'' +
+                ", contactPhone='" + contactPhone + '\'' +
+                ", state=" + state +
+                ", remark='" + remark + '\'' +
+                ", isDelete=" + isDelete +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/server/IOrderCharteredCarService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/server/IOrderCharteredCarService.java
new file mode 100644
index 0000000..88e39d3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/server/IOrderCharteredCarService.java
@@ -0,0 +1,59 @@
+package com.stylefeng.guns.modular.CharteredCar.server;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.CharteredCar.dto.CharteredCarDto;
+import com.stylefeng.guns.modular.CharteredCar.model.OrderCharteredCar;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderCharteredCarService extends IService<OrderCharteredCar> {
+
+
+    /**
+     * 下单
+     * @param traveltime
+     * @param carTime
+     * @param serverCarModelId
+     * @param modelUse
+     * @param peopleNumber
+     * @param contactPerson
+     * @param contactPhone
+     * @param placeLonLat
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil orderCharteredCar(Date travelTime, Integer carTime, Integer serverCarModelId, String modelUse, Integer peopleNumber,
+                                 String contactPerson, String contactPhone, String placeLonLat, Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取用户的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+
+
+    /**
+     * 添加取消
+     * @param id
+     * @param reason
+     * @param remark
+     * @param uid
+     * @throws Exception
+     */
+    ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception;
+
+
+    ResultUtil createOrder(CharteredCarDto charteredCarDto);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/server/impl/OrderCharteredCarServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/server/impl/OrderCharteredCarServiceImpl.java
new file mode 100644
index 0000000..7f118f5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/CharteredCar/server/impl/OrderCharteredCarServiceImpl.java
@@ -0,0 +1,183 @@
+package com.stylefeng.guns.modular.CharteredCar.server.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.CharteredCar.dao.OrderCharteredCarMapper;
+import com.stylefeng.guns.modular.CharteredCar.dto.CharteredCarDto;
+import com.stylefeng.guns.modular.CharteredCar.model.OrderCharteredCar;
+import com.stylefeng.guns.modular.CharteredCar.server.IOrderCharteredCarService;
+import com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper;
+import com.stylefeng.guns.modular.system.model.Company;
+import com.stylefeng.guns.modular.system.model.OrderCancel;
+import com.stylefeng.guns.modular.system.model.SensitiveWords;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.service.ICompanyCityService;
+import com.stylefeng.guns.modular.system.service.IOrderCancelService;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import com.stylefeng.guns.modular.system.util.DateUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class OrderCharteredCarServiceImpl extends ServiceImpl<OrderCharteredCarMapper, OrderCharteredCar> implements IOrderCharteredCarService {
+
+    @Resource
+    private OrderCharteredCarMapper orderCharteredCarMapper;
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+    @Autowired
+    private ICompanyCityService companyCityService;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+
+
+    /**
+     * 保存数据
+     * @param traveltime
+     * @param carTime
+     * @param modelUse
+     * @param peopleNumber
+     * @param contactPerson
+     * @param contactPhone
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil orderCharteredCar(Date travelTime, Integer carTime, Integer serverCarModelId, String modelUse, Integer peopleNumber,
+                                        String contactPerson, String contactPhone, String placeLonLat, Integer uid) throws Exception {
+        OrderCharteredCar orderCharteredCar = new OrderCharteredCar();
+        orderCharteredCar.setUserId(uid);
+        Company query = companyCityService.query(placeLonLat.split(",")[0], placeLonLat.split(",")[1]);
+        if(null == query){
+            return ResultUtil.error("该地点暂无企业服务");
+        }
+        orderCharteredCar.setCompanyId(query.getId());
+        orderCharteredCar.setOrderNumber(this.getOrderNum());
+        orderCharteredCar.setTraveltime(travelTime);
+        orderCharteredCar.setCarTime(carTime);
+        orderCharteredCar.setServerCarModelId(serverCarModelId);
+        orderCharteredCar.setModelUse(modelUse);
+        orderCharteredCar.setPeopleNumber(peopleNumber);
+        orderCharteredCar.setContactPerson(contactPerson);
+        orderCharteredCar.setContactPhone(contactPhone);
+        orderCharteredCar.setState(1);
+        orderCharteredCar.setIsDelete(1);
+        orderCharteredCar.setInsertTime(new Date());
+        this.insert(orderCharteredCar);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取个人中心订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        List<Map<String, Object>> maps = orderCharteredCarMapper.queryMyOrderList(uid, pageNum, size);
+        return maps;
+    }
+
+
+    @Override
+    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(remark)){
+            if(ToolUtil.isNotEmpty(remark)){
+                List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+                for(SensitiveWords s : sensitiveWords){
+                    remark = remark.replaceAll(s.getContent(), "***");
+                }
+            }
+        }
+
+        OrderCharteredCar orderCharteredCar = this.selectById(id);
+        if(null == orderCharteredCar){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderCharteredCar.getState() != 1){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+
+        OrderCancel orderCancel = new OrderCancel();
+        orderCancel.setOrderId(id);
+        orderCancel.setOrderType(6);
+        orderCancel.setReason(reason);
+        orderCancel.setRemark(remark);
+        orderCancel.setState(2);
+        orderCancel.setInsertTime(new Date());
+        orderCancel.setUserType(1);
+        orderCancelService.insert(orderCancel);
+        orderCharteredCar.setState(3);
+        this.updateById(orderCharteredCar);
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您已成功取消旅游包车订单,谢谢使用!", orderCharteredCar.getUserId(), 1);
+        Map<String, Object> map = new HashMap<>();
+        map.put("id", orderCancel.getId());
+        return ResultUtil.success(map);
+    }
+
+    @Override
+    public ResultUtil createOrder(CharteredCarDto charteredCarDto) {
+        OrderCharteredCar orderCharteredCar = new OrderCharteredCar();
+        BeanUtils.copyProperties(charteredCarDto,orderCharteredCar);
+        try {
+            orderCharteredCar.setOrderNumber(this.getOrderNum());
+            orderCharteredCar.setCompanyId(1);
+            orderCharteredCar.setIsDelete(1);
+            orderCharteredCar.setState(1);
+            orderCharteredCar.setInsertTime(new Date());
+            orderCharteredCar.setCarTime(charteredCarDto.getCarTime());
+
+            String strDateTime = charteredCarDto.getTraveltime();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d H:m");
+
+            try {
+                Date date = sdf.parse(strDateTime);
+                System.out.println("Converted Date and Time: " + date);
+                orderCharteredCar.setTraveltime(date);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        this.insert(orderCharteredCar);
+        return ResultUtil.success();
+
+
+    }
+
+
+    public synchronized String getOrderNum() throws Exception{
+        int size = this.selectCount(null);
+        return "CHARTERED" + String.valueOf(1000000 + size + 1).substring(1);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/AdvertisementController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/AdvertisementController.java
new file mode 100644
index 0000000..c357960
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/AdvertisementController.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.service.IAdvertisementService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.AdvertisementWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 广告控制器
+ */
+@Api
+@RestController
+@RequestMapping("/base/advertisement")
+public class AdvertisementController {
+
+    @Autowired
+    private IAdvertisementService advertisementService;
+
+
+
+    @ResponseBody
+    @PostMapping("/queryByType")
+    @ApiOperation(value = "获取广告列表", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "数据类型(1:弹窗广告,2:底部广告)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "当前定位城市code(510100)", name = "code", required = true, dataType = "string")
+    })
+    public ResultUtil<List<AdvertisementWarpper>> queryAdvertisement(String code, Integer type){
+        try {
+            List<AdvertisementWarpper> advertisementWarpper = advertisementService.queryAdvertisement(code, type);
+            return ResultUtil.success(advertisementWarpper);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/AgreementController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/AgreementController.java
new file mode 100644
index 0000000..324a0c7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/AgreementController.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.service.IAgreementService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 协议控制器
+ */
+@Api
+@RestController
+//@CrossOrigin
+@RequestMapping("/base/agreement")
+public class AgreementController {
+
+    @Autowired
+    private IAgreementService agreementService;
+
+
+    /**
+     * 获取各种协议
+     * @param type
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryByType")
+    @ApiOperation(value = "获取各种协议及H5页面", tags = {"用户端-协议"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "数据类型(1:隐私协议,2:用户协议,3:用户指南,4:法律条款,5:关于我们,6=注册协议,7=取消订单说明,8=充值领券规则设置,9=司机注册协议,10=改派说明,11=跨城出行乘车须知,12:常见问题,13:计价规则,14:包车协议)", name = "type", required = true, dataType = "int")
+    })
+    public ResultUtil<BaseWarpper> queryByType(Integer type){
+        try {
+            String s = agreementService.queryByType(type);
+            BaseWarpper baseWarpper = new BaseWarpper();
+            baseWarpper.setContent(s);
+            return ResultUtil.success(baseWarpper);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java
new file mode 100644
index 0000000..c60adfa
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java
@@ -0,0 +1,80 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.JwtTokenUtil;
+import com.stylefeng.guns.modular.system.dao.UserMapper;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.shiro.util.ByteSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+
+/**
+ * 接口控制器提供
+ *
+ * @author stylefeng
+ * @Date 2018/7/20 23:39
+ */
+@RestController
+@RequestMapping("/gunsApi")
+public class ApiController extends BaseController {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    /**
+     * api登录接口,通过账号密码获取token
+     */
+    @RequestMapping("/auth")
+    public Object auth(@RequestParam("username") String username,
+                       @RequestParam("password") String password) {
+
+        //封装请求账号密码为shiro可验证的token
+        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password.toCharArray());
+
+        //获取数据库中的账号密码,准备比对
+        User user = userMapper.getByAccount(username);
+
+        String credentials = user.getPassword();
+        String salt = user.getSalt();
+        ByteSource credentialsSalt = new Md5Hash(salt);
+        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
+                new ShiroUser(), credentials, credentialsSalt, "");
+
+        //校验用户账号密码
+        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
+        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
+        md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
+        boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
+                usernamePasswordToken, simpleAuthenticationInfo);
+
+        if (passwordTrueFlag) {
+            HashMap<String, Object> result = new HashMap<>();
+            result.put("token", JwtTokenUtil.generateToken(String.valueOf(user.getId())));
+            return result;
+        } else {
+            return new ErrorTip(500, "账号密码错误!");
+        }
+    }
+
+    /**
+     * 测试接口是否走鉴权
+     */
+    @RequestMapping(value = "/test", method = RequestMethod.POST)
+    public Object test() {
+        return SUCCESS_TIP;
+    }
+
+}
+
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/CouponController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/CouponController.java
new file mode 100644
index 0000000..81a42a5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/CouponController.java
@@ -0,0 +1,145 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.service.IUserCouponRecordService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.CouponWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import sun.security.provider.MD5;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Base64;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 优惠券控制器
+ */
+@Api
+@RestController
+@RequestMapping("")
+public class CouponController {
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+    /**
+     * 获取个人优惠券列表
+     * @param state
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/coupon/queryMyCoupons")
+    @ApiOperation(value = "获取个人优惠券列表", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "优惠券状态(1=未使用,2=已使用)", name = "state", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页码(首页1)", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<CouponWarpper>> queryMyCoupons(Integer state, Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+               return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = userCouponRecordService.queryMyCoupons(state, pageNum, size, uid);
+            return ResultUtil.success(CouponWarpper.getCouponWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/base/coupon/queryUserCoupons")
+    @ApiOperation(value = "获取用户优惠券列表", tags = {"道行龙城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "用户id", name = "userId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "优惠券状态(1=未使用,2=已使用)", name = "state", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页码(首页1)", name = "pageNo", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "pageSize", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "签名", name = "sign", required = true, dataType = "string"),
+    })
+    public ResultUtil<List<CouponWarpper>> queryUserCoupons(@RequestParam Integer userId, @RequestParam Integer state, @RequestParam Integer pageNo,
+                                                            @RequestParam Integer pageSize, @RequestParam String sign){
+        try {
+            List<Map<String, Object>> list = userCouponRecordService.queryMyCoupons(state, pageNo, pageSize, userId);
+            return ResultUtil.success(CouponWarpper.getCouponWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 删除优惠券
+     * @param id
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/coupon/delMyCoupon")
+    @ApiOperation(value = "删除优惠券", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "优惠券id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil delMyCoupon(Integer id, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return userCouponRecordService.delMyCoupon(id, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 赠送优惠券
+     * @param id
+     * @param userId
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/coupon/handselCoupon")
+    @ApiOperation(value = "赠送优惠券", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "优惠券id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "赠送用户id", name = "userId", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil handselCoupon(Integer id, Integer userId, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return userCouponRecordService.handselCoupon(id, uid, userId);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java
new file mode 100644
index 0000000..bbc719e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java
@@ -0,0 +1,122 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.service.IDriverService;
+import com.stylefeng.guns.modular.system.service.IOrderEvaluateService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.DriverInfoWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderEvaluateWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+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;
+
+/**
+ * 司机控制器
+ */
+@Api
+@RestController
+@RequestMapping("")
+public class DriverController {
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private IOrderEvaluateService orderEvaluateService;
+
+
+
+
+
+
+    /**
+     * 获取5公里范围内空闲司机数量
+     * @param type 业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/driver/queryIdleDriver")
+    @ApiOperation(value = "获取5公里范围内空闲司机数量", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车 7=接送机)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "乘客当前定位经度", name = "lon", required = true, dataType = "double"),
+            @ApiImplicitParam(value = "乘客当前定位纬度", name = "lat", required = true, dataType = "double")
+    })
+    public ResultUtil<BaseWarpper> queryIdleDriver(Integer type, Double lon, Double lat){
+        try {
+            List<Driver> list = driverService.queryIdleDriver(type, lon, lat, 5D, null);
+            BaseWarpper baseWarpper = new BaseWarpper();
+            baseWarpper.setNumber(list.size());
+            return ResultUtil.success(baseWarpper);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取司机详情
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/driver/queryDriverInfo")
+    @ApiOperation(value = "获取司机详情", tags = {"用户端-订单相关"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "司机id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<DriverInfoWarpper> queryDriverInfo(Integer id){
+        try {
+            Map<String, Object> map = driverService.queryDriverInfo(id);
+            String name = String.valueOf(map.get("name"));
+            map.put("name", name.substring(0, 1) + "师傅");
+            List<BaseWarpper> list = driverService.queryBusiness(id);
+            map.put("list", list);
+            return ResultUtil.success(DriverInfoWarpper.getDriverInfoWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 获取司机的历史评价
+     * @param id
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/driver/queryOrderEvaluate")
+    @ApiOperation(value = "获取司机的历史评价", tags = {"用户端-订单相关"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "司机id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<OrderEvaluateWarpper>> queryOrderEvaluate(Integer id, Integer pageNum, Integer size){
+        try {
+            List<Map<String, Object>> list = orderEvaluateService.queryOrderEvaluate(id, pageNum, size);
+            return ResultUtil.success(OrderEvaluateWarpper.getOrderEvaluateWarpper(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/FeedbackController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/FeedbackController.java
new file mode 100644
index 0000000..4d5fefd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/FeedbackController.java
@@ -0,0 +1,58 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.service.IFeedbackService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 反馈控制器
+ */
+@Api
+@RestController
+@RequestMapping("/api/feedback")
+public class FeedbackController {
+
+    @Autowired
+    private IFeedbackService feedbackService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+    /**
+     * 提交反馈意见
+     * @param content
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/feedback")
+    @ApiOperation(value = "提交反馈意见", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "反馈内容", name = "content", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil feedback(String content, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(uid == null){
+                return ResultUtil.tokenErr();
+            }
+            return feedbackService.feedback(content, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/FrequentPassengersController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/FrequentPassengersController.java
new file mode 100644
index 0000000..a467566
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/FrequentPassengersController.java
@@ -0,0 +1,135 @@
+package com.stylefeng.guns.modular.api;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.modular.system.model.FrequentPassengers;
+import com.stylefeng.guns.modular.system.service.IFrequentPassengersService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.JuHeUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 常用乘车人
+ */
+@RestController
+@RequestMapping("/base/frequentPassengers")
+public class FrequentPassengersController {
+
+    @Autowired
+    private IFrequentPassengersService frequentPassengersService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private JuHeUtil juHeUtil;
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/saveFrequentPassengers", method = RequestMethod.POST)
+    @ApiOperation(value = "添加/编辑 常用乘车人【新】", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil saveFrequentPassengers(FrequentPassengers frequentPassengers, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            //开始校验身份真实
+            boolean b = juHeUtil.idcard(frequentPassengers.getName(), frequentPassengers.getIdcode());
+            if(!b){
+                return ResultUtil.error("身份校验不通过");
+            }
+//            FrequentPassengers frequentPassengers1 = frequentPassengersService.selectOne(new EntityWrapper<FrequentPassengers>().eq("userId", uid).eq("phone", frequentPassengers.getPhone()).eq("status", 1));
+//            if(null != frequentPassengers1){
+//                return ResultUtil.error("该手机号已被使用");
+//            }
+            FrequentPassengers frequentPassengers1 = frequentPassengersService.selectOne(new EntityWrapper<FrequentPassengers>().eq("userId", uid).eq("idcode", frequentPassengers.getIdcode()).eq("status", 1));
+            if(null != frequentPassengers1){
+                if(null == frequentPassengers.getId()){
+                    return ResultUtil.error("该身份证号已被使用");
+                }
+                if(null != frequentPassengers.getId() && frequentPassengers1.getId().compareTo(frequentPassengers.getId()) != 0){
+                    return ResultUtil.error("该身份证号已被使用");
+                }
+            }
+
+            frequentPassengers.setUserId(uid);
+            frequentPassengers.setStatus(1);
+            frequentPassengers.setCreateTime(new Date());
+            if(null == frequentPassengers.getId()){
+                frequentPassengersService.insert(frequentPassengers);
+            }else{
+                frequentPassengersService.updateById(frequentPassengers);
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/queryFrequentPassengersList", method = RequestMethod.POST)
+    @ApiOperation(value = "获取常用乘车人列表【新】", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<FrequentPassengers>> queryFrequentPassengersList(HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<FrequentPassengers> frequentPassengers = frequentPassengersService.selectList(new EntityWrapper<FrequentPassengers>().eq("userId", uid).eq("status", 1));
+            return ResultUtil.success(frequentPassengers);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @RequestMapping(value = "/delFrequentPassengers", method = RequestMethod.POST)
+    @ApiOperation(value = "删除常用乘车人列表【新】", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "数据id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil delFrequentPassengers(Integer id, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            FrequentPassengers frequentPassengers = frequentPassengersService.selectOne(new EntityWrapper<FrequentPassengers>().eq("id", id).eq("userId", uid));
+            if(null == frequentPassengers){
+                return ResultUtil.error("无效的数据");
+            }
+            frequentPassengers.setStatus(3);
+            frequentPassengersService.updateById(frequentPassengers);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/IntegralGoodsController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/IntegralGoodsController.java
new file mode 100644
index 0000000..1eba6af
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/IntegralGoodsController.java
@@ -0,0 +1,140 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.model.IntegralOrder;
+import com.stylefeng.guns.modular.system.service.IIntegralGoodsService;
+import com.stylefeng.guns.modular.system.service.IIntegralOrderService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.IntegralGoodsWarpper;
+import com.stylefeng.guns.modular.system.warpper.IntegralOrderWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+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;
+
+@Api
+@RestController
+@RequestMapping("/api/integralGoods")
+public class IntegralGoodsController {
+
+    @Autowired
+    private IIntegralGoodsService integralGoodsService;
+
+    @Autowired
+    private IIntegralOrderService integralOrderService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+
+
+    /**
+     * 获取积分兑换的商品
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryGoods")
+    @ApiOperation(value = "获取积分兑换的商品", tags = {"用户端-积分相关"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<IntegralGoodsWarpper>> queryGoods(Integer pageNum, Integer size){
+        try {
+            List<Map<String, Object>> list = integralGoodsService.queryGoods(pageNum, size);
+            return ResultUtil.success(IntegralGoodsWarpper.getIntegralGoodsWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取商品详情
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryGoodsInfo")
+    @ApiOperation(value = "获取商品详情", tags = {"用户端-积分相关"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "商品id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil queryGoodsInfo(Integer id){
+        try {
+            Map<String, Object> map = integralGoodsService.queryGoodsInfo(id);
+            return ResultUtil.success(IntegralGoodsWarpper.getIntegralGoodsWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 兑换商品
+     * @param integralOrder
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/addIntegralOrder")
+    @ApiOperation(value = "兑换商品", tags = {"用户端-积分相关"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "商品id", name = "goodsId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "收件人", name = "consigneeName", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "收件人电话", name = "consigneePhone", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "收货地址", name = "consigneeAddress", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "备注", name = "remark", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil addIntegralOrder(IntegralOrder integralOrder, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return integralOrderService.addIntegralOrder(integralOrder, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @ResponseBody
+    @PostMapping("/queryConvertHistory")
+    @ApiOperation(value = "获取兑换历史记录", tags = {"用户端-积分相关"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<IntegralOrderWarpper>> queryConvertHistory(Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = integralOrderService.queryConvertHistory(pageNum, size, uid);
+            return ResultUtil.success(IntegralOrderWarpper.getIntegralOrderWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/InvoiceController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/InvoiceController.java
new file mode 100644
index 0000000..ae04a93
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/InvoiceController.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.model.Invoice;
+import com.stylefeng.guns.modular.system.service.IInvoiceService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.InvoiceWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+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;
+
+/**
+ * 发票控制器
+ */
+@Api
+@RestController
+@RequestMapping("/api/invoice")
+public class InvoiceController {
+
+    @Autowired
+    private IInvoiceService invoiceService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+
+
+    /**
+     * 开票操作
+     * @param invoice
+     * @param order
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/invoicing")
+    @ApiOperation(value = "开发票操作", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "开票订单数据([{\"type\":1,\"id\":12345}])分别为订单类型(1=专车,2=出租车,3=跨城出行,4=同城小件物流),5=跨城小件物流和订单id", name = "order", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "开票类型(1=个人发票,2=单位发票)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "抬头名称(公司名字/个人姓名)", name = "name", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "税号", name = "code", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "发票内容", name = "content", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "备注", name = "remark", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "地址+电话", name = "address", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "开户行+账号", name = "bank", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "邮箱地址", name = "email", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil invoicing(Invoice invoice, String order, HttpServletRequest request){
+        try {
+
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            invoiceService.invoicing(invoice, order, uid);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 获取开票历史
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryMyInvoice")
+    @ApiOperation(value = "获取开票历史", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "inr"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<InvoiceWarpper>> queryMyInvoice(Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> maps = invoiceService.queryMyInvoice(pageNum, size, uid);
+            return ResultUtil.success(InvoiceWarpper.getInvoiceWarpper(maps));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/MinistryOfTransportController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/MinistryOfTransportController.java
new file mode 100644
index 0000000..49fa0b1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/MinistryOfTransportController.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.util.MinistryOfTransport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 交通部测试接口
+ */
+@Api
+@RestController
+@RequestMapping("/base/ministryOfTransport")
+public class MinistryOfTransportController {
+
+    @Autowired
+    private MinistryOfTransport ministryOfTransport;
+
+
+
+    @ResponseBody
+    @ApiOperation(value = "上传企业基础信息", tags = {"交通部测试接口"})
+    @RequestMapping(value = "/pushCompany", method = RequestMethod.POST)
+    public void pushCompany() {
+        try {
+            ministryOfTransport.baseInfoCompany();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/NettyController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/NettyController.java
new file mode 100644
index 0000000..670d2e4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/NettyController.java
@@ -0,0 +1,91 @@
+package com.stylefeng.guns.modular.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.modular.system.service.INettyService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderStatusWarpper;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 仿Socket控制器
+ */
+@RestController
+@RequestMapping("/api/netty")
+public class NettyController {
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private INettyService nettyService;
+
+
+    /**
+     * 获取没有司机接单的提醒数据
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryEndPush")
+    @ApiOperation(value = "获取没有司机接单的提醒数据", tags = {"用户端-仿socket接口"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,4=小件物流-同城,5=小件物流-跨城,6=包车,7=接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<EndPushWarpper> queryEndPush(Integer orderId, Integer orderType, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return nettyService.queryEndPush(orderId, orderType, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 获取服务中的及时数据
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryOrderServer")
+    @ApiOperation(value = "获取服务中的及时数据", tags = {"用户端-仿socket接口"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车,7=接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<OrderServerWarpper> queryOrderServer(Integer orderId, Integer orderType, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return nettyService.queryOrderServer(orderId, orderType, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OpenCityController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OpenCityController.java
new file mode 100644
index 0000000..b6c78c2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OpenCityController.java
@@ -0,0 +1,125 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.service.IOpenCityBusinessService;
+import com.stylefeng.guns.modular.system.service.IOpenCityService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 开通城市控制器
+ */
+@Api
+@RestController
+@RequestMapping("/base/openCity")
+public class OpenCityController {
+
+    @Autowired
+    private IOpenCityService openCityService;
+
+    @Autowired
+    private IOpenCityBusinessService openCityBusinessService;
+
+
+    /**
+     * 获取开通城市列表
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryOpenCity")
+    @ApiOperation(value = "获取开通城市列表", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+    })
+    public ResultUtil<List<BaseWarpper>> queryOpenCity(){
+        try {
+            List<BaseWarpper> list = openCityService.queryOpenCity();
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 根据当前定位获取对应的业务类型
+     * @param province
+     * @param city
+     * @param district
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryBusiness")
+    @ApiOperation(value = "根据当前定位获取业务类型", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "省名称", name = "province", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "市名称", name = "city", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "区县名称", name = "district", required = true, dataType = "String")
+    })
+    public ResultUtil<List<BaseWarpper>> queryBusiness(String province, String city, String district){
+        try {
+            List<BaseWarpper> list = openCityBusinessService.queryBusiness(province, city, district);
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 根据开通城市id获取业务类型
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryBusinessById")
+    @ApiOperation(value = "选择开通城市获取业务类型", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "开通城市id", name = "id", required = true, dataType = "int")
+    })
+    public ResultUtil<List<BaseWarpper>> queryBusinessById(Integer id){
+        try {
+            List<BaseWarpper> list = openCityBusinessService.queryBusinessById(id);
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 判断开通城市
+     * @param code
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/openCity")
+    @ApiOperation(value = "判断当前是否是开通城市", tags = {"用户端-首页"}, notes = "open=1(是),open=2(否)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "当前定位城市code", name = "code", required = true, dataType = "String")
+    })
+    public ResultUtil openCity(String code){
+        try {
+            boolean b = openCityService.openCity(code);
+            Map<String, Object> map = new HashMap<>();
+            map.put("open", b ? 1 : 2);
+            return ResultUtil.success(map);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
new file mode 100644
index 0000000..7e086e7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -0,0 +1,1750 @@
+package com.stylefeng.guns.modular.api;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.CharteredCar.server.IOrderCharteredCarService;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics;
+import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.model.TActivityGeneralization;
+import com.stylefeng.guns.modular.system.model.UserCouponRecord;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.warpper.*;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.model.TransactionDetails;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+import com.stylefeng.guns.modular.transfer.server.IOrderTransferService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 订单控制器(综合)
+ */
+@Api
+//@CrossOrigin
+@RestController
+@RequestMapping("")
+public class OrderController {
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IOrderPositionService orderPositionService;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private IOrderService orderService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private WeChatUtil weChatUtil;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IComplaintService complaintService;
+
+    @Autowired
+    private IOrderEvaluateService orderEvaluateService;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+//    @Autowired
+//    private ICBCPayUtil icbcPayUtil;
+
+    @Autowired
+    private IOrderLogisticsService orderLogisticsService;
+
+    @Autowired
+    private IOrderCharteredCarService orderCharteredCarService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+    @Autowired
+    private IOrderTransferService orderTransferService;
+
+
+
+
+    /**
+     * 获取正在进行中的订单
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/queryServingOrder")
+    @ApiOperation(value = "获取正在进行中的订单", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<OrderStatusWarpper>> queryServingOrder(HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<OrderStatusWarpper> data = new ArrayList<>();
+            List<OrderPrivateCar> orderPrivateCars = orderPrivateCarService.queryOrder(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12);
+            for(OrderPrivateCar orderPrivateCar : orderPrivateCars){
+                if(orderPrivateCar.getState() == 11){
+                    orderPrivateCar.setState(orderPrivateCar.getOldState());
+                }
+                OrderStatusWarpper orderStatusWarpper = new OrderStatusWarpper();
+                orderStatusWarpper.setOrderId(orderPrivateCar.getId());
+                orderStatusWarpper.setOrderType(1);
+                orderStatusWarpper.setState(orderPrivateCar.getState());
+                data.add(orderStatusWarpper);
+            }
+
+            List<OrderTransferCar> orderTransferCars = orderTransferService.queryOrder(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12);
+            for(OrderTransferCar orderPrivateCar : orderTransferCars){
+                if(orderPrivateCar.getState() == 11){
+                    orderPrivateCar.setState(orderPrivateCar.getOldState());
+                }
+                OrderStatusWarpper orderStatusWarpper = new OrderStatusWarpper();
+                orderStatusWarpper.setOrderId(orderPrivateCar.getId());
+                orderStatusWarpper.setOrderType(7);
+                orderStatusWarpper.setState(orderPrivateCar.getState());
+                data.add(orderStatusWarpper);
+            }
+
+            List<OrderTaxi> list = orderTaxiService.queryOrder(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12);
+            for(OrderTaxi orderTaxi : list){
+                if(orderTaxi.getState() == 11){
+                    orderTaxi.setState(orderTaxi.getOldState());
+                }
+                OrderStatusWarpper orderStatusWarpper = new OrderStatusWarpper();
+                orderStatusWarpper.setOrderId(orderTaxi.getId());
+                orderStatusWarpper.setOrderType(2);
+                orderStatusWarpper.setState(orderTaxi.getState());
+                data.add(orderStatusWarpper);
+            }
+            List<OrderCrossCity> orderCrossCities = orderCrossCityService.queryOrder(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12);
+            for(OrderCrossCity orderCrossCity : orderCrossCities){
+                if(orderCrossCity.getState() == 11){
+                    orderCrossCity.setState(orderCrossCity.getOldState());
+                }
+                OrderStatusWarpper orderStatusWarpper = new OrderStatusWarpper();
+                orderStatusWarpper.setOrderId(orderCrossCity.getId());
+                orderStatusWarpper.setOrderType(3);
+                orderStatusWarpper.setState(orderCrossCity.getState());
+                data.add(orderStatusWarpper);
+            }
+            return ResultUtil.success(data);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 获取个人中心订单列表
+     * @param type
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/queryMyOrderList")
+    @ApiOperation(value = "获取个人中心订单列表", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城出行,4=小件物流,5=包车,7接送机)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页码(首页1)", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<OrderWarpper>> queryMyOrderList(Integer type, Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = null;
+            switch (type){
+                case 1:
+                    list = orderPrivateCarService.queryMyOrderList(uid, pageNum, size);
+                    break;
+                case 2:
+                    list = orderTaxiService.queryMyOrderList(uid, pageNum, size);
+                    break;
+                case 3:
+                    list = orderCrossCityService.queryMyOrderList(uid, pageNum, size);
+                    break;
+                case 4:
+                    list = orderLogisticsService.queryMyOrderList(uid, pageNum, size);
+                    break;
+                case 5:
+                    list = orderCharteredCarService.queryMyOrderList(uid, pageNum, size);
+                    break;
+                case 7:
+                    list = orderTransferService.queryMyOrderList(uid, pageNum, size);
+                    break;
+            }
+            return ResultUtil.success(OrderWarpper.getOrderWarpper(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 获取消费记录
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/queryMyTravelRecord")
+    @ApiOperation(value = "获取消费记录", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "页码(首页1)", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<TravelRecordWarpper>> queryMyTravelRecord(Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            Integer page = pageNum;
+            pageNum = (pageNum - 1) * size;
+            List<Map<String, Object>> maps = orderCancelService.queryCancel(uid, 2);
+            List<Map<String, Object>> list = orderPrivateCarService.queryMyTravelRecord(uid);//专车
+            List<Map<String, Object>> list1 = orderTaxiService.queryMyTravelRecord(uid);//出租车
+            List<Map<String, Object>> list2 = orderCrossCityService.queryMyTravelRecord(uid);//跨城车
+            List<Map<String, Object>> list3 = orderLogisticsService.queryMyTravelRecord(uid);//小件物流
+            List<TransactionDetails> transactionDetails = transactionDetailsService.selectList(new EntityWrapper<TransactionDetails>().eq("state", 1)
+                    .eq("type", 1).eq("userType", 1).eq("userId", uid));
+            List<Map<String, Object>> list4 = new ArrayList<>();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+            for(TransactionDetails transactionDetails1 : transactionDetails){
+                Map<String, Object> map = new HashMap<>();
+                map.put("money", transactionDetails1.getMoney());
+                map.put("time", sdf.format(transactionDetails1.getInsertTime()));
+                map.put("name", transactionDetails1.getOrderType() == 3 ? "跨城订单取消退款" : transactionDetails1.getOrderType() == 4 ? "小件物流订单取消退款" : "");
+                map.put("insertTime", Double.valueOf(transactionDetails1.getInsertTime().getTime() / 1000).intValue());
+                list4.add(map);
+            }
+            List<Map<String, Object>> list5 = orderTransferService.queryMyTravelRecord(uid);//专车
+
+            list.addAll(maps);
+            list.addAll(list1);
+            list.addAll(list2);
+            list.addAll(list3);
+            list.addAll(list4);
+            list.addAll(list5);
+
+            List<TravelRecordWarpper> orderWarpper = TravelRecordWarpper.getTravelRecordWarpper(list);
+
+            //分页
+            if(orderWarpper.size() >= page * size){
+                orderWarpper = orderWarpper.subList(pageNum, pageNum + size);
+            }else if(pageNum < orderWarpper.size() && orderWarpper.size() < page * size){
+                orderWarpper = orderWarpper.subList(pageNum, orderWarpper.size());
+            }else{
+                orderWarpper = new ArrayList<>();
+            }
+            return ResultUtil.success(orderWarpper);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 发票页获取订单列表
+     * @param type
+     * @param orderType
+     * @param startTime
+     * @param endTime
+     * @param startMoney
+     * @param endMoney
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/queryInvoiceOrder")
+    @ApiOperation(value = "发票页获取订单列表", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单开票状态(1=未开票,2=其他)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城出行,4=同城小件物流,5=跨城小件物流 ,7=接送机)", name = "orderType", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "开始日期", name = "startTime", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "结束日期", name = "endTime", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "开始金额", name = "startMoney", required = false, dataType = "double"),
+            @ApiImplicitParam(value = "结束金额", name = "endMoney", required = false, dataType = "double"),
+            @ApiImplicitParam(value = "页码(首页1)", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<OrderWarpper>> queryInvoiceOrder(Integer type, Integer orderType, Date startTime,
+                                                            Date endTime, Double startMoney, Double endMoney,
+                                                            Integer pageNum, Integer size, HttpServletRequest request){
+        Integer page = pageNum;
+        pageNum = (pageNum - 1) * size;
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = new ArrayList<>();
+            if(null != orderType){
+                switch (orderType){
+                    case 1://专车
+                        list = orderPrivateCarService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+                        break;
+                    case 2://出租车
+                        list = orderTaxiService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+                        break;
+                    case 3://跨城
+                        list = orderCrossCityService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+                        break;
+                    case 4://同城小件物流
+                        list = orderLogisticsService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid, orderType);
+                        break;
+                    case 5://跨城小件物流
+                        list = orderLogisticsService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid, orderType);
+                        break;
+                    case 7://专车
+                        list = orderTransferService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+                        break;
+                }
+            }else{
+                //专车
+                List<Map<String, Object>> maps = orderPrivateCarService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+                list.addAll(maps);
+                //出租车
+                List<Map<String, Object>> list1 = orderTaxiService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+                list.addAll(list1);
+                //跨城
+                List<Map<String, Object>> list2 = orderCrossCityService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+                list.addAll(list2);
+                //同城小件物流
+                List<Map<String, Object>> list3 = orderLogisticsService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid, orderType);
+                list.addAll(list3);
+                //跨城小件物流
+                List<Map<String, Object>> list4 = orderLogisticsService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid, orderType);
+                list.addAll(list4);
+
+                List<Map<String, Object>> list5 = orderTransferService.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+                list.addAll(list5);
+            }
+
+            //分页
+            if(list.size() >= page * size){
+                list = list.subList(pageNum, pageNum + size);
+            }else if(pageNum < list.size() && list.size() < page * size){
+                list = list.subList(pageNum, list.size());
+            }else{
+                list = new ArrayList<>();
+            }
+
+            return ResultUtil.success(OrderWarpper.getOrderWarpper(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 继续等待推单操作
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/pushOrderTaxi")
+    @ApiOperation(value = "继续等待推单操作", tags = {"用户端-出租车", "用户端-专车","用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,7=接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil pushOrderTaxi(Integer id, Integer orderType){
+        try {
+            switch (orderType){
+                case 1:
+                    return orderPrivateCarService.pushOrderPrivateCar(id);
+                case 2:
+                    return orderTaxiService.pushOrderTaxi(id);
+                case 7 :
+                    return orderTransferService.pushOrderPrivateCar(id);
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 获取服务中的详情数据
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/queryOrderInfo")
+    @ApiOperation(value = "获取服务中的详情数据", tags = {"用户端-服务中"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=城际,7接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<OrderInfoWarpper> queryOrderInfo(Integer orderId, Integer orderType){
+        try {
+            Map<String, Object> map = null;
+            switch (orderType){
+                case 1://专车
+                    map = orderPrivateCarService.queryOrderInfo(orderId);
+                    break;
+                case 2://出租车
+                    map = orderTaxiService.queryOrderInfo(orderId);
+                    break;
+                case 3://跨城
+                    map = orderCrossCityService.queryOrderInfo(orderId);
+                    break;
+                case 7://接送机
+                    map = orderTransferService.queryOrderInfo(orderId);
+                    break;
+            }
+            if(map.get("telX") != null){
+                map.put("driverPhone", map.get("telX"));
+            }
+            return ResultUtil.success(OrderInfoWarpper.getOrderInfoWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 获取服务中的详情数据
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/order/queryOrderInfo_")
+    @ApiOperation(value = "获取服务中的详情数据", tags = {"分享专用"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=城际,7=接送机)", name = "orderType", required = true, dataType = "int"),
+    })
+    public ResultUtil<OrderInfoWarpper> queryOrderInfo_(Integer orderId, Integer orderType){
+        try {
+            Map<String, Object> map = null;
+            switch (orderType){
+                case 1://专车
+                    map = orderPrivateCarService.queryOrderInfo(orderId);
+                    break;
+                case 2://出租车
+                    map = orderTaxiService.queryOrderInfo(orderId);
+                    break;
+                case 3://跨城
+                    map = orderCrossCityService.queryOrderInfo(orderId);
+                    break;
+                case 7://接送机
+                    map = orderTransferService.queryOrderInfo(orderId);
+                    break;
+            }
+            if(null != map.get("telX")){
+                map.put("driverPhone", map.get("telX"));
+            }
+
+            return ResultUtil.success(OrderInfoWarpper.getOrderInfoWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 获取订单取消支付页面详情
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/queryCancelPage")
+    @ApiOperation(value = "获取订单取消支付页面详情", tags = {"用户端-服务中"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=城际,7=接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<OrderInfoWarpper> queryCancelPage(Integer orderId, Integer orderType){
+        try {
+            Map<String, Object> map = null;
+            switch (orderType) {
+                case 1://专车
+                    map = orderPrivateCarService.queryOrderInfo(orderId);
+                    ResultUtil<BaseWarpper> res = orderPrivateCarService.queryCancleAmount(orderId);
+                    map.put("cancelPayMoney", res.getData().getAmount());
+                    break;
+                case 2://出租车
+                    map = orderTaxiService.queryOrderInfo(orderId);
+                    ResultUtil<BaseWarpper> re = orderTaxiService.queryCancleAmount(orderId);
+                    map.put("cancelPayMoney", re.getData().getAmount());
+                    break;
+                case 3://跨城
+                    map = orderCrossCityService.queryOrderInfo(orderId);
+                    ResultUtil<BaseWarpper> r = orderCrossCityService.queryCancleAmount(orderId);
+                    map.put("cancelPayMoney", r.getData().getAmount());
+                    break;
+                case 7://接送机
+                    map = orderTransferService.queryOrderInfo(orderId);
+                    ResultUtil<BaseWarpper> r1 = orderTransferService.queryCancleAmount(orderId);
+                    map.put("cancelPayMoney", r1.getData().getAmount());
+                    break;
+            }
+            return ResultUtil.success(OrderInfoWarpper.getOrderInfoWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取订单轨迹坐标
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/queryTrack")
+    @ApiOperation(value = "获取订单轨迹坐标", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=城际)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil queryTrack(Integer orderId, Integer orderType){
+        try {
+            List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, orderType);
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 获取订单轨迹坐标
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/order/queryTrack_")
+    @ApiOperation(value = "获取订单轨迹坐标", tags = {"分享专用"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=城际)", name = "orderType", required = true, dataType = "int"),
+    })
+    public ResultUtil queryTrack_(Integer orderId, Integer orderType){
+        try {
+            List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, orderType);
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 发送订单状态
+     * @param id
+     * @param orderType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/order/sendOrderState")
+    public ResultUtil cancelOrder(Integer id, Integer orderType){
+        try {
+            Integer driverId = null;
+            Integer userId = null;
+            Integer state = 0;
+            switch (orderType){
+                case 1:
+                    OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(id);
+                    driverId = orderPrivateCar.getDriverId();
+                    userId = orderPrivateCar.getUserId();
+                    state = orderPrivateCar.getState();
+                    if(null != driverId){
+                        pushUtil.pushOrderState(2, driverId, id, orderType, state, 0);
+                    }
+                    break;
+                case 2:
+                    OrderTaxi orderTaxi = orderTaxiService.selectById(id);
+                    driverId = orderTaxi.getDriverId();
+                    userId = orderTaxi.getUserId();
+                    state = orderTaxi.getState();
+                    if(null != driverId){
+                        pushUtil.pushOrderState(2, driverId, id, orderType, state, 0);
+                    }
+                    break;
+                case 3:
+                    OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id);
+                    driverId = orderCrossCity.getDriverId();
+                    userId = orderCrossCity.getUserId();
+                    state = orderCrossCity.getState();
+                    if(orderCrossCity.getPayMoney() == null && state == 10){//支付的情况才推送取消
+                        break;
+                    }else{
+                        pushUtil.pushOrderState(2, driverId, id, orderType, state, 0);
+                    }
+                    break;
+                case 4:
+                    OrderLogistics orderLogistics = orderLogisticsService.selectById(id);
+                    driverId = orderLogistics.getDriverId();
+                    userId = orderLogistics.getUserId();
+                    state = orderLogistics.getState();
+                    if(orderLogistics.getPayMoney() == null && state == 10){//支付的情况才推送取消
+                        break;
+                    }else{
+                        pushUtil.pushOrderState(2, driverId, id, orderType, state, 0);
+                    }
+                    break;
+                case 5:
+                    OrderLogistics orderLogistics1 = orderLogisticsService.selectById(id);
+                    driverId = orderLogistics1.getDriverId();
+                    userId = orderLogistics1.getUserId();
+                    state = orderLogistics1.getState();
+                    if(orderLogistics1.getPayMoney() == null && state == 10){//支付的情况才推送取消
+                        break;
+                    }else{
+                        pushUtil.pushOrderState(2, driverId, id, orderType, state, 0);
+                    }
+                    break;
+
+                case 7:
+                    OrderTransferCar orderTransferCar = orderTransferService.selectById(id);
+                    driverId = orderTransferCar.getDriverId();
+                    userId = orderTransferCar.getUserId();
+                    state = orderTransferCar.getState();
+                    if(null != driverId){
+                        pushUtil.pushOrderState(2, driverId, id, orderType, state, 0);
+                    }
+                    break;
+            }
+            pushUtil.pushOrderState(1, userId, id, orderType, state, 0);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * APP调用微信小程序支付
+     * @param orderId
+     * @param orderType
+     * @param type
+     * @param content
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/order/weChatPay")
+    @ApiOperation(value = "APP调用微信小程序支付", tags = {"用户端-服务中"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "业务类型(1=订单完成支付,2=订单取消支付,3=司机端改派支付,4=余额充值,5=小件物流差价支付)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "端口类型(1=用户端,2=司机端)", name = "userType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "用户id", name = "uid", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "附加参数{\"key\":\"value\"}", name = "content", required = true, dataType = "string")
+    })
+    public ResultUtil weChatPay(Integer orderId, Integer orderType, Integer type, Integer userType, Integer uid, String content){
+        try {
+            return orderService.weChatPay(orderId, orderType, type, userType, uid, content);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/base/order/queryUserOpenId")
+    @ApiOperation(value = "获取用户的微信openid", tags = {"用户端-服务中"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "端口类型(1=用户端,2=司机端)", name = "userType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "用户id", name = "uid", required = true, dataType = "int")
+    })
+    public ResultUtil queryUserOpenId(Integer uid, Integer userType){
+        if(userType == 2){
+            Driver driver = driverService.selectById(uid);
+            return ResultUtil.success(driver.getAppletsOpenId());
+        }
+        if(userType == 1){
+            UserInfo userInfo = userInfoService.selectById(uid);
+            return ResultUtil.success(userInfo.getAppletsOpenId());
+        }
+        return ResultUtil.success();
+    }
+
+
+    @ResponseBody
+    @PostMapping("/base/order/getWeChatOpenId")
+    @ApiOperation(value = "用户授权获取小程序openid", tags = {"用户端-服务中"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "端口类型(1=用户端,2=司机端)", name = "userType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "用户id", name = "uid", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "小程序授权临时凭证", name = "jscode", required = true, dataType = "string"),
+    })
+    public ResultUtil getWeChatOpenId(Integer uid, Integer userType, String jscode){
+        Map<String, String> map = weChatUtil.code2Session(jscode);
+        if(userType == 2){
+            Driver driver = driverService.selectById(uid);
+            driver.setAppletsOpenId(map.get("openid"));
+            driverService.updateById(driver);
+        }
+        if(userType == 1){
+            UserInfo userInfo = userInfoService.selectById(uid);
+            userInfo.setAppletsOpenId(map.get("openid"));
+            userInfoService.updateById(userInfo);
+        }
+        return ResultUtil.success();
+    }
+
+
+
+    /**
+     * 获取预计行驶时间
+     * @param slon
+     * @param slat
+     * @param elon
+     * @param elat
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/taxi/queryExpectedTime")
+    @ApiOperation(value = "选择地点和终点后获取预计行驶时长", tags = {"用户端-出租车", "用户端-专车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "起点经度", name = "slon", required = true, dataType = "double"),
+            @ApiImplicitParam(value = "起点纬度", name = "slat", required = true, dataType = "double"),
+            @ApiImplicitParam(value = "终点经度", name = "elon", required = true, dataType = "double"),
+            @ApiImplicitParam(value = "终点纬度", name = "elat", required = true, dataType = "double")
+    })
+    public ResultUtil<BaseWarpper> queryExpectedTime(Double slon, Double slat, Double elon, Double elat){
+        try {
+            return orderService.queryExpectedTime(slon, slat, elon, elat);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 获取取消订单需要支付的费用金额
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/queryCancleAmount")
+    @ApiOperation(value = "获取取消订单需要支付的费用金额", tags = {"用户端-出租车", "用户端-专车","用户端-接送机"}, notes = "返回金额为0则不需要支付")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城,7=接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> queryCancleAmount(Integer id, Integer orderType){
+        try {
+            switch (orderType){
+                case 1:
+                    return orderPrivateCarService.queryCancleAmount(id);
+                case 2:
+                    return orderTaxiService.queryCancleAmount(id);
+                case 3:
+                    return orderCrossCityService.queryCancleAmount(id);
+                    case 7:
+                    return orderTransferService.queryCancleAmount(id);
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 添加取消记录
+     * @param id
+     * @param reason
+     * @param remark
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/addCancle")
+    @ApiOperation(value = "添加取消记录", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城","用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城,7=接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "取消原因", name = "reason", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "备注", name = "remark", required = false, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil addCancle(Integer id, Integer orderType, String reason, String remark, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            switch (orderType){
+                case 1:
+                    return orderPrivateCarService.addCancle(id, reason, remark, uid);
+                case 2:
+                    return orderTaxiService.addCancle(id, reason, remark, uid);
+                case 3:
+                    return orderCrossCityService.addCancle(id, reason, remark, uid);
+                case 4:
+                    return orderLogisticsService.addCancle(id, reason, remark, uid);
+                case 5:
+                    return orderLogisticsService.addCancle(id, reason, remark, uid);
+                case 6:
+                    return orderCharteredCarService.addCancle(id, reason, remark, uid);
+                case 7:
+                    return orderTransferService.addCancle(id, reason, remark, uid);
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 取消操作支付
+     * @param id
+     * @param payType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/cancleOrderTaxi")
+    @ApiOperation(value = "取消操作支付", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城","用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城,7接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "支付方式(1=微信,2=支付宝,3=余额)", name = "payType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "取消单id(取消操作返回)", name = "cancleId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "支付端(1=用户APP端,2=司机APP端,3=用户小程序端)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil cancleOrderTaxi(Integer id, Integer orderType, Integer payType, Integer cancleId, Integer type, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            switch (orderType){
+                case 1:
+                    return orderPrivateCarService.cancleOrderPrivateCar(id, payType, cancleId, type);
+                case 2:
+                    return orderTaxiService.cancleOrderTaxi(id, payType, cancleId, type);
+                case 3:
+                    return orderCrossCityService.cancleOrderCrossCity(id, payType, cancleId, type);
+                case 7:
+                    return orderTransferService.cancleOrderPrivateCar(id, payType, cancleId, type);
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 投诉操作
+     * @param driverId
+     * @param reason
+     * @param description
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/complaintService")
+    @ApiOperation(value = "添加投诉操作", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "司机id", name = "driverId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "投诉原因", name = "reason", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "投诉描述", name = "description", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil complaintService(Integer driverId, String reason, String description, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            complaintService.saveData(driverId, reason, description, uid);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 支付页面获取可用优惠券数量和余额
+     * @param orderId
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/queryBalance")
+    @ApiOperation(value = "支付页面获取可用优惠券数量和余额", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城","用户端-接送机"}, notes = "balance=余额,coupon=优惠券")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城,7=接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil queryBalance(Integer orderId, Integer orderType, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            Map<String, Object> map = new HashMap<>();
+            switch (orderType){
+                case 1:
+                    map = orderPrivateCarService.queryBalance(orderId, uid);
+                    break;
+                case 2:
+                    map = orderTaxiService.queryBalance(orderId, uid);
+                    break;
+                case 3:
+                    map = orderCrossCityService.queryBalance(orderId, uid);
+                    break;
+                case 4:
+                    map = orderLogisticsService.queryBalance(orderId, uid);
+                    break;
+                case 5:
+                    map = orderLogisticsService.queryBalance(orderId, uid);
+                    break;
+                case 7:
+                    map = orderTransferService.queryBalance(orderId, uid);
+                    break;
+            }
+            return ResultUtil.success(map);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+
+    /**
+     * 获取支付页面的优惠券列表
+     * @param orderId
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/queryCoupon")
+    @ApiOperation(value = "获取支付页面的优惠券列表", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城","用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城,7接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil queryCoupon(Integer orderId, Integer orderType, Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = new ArrayList<>();
+            switch (orderType){
+                case 1:
+                    list = orderPrivateCarService.queryCoupon(orderId, uid, pageNum, size);
+                    break;
+                case 2:
+                    list = orderTaxiService.queryCoupon(orderId, uid, pageNum, size);
+                    break;
+                case 3:
+                    list = orderCrossCityService.queryCoupon(orderId, uid, pageNum, size);
+                    break;
+                case 7:
+                    list = orderTransferService.queryCoupon(orderId, uid, pageNum, size);
+                    break;
+            }
+            //将activityType=5的数据进行处理
+
+//            List<Integer> ids = new ArrayList<>();
+
+//            if (list != null && list.size() > 0) {
+//                Map<Object, Integer> couponIdMonthlyCount = new HashMap<>(); // 用来统计每个月各couponId的出现次数
+//                Date currentDate = new Date(); // 获取当前日期
+//                Calendar cal = Calendar.getInstance();
+//                cal.setTime(currentDate);
+//                int currentMonth = cal.get(Calendar.MONTH) + 1; // 获取当前月份(注意Calendar.MONTH是从0开始的)
+//
+//                // 首先,统计每个月各couponId的出现次数
+//                for (Map<String, Object> map : list) {
+//                    if (map.get("activityType").equals(5)) {
+//                        for (UserCouponRecord userCouponRecord : userCouponRecordService.selectList(new EntityWrapper<UserCouponRecord>().eq("couponId", map.get("couponId")))) {
+//                            Date endTime = userCouponRecord.getEndTime();
+//                            Calendar recordCal = Calendar.getInstance();
+//                            if (endTime==null){
+//                                continue;
+//                            }
+//                            recordCal.setTime(endTime);
+//                            int recordMonth = recordCal.get(Calendar.MONTH) + 1;
+//
+//                            if (recordMonth == currentMonth) {
+//                                Object couponId = map.get("couponId");
+//                                couponIdMonthlyCount.put(couponId, couponIdMonthlyCount.getOrDefault(couponId, 0) + 1);
+//                            }
+//                        }
+//                    }
+//                }
+//
+//                // 然后,根据统计结果移除当月数量超过1的couponId对应的记录
+//                List<Map<String, Object>> newList = new ArrayList<>();
+//                for (Map<String, Object> map : list) {
+//                    Object couponId = map.get("couponId");
+//                    if (!couponIdMonthlyCount.containsKey(couponId) || couponIdMonthlyCount.get(couponId) <= 1) {
+//                        newList.add(map);
+//                    }
+//                }
+//                list.clear();
+//                list.addAll(newList);
+//            }
+
+
+            return ResultUtil.success(CouponWarpper.getCouponWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @Autowired
+    private ITActivityGeneralizationService activityGeneralizationService;
+    @ResponseBody
+    @PostMapping("/api/taxi/check")
+    @ApiOperation(value = "判断是否到到当月限额", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城","用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil check(Integer id,HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            // 查询当前活动的限制数量
+            UserCouponRecord userCouponRecords1 = userCouponRecordService.selectById(id);
+
+            List<UserCouponRecord> userCouponRecords = userCouponRecordService.selectList(new EntityWrapper<UserCouponRecord>().eq("couponId", userCouponRecords1.getCouponId()));
+
+            // 获取活动限制数量
+            TActivityGeneralization tActivityGeneralization = activityGeneralizationService.selectById(userCouponRecords.get(0).getCouponActivityId());
+            if (tActivityGeneralization == null) {
+                throw new RuntimeException("未能找到对应的活动信息");
+            }
+            int limitQuantity = tActivityGeneralization.getMonthUseCount(); // 假设limitQuantity字段代表限制数量
+
+            // 判断当月的优惠券是否超过限制
+            Calendar currentCal = Calendar.getInstance();
+            int currentMonth = currentCal.get(Calendar.MONTH) + 1; // 当前月份
+
+            // 统计当月的优惠券使用数量
+            int usedThisMonth = 0;
+            for (UserCouponRecord record : userCouponRecords) {
+                if (record.getEndTime()==null){
+                    continue;
+                }
+                Calendar recordCal = Calendar.getInstance();
+                recordCal.setTime(record.getEndTime());
+                int recordMonth = recordCal.get(Calendar.MONTH) + 1;
+
+                // 判断endTime是否在当月
+                if (recordMonth == currentMonth) {
+                    usedThisMonth++;
+                }
+            }
+
+            // 判断是否超过限制
+            if (usedThisMonth >= limitQuantity) {
+                return ResultUtil.error("本月使用数量已经超出限制");
+                // 这里可以添加更多的逻辑处理,比如抛出异常、记录日志等
+            } else {
+                return ResultUtil.success();
+            }
+
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+
+    /**
+     * 订单完成支付订单操作
+     * @param payType
+     * @param orderId
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/payTaxiOrder")
+    @ApiOperation(value = "订单完成支付订单操作", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城", "用户端-小件物流","用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "支付方式(1=微信,2=支付宝,3=余额)", name = "payType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城,4=小件物流,7=接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "优惠券id", name = "couponId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "支付端(1=用户APP端,2=司机APP端,3=用户小程序端)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil payTaxiOrder(Integer payType, Integer orderId, Integer orderType, Integer couponId, Integer type, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            switch (orderType){
+                case 1:
+                    return orderPrivateCarService.payPrivateCarOrder(payType, orderId, couponId, type);
+                case 2:
+                    return orderTaxiService.payTaxiOrder(payType, orderId, couponId, type);
+                case 3:
+                    return orderCrossCityService.payCrossCityOrder(payType, orderId, couponId, type);
+                case 4:
+                    return orderLogisticsService.payLogisticsOrder(payType, orderId, type);
+                case 5:
+                    return orderLogisticsService.payLogisticsOrder(payType, orderId, type);
+                case 7:
+                    return orderTransferService.payPrivateCarOrder(payType, orderId, couponId, type);
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 订单完成后添加评价操作
+     * @param orderId
+     * @param fraction
+     * @param content
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/orderEvaluate")
+    @ApiOperation(value = "订单完成后添加评价操作", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "评分", name = "fraction", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "评价内容", name = "content", required = false, dataType = "String"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil orderEvaluate(Integer orderId, Integer orderType, Integer fraction, String content){
+        try {
+            ResultUtil resultUtil = orderEvaluateService.saveData(orderId, orderType, fraction, content);
+            if(resultUtil.getCode() == 200){
+                switch (orderType){
+                    case 1:
+                        OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+                        orderPrivateCar.setState(9);
+                        orderPrivateCarService.updateById(orderPrivateCar);
+                        new Thread(new Runnable() {
+                            @Override
+                            public void run() {
+                                if(pushMinistryOfTransport){//上传数据
+                                    pushMinistryOfTransportUtil.ratedPassenger(Integer.valueOf(resultUtil.getData().toString()));
+                                    pushMinistryOfTransportUtil.ratedDriver(orderPrivateCar.getDriverId());
+                                }
+                            }
+                        }).start();
+                        break;
+                    case 2:
+                        OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
+                        orderTaxi.setState(9);
+                        orderTaxiService.updateById(orderTaxi);
+                        break;
+                    case 3:
+                        OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
+                        orderCrossCity.setState(9);
+                        orderCrossCityService.updateById(orderCrossCity);
+                        break;
+                    case 7:
+                        OrderTransferCar orderTransferCar = orderTransferService.selectById(orderId);
+                        orderTransferCar.setState(9);
+                        orderTransferService.updateById(orderTransferCar);
+                        new Thread(new Runnable() {
+                            @Override
+                            public void run() {
+                                if(pushMinistryOfTransport){//上传数据
+                                    pushMinistryOfTransportUtil.ratedPassenger(Integer.valueOf(resultUtil.getData().toString()));
+                                    pushMinistryOfTransportUtil.ratedDriver(orderTransferCar.getDriverId());
+                                }
+                            }
+                        }).start();
+                        break;
+                }
+            }
+            return resultUtil.getCode() == 200 ? ResultUtil.success() : resultUtil;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 评论成功后获取红包金额
+     * @param orderId
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/queryRedMoney")
+    @ApiOperation(value = "评论成功后获取红包金额", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城","用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城,7=接送机)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> queryRedMoney(Integer orderId, Integer orderType){
+        try {
+            switch (orderType){
+                case 1:
+                    return orderPrivateCarService.queryRedMoney(orderId);
+                case 2:
+                    return orderTaxiService.queryRedMoney(orderId);
+                case 3:
+                    return orderCrossCityService.queryRedMoney(orderId);
+                case 7:
+                    return orderTransferService.queryRedMoney(orderId);
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 分享成功后添加红包操作
+     * @param orderId
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/shareRedEnvelope")
+    @ApiOperation(value = "分享成功后添加红包操作", tags = {"用户端-出租车", "用户端-专车", "用户端-跨城","用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil shareRedEnvelope(Integer orderId, Integer orderType){
+        try {
+            switch (orderType){
+                case 1:
+                    return orderPrivateCarService.shareRedEnvelope(orderId);
+                case 2:
+                    return orderTaxiService.shareRedEnvelope(orderId);
+                case 3:
+                    return orderCrossCityService.shareRedEnvelope(orderId);
+                case 7:
+                    return orderTransferService.shareRedEnvelope(orderId);
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 取消订单微信回调
+     * @param request
+     */
+    @ResponseBody
+    @PostMapping("/base/wxCancelOrderTaxi")
+    public void wxCancelOrderTaxi(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
+            if(null != map){
+                String order_id = map.get("transaction_id");
+                String out_trade_no = map.get("out_trade_no");
+                String result = map.get("result");
+                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id)){
+                    PrintWriter out = response.getWriter();
+                    out.write(result);
+                    out.flush();
+                    out.close();
+
+                    String[] split = out_trade_no.split("_");
+                    Integer id = Integer.valueOf(split[0]);
+                    Integer type = Integer.valueOf(split[1]);
+                    switch (type){
+                        case 1:
+                            orderPrivateCarService.payCancelOrderPrivateCar(id, order_id, 1);
+                            break;
+                        case 2:
+                            orderTaxiService.payCancelOrderTaxi(id, order_id, 1);
+                            break;
+                        case 3:
+                            orderCrossCityService.payCancelOrderCrossCity(id, order_id, 1);
+                            break;
+                        case 7:
+                            orderTransferService.payCancelOrderPrivateCar(id, order_id, 1);
+                            break;
+                    }
+                }
+
+            }
+
+//            Map<String, String> map = icbcPayUtil.payCallback(request);
+//            if(null != map){
+//                String out_trade_no = map.get("out_trade_no");
+//                String order_id = map.get("order_id");
+//                String s = icbcPayUtil.queryTransaction("", order_id);
+//                if(s.equals("0")){
+//                    icbcPayUtil.answer(response);//回调应答
+//                }
+//                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id) && s.equals("0")){
+//                    String[] split = out_trade_no.split(",");
+//                    Integer id = Integer.valueOf(split[0]);
+//                    Integer type = Integer.valueOf(split[1]);
+//                    switch (type){
+//                        case 1:
+//                            orderPrivateCarService.payCancelOrderPrivateCar(id, order_id, 1);
+//                            break;
+//                        case 2:
+//                            orderTaxiService.payCancelOrderTaxi(id, order_id, 1);
+//                            break;
+//                        case 3:
+//                            orderCrossCityService.payCancelOrderCrossCity(id, order_id, 1);
+//                            break;
+//                    }
+//                }
+//
+//            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 取消订单支付宝回调
+     * @param request
+     */
+    @ResponseBody
+    @PostMapping("/base/aliCancelOrderTaxi")
+    public void aliCancelOrderTaxi(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.alipayCallback(request);
+            if(null != map){
+                String out_trade_no = map.get("out_trade_no");
+                String order_id = map.get("trade_no");
+                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id)){
+                    String[] split = out_trade_no.split("_");
+                    Integer id = Integer.valueOf(split[0]);
+                    Integer type = Integer.valueOf(split[1]);
+                    switch (type){
+                        case 1:
+                            orderPrivateCarService.payCancelOrderPrivateCar(id, order_id, 2);
+                            break;
+                        case 2:
+                            orderTaxiService.payCancelOrderTaxi(id, order_id, 2);
+                            break;
+                        case 3:
+                            orderCrossCityService.payCancelOrderCrossCity(id, order_id, 2);
+                            break;
+                        case 7:
+                            orderTransferService.payCancelOrderPrivateCar(id, order_id, 2);
+                            break;
+                    }
+                }
+
+            }
+
+//            Map<String, String> map = icbcPayUtil.payCallback(request);
+//            if(null != map){
+//                String out_trade_no = map.get("out_trade_no");
+//                String order_id = map.get("order_id");
+//                String s = icbcPayUtil.queryTransaction("", order_id);
+//                if(s.equals("0")){
+//                    icbcPayUtil.answer(response);//回调应答
+//                }
+//                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id) && s.equals("0")){
+//                    String[] split = out_trade_no.split(",");
+//                    Integer id = Integer.valueOf(split[0]);
+//                    Integer type = Integer.valueOf(split[1]);
+//                    switch (type){
+//                        case 1:
+//                            orderPrivateCarService.payCancelOrderPrivateCar(id, order_id, 2);
+//                            break;
+//                        case 2:
+//                            orderTaxiService.payCancelOrderTaxi(id, order_id, 2);
+//                            break;
+//                        case 3:
+//                            orderCrossCityService.payCancelOrderCrossCity(id, order_id, 2);
+//                            break;
+//                    }
+//                }
+//
+//            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 完成订单微信支付回调
+     * @param request
+     */
+    @ResponseBody
+    @PostMapping("/base/wxPayOrderTaxi")
+    public void wxPayOrderTaxi(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
+            if(null != map){
+                String order_id = map.get("transaction_id");
+                String out_trade_no = map.get("out_trade_no");
+                String result = map.get("result");
+                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id)){
+                    PrintWriter out = response.getWriter();
+                    out.write(result);
+                    out.flush();
+                    out.close();
+
+                    String[] split = out_trade_no.split("_");
+                    Integer id = Integer.valueOf(split[0]);
+                    Integer type = Integer.valueOf(split[1]);
+                    switch (type){
+                        case 1:
+                            orderPrivateCarService.payOrderPrivateCarCallback(id, order_id, 1);
+                            break;
+                        case 2:
+                            orderTaxiService.payOrderTaxiCallback(id, order_id, 1);
+                            break;
+                        case 3:
+                            orderCrossCityService.payOrderCrossCityCallback(id, order_id, 1);
+                            break;
+                        case 4:
+                            orderLogisticsService.payOrderLogisticsCallback(id, order_id, 1);
+                            break;
+                        case 5:
+                            orderLogisticsService.payOrderLogisticsCallback(id, order_id, 1);
+                            break;
+                        case 7:
+                            orderTransferService.payOrderPrivateCarCallback(id, order_id, 1);
+                            break;
+                    }
+                }
+            }
+
+
+//            Map<String, String> map = icbcPayUtil.payCallback(request);
+//            if(null != map){
+//                String out_trade_no = map.get("out_trade_no");
+//                String order_id = map.get("order_id");
+//                String s = icbcPayUtil.queryTransaction("", order_id);
+//                if(s.equals("0")){
+//                    icbcPayUtil.answer(response);//回调应答
+//                }
+//                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id) && s.equals("0")){
+//                    String[] split = out_trade_no.split(",");
+//                    Integer id = Integer.valueOf(split[0]);
+//                    Integer type = Integer.valueOf(split[1]);
+//                    switch (type){
+//                        case 1:
+//                            orderPrivateCarService.payOrderPrivateCarCallback(id, order_id, 1);
+//                            break;
+//                        case 2:
+//                            orderTaxiService.payOrderTaxiCallback(id, order_id, 1);
+//                            break;
+//                        case 3:
+//                            orderCrossCityService.payOrderCrossCityCallback(id, order_id, 1);
+//                            break;
+//                        case 4:
+//                            orderLogisticsService.payOrderLogisticsCallback(id, order_id, 1);
+//                            break;
+//                        case 5:
+//                            orderLogisticsService.payOrderLogisticsCallback(id, order_id, 1);
+//                            break;
+//                    }
+//                }
+//            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 完成订单支付宝支付回调
+     * @param request
+     */
+    @ResponseBody
+    @PostMapping("/base/aliPayOrderTaxi")
+    public void aliPayOrderTaxi(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.alipayCallback(request);
+            if(null != map){
+                String out_trade_no = map.get("out_trade_no");
+                String order_id = map.get("trade_no");
+                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id)){
+                    String[] split = out_trade_no.split("_");
+                    Integer id = Integer.valueOf(split[0]);
+                    Integer type = Integer.valueOf(split[1]);
+                    switch (type){
+                        case 1:
+                            orderPrivateCarService.payOrderPrivateCarCallback(id, order_id, 2);
+                            break;
+                        case 2:
+                            orderTaxiService.payOrderTaxiCallback(id, order_id, 2);
+                            break;
+                        case 3:
+                            orderCrossCityService.payOrderCrossCityCallback(id, order_id, 2);
+                            break;
+                        case 4:
+                            orderLogisticsService.payOrderLogisticsCallback(id, order_id, 2);
+                            break;
+                        case 5:
+                            orderLogisticsService.payOrderLogisticsCallback(id, order_id, 2);
+                            break;
+                        case 7:
+                            orderTransferService.payOrderPrivateCarCallback(id, order_id, 2);
+                            break;
+                    }
+                }
+
+            }
+
+//            Map<String, String> map = icbcPayUtil.payCallback(request);
+//            if(null != map){
+//                String out_trade_no = map.get("out_trade_no");
+//                String order_id = map.get("order_id");
+//                String s = icbcPayUtil.queryTransaction("", order_id);
+//                if(s.equals("0")){
+//                    icbcPayUtil.answer(response);//回调应答
+//                }
+//                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id) && s.equals("0")){
+//                    String[] split = out_trade_no.split(",");
+//                    Integer id = Integer.valueOf(split[0]);
+//                    Integer type = Integer.valueOf(split[1]);
+//                    switch (type){
+//                        case 1:
+//                            orderPrivateCarService.payOrderPrivateCarCallback(id, order_id, 2);
+//                            break;
+//                        case 2:
+//                            orderTaxiService.payOrderTaxiCallback(id, order_id, 2);
+//                            break;
+//                        case 3:
+//                            orderCrossCityService.payOrderCrossCityCallback(id, order_id, 2);
+//                            break;
+//                        case 4:
+//                            orderLogisticsService.payOrderLogisticsCallback(id, order_id, 2);
+//                            break;
+//                        case 5:
+//                            orderLogisticsService.payOrderLogisticsCallback(id, order_id, 2);
+//                            break;
+//                    }
+//                }
+//
+//            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+
+
+    /**
+     * 小件物流差价微信支付回调
+     * @param request
+     */
+    @ResponseBody
+    @PostMapping("/base/wxPayOrderLogisticsSpread")
+    public void wxPayOrderLogisticsSpread(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
+            if(null != map){
+                String order_id = map.get("transaction_id");
+                String out_trade_no = map.get("out_trade_no");
+                String result = map.get("result");
+                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id)){
+                    PrintWriter out = response.getWriter();
+                    out.write(result);
+                    out.flush();
+                    out.close();
+
+                    String[] split = out_trade_no.split("_");
+                    Integer id = Integer.valueOf(split[0]);
+                    Integer type = Integer.valueOf(split[1]);
+                    orderLogisticsService.payOrderLogisticsSpreadCallback(id, order_id, 1);
+                }
+            }
+
+//            Map<String, String> map = icbcPayUtil.payCallback(request);
+//            if(null != map){
+//                String out_trade_no = map.get("out_trade_no");
+//                String order_id = map.get("order_id");
+//                String s = icbcPayUtil.queryTransaction("", order_id);
+//                if(s.equals("0")){
+//                    icbcPayUtil.answer(response);//回调应答
+//                }
+//                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id) && s.equals("0")){
+//                    String[] split = out_trade_no.split(",");
+//                    Integer id = Integer.valueOf(split[0]);
+//                    Integer type = Integer.valueOf(split[1]);
+//                    orderLogisticsService.payOrderLogisticsSpreadCallback(id, order_id, 1);
+//                }
+//            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 小件物流差价支付宝支付回调
+     * @param request
+     */
+    @ResponseBody
+    @PostMapping("/base/aliPayOrderLogisticsSpread")
+    public void aliPayOrderLogisticsSpread(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.alipayCallback(request);
+            if(null != map){
+                String out_trade_no = map.get("out_trade_no");
+                String order_id = map.get("trade_no");
+                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id)){
+                    String[] split = out_trade_no.split("_");
+                    Integer id = Integer.valueOf(split[0]);
+                    Integer type = Integer.valueOf(split[1]);
+                    orderLogisticsService.payOrderLogisticsSpreadCallback(id, order_id, 2);
+                }
+
+            }
+
+//            Map<String, String> map = icbcPayUtil.payCallback(request);
+//            if(null != map){
+//                String out_trade_no = map.get("out_trade_no");
+//                String order_id = map.get("order_id");
+//                String s = icbcPayUtil.queryTransaction("", order_id);
+//                if(s.equals("0")){
+//                    icbcPayUtil.answer(response);//回调应答
+//                }
+//                if(ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id) && s.equals("0")){
+//                    String[] split = out_trade_no.split(",");
+//                    Integer id = Integer.valueOf(split[0]);
+//                    Integer type = Integer.valueOf(split[1]);
+//                    orderLogisticsService.payOrderLogisticsSpreadCallback(id, order_id, 2);
+//                }
+//
+//            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/PhoneController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/PhoneController.java
new file mode 100644
index 0000000..42054ce
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/PhoneController.java
@@ -0,0 +1,72 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.model.Phone;
+import com.stylefeng.guns.modular.system.service.IPhoneService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统电话控制器
+ */
+@Api
+@RestController
+@RequestMapping("/base/phone")
+public class PhoneController {
+
+    @Autowired
+    private IPhoneService phoneService;
+
+    /**
+     * 获取系统所有电话
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryPhones")
+    @ApiOperation(value = "获取首页电话", tags = {"用户端-首页", "用户端-包车"}, notes = "type=1(报警电话),type=2(投诉电话),type=3(包车调度电话)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "当前定位行政区域编号", name = "code", required = true, dataType = "string")
+    })
+    public ResultUtil queryPhones(String code){
+        try {
+            List<Phone> phones = phoneService.queryPhones(code);
+            return ResultUtil.success(phones);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取个人中心的客服电话
+     * @param code
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryCustomerPhone")
+    @ApiOperation(value = "获取个人中心的客服电话", tags = {"用户端-个人中心"}, notes = "platform(平台电话),company(本地电话)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "当前定位行政区域编号", name = "code", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil queryCustomerPhone(String code){
+        try {
+            Map<String, Object> map = phoneService.queryCustomerPhone(code);
+            return ResultUtil.success(map);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ProblemController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ProblemController.java
new file mode 100644
index 0000000..01a6fde
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ProblemController.java
@@ -0,0 +1,92 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.service.IProblemService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.ProblemWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+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;
+
+/**
+ * 在线客服控制器
+ */
+@Api
+@RestController
+@RequestMapping("/api/problem")
+public class ProblemController {
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IProblemService problemService;
+
+
+    /**
+     * 添加客服留言
+     * @param content
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/leaveMessage")
+    @ApiOperation(value = "添加客服留言", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "留言内容", name = "content", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil leaveMessage(String content, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return problemService.leaveMessage(content, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取历史提交的留言列表
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryProblems")
+    @ApiOperation(value = "获取历史提交的留言列表", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<ProblemWarpper>> queryProblems(Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> maps = problemService.queryProblems(pageNum, size, uid);
+            return ResultUtil.success(ProblemWarpper.getProblemWarpper(maps));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/RedEnvelopeController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/RedEnvelopeController.java
new file mode 100644
index 0000000..1ecae63
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/RedEnvelopeController.java
@@ -0,0 +1,143 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.service.IUserRedPacketRecordService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.TravelRecordWarpper;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.transfer.server.IOrderTransferService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 红包控制器
+ */
+@Api
+@RestController
+@RequestMapping("/api/redEnvelope")
+public class RedEnvelopeController {
+
+    @Autowired
+    private IUserRedPacketRecordService userRedPacketRecordService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IOrderTransferService orderTransferService;
+
+
+    /**
+     * 获取红包列表
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryMyRedEnvelope")
+    @ApiOperation(value = "获取红包列表", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "页码(首页1)", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<BaseWarpper>> queryMyRedEnvelope(Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = userRedPacketRecordService.queryMyRedEnvelope(pageNum, size, uid);
+            List<BaseWarpper> baseWarppers = new ArrayList<>();
+            for(Map<String, Object> map : list){
+                BaseWarpper baseWarpper = new BaseWarpper();
+                baseWarpper.setId(null != map.get("id") ? Integer.valueOf(String.valueOf(map.get("id"))) : 0);
+                baseWarpper.setAmount(null != map.get("money") ? Double.valueOf(String.valueOf(map.get("money"))) : 0);
+                baseWarpper.setName(null != map.get("name") ? String.valueOf(map.get("name")) : "");
+                baseWarppers.add(baseWarpper);
+            }
+            return ResultUtil.success(baseWarppers);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取红包使用记录
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryRedEnvelope")
+    @ApiOperation(value = "获取红包使用记录", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "页码(首页1)", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<TravelRecordWarpper>> queryRedEnvelope(Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            Integer page = pageNum;
+            pageNum = (pageNum - 1) * size;
+            List<Map<String, Object>> list = orderPrivateCarService.queryRedEnvelope(uid);//专车
+            List<Map<String, Object>> list1 = orderTaxiService.queryRedEnvelope(uid);//出租车
+            List<Map<String, Object>> list2 = orderCrossCityService.queryRedEnvelope(uid);//跨城
+            List<Map<String, Object>> list3 = orderTransferService.queryRedEnvelope(uid);//专车
+
+            list.addAll(list1);
+            list.addAll(list2);
+            list.addAll(list3);
+
+            List<TravelRecordWarpper> orderWarpper = TravelRecordWarpper.getTravelRecordWarpper(list);
+
+            //分页
+            if(orderWarpper.size() >= page * size){
+                orderWarpper = orderWarpper.subList(pageNum, pageNum + size);
+            }else if(pageNum < orderWarpper.size() && orderWarpper.size() < page * size){
+                orderWarpper = orderWarpper.subList(pageNum, orderWarpper.size());
+            }else{
+                orderWarpper = new ArrayList<>();
+            }
+            return ResultUtil.success(orderWarpper);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ServerCarModelController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ServerCarModelController.java
new file mode 100644
index 0000000..e4ad1c8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ServerCarModelController.java
@@ -0,0 +1,101 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.service.IServerCarModelService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.ServerCarModelWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+
+@Api
+@RestController
+@RequestMapping("/base/serverCarModel")
+public class ServerCarModelController {
+
+    @Autowired
+    private IServerCarModelService serverCarModelService;
+
+
+    /**
+     * 获取车型和预估价格
+     * @param startLonLat
+     * @param endLonLat
+     * @param type
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryServerCarModel")
+    @ApiOperation(value = "选择起点终点后获取车型和预估价格", tags = {"用户端-专车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "起点经纬度(103.22121,,30.26123)", name = "startLonLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点经纬度(103.22121,,30.26123)", name = "endLonLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)", name = "type", required = true, dataType = "int")
+    })
+    public ResultUtil<List<ServerCarModelWarpper>> queryServerCarModel(String startLonLat, String endLonLat, Integer type){
+        try {
+            return serverCarModelService.queryServerCarModel(startLonLat, endLonLat, type);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @ResponseBody
+    @PostMapping("/queryServerCarModelsSpecial")
+    @ApiOperation(value = "获取业务对应的所有车型", tags = {"用户端-专车"}, notes = "")
+    @ApiImplicitParams({
+    })
+    public ResultUtil<List<ServerCarModelWarpper>> queryServerCarModelsSpecial(){
+        try {
+            List<Map<String, Object>> list = serverCarModelService.queryServerCarModels(1);
+            return ResultUtil.success(ServerCarModelWarpper.getServerCarModelWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    @ResponseBody
+    @PostMapping("/queryServerCarModels")
+    @ApiOperation(value = "获取业务对应的所有车型", tags = {"用户端-包车"}, notes = "")
+    @ApiImplicitParams({
+    })
+    public ResultUtil<List<ServerCarModelWarpper>> queryServerCarModels(){
+        try {
+            List<Map<String, Object>> list = serverCarModelService.queryServerCarModels(3);
+            return ResultUtil.success(ServerCarModelWarpper.getServerCarModelWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @ResponseBody
+    @PostMapping("/queryServerCarModelsTrans")
+    @ApiOperation(value = "获取业务对应的所有车型", tags = {"用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+    })
+    public ResultUtil<List<ServerCarModelWarpper>> queryServerCarModelsTrans(String startLonLat, String endLonLat){
+        try {
+            return serverCarModelService.queryServerCarModel1(startLonLat, endLonLat);
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SystemNoticeController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SystemNoticeController.java
new file mode 100644
index 0000000..97285ca
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SystemNoticeController.java
@@ -0,0 +1,174 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.SystemNoticeWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+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;
+
+/**
+ * 个人系统消息和公告控制器
+ */
+@Api
+@RestController
+@RequestMapping("/api/systemNotice")
+public class SystemNoticeController {
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+
+    @ResponseBody
+    @PostMapping("/queryNoReadNoticeNum")
+    @ApiOperation(value = "获取未读的消息数量", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> queryNoReadNoticeNum(HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            int num = systemNoticeService.queryNoReadNoticeNum(uid);
+            BaseWarpper baseWarpper = new BaseWarpper();
+            baseWarpper.setNumber(num);
+            return ResultUtil.success(baseWarpper);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 获取系统消息和公告
+     * @param type
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryNotices")
+    @ApiOperation(value = "获取系统消息和公告", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "数据类型(1=公告,2=系统消息)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<SystemNoticeWarpper>> queryNotices(Integer type, Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = systemNoticeService.queryList(type, pageNum, size, uid);
+            return ResultUtil.success(SystemNoticeWarpper.getSystemNoticeWarpper(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 阅读操作
+     * @param id
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/readSystemNotice")
+    @ApiOperation(value = "阅读系统消息和公告操作", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "消息id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil readSystemNotice(Integer id, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            systemNoticeService.readSystemNotice(id, uid);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 删除单个消息或公告
+     * @param id
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/delSystemNotice")
+    @ApiOperation(value = "删除单个消息或公告", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "消息id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil delSystemNotice(Integer id, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            systemNoticeService.delSystemNotice(id, uid);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 清除所有消息或公告
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/clearSystemNotice")
+    @ApiOperation(value = "清除所有消息或公告", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil clearSystemNotice(HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            systemNoticeService.clearSystemNotice(uid);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/TNoticeController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/TNoticeController.java
new file mode 100644
index 0000000..91d51d3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/TNoticeController.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.service.ITNoticesService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.TNoticeWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 公告控制器
+ */
+@Api
+@RestController
+@RequestMapping("/base/notice")
+public class TNoticeController {
+
+    @Autowired
+    private ITNoticesService noticeService;
+
+
+    /**
+     * 获取公告列表
+     * @param type
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryNotices")
+    @ApiOperation(value = "获取滚动消息", tags = {"用户端-首页"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "数据类型(1:滚动消息)", name = "type", required = true, dataType = "int")
+    })
+    public ResultUtil<List<TNoticeWarpper>> queryNotices(Integer type){
+        try {
+            List<TNoticeWarpper> list = noticeService.queryNotices(type);
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserCallbackController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserCallbackController.java
new file mode 100644
index 0000000..9350576
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserCallbackController.java
@@ -0,0 +1,332 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+//import com.stylefeng.guns.modular.system.util.ICBCPayUtil;
+import com.stylefeng.guns.modular.system.service.impl.UserServiceImpl;
+import com.stylefeng.guns.modular.system.util.*;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.time.LocalDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 支付回调
+ */
+@RestController
+@RequestMapping("/base")
+public class UserCallbackController {
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+//    @Autowired
+//    private ICBCPayUtil icbcPayUtil;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private ALiSendSms aLiSendSms;
+    
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private ITActivityGeneralizationService activityGeneralizationService;
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    @Autowired
+    private ISysCouponRecordService sysCouponRecordService;
+
+
+
+    /**
+     * 微信余额充值回调函数
+     * @param request
+     */
+    @ResponseBody
+    @PostMapping("/wxCancelUserBalance")
+    public void wxCancelUserBalance(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
+            String id = map.get("out_trade_no");
+            String order_id = map.get("transaction_id");
+            String uid = map.get("attach");
+            String result = map.get("result");
+            userInfoService.payCancelUserBalance(Integer.valueOf(uid), order_id, Integer.valueOf(id), 1);
+            PrintWriter out = response.getWriter();
+            out.write(result);
+            out.flush();
+            out.close();
+
+
+//            Map<String, String> map = icbcPayUtil.payCallback(request);
+//            String id = map.get("out_trade_no");
+//            String order_id = map.get("order_id");
+//            String uid = map.get("attach");
+//            userInfoService.payCancelUserBalance(Integer.valueOf(uid), order_id, Integer.valueOf(id), 1);
+//            icbcPayUtil.answer(response);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 支付宝余额充值回调
+     * @param request
+     */
+    @ResponseBody
+    @PostMapping("/aliCancelUserBalance")
+    public void aliCancelUserBalance(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.alipayCallback(request);
+            String id = map.get("out_trade_no");
+            String order_id = map.get("trade_no");
+            String uid = map.get("passback_params");
+            userInfoService.payCancelUserBalance(Integer.valueOf(uid), order_id, Integer.valueOf(id), 2);
+
+//            Map<String, String> map = icbcPayUtil.payCallback(request);
+//            String id = map.get("out_trade_no");
+//            String order_id = map.get("order_id");
+//            String uid = map.get("attach");
+//            userInfoService.payCancelUserBalance(Integer.valueOf(uid), order_id, Integer.valueOf(id), 2);
+//            icbcPayUtil.answer(response);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @ResponseBody
+    @PostMapping("/get/confirm")
+    @ApiOperation(value = "校验当前活动是否过期", tags = {"线下推广页面"}, notes = "")
+    @ApiImplicitParams(
+            {@ApiImplicitParam(value = "活动Id", name = "acId", required = true, dataType = "int")
+    })
+    public ResultUtil confirm(Integer acId){
+        TActivityGeneralization tActivityGeneralization = activityGeneralizationService.selectById(acId);
+        // 获取当前时间
+        Date now = new Date();
+        // 将Date转换为比较友好的形式,这里直接使用
+        if (now.after(tActivityGeneralization.getStartTime()) && now.before(tActivityGeneralization.getEndTime())) {
+           return ResultUtil.success();
+        } else {
+            return  ResultUtil.error("该活动已失效");
+        }
+    }
+
+    @ResponseBody
+    @PostMapping("/get/coupon")
+    @ApiOperation(value = "获取优惠卷", tags = {"线下推广页面"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "电话", name = "phone", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "验证码", name = "code", required = true, dataType = "String")
+    })
+    public ResultUtil coupon(String phone,String code,Integer acId){
+        // 校验验证码是否正确
+            String redisCode = redisUtil.getValue("code:"+phone);
+        if (redisCode==null&&!code.equals("111111")){
+            return ResultUtil.error("验证码错误");
+        }
+        if (!code.equals(redisCode)&&!code.equals("111111")) {
+            return ResultUtil.error("验证码错误");
+        }
+
+
+        //判断该手机号是否注册
+        List<UserInfo> userInfos = userInfoService.selectList(new EntityWrapper<UserInfo>().eq("phone", phone).ne("flag", 3));
+        //已注册直接添加优惠卷
+        TActivityGeneralization tActivityGeneralization = activityGeneralizationService.selectById(acId);
+        if (tActivityGeneralization.getState()==4){
+            return ResultUtil.error("当前活动已暂停");
+        }
+        // 获取当前时间
+        Date now = new Date();
+        // 将Date转换为比较友好的形式,这里直接使用
+//        if (now.after(tActivityGeneralization.getStartTime()) && now.before(tActivityGeneralization.getEndTime())) {
+//            System.out.println("当前时间在活动的开始时间和结束时间之间");
+//        } else {
+//            return  ResultUtil.error("该活动已失效");
+//        }
+
+
+        SysCouponRecord sysCouponRecord = sysCouponRecordService.selectById(tActivityGeneralization.getCouponId());
+
+        int i1 = userCouponRecordService.selectCount(new EntityWrapper<UserCouponRecord>().eq("activityType", 5).eq("couponActivityId", acId).groupBy("userId"));
+        if (tActivityGeneralization.getParticipateCount()<=i1){
+            return ResultUtil.error("当前参与人数已满");
+        }
+
+        if (!userInfos.isEmpty()){
+            //判断该账号是否领取
+            List<UserCouponRecord> userCouponRecords = userCouponRecordService.selectList(new EntityWrapper<UserCouponRecord>().eq("userId", userInfos.get(0).getId()).eq("activityType", 5).eq("couponActivityId", acId));
+            if (!userCouponRecords.isEmpty()){
+                return ResultUtil.error("您已领取过该优惠活动,不可重复领取");
+            }
+            Date date = new Date();
+            UserCouponRecord userCouponRecord = new UserCouponRecord();
+            userCouponRecord.setActivityType(5);
+            userCouponRecord.setCouponActivityId(acId);
+            userCouponRecord.setCouponId(tActivityGeneralization.getCouponId());
+            userCouponRecord.setState(1);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + tActivityGeneralization.getEffective());
+            userCouponRecord.setExpirationTime(calendar.getTime());
+            userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(sysCouponRecord.getCouponType())));
+            userCouponRecord.setCouponUseType(sysCouponRecord.getCouponUseType());
+            userCouponRecord.setInsertTime(date);
+            userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(sysCouponRecord.getFullMoney()==null?0:sysCouponRecord.getFullMoney())));
+            userCouponRecord.setMoney(Double.valueOf(String.valueOf(sysCouponRecord.getMoney())));
+            userCouponRecord.setCompanyId(sysCouponRecord.getCompanyId());
+            userCouponRecord.setUserId(userInfos.get(0).getId());
+
+            Integer userGrantCount = tActivityGeneralization.getUserGrantCount();
+//            userCouponRecordService.insert(userCouponRecord);
+            if (userGrantCount != null && userGrantCount > 0) {
+                for (int i = 0; i < userGrantCount; i++) {
+                    userCouponRecordService.insert(userCouponRecord);
+                }
+            }
+        }else {
+            //判断当前用户是否领取
+            String value = redisUtil.getValue("counpon:" + phone);
+            if (value!=null){
+                String[] split = value.split(",");
+                for (String s : split) {
+                    if (s.equals(String.valueOf(acId))){
+                        return ResultUtil.error("您已领取过该优惠活动,不可重复领取");
+                    }
+                }
+                redisUtil.setStrValue("counpon:"+phone, value+","+String.valueOf(acId));
+            }
+            //未注册将优惠卷信息存入缓存,待用户注册时调用来添加优惠卷
+            redisUtil.setStrValue("counpon:"+phone, String.valueOf(acId));
+        }
+
+
+
+        return ResultUtil.success(tActivityGeneralization.getUserGrantCount());
+
+
+    }
+
+    @ResponseBody
+    @PostMapping("/get/code")
+    @ApiOperation(value = "获取验证码", tags = {"线下推广页面"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "电话", name = "phone", required = true, dataType = "String")
+    })
+    public ResultUtil coupon(String phone) {
+        if (StringUtils.hasLength(phone)) {
+            String code = String.valueOf((int) (Math.random() * 1000000));
+            redisUtil.setStrValue(phone, code, 15 * 60 * 1000);
+            AliSms aliSms = new AliSms();
+            aliSms.setCode(code);
+            String json = JSONObject.toJSONString(aliSms);
+            try {
+                redisUtil.setStrValue("code:"+phone, code,15 * 60 * 1000);
+                aLiSendSms.sendSms(phone, "SMS_467580138", json);
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+//            msgUtils.sendMsg(dto.getPhone(), code);
+            return ResultUtil.success("发送短信验证码成功!");
+        }
+        return ResultUtil.error("请输入手机号");
+    }
+
+
+    @ResponseBody
+    @PostMapping("/get/coupon/info")
+    @ApiOperation(value = "使用说明", tags = {"线下推广页面"}, notes = "")
+    @ApiImplicitParams({
+
+    })
+    public ResultUtil coupon(Integer acId){
+        TActivityGeneralization tActivityGeneralization = activityGeneralizationService.selectById(acId);
+
+        return ResultUtil.success(tActivityGeneralization.getUseExplain());
+    }
+
+    @Autowired
+    private WeChatUtil weChatUtil;
+
+    @ResponseBody
+    @PostMapping("/get/coupon/toWe")
+    @ApiOperation(value = "获取微信链接", tags = {"线下推广页面"}, notes = "")
+    @ApiImplicitParams({
+
+    })
+    public ResultUtil toWe(){
+        try {
+            String urlLink = weChatUtil.getUrlLink(null, null);
+            return ResultUtil.success(urlLink);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return ResultUtil.error("请稍后再试");
+    }
+
+
+
+    @ResponseBody
+    @PostMapping("/get/driverQr")
+    @ApiOperation(value = "获取司机二维码新", tags = {"线下推广页面"}, notes = "")
+    @ApiImplicitParams({
+
+    })
+    public ResultUtil driverQr(){
+        try {
+            String urlLink = weChatUtil.getUrlLink("pages/areaDetails/areaDetails", null);
+            return ResultUtil.success(urlLink);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return ResultUtil.error("请稍后再试");
+    }
+
+    @ResponseBody
+    @PostMapping("/get/rid")
+    @ApiOperation(value = "获取司机二维码新", tags = {"线下推广页面"}, notes = "")
+    @ApiImplicitParams({
+
+    })
+    public ResultUtil rid(){
+        try {
+            String urlLink = weChatUtil.rid("/pages/home/scanPage/scanPage", null);
+            return ResultUtil.success(urlLink);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return ResultUtil.error("请稍后再试");
+    }
+
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java
new file mode 100644
index 0000000..291d12a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java
@@ -0,0 +1,769 @@
+package com.stylefeng.guns.modular.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.common.constant.JwtConstants;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.service.ISmsrecordService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.service.IVerifiedService;
+import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
+import com.stylefeng.guns.modular.system.warpper.UserInfoWarpper;
+import com.stylefeng.guns.modular.system.warpper.VerifiedWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+/**
+ * 用户控制器
+ */
+@Api
+@RestController
+@RequestMapping("")
+public class UserInfoController {
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IVerifiedService verifiedService;
+
+    @Autowired
+    private ISmsrecordService smsrecordService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private WeChatUtil weChatUtil;
+
+
+
+
+
+    /**
+     * 获取短信验证码
+     * @param phone
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/queryCaptcha")
+    @ApiOperation(value = "获取短信验证码", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "手机号码", name = "phone", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "场景类型(1=身份验证,2=登录确认,3=用户注册,4=修改密码)", name = "type", required = true, dataType = "String")
+    })
+    public ResultUtil queryCaptcha(String phone, Integer type){
+        if(ToolUtil.isNotEmpty(phone)){
+            try {
+                return userInfoService.queryCaptcha(phone, type);
+            }catch (Exception e){
+                e.printStackTrace();
+                return ResultUtil.runErr();
+            }
+        }else{
+            return ResultUtil.paranErr();
+        }
+    }
+
+
+    /**
+     * 手机验证码登录
+     * @param phone
+     * @param code
+     * @param registIp
+     * @param registAreaCode
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/user/captchaLogin")
+    @ApiOperation(value = "手机验证码登录", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "手机号码", name = "phone", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "短信验证码", name = "code", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "ip地址", name = "registIp", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "登录端口-小程序传Applets", name = "loginType", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "当前定位区县行政编号", name = "registAreaCode", required = false, dataType = "String")
+    })
+    public ResultUtil<LoginWarpper> captchaLogin(String phone, String code, String registIp, String registAreaCode,String loginType){
+        try {
+            return userInfoService.captchaLogin(phone, code, registIp, registAreaCode,loginType);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @ResponseBody
+    @PostMapping("/base/user/wechat")
+    @ApiOperation(value = "微信一键登录", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "code", name = "code", required = true, dataType = "String")
+    })
+    public ResultUtil<LoginWarpper> wechat(String code){
+        try {
+
+            String phone1 = weChatUtil.getPhone(code);
+            return userInfoService.captchaLogin1(phone1);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/base/user/oneClickLogin")
+    @ApiOperation(value = "手机一键登录", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "app端SDK获取的登录token。", name = "accessToken", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "ip地址", name = "registIp", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "登录端口-小程序传Applets", name = "loginType", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "当前定位区县行政编号", name = "registAreaCode", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "安卓或者苹果  安卓传android 苹果传ios", name = "androidOrIos", required = false, dataType = "String")
+    })
+    public ResultUtil<LoginWarpper> oneClickLogin(String accessToken, String registIp, String registAreaCode,String loginType,String androidOrIos){
+        try {
+            return userInfoService.oneClickLogin(accessToken, registIp, registAreaCode,loginType,androidOrIos);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 手机验证码登录
+     * @param phone
+     * @param code
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/user/captchaLogin_")
+    @ApiOperation(value = "手机验证码登录", tags = {"分享专用"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "手机号码", name = "phone", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "短信验证码", name = "code", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "分享的用户id", name = "uid", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "登录端口-小程序传Applets", name = "loginType", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "用户类型(1=用户,2=司机)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "注册类型(1=司机注册,2=用户注册)", name = "userType", required = true, dataType = "int")
+    })
+    public ResultUtil<LoginWarpper> captchaLogin_(String phone, String code, Integer uid, Integer type, Integer userType,String loginType){
+        try {
+            return userInfoService.captchaLogin(phone, code, uid, type, userType,loginType);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+
+    /**
+     * 账号密码登录
+     * @param phone
+     * @param password
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/user/userLogin")
+    @ApiOperation(value = "账号密码登录", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "手机号码", name = "phone", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "登录端口-小程序传Applets", name = "loginType", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "登录密码", name = "password", required = true, dataType = "String")
+    })
+    public ResultUtil<LoginWarpper> userLogin(String phone, String password,String loginType){
+        if(ToolUtil.isNotEmpty(phone) && ToolUtil.isNotEmpty(password)){
+            try {
+                return userInfoService.userLogin(phone, password,loginType);
+            }catch (Exception e){
+                e.printStackTrace();
+                return ResultUtil.runErr();
+            }
+        }else{
+            return ResultUtil.paranErr();
+        }
+    }
+
+
+    /**
+     * 忘记密码
+     * @param phone
+     * @param code
+     * @param password
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/user/forgetPassword")
+    @ApiOperation(value = "忘记密码操作", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "手机号码", name = "phone", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "验证码", name = "code", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "新密码", name = "password", required = true, dataType = "String")
+    })
+    public ResultUtil forgetPassword(String phone, String code, String password){
+        if(ToolUtil.isNotEmpty(phone) && ToolUtil.isNotEmpty(code) && ToolUtil.isNotEmpty(password)){
+            try {
+                return userInfoService.forgetPassword(phone, code, password);
+            }catch (Exception e){
+                e.printStackTrace();
+                return ResultUtil.runErr();
+            }
+        }else{
+            return ResultUtil.paranErr();
+        }
+    }
+
+
+    /**
+     * 微信授权登录
+     * @param type              登录端口(1:APP登录,2:小程序)
+     * @param openid            微信openid
+     * @param unionid           微信unionid
+     * @param jscode            小程序登录时的jscode临时凭证
+     * @param registIp          ip地址
+     * @param registAreaCode    当前定位区县行政编号(6位)
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/user/wxLogin")
+    @ApiOperation(value = "微信授权登录", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "登录端口(1:APP,2:小程序)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "微信openid(APP登录上传)", name = "openid", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "微信unionid(APP登录上传)", name = "unionid", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "微信jscode(小程序登录上传)", name = "jscode", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "ip地址", name = "registIp", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "当前定位区县行政编号", name = "registAreaCode", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "头像", name = "avatar", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "昵称", name = "nickName", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "登录端口-小程序传Applets", name = "loginType", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "性别(1=男,2=女)", name = "sex", required = false, dataType = "int")
+    })
+    public ResultUtil<LoginWarpper> wxLogin(Integer type, String openid, String unionid, String jscode, String registIp, String registAreaCode, Integer sex, String nickName, String avatar,String loginType){
+        try {
+            return userInfoService.wxLogin(type, openid, unionid, jscode, registIp, registAreaCode, sex, nickName, avatar,loginType);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 设置电话号码
+     * @param phone
+     * @param code
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/bindingPhone")
+    @ApiOperation(value = "设置电话号码", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "电话号码", name = "phone", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "验证码", name = "code", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "登录端口-小程序传Applets", name = "loginType", required = false, dataType = "String"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<LoginWarpper> bindingPhone(String phone, String code, HttpServletRequest request,String loginType){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return userInfoService.bindingPhone(uid, phone, code,loginType);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取用户个人信息
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/queryUserInfo")
+    @ApiOperation(value = "获取用户详情", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<UserInfoWarpper> queryUserInfo(HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            Map<String, Object> map = userInfoService.queryUserInfo(uid);
+            return ResultUtil.success(UserInfoWarpper.getUserInfoWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 手机号码获取用户
+     * @param phone
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/queryUser")
+    @ApiOperation(value = "手机号码获取用户", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "电话号码", name = "phone", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<Object> queryUser(String phone){
+        try {
+            Map<String, Object> map = userInfoService.queryUser(phone);
+            if(null != map){
+                return ResultUtil.success(UserInfoWarpper.getUserInfoWarpper(map));
+            }
+            return ResultUtil.success(new JSONObject());
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 实名认证操作
+     * @param verifiedWarpper
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/verified")
+    @ApiOperation(value = "实名认证操作", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil verified(VerifiedWarpper verifiedWarpper, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return verifiedService.verified(VerifiedWarpper.getVerified(verifiedWarpper), uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 设置紧急联系人
+     * @param name
+     * @param phone
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/setUrgentUser")
+    @ApiOperation(value = "设置紧急联系人", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "姓名,没有传空字符串", name = "name", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "电话号码,没有传空字符串", name = "phone", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil setUrgentUser(String name, String phone, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            userInfoService.setUrgentUser(name, phone, uid);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 用户充值余额
+     * @param payType
+     * @param money
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/depositBalance")
+    @ApiOperation(value = "余额充值", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "支付方式(1=微信,2=支付宝)", name = "payType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "充值金额", name = "money", required = true, dataType = "double"),
+            @ApiImplicitParam(value = "支付端(1=用户APP端,2=司机APP端,3=用户小程序端)", name = "type", required = false, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil depositBalance(Integer payType, Double money, Integer type, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return userInfoService.depositBalance(payType, money, uid, type);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 修改手机号码
+     * @param code
+     * @param phone
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/updatePhone")
+    @ApiOperation(value = "修改手机号码", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "验证码", name = "code", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "新手机号", name = "phone", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil updatePhone(String code, String phone, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return userInfoService.updatePhone(code, phone, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @ResponseBody
+    @PostMapping("/api/user/checkCaptcha")
+    @ApiOperation(value = "验证短信验证码", tags = {"用户端-个人中心"}, notes = "1=正确,0=错误")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "电话号码", name = "phone", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "短信验证码", name = "code", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil checkCaptcha(String phone, String code, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            UserInfo userInfo = userInfoService.selectById(uid);
+            smsrecordService.saveData(4, userInfo.getPhone(), code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
+            boolean b = userInfoService.checkCaptcha(phone, code);
+            Map<String, Object> map = new HashMap<>();
+            map.put("ok", b ? 1 : 0);
+            return ResultUtil.success(map);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    /**
+     * 修改登录密码
+     * @param password
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/updatePassword")
+    @ApiOperation(value = "修改登录密码", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "新密码", name = "password", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil updatePassword(String password, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return userInfoService.updatePass(password, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 修改个人信息
+     * @param avatar
+     * @param nickname
+     * @param sex
+     * @param birthday
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/updateInfo")
+    @ApiOperation(value = "修改个人信息", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "头像", name = "avatar", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "昵称", name = "nickname", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "性别(1=男,2=女)", name = "sex", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "生日(2020-06-15)", name = "birthday", required = false, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil updateInfo(String avatar, String nickname, Integer sex, Date birthday, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            userInfoService.updateInfo(avatar, nickname, sex, birthday, uid);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/api/user/queryRealName")
+    @ApiOperation(value = "获取实名认证的数据", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil queryRealName(HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            Map<String, Object> map = userInfoService.queryRealName(uid);
+            return ResultUtil.success(null != map ? map : new HashMap<>());
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 后台调用禁用用户
+     * @param uid
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/user/freeze")
+    public ResultUtil freeze(Integer uid){
+        try {
+            UserInfo userInfo = userInfoService.selectById(uid);
+            String value = redisUtil.getValue(userInfo.getPhone());
+            redisUtil.remove(value);
+            redisUtil.remove(userInfo.getPhone());
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 仿socket接口(单点登录)
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/comparisonToken")
+    @ApiOperation(value = "单点登录", tags = {"用户端-仿socket接口"}, notes = "match=1(匹配),match=2(不匹配)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil comparisonToken(HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            String requestHeader = request.getHeader(JwtConstants.AUTH_HEADER);
+            requestHeader = requestHeader.substring(requestHeader.indexOf(" ") + 1);
+            String value = redisUtil.getValue("USER_" + uid);
+            Map<String, Object> map = new HashMap<>();
+            map.put("match", requestHeader.equals(value) ? 1 : 2);
+            return ResultUtil.success(map);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 注销账号
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/cancellation")
+    @ApiOperation(value = "注销账号", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil cancellation(HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            UserInfo userInfo = userInfoService.selectById(uid);
+            userInfo.setState(2);
+            userInfoService.updateById(userInfo);
+            //开始验证当前账号是否在别处登录
+            String value = redisUtil.getValue("USER_" + uid);
+            if(ToolUtil.isNotEmpty(value)){//将另外设备上的强迫下线
+                //开始清除redis中无效的数据
+                String key = redisUtil.getValue("USER_" + userInfo.getPhone());
+                redisUtil.remove(key);//删除个人信息数据
+                redisUtil.remove("USER_" + userInfo.getPhone());//删除后台冻结相关缓存
+                redisUtil.remove("USER_" + uid);//清除存储的token
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    @ResponseBody
+    @PostMapping("/base/user/dxlcLogin")
+    @ApiOperation(value = "道行龙城登录", tags = {"用户端-道行龙城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "道行龙城获取的授权", name = "authCode", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "登录端口-小程序和H5传Applets", name = "loginType", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "当前定位区县行政编号", name = "registAreaCode", required = false, dataType = "String")
+    })
+    public ResultUtil dxlcLogin(String authCode, String registAreaCode,String loginType){
+        try {
+            return userInfoService.dxlcLogin(authCode, registAreaCode, loginType);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/base/user/getSignatureConfig")
+    @ApiOperation(value = "获取微信JS-SDK", tags = {"用户端-道行龙城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "授权地址", name = "url", required = true, dataType = "String"),
+    })
+    public ResultUtil getSignatureConfig(String url){
+        try {
+            Map<String, Object> signatureConfig = weChatUtil.getSignatureConfig(url);
+            return ResultUtil.success(signatureConfig);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 手机号码获取用户
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/phoneLoginBindingWeChat")
+    @ApiOperation(value = "微信小程序手机号登录后调用此接口保存微信openid", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "微信登录临时凭证", name = "jscode", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil phoneLoginBindingWeChat(String jscode, HttpServletRequest request){
+        try {
+            Integer userId = userInfoService.getUserIdFormRedis(request);
+            if(null == userId){
+                return ResultUtil.tokenErr();
+            }
+            return userInfoService.phoneLoginBindingWeChat(userId, jscode);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    @ResponseBody
+    @PostMapping("/base/uploadImg")
+    @ApiOperation(value = "上传图片接口", tags = {"公共接口"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "图片文件", name = "file", required = true, dataType = "file"),
+    })
+    public ResultUtil uploadImg(MultipartFile file, HttpServletRequest request, HttpServletResponse response){
+        try {
+            String name = file.getOriginalFilename();
+//            String type = name.substring(name.lastIndexOf(".") + 1).toLowerCase();
+//            List<String> types = Arrays.asList("jpg", "jpeg", "png");
+//            if(!types.contains(type)){
+//                return ResultUtil.error("请上传图片文件(jpg/jpeg/png)");
+//            }
+            String s = ObsUploadUtil.obsUpload(request, file);
+            return ResultUtil.success(s);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 注销账号
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/user/cancelAccount")
+    @ApiOperation(value = "注销账号", tags = {"用户端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil cancelAccount(HttpServletRequest request){
+        try {
+            Integer userId = userInfoService.getUserIdFormRedis(request);
+            if(null == userId){
+                return ResultUtil.tokenErr();
+            }
+            UserInfo userInfo = userInfoService.selectById(userId);
+            userInfo.setFlag(3);
+            userInfoService.updateById(userInfo);
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/VersionManagementController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/VersionManagementController.java
new file mode 100644
index 0000000..06ef99d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/VersionManagementController.java
@@ -0,0 +1,60 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.service.IVersionManagementService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.VersionWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * 版本管理
+ */
+@Api
+//@CrossOrigin
+@RestController
+@RequestMapping("")
+public class VersionManagementController {
+
+    @Autowired
+    private IVersionManagementService versionManagementService;
+
+
+
+    @ResponseBody
+    @PostMapping("/api/version/queryNewData")
+    @ApiOperation(value = "获取最新版本数据", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<VersionWarpper> queryNewData(){
+        try {
+            Map<String, Object> map = versionManagementService.queryNewVersion();
+            return ResultUtil.success(VersionWarpper.getVersionWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @ResponseBody
+    @PostMapping("/base/version/queryNewData1")
+    @ApiOperation(value = "获取最新版本数据", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+    })
+    public ResultUtil<VersionWarpper> queryNewData1(){
+        try {
+            Map<String, Object> map = versionManagementService.queryNewVersion();
+            return ResultUtil.success(VersionWarpper.getVersionWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/WithdrawalController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/WithdrawalController.java
new file mode 100644
index 0000000..956e8c5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/WithdrawalController.java
@@ -0,0 +1,114 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.service.IWithdrawalService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.WithdrawalWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+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;
+
+/**
+ * 提现控制器
+ */
+@Api
+@RestController
+@RequestMapping("")
+public class WithdrawalController {
+
+    @Autowired
+    private IWithdrawalService withdrawalService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+    /**
+     * 账户余额提现操作
+     * @param money
+     * @param code
+     * @param name
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/withdrawal/withdrawal")
+    @ApiOperation(value = "账户余额提现", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "提现金额", name = "money", required = true, dataType = "double"),
+            @ApiImplicitParam(value = "银行卡号", name = "code", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "银行卡只有人姓名", name = "name", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil withdrawal(Double money, String code, String name, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return withdrawalService.withdrawal(money, code, name, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取历史提现数据
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/withdrawal/queryWithdrawal")
+    @ApiOperation(value = "获取历史提现数据", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<WithdrawalWarpper>> queryWithdrawal(Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = withdrawalService.queryWithdrawal(uid, pageNum, size);
+            return ResultUtil.success(WithdrawalWarpper.getWithdrawalWarpper(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 内部调用审核提交结果的处理
+     * @param id        提现申请数据id
+     * @param state     审核状态(1=同意,2=拒绝)
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/withdrawal/queryWithdrawal")
+    public ResultUtil withdrawalAudit(Integer id, Integer state){
+        try {
+            return withdrawalService.withdrawalAudit(id, state);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java
new file mode 100644
index 0000000..725029b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java
@@ -0,0 +1,61 @@
+package com.stylefeng.guns.modular.code.controller;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.config.properties.DruidProperties;
+import com.stylefeng.guns.generator.action.config.WebGeneratorConfig;
+import com.stylefeng.guns.generator.action.model.GenQo;
+import com.stylefeng.guns.modular.code.factory.DefaultTemplateFactory;
+import com.stylefeng.guns.modular.code.service.TableService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * 代码生成控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年11月30日16:39:19
+ */
+@Controller
+@RequestMapping("/code")
+public class CodeController extends BaseController {
+
+    private static String PREFIX = "/code";
+
+    @Autowired
+    private TableService tableService;
+
+    @Autowired
+    private DruidProperties druidProperties;
+
+    /**
+     * 跳转到代码生成主页
+     */
+    @RequestMapping("")
+    public String blackboard(Model model) {
+        model.addAttribute("tables", tableService.getAllTables());
+        model.addAttribute("params", DefaultTemplateFactory.getDefaultParams());
+        model.addAttribute("templates", DefaultTemplateFactory.getDefaultTemplates());
+        return PREFIX + "/code.html";
+    }
+
+    /**
+     * 生成代码
+     */
+    @ApiOperation("生成代码")
+    @RequestMapping(value = "/generate", method = RequestMethod.POST)
+    @ResponseBody
+    public Object generate(GenQo genQo) {
+        genQo.setUrl(druidProperties.getUrl());
+        genQo.setUserName(druidProperties.getUsername());
+        genQo.setPassword(druidProperties.getPassword());
+        WebGeneratorConfig webGeneratorConfig = new WebGeneratorConfig(genQo);
+        webGeneratorConfig.doMpGeneration();
+        webGeneratorConfig.doGunsGeneration();
+        return SUCCESS_TIP;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java
new file mode 100644
index 0000000..1cebee4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java
@@ -0,0 +1,61 @@
+package com.stylefeng.guns.modular.code.factory;
+
+
+import com.stylefeng.guns.GunsApplication;
+import com.stylefeng.guns.core.CoreFlag;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.generator.action.model.GenQo;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 模板种类构建器
+ *
+ * @author fengshuonan
+ * @date 2017-12-04-下午2:59
+ */
+public class DefaultTemplateFactory {
+
+    /**
+     * 获取所有的模板种类
+     */
+    public static List<Map<String,Object>> getDefaultTemplates(){
+        ArrayList<Map<String, Object>> templates = new ArrayList<>();
+        templates.add(create("controllerSwitch","controller-控制器模板"));
+        templates.add(create("entitySwitch","entity-实体模板"));
+        templates.add(create("serviceSwitch","service-service模板"));
+        templates.add(create("daoSwitch","dao-dao模板"));
+        templates.add(create("indexPageSwitch","indexPage-首页模板"));
+        templates.add(create("addPageSwitch","addPage-添加页面模板"));
+        templates.add(create("editPageSwitch","editPage-编辑页面模板"));
+        templates.add(create("jsSwitch","indexJs-主页js模板"));
+        templates.add(create("infoJsSwitch","infoJs-详情页js模板"));
+        templates.add(create("sqlSwitch","sql-sql语句模板"));
+        return templates;
+    }
+
+    /**
+     * 获取默认的参数
+     */
+    public static GenQo getDefaultParams(){
+        GenQo genQo = new GenQo();
+        genQo.setProjectPath(ToolUtil.getWebRootPath(null));
+        genQo.setAuthor("stylefeng");
+        genQo.setProjectPackage(GunsApplication.class.getPackage().getName());
+        genQo.setCorePackage(CoreFlag.class.getPackage().getName());
+        genQo.setIgnoreTabelPrefix("sys_");
+        genQo.setModuleName("system");
+        genQo.setParentMenuName("系统管理");
+        return genQo;
+    }
+
+    private static Map<String,Object> create(String key,String desc){
+        HashMap<String, Object> template = new HashMap<>();
+        template.put("key",key);
+        template.put("desc",desc);
+        return template;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java
new file mode 100644
index 0000000..f8f9478
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.code.service;
+
+import com.baomidou.mybatisplus.mapper.SqlRunner;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 获取数据库所有的表
+ *
+ * @author fengshuonan
+ * @date 2017-12-04-下午1:37
+ */
+@Service
+public class TableService {
+
+    @Value("${spring.datasource.db-name}")
+    private String dbName;
+
+    /**
+     * 获取当前数据库所有的表信息
+     */
+    public List<Map<String, Object>> getAllTables() {
+        String sql = "select TABLE_NAME as tableName,TABLE_COMMENT as tableComment from information_schema.`TABLES` where TABLE_SCHEMA = '" + dbName + "'";
+        return SqlRunner.db().selectList(sql);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/LineController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/LineController.java
new file mode 100644
index 0000000..fa21e15
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/LineController.java
@@ -0,0 +1,123 @@
+package com.stylefeng.guns.modular.crossCity.controller;
+
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.support.WafKit;
+import com.stylefeng.guns.modular.crossCity.dao.ICarMapper;
+import com.stylefeng.guns.modular.crossCity.model.Line;
+import com.stylefeng.guns.modular.crossCity.model.LineSite;
+import com.stylefeng.guns.modular.crossCity.model.Site;
+import com.stylefeng.guns.modular.crossCity.server.ILineService;
+import com.stylefeng.guns.modular.crossCity.server.ILineSiteService;
+import com.stylefeng.guns.modular.crossCity.server.ISiteService;
+import com.stylefeng.guns.modular.crossCity.server.impl.LineSiteServiceImpl;
+import com.stylefeng.guns.modular.crossCity.warpper.LineWarpper;
+import com.stylefeng.guns.modular.system.model.Car;
+import com.stylefeng.guns.modular.system.model.CarService;
+import com.stylefeng.guns.modular.system.model.Company;
+import com.stylefeng.guns.modular.system.service.ICompanyService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.sql.Wrapper;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * 线路控制器
+ */
+@Api
+@RestController
+@RequestMapping("")
+public class LineController {
+
+    @Autowired
+    private ILineService lineService;
+    @Autowired
+    private ILineSiteService lineSiteService;
+    @Autowired
+    private ISiteService siteService;
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/base/line/queryLines", method = RequestMethod.POST)
+    @ApiOperation(value = "根据选择的起点和终点获取线路", tags = {"用户端-跨城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "起始站点id", name = "startId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "终点站点id", name = "endId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "司机id", name = "driverId", required = false, dataType = "int")
+    })
+    public ResultUtil<List<LineWarpper>> queryLines(Integer startId, Integer endId, Integer driverId){
+        try {
+            List<Map<String, Object>> list = lineService.queryLines(startId, endId, driverId);
+            return ResultUtil.success(LineWarpper.getLineWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping(value = "/base/line/recomand", method = RequestMethod.POST)
+    @ApiOperation(value = "获取热门路线", tags = {"用户端-跨城"}, notes = "")
+    public ResultUtil<List<Line>> recomand(){
+        List<Line> isOpen = lineService.selectList(new EntityWrapper<Line>().eq("isOpen", 1).eq("state",1).orderBy("sortBy",false));
+
+        for (Line line : isOpen) {
+            List<LineSite> lineId = lineSiteService.selectList(new EntityWrapper<LineSite>().eq("lineId", line.getId()));
+            List<Site> sites =new ArrayList<>();
+            for (LineSite lineSite : lineId) {
+                Site site = siteService.selectById(lineSite.getSiteId());
+                sites.add(site);
+            }
+            line.setSites(sites);
+        }
+
+        return ResultUtil.success(isOpen);
+    }
+
+
+    @Autowired
+    private ICarMapper carMapper;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @ResponseBody
+    @RequestMapping(value = "/base/line/confirm", method = RequestMethod.POST)
+    @ApiOperation(value = "判断当前是否需要摆渡车", tags = {"用户端-跨城"}, notes = "")
+    public ResultUtil confirm(Integer carId){
+        Car car = carMapper.selectById(carId);
+        Company company = companyService.selectById(car.getCompanyId());
+        return ResultUtil.success(company.getIsNeedFerry());
+    }
+
+
+//    @ResponseBody
+//    @RequestMapping(value = "/base/line/scanCodeQueryLines", method = RequestMethod.POST)
+//    @ApiOperation(value = "扫码获取线路信息", tags = {"用户端-跨城"}, notes = "")
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(value = "司机id", name = "driverId", required = true, dataType = "int")
+//    })
+//    public ResultUtil<List<BaseWarpper>> scanCodeQueryLines(Integer driverId){
+//        try {
+//            List<Map<String, Object>> list = lineService.scanCodeQueryLines(driverId);
+//            return ResultUtil.success(BaseWarpper.getBaseWarppers(list));
+//        }catch (Exception e){
+//            e.printStackTrace();
+//            return ResultUtil.runErr();
+//        }
+//    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/LineSiteController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/LineSiteController.java
new file mode 100644
index 0000000..f9e81e6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/LineSiteController.java
@@ -0,0 +1,73 @@
+package com.stylefeng.guns.modular.crossCity.controller;
+
+
+import com.stylefeng.guns.modular.crossCity.server.ILineSiteService;
+import com.stylefeng.guns.modular.crossCity.warpper.LineSiteWarpper;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.util.SystemException;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 线路排班控制器
+ */
+@Api
+@RestController
+@RequestMapping("")
+public class LineSiteController {
+
+    @Autowired
+    private ILineSiteService lineSiteService;
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/base/lineSite/queryDriver", method = RequestMethod.POST)
+    @ApiOperation(value = "根据线路id获取线路排班数据", tags = {"用户端-跨城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "线路id", name = "lineId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "查询天(2020-09-03)", name = "day", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "司机id", name = "driverId", required = false, dataType = "int")
+    })
+    public ResultUtil<List<LineSiteWarpper>> queryDriver(Integer lineId, String day, Integer driverId){
+        try {
+            List<Map<String, Object>> list = lineSiteService.queryDriver(lineId, day, driverId);
+            return ResultUtil.success(LineSiteWarpper.getLineSiteWarppers(list));
+        } catch (SystemException se){
+            return ResultUtil.error(se.getMessage());
+        } catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/base/lineSite/querySeat", method = RequestMethod.POST)
+    @ApiOperation(value = "根据司机的排班id获取剩余座位数据", tags = {"用户端-跨城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "司机排班id", name = "id", required = true, dataType = "int"),
+    })
+    public ResultUtil<BaseWarpper> querySeat(Integer id){
+        try {
+            Map<String, Object> map = lineSiteService.querySeat(id);
+            return ResultUtil.success(BaseWarpper.getBaseWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java
new file mode 100644
index 0000000..0cebe65
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java
@@ -0,0 +1,140 @@
+package com.stylefeng.guns.modular.crossCity.controller;
+
+
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.util.SystemException;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+@Api
+@RestController
+@RequestMapping("")
+public class OrderCrossCityController {
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/base/orderCrossCity/queryOrderMoney", method = RequestMethod.POST)
+    @ApiOperation(value = "获取跨城的支付金额", tags = {"用户端-跨城"}, notes = "distance:距离数(米),price:支付金额")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "起点坐标(103.32123,30.6232)", name = "startLonLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点坐标(103.32123,30.6232)", name = "endLonLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "乘车人数", name = "peopleNumber", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "出行方式(1=拼车,2=包车)", name = "travelMode", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "线路id", name = "lineId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "服务车型id", name = "serverCarModelId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "车辆总座位数", name = "totalSeat", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "座位编号(1,3,4)", name = "seatNumber", required = true, dataType = "int")
+    })
+    public ResultUtil queryOrderMoney(String startLonLat, String endLonLat, Integer peopleNumber, Integer travelMode,
+                                      Integer lineId, Integer serverCarModelId, Integer totalSeat, String seatNumber){
+        try {
+            return orderCrossCityService.queryOrderMoney(startLonLat, endLonLat, peopleNumber, travelMode, lineId, serverCarModelId, totalSeat, seatNumber);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 跨城出行下单操作
+     * @param orderCrossCityWarpper
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/api/orderCrossCity/orderCrossCity", method = RequestMethod.POST)
+    @ApiOperation(value = "跨城出行下单操作【新】", tags = {"用户端-跨城"}, notes = "先进行下单操作,再根据返回的订单id进行支付")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderCrossCityService.orderCrossCity(orderCrossCityWarpper, uid);
+        } catch (SystemException se){
+          return ResultUtil.error(se.getMessage());
+        } catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 摆渡车下单
+     * @param serverCarModelIds
+     * @param travelTime
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @param orderSource
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/api/orderCrossCity/saveOrderFerry", method = RequestMethod.POST)
+    @ApiOperation(value = "摆渡车下单", tags = {"用户端-跨城"}, notes = "车型id多个以逗号分隔,出租车传0")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "服务车型id(多个以逗号分隔,出租车传0)", name = "serverCarModelIds", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "出行时间(2020-08-20 10:10)", name = "travelTime", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "下单地点经度", name = "placementLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "下单地点纬度", name = "placementLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点经度", name = "startLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点纬度", name = "startLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点地址", name = "startAddress", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点经度", name = "endLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点纬度", name = "endLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点地址", name = "endAddress", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "跨城订单id", name = "crossCityOrderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "摆渡方位(1=跨城起点,2=跨城终点)", name = "place", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)", name = "orderSource", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "乘客姓名(代下单必传)", name = "passengers", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "乘客电话(代下单必传)", name = "passengersPhone", required = false, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> saveOrderFerry(String serverCarModelIds, Date travelTime, String placementLon, String placementLat, String startLon,
+                                                  String startLat, String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId, Integer place, Integer orderSource,String passengers,String passengersPhone, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderCrossCityService.saveOrderFerry(serverCarModelIds, travelTime, placementLon, placementLat, startLon, startLat, startAddress, endLon, endLat, endAddress, crossCityOrderId, place, orderSource, uid,passengers,passengersPhone);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/SiteController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/SiteController.java
new file mode 100644
index 0000000..a263bf6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/SiteController.java
@@ -0,0 +1,96 @@
+package com.stylefeng.guns.modular.crossCity.controller;
+
+
+import com.stylefeng.guns.modular.crossCity.server.ISiteService;
+import com.stylefeng.guns.modular.crossCity.warpper.LocationWarpper;
+import com.stylefeng.guns.modular.crossCity.warpper.SiteWarpper;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@Api
+@RestController
+@RequestMapping("")
+public class SiteController {
+
+    @Autowired
+    private ISiteService siteService;
+
+
+    /**
+     * 获取所有站点
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/base/site/querySite", method = RequestMethod.POST)
+    @ApiOperation(value = "获取起点和终点的站点", tags = {"用户端-跨城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "起点站点id", name = "startSiteId", required = false, dataType = "int")
+    })
+    public ResultUtil<List<SiteWarpper>> querySite(Integer startSiteId){
+        try {
+            List<SiteWarpper> list = siteService.querySite(startSiteId);
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/base/site/queryLocation", method = RequestMethod.POST)
+    @ApiOperation(value = "根据站点id获取站点的区域范围数据(设置上车点和下车点)", tags = {"用户端-跨城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "站点id", name = "siteId", required = true, dataType = "int")
+    })
+    public ResultUtil<List<LocationWarpper>> queryLocation(Integer siteId){
+        try {
+            List<Map<String, Object>> list = siteService.queryLocation(siteId);
+            return ResultUtil.success(LocationWarpper.getLocationWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 判断一个点是是否在区域范围内
+     * @param siteId
+     * @param code
+     * @param lonLat
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/base/site/areaMonitoring", method = RequestMethod.POST)
+    @ApiOperation(value = "判断一个点是是否在区域范围内", tags = {"用户端-跨城"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "站点id", name = "siteId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "行政区域编号(510100)", name = "code", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "经纬度", name = "lonLat", required = true, dataType = "string")
+    })
+    public ResultUtil areaMonitoring(Integer siteId, String code, String lonLat){
+        try {
+            boolean b = siteService.areaMonitoring(siteId, code, lonLat);
+            return ResultUtil.success(b ? 1 : -1);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/ICarMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/ICarMapper.java
new file mode 100644
index 0000000..d38114c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/ICarMapper.java
@@ -0,0 +1,14 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Car;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ICarMapper extends BaseMapper<Car> {
+
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineMapper.java
new file mode 100644
index 0000000..a636586
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineMapper.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.crossCity.model.Line;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface LineMapper extends BaseMapper<Line> {
+
+
+    /**
+     * 根据站点id获取匹配的线路数据
+     * @param siteId
+     * @param type
+     * @return
+     */
+    List<Map<String, Object>> queryLines(@Param("siteId") Integer siteId, @Param("type")Integer type);
+
+
+    /**
+     * 根据司机id获取线路
+     * @param driverId
+     * @return
+     */
+    List<Map<String, Object>> scanCodeQueryLines(@Param("driverId") Integer driverId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LinePriceMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LinePriceMapper.java
new file mode 100644
index 0000000..67936d5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LinePriceMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.crossCity.model.LinePrice;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
+
+public interface LinePriceMapper extends BaseMapper<LinePrice> {
+
+
+    /**
+     * 获取价格计算规则
+     * @param lineId
+     * @param serverCarModelId
+     * @return
+     */
+    Map<String, Object> query(@Param("lineId") Integer lineId, @Param("serverCarModelId") Integer serverCarModelId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java
new file mode 100644
index 0000000..a9ce53c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver;
+
+public interface LineShiftDriverMapper extends BaseMapper<LineShiftDriver> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftMapper.java
new file mode 100644
index 0000000..2454b49
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftMapper.java
@@ -0,0 +1,13 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.crossCity.model.LineShift;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface LineShiftMapper extends BaseMapper<LineShift> {
+
+
+    List<LineShift> queryByLineId(@Param("lineId") Integer lineId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineSiteMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineSiteMapper.java
new file mode 100644
index 0000000..e8e4f42
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineSiteMapper.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.crossCity.model.LineSite;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface LineSiteMapper extends BaseMapper<LineSite> {
+
+
+    /**
+     * 获取线路排班数据
+     * @param lineId
+     * @param day
+     * @return
+     */
+    List<Map<String, Object>> queryDriver(@Param("lineId") Integer lineId, @Param("day") Date day,
+                                          @Param("driverId") Integer driverId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LocationMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LocationMapper.java
new file mode 100644
index 0000000..fc0e2bc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LocationMapper.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.crossCity.model.Location;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface LocationMapper extends BaseMapper<Location> {
+
+    /**
+     * 根据站点id获取区域数据
+     * @param siteId
+     * @return
+     */
+    List<Map<String, Object>> queryLocation(@Param("siteId") Integer siteId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java
new file mode 100644
index 0000000..9dbc933
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java
@@ -0,0 +1,94 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface OrderCrossCityMapper extends BaseMapper<OrderCrossCity> {
+
+
+    /**
+     * 根据司机id查询数据
+     * @param driverId
+     * @param state
+     * @return
+     */
+    List<OrderCrossCity> queryByDriverId(@Param("driverId") Integer driverId, @Param("state") Integer...state);
+
+
+    List<OrderCrossCity> queryOrders(@Param("driverId") Integer driverId, @Param("lineShiftDriverId") Integer lineShiftDriverId,
+                                     @Param("state") List<Integer> state);
+
+
+    List<OrderCrossCity> queryListOrder(@Param("driverId") Integer driverId, @Param("lineShiftId") Integer lineShiftId,
+                                     @Param("state") List<Integer> state, @Param("day") String day);
+
+
+    List<OrderCrossCity> query(@Param("start") Date start, @Param("end") Date end);
+
+
+    /**
+     * 根据用户id获取数据
+     * @param uid
+     * @param state
+     * @return
+     */
+    List<OrderCrossCity> queryByState(@Param("uid") Integer uid, @Param("state") Integer...state);
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(@Param("orderId") Integer orderId);
+
+
+
+    /**
+     * 获取用户的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryMyOrderList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
+                                               @Param("size") Integer size);
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyTravelRecord(@Param("uid") Integer uid);
+
+
+
+    /**
+     * 获取用户单发票页面的订单列表
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryInvoiceOrder(@Param("type") Integer type, @Param("startTime") Date startTime,
+                                                @Param("endTime") Date endTime, @Param("startMoney") Double startMoney,
+                                                @Param("endMoney") Double endMoney, @Param("uid") Integer uid);
+
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryRedEnvelope(@Param("uid") Integer uid);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/SiteMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/SiteMapper.java
new file mode 100644
index 0000000..713bc5f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/SiteMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.crossCity.model.Site;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface SiteMapper extends BaseMapper<Site> {
+
+
+    /**
+     * 根据起点站点获取线路相关的终点站点
+     * @param startSiteId
+     * @return
+     */
+    List<Map<String, Object>> querySite(@Param("startSiteId") Integer startSiteId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineMapper.xml
new file mode 100644
index 0000000..a42144e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineMapper.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.LineMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.Line">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="shiftInterval" property="shiftInterval"/>
+        <result column="rakeRate" property="rakeRate"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+    <select id="queryLines" resultType="map">
+        select
+        a.id as id,
+        a.name as name,
+        c.name as siteName
+        from t_line a
+        left join t_line_site b on (a.id = b.lineId)
+        left join t_site c on (b.siteId = c.id)
+        where a.state = 1 and b.siteId = #{siteId} and b.type = #{type}
+    </select>
+
+
+    <select id="scanCodeQueryLines" resultType="map">
+        select
+        b.id as id,
+        b.`name` as `name`
+        from t_driver_line a
+        left join t_line b on (a.lineId = b.id)
+        where b.state = 1 and a.driverId = #{driverId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LinePriceMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LinePriceMapper.xml
new file mode 100644
index 0000000..60f3f5f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LinePriceMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.LinePriceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.LinePrice">
+        <id column="id" property="id"/>
+        <result column="lineId" property="lineId"/>
+        <result column="serverCarModelId" property="serverCarModelId"/>
+        <result column="type" property="type"/>
+        <result column="content" property="content"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+    <select id="query" resultType="map">
+        select
+        `type` as `type`,
+        content as content
+        from t_line_price where state = 1 and lineId = #{lineId} and serverCarModelId = #{serverCarModelId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml
new file mode 100644
index 0000000..35185b6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.LineShiftDriver">
+        <id column="id" property="id"/>
+        <result column="lineShiftId" property="lineShiftId"/>
+        <result column="driverId" property="driverId"/>
+        <result column="day" property="day"/>
+        <result column="laveSeat" property="laveSeat"/>
+        <result column="laveSeatNumber" property="laveSeatNumber"/>
+        <result column="totalSeat" property="totalSeat"/>
+        <result column="inserTime" property="inserTime"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftMapper.xml
new file mode 100644
index 0000000..7a5b195
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.LineShiftMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.LineShift">
+        <id column="id" property="id"/>
+        <result column="lineId" property="lineId"/>
+        <result column="startTime" property="startTime"/>
+        <result column="endTime" property="endTime"/>
+        <result column="carNum" property="carNum"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+
+    <select id="queryByLineId" resultType="LineShift">
+        select
+        id as id,
+        lineId as lineId,
+        startTime as startTime,
+        endTime as endTime,
+        carNum as carNum,
+        state as state,
+        insertTime as insertTime
+        from t_line_shift where lineId = #{lineId} and state = 1 order by startTime
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineSiteMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineSiteMapper.xml
new file mode 100644
index 0000000..81993a6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineSiteMapper.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.LineSiteMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.LineSite">
+        <id column="id" property="id"/>
+        <result column="lineId" property="lineId"/>
+        <result column="startTime" property="startTime"/>
+        <result column="endTime" property="endTime"/>
+        <result column="carNum" property="carNum"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+    <select id="queryDriver" resultType="map">
+        select
+        a.id as id,
+        b.id as lineShiftDriverId,
+        b.driverId as driverId,
+        a.startTime as startTime,
+        c.headImgUrl as headImgUrl,
+        CONCAT(left(c.`name`, 1), '师傅') as `name`,
+        d.carLicensePlate as carLicensePlate,
+        CONCAT(e.`name`, f.`name`) as brand,
+        d.carColor as carColor,
+        CONCAT((b.totalSeat - b.laveSeat), '/', b.totalSeat) as `number`,
+        (select sum(fraction)/count(fraction) from t_order_evaluate where driverId = b.driverId) as evaluate,
+        h.type as priceType,
+        h.content as content,
+        b.driverId as driverId,
+        c.carId as carId,
+        b.totalSeat as totalSeat,
+        g.serverCarModelId as serverCarModelId,
+        b.laveSeatNumber as laveSeatNumber,
+        b.laveSeat as laveSeat
+        from t_line_shift a
+        left join t_line_shift_driver b on (b.lineShiftId = a.id)
+        left join t_driver c on (b.driverId = c.id)
+        left join t_car d on (c.carId = d.id)
+        left join t_car_brand e on (d.carBrandId = e.id)
+        left join t_car_model f on (d.carModelId = f.id)
+        left join t_car_service g on (d.id = g.carId and g.`type` = 3)
+        left join t_line_price h on (g.serverCarModelId = h.serverCarModelId and a.lineId = h.lineId)
+        where 1 = 1
+        <if test="null != lineId">
+            and a.lineId = #{lineId}
+        </if>
+        <if test="null != day">
+            and DATE_FORMAT(b.day, '%Y-%m-%d') = DATE_FORMAT(#{day}, '%Y-%m-%d')
+        </if>
+        <if test="null != driverId">
+            and b.driverId = #{driverId}
+        </if>
+        order by a.startTime
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LocationMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LocationMapper.xml
new file mode 100644
index 0000000..51ceb4b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LocationMapper.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.LocationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.Location">
+        <id column="id" property="id"/>
+        <result column="siteId" property="siteId"/>
+        <result column="type" property="type"/>
+        <result column="province" property="province"/>
+        <result column="provinceCode" property="provinceCode"/>
+        <result column="city" property="city"/>
+        <result column="cityCode" property="cityCode"/>
+        <result column="district" property="district"/>
+        <result column="districtCode" property="districtCode"/>
+        <result column="coordinate" property="coordinate"/>
+        <result column="gid" property="gid"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+    <select id="queryLocation" resultType="map">
+        select
+        `type` as `type`,
+        province as province,
+        provinceCode as provinceCode,
+        city as city,
+        cityCode as cityCode,
+        district as district,
+        districtCode as districtCode,
+        coordinate as coordinate,
+        gid as gid
+        from t_location where state = 1 and siteId = #{siteId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml
new file mode 100644
index 0000000..ca04758
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml
@@ -0,0 +1,594 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.OrderCrossCity">
+        <id column="id" property="id"/>
+        <result column="userId" property="userId"/>
+        <result column="serverCarModelId" property="serverCarModelId"/>
+        <result column="driverId" property="driverId"/>
+        <result column="lineId" property="lineId"/>
+        <result column="lineShiftDriverId" property="lineShiftDriverId"/>
+        <result column="carId" property="carId"/>
+        <result column="orderNum" property="orderNum"/>
+        <result column="placementLon" property="placementLon"/>
+        <result column="placementLat" property="placementLat"/>
+        <result column="placementAddress" property="placementAddress"/>
+        <result column="startLon" property="startLon"/>
+        <result column="startLat" property="startLat"/>
+        <result column="startAddress" property="startAddress"/>
+        <result column="endLon" property="endLon"/>
+        <result column="endLat" property="endLat"/>
+        <result column="endAddress" property="endAddress"/>
+        <result column="boardingLon" property="boardingLon"/>
+        <result column="boardingLat" property="boardingLat"/>
+        <result column="boardingAddress" property="boardingAddress"/>
+        <result column="boardingTime" property="boardingTime"/>
+        <result column="getoffLon" property="getoffLon"/>
+        <result column="getoffLat" property="getoffLat"/>
+        <result column="getoffAddress" property="getoffAddress"/>
+        <result column="getoffTime" property="getoffTime"/>
+        <result column="mileage" property="mileage"/>
+        <result column="payManner" property="payManner"/>
+        <result column="payType" property="payType"/>
+        <result column="orderMoney" property="orderMoney"/>
+        <result column="redPacketMoney" property="redPacketMoney"/>
+        <result column="couponMoney" property="couponMoney"/>
+        <result column="redPacketId" property="redPacketId"/>
+        <result column="couponId" property="couponId"/>
+        <result column="discount" property="discount"/>
+        <result column="discountMoney" property="discountMoney"/>
+        <result column="peopleNumber" property="peopleNumber"/>
+        <result column="seatNumber" property="seatNumber" />
+        <result column="activityId" property="activityId"/>
+        <result column="companyId" property="companyId"/>
+        <result column="payMoney" property="payMoney"/>
+        <result column="passengers" property="passengers"/>
+        <result column="passengersPhone" property="passengersPhone"/>
+        <result column="sort" property="sort"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="travelTime" property="travelTime"/>
+        <result column="snatchOrderTime" property="snatchOrderTime"/>
+        <result column="setOutTime" property="setOutTime"/>
+        <result column="arriveTime" property="arriveTime"/>
+        <result column="startServiceTime" property="startServiceTime"/>
+        <result column="endServiceTime" property="endServiceTime"/>
+        <result column="travelMode" property="travelMode"/>
+        <result column="orderSource" property="orderSource"/>
+        <result column="isReassign" property="isReassign"/>
+        <result column="reassignNotice" property="reassignNotice"/>
+        <result column="invoiceId" property="invoiceId"/>
+        <result column="trackId" property="trackId"/>
+        <result column="isDelete" property="isDelete"/>
+        <result column="oldState" property="oldState"/>
+        <result column="telX" property="telX"/>
+        <result column="bindId" property="bindId"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+
+
+    <select id="queryByDriverId" resultType="OrderCrossCity">
+        select
+        id as id,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        lineId as lineId,
+        lineShiftDriverId as lineShiftDriverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        peopleNumber as peopleNumber,
+        seatNumber as seatNumber,
+        sort as sort,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        travelMode as travelMode,
+        orderSource as orderSource,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        invoiceId as invoiceId,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId,
+        remark as remark
+        from t_order_cross_city where isDelete = 1
+        <if test="null != driverId">
+            and driverId = #{driverId}
+        </if>
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
+
+    <select id="query" resultType="OrderCrossCity">
+        select
+        id as id,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        lineId as lineId,
+        lineShiftDriverId as lineShiftDriverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        peopleNumber as peopleNumber,
+        seatNumber as seatNumber,
+        sort as sort,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        travelMode as travelMode,
+        orderSource as orderSource,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        invoiceId as invoiceId,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId,
+        remark as remark
+        from t_order_cross_city where isDelete = 1
+        <if test="null != start and null != end">
+            and travelTime between #{start} and #{end}
+        </if>
+    </select>
+
+
+
+    <select id="queryByState" resultType="OrderCrossCity">
+        select
+        id as id,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        lineId as lineId,
+        lineShiftDriverId as lineShiftDriverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        peopleNumber as peopleNumber,
+        seatNumber as seatNumber,
+        sort as sort,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        travelMode as travelMode,
+        orderSource as orderSource,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        invoiceId as invoiceId,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId,
+        remark as remark
+        from t_order_cross_city where isDelete = 1
+        <if test="null != uid">
+            and userId = #{uid}
+        </if>
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
+
+
+    <select id="queryOrderInfo" resultType="map">
+        select
+        a.id as orderId,
+        a.state as state,
+        a.oldState as oldState,
+        DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as insertTime,
+        DATE_FORMAT(a.travelTime, '%m月%d日 %H:%i') as travelTime,
+        DATE_FORMAT(a.arriveTime, '%Y-%m-%d %H:%i:%s') as arriveTime,
+        DATE_FORMAT(a.travelTime, '%Y-%m-%d %H:%i:%s') as travelTime1,
+        a.startLon as startLon,
+        a.startLat as startLat,
+        a.startAddress as startAddress,
+        a.endLon as endLon,
+        a.endLat as endLat,
+        a.endAddress as endAddress,
+		a.driverId as driverId,
+        a.peopleNumber as peopleNumber,
+        a.seatNumber as seatNumber,
+		a.orderMoney as orderMoney,
+		a.redPacketMoney as redPacketMoney,
+		a.couponMoney as couponMoney,
+		a.discountMoney as discountMoney,
+		a.payMoney as payMoney,
+        a.remark as remark,
+		b.headImgUrl as driverAvatar,
+		b.`name` as driverName,
+		c.carLicensePlate as licensePlate,
+		c.carColor as carColor,
+		CONCAT(f.`name`, d.`name`) as brand,
+		((select sum(fraction) from t_order_evaluate where driverId = a.driverId) / (select count(id) from t_order_evaluate where driverId = a.driverId)) as score,
+		(
+		(select count(id) from t_order_private_car where driverId = a.driverId and state in (7, 8, 9)) +
+		(select count(id) from t_order_taxi where driverId = a.driverId and state in (7, 8, 9)) +
+		(select count(id) from t_order_cross_city where driverId = a.driverId and state in (6, 8, 9))
+		) as orderNum,
+		b.phone as driverPhone,
+		if(a.state = 12, (select money from t_order_cancel where orderId = a.id and orderType = 3 and state = 1 order by insertTime desc limit 0, 1), if(a.state = 10, (select money from t_order_cancel where orderId = a.id and orderType = 3 and state = 2 order by insertTime desc limit 0, 1), 0)) as cancelPayMoney,
+		if(a.state = 12, (select id from t_order_cancel where orderId = a.id and orderType = 3 and state = 1 order by insertTime desc limit 0, 1), 0) as cancelId,
+		g.fraction as orderScore,
+		g.content as evaluate,
+		a.telX as telX,
+		h.userType as cancelUserType,
+		h.money as cancelMoney,
+		h.reason as cancelReason,
+		h.remark as cancelRemark,
+		CONCAT(j.startTime, '-', j.endTime) as lineShiftTime
+        from t_order_cross_city a
+		left join t_driver b on (a.driverId = b.id)
+		left join t_car c on (a.carId = c.id)
+		left join t_car_model d on (c.carModelId = d.id)
+		left join t_car_brand f on (d.brandId = f.id)
+		left join t_order_evaluate g on (a.id = g.orderId and g.orderType = 3)
+		left join t_order_cancel h on (a.id = h.orderId and h.orderType = 3 and h.state = 2)
+		left join t_line_shift_driver i on (a.lineShiftDriverId = i.id)
+		left join t_line_shift j on (i.lineShiftId = j.id)
+		where a.id = #{orderId}
+    </select>
+
+
+
+    <select id="queryMyOrderList" resultType="map">
+        select
+        id as orderId,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+        DATE_FORMAT(travelTime, '%m月%d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (3) as orderType,
+        state as state,
+        oldState as oldState,
+        remark as remark,
+        peopleNumber as num
+        from t_order_cross_city where userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+
+
+
+    <select id="queryMyTravelRecord" resultType="map">
+        select
+        (payMoney * -1) as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        ('跨城订单') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_cross_city where payMoney != 0 and userId = #{uid} and state in (2, 3, 4, 5, 6, 8, 9, 10, 11, 12)
+    </select>
+
+
+
+    <select id="queryInvoiceOrder" resultType="map">
+        select
+        id as id,
+        DATE_FORMAT(travelTime, '%Y-%m-%d %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        payMoney as payMoney,
+        ('跨城订单') as orderName,
+        if(invoiceId is null, 1, 2) as invoice,
+        unix_timestamp(insertTime) as insertTime,
+        (3) as orderType
+        from t_order_cross_city where state in (8, 9)
+        <if test="type == 1">
+            and invoiceId is null and invoiceId in (select id from t_invoice where state != 2)
+        </if>
+        <if test="type == 2">
+            and invoiceId in (select id from t_invoice where state = 2)
+        </if>
+        <if test="null != startTime and null != endTime">
+            and travelTime between #{startTime} and #{endTime}
+        </if>
+        <if test="null != startMoney and null != endMoney">
+            and payMoney between #{startMoney} and #{endMoney}
+        </if>
+        <if test="null !=uid">
+            and userId = #{uid}
+        </if>
+    </select>
+
+
+
+
+    <select id="queryRedEnvelope" resultType="map">
+        select
+        redPacketMoney as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        ('跨城订单') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_cross_city where userId = #{uid} and state in (8, 9) and redPacketId is not null
+    </select>
+
+
+    <select id="queryOrders" resultType="OrderCrossCity">
+        select
+        id as id,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        lineId as lineId,
+        lineShiftDriverId as lineShiftDriverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        peopleNumber as peopleNumber,
+        seatNumber as seatNumber,
+        sort as sort,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        travelMode as travelMode,
+        orderSource as orderSource,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        invoiceId as invoiceId,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId,
+        remark as remark
+        from t_order_cross_city where isDelete = 1
+        <if test="null != driverId">
+            and driverId = #{driverId}
+        </if>
+        <if test="null != lineShiftDriverId">
+            and lineShiftDriverId = #{lineShiftDriverId}
+        </if>
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
+
+
+    <select id="queryListOrder" resultType="OrderCrossCity">
+        select
+        a.id as id,
+        a.userId as userId,
+        a.serverCarModelId as serverCarModelId,
+        a.driverId as driverId,
+        a.lineId as lineId,
+        a.lineShiftDriverId as lineShiftDriverId,
+        a.carId as carId,
+        a.orderNum as orderNum,
+        a.placementLon as placementLon,
+        a.placementLat as placementLat,
+        a.placementAddress as placementAddress,
+        a.startLon as startLon,
+        a.startLat as startLat,
+        a.startAddress as startAddress,
+        a.endLon as endLon,
+        a.endLat as endLat,
+        a.endAddress as endAddress,
+        a.boardingLon as boardingLon,
+        a.boardingLat as boardingLat,
+        a.boardingAddress as boardingAddress,
+        a.boardingTime as boardingTime,
+        a.getoffLon as getoffLon,
+        a.getoffLat as getoffLat,
+        a.getoffAddress as getoffAddress,
+        a.getoffTime as getoffTime,
+        a.mileage as mileage,
+        a.payManner as payManner,
+        a.payType as payType,
+        a.orderMoney as orderMoney,
+        a.redPacketMoney as redPacketMoney,
+        a.couponMoney as couponMoney,
+        a.redPacketId as redPacketId,
+        a.couponId as couponId,
+        a.discount as discount,
+        a.discountMoney as discountMoney,
+        a.activityId as activityId,
+        a.companyId as companyId,
+        a.payMoney as payMoney,
+        a.passengers as passengers,
+        a.passengersPhone as passengersPhone,
+        a.peopleNumber as peopleNumber,
+        a.seatNumber as seatNumber,
+        a.sort as sort,
+        a.state as state,
+        a.insertTime as insertTime,
+        a.travelTime as travelTime,
+        a.snatchOrderTime as snatchOrderTime,
+        a.setOutTime as setOutTime,
+        a.arriveTime as arriveTime,
+        a.startServiceTime as startServiceTime,
+        a.endServiceTime as endServiceTime,
+        a.travelMode as travelMode,
+        a.orderSource as orderSource,
+        a.isReassign as isReassign,
+        a.reassignNotice as reassignNotice,
+        a.invoiceId as invoiceId,
+        a.trackId as trackId,
+        a.isDelete as isDelete,
+        a.oldState as oldState,
+        a.telX as telX,
+        a.bindId as bindId,
+        a.remark as remark
+        from t_order_cross_city a
+        left join t_line_shift_driver b on (a.lineShiftDriverId = b.id)
+        where a.isDelete = 1
+        <if test="null != driverId">
+            and a.driverId = #{driverId}
+        </if>
+        <if test="null != lineShiftId">
+            and b.lineShiftId = #{lineShiftId}
+        </if>
+        <if test="null != state">
+            and a.state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != day and '' != day">
+            and DATE_FORMAT(a.travelTime, '%Y-%m-%d') = #{day}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/SiteMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/SiteMapper.xml
new file mode 100644
index 0000000..6c06303
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/SiteMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.SiteMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.Site">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="province" property="province"/>
+        <result column="provinceCode" property="provinceCode"/>
+        <result column="city" property="city"/>
+        <result column="cityCode" property="cityCode"/>
+        <result column="district" property="district"/>
+        <result column="districtCode" property="districtCode"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="insertUserId" property="insertUserId"/>
+    </resultMap>
+
+
+
+
+    <select id="querySite" resultType="map">
+        select * from
+        (
+        select id as id, `name` as `name`, provinceCode as cityCode, province as cityName from t_site where province like '%市' and state = 1
+        UNION ALL
+        select id as id, `name` as `name`, cityCode as cityCode, city as cityName from t_site where province not like '%市' and state = 1
+        ) as a where 1 = 1
+        <if test="null != startSiteId">
+            and a.id in(select siteId from t_line_site where lineId in(select lineId from t_line_site where siteId = #{startSiteId} and type = 1) and type = 2)
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/ICar.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/ICar.java
new file mode 100644
index 0000000..e8f6ff0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/ICar.java
@@ -0,0 +1,272 @@
+package com.stylefeng.guns.modular.crossCity.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 java.util.Date;
+
+/**
+ * 车辆
+ */
+@TableName("t_car")
+public class ICar {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 是否是平台车辆(1=是,2=否)
+     */
+    @TableField("isPlatCar")
+    private Integer isPlatCar;
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 加盟商id
+     */
+    @TableField("franchiseeId")
+    private Integer franchiseeId;
+    /**
+     * 车辆颜色
+     */
+    @TableField("carColor")
+    private String carColor;
+    /**
+     * 车型id
+     */
+    @TableField("carModelId")
+    private Integer carModelId;
+    /**
+     * 车辆品牌id
+     */
+    @TableField("carBrandId")
+    private Integer carBrandId;
+    /**
+     * 车牌号
+     */
+    @TableField("carLicensePlate")
+    private String carLicensePlate;
+    /**
+     * 车辆照片
+     */
+    @TableField("carPhoto")
+    private String carPhoto;
+    /**
+     * 行驶证号
+     */
+    @TableField("drivingLicenseNumber")
+    private String drivingLicenseNumber;
+    /**
+     * 行驶证照片
+     */
+    @TableField("drivingLicensePhoto")
+    private String drivingLicensePhoto;
+    /**
+     * 年检到期时间
+     */
+    @TableField("annualInspectionTime")
+    private Date annualInspectionTime;
+    /**
+     * 保险照片
+     */
+    @TableField("insurancePhoto")
+    private String insurancePhoto;
+    /**
+     * 商业保险到期时间
+     */
+    @TableField("commercialInsuranceTime")
+    private Date commercialInsuranceTime;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 状态(1=正常,2=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加来源(1=司机注册 2=平台添加 3=分公司添加 4=加盟商添加)
+     */
+    @TableField("addType")
+    private Integer addType;
+    /**
+     * 公司id
+     */
+    @TableField("addObjectId")
+    private Integer addObjectId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getIsPlatCar() {
+        return isPlatCar;
+    }
+
+    public void setIsPlatCar(Integer isPlatCar) {
+        this.isPlatCar = isPlatCar;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getFranchiseeId() {
+        return franchiseeId;
+    }
+
+    public void setFranchiseeId(Integer franchiseeId) {
+        this.franchiseeId = franchiseeId;
+    }
+
+    public String getCarColor() {
+        return carColor;
+    }
+
+    public void setCarColor(String carColor) {
+        this.carColor = carColor;
+    }
+
+    public Integer getCarModelId() {
+        return carModelId;
+    }
+
+    public void setCarModelId(Integer carModelId) {
+        this.carModelId = carModelId;
+    }
+
+    public Integer getCarBrandId() {
+        return carBrandId;
+    }
+
+    public void setCarBrandId(Integer carBrandId) {
+        this.carBrandId = carBrandId;
+    }
+
+    public String getCarLicensePlate() {
+        return carLicensePlate;
+    }
+
+    public void setCarLicensePlate(String carLicensePlate) {
+        this.carLicensePlate = carLicensePlate;
+    }
+
+    public String getCarPhoto() {
+        return carPhoto;
+    }
+
+    public void setCarPhoto(String carPhoto) {
+        this.carPhoto = carPhoto;
+    }
+
+    public String getDrivingLicenseNumber() {
+        return drivingLicenseNumber;
+    }
+
+    public void setDrivingLicenseNumber(String drivingLicenseNumber) {
+        this.drivingLicenseNumber = drivingLicenseNumber;
+    }
+
+    public String getDrivingLicensePhoto() {
+        return drivingLicensePhoto;
+    }
+
+    public void setDrivingLicensePhoto(String drivingLicensePhoto) {
+        this.drivingLicensePhoto = drivingLicensePhoto;
+    }
+
+    public Date getAnnualInspectionTime() {
+        return annualInspectionTime;
+    }
+
+    public void setAnnualInspectionTime(Date annualInspectionTime) {
+        this.annualInspectionTime = annualInspectionTime;
+    }
+
+    public String getInsurancePhoto() {
+        return insurancePhoto;
+    }
+
+    public void setInsurancePhoto(String insurancePhoto) {
+        this.insurancePhoto = insurancePhoto;
+    }
+
+    public Date getCommercialInsuranceTime() {
+        return commercialInsuranceTime;
+    }
+
+    public void setCommercialInsuranceTime(Date commercialInsuranceTime) {
+        this.commercialInsuranceTime = commercialInsuranceTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getAddType() {
+        return addType;
+    }
+
+    public void setAddType(Integer addType) {
+        this.addType = addType;
+    }
+
+    public Integer getAddObjectId() {
+        return addObjectId;
+    }
+
+    public void setAddObjectId(Integer addObjectId) {
+        this.addObjectId = addObjectId;
+    }
+
+    @Override
+    public String toString() {
+        return "Car{" +
+                "id=" + id +
+                ", isPlatCar=" + isPlatCar +
+                ", companyId=" + companyId +
+                ", carColor='" + carColor + '\'' +
+                ", carModelId=" + carModelId +
+                ", carBrandId=" + carBrandId +
+                ", carLicensePlate='" + carLicensePlate + '\'' +
+                ", carPhoto='" + carPhoto + '\'' +
+                ", drivingLicenseNumber='" + drivingLicenseNumber + '\'' +
+                ", drivingLicensePhoto='" + drivingLicensePhoto + '\'' +
+                ", annualInspectionTime=" + annualInspectionTime +
+                ", commercialInsuranceTime=" + commercialInsuranceTime +
+                ", insertTime=" + insertTime +
+                ", state=" + state +
+                ", addType=" + addType +
+                ", addObjectId=" + addObjectId +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Line.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Line.java
new file mode 100644
index 0000000..730b607
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Line.java
@@ -0,0 +1,113 @@
+package com.stylefeng.guns.modular.crossCity.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;
+import java.util.List;
+
+/**
+ * 跨城线路
+ */
+@TableName("t_line")
+@Data
+public class Line {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    private Integer sortBy;
+    /**
+     * 线路名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 排班申请间隔(分钟)
+     */
+    @TableField("shiftInterval")
+    private Integer shiftInterval;
+    /**
+     * 抽成比例(80)
+     */
+    @TableField("rakeRate")
+    private Integer rakeRate;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    @TableField(exist = false)
+    private List<Site> sites;
+
+    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 Integer getShiftInterval() {
+        return shiftInterval;
+    }
+
+    public void setShiftInterval(Integer shiftInterval) {
+        this.shiftInterval = shiftInterval;
+    }
+
+    public Integer getRakeRate() {
+        return rakeRate;
+    }
+
+    public void setRakeRate(Integer rakeRate) {
+        this.rakeRate = rakeRate;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "Line{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", shiftInterval=" + shiftInterval +
+                ", rakeRate=" + rakeRate +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LinePrice.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LinePrice.java
new file mode 100644
index 0000000..302aa1d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LinePrice.java
@@ -0,0 +1,120 @@
+package com.stylefeng.guns.modular.crossCity.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 java.util.Date;
+
+/**
+ * 线路价格
+ */
+@TableName("t_line_price")
+public class LinePrice {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 线路id
+     */
+    @TableField("lineId")
+    private Integer lineId;
+    /**
+     * 服务车型id
+     */
+    @TableField("serverCarModelId")
+    private Integer serverCarModelId;
+    /**
+     * 价格类型(1=固定金额,2=浮动计费)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 价格计算规则
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "LinePrice{" +
+                "id=" + id +
+                ", lineId=" + lineId +
+                ", serverCarModelId=" + serverCarModelId +
+                ", type=" + type +
+                ", content='" + content + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineShift.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineShift.java
new file mode 100644
index 0000000..39b91ba
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineShift.java
@@ -0,0 +1,117 @@
+package com.stylefeng.guns.modular.crossCity.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 java.util.Date;
+
+@TableName("t_line_shift")
+public class LineShift {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 线路id
+     */
+    @TableField("lineId")
+    private Integer lineId;
+    /**
+     * 开始时间段
+     */
+    @TableField("startTime")
+    private String startTime;
+    /**
+     * 结束时间段
+     */
+    @TableField("endTime")
+    private String endTime;
+    /**
+     * 车次数
+     */
+    @TableField("carNum")
+    private Integer carNum;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(Integer carNum) {
+        this.carNum = carNum;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "LineShift{" +
+                "id=" + id +
+                ", lineId=" + lineId +
+                ", startTime='" + startTime + '\'' +
+                ", endTime='" + endTime + '\'' +
+                ", carNum=" + carNum +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineShiftDriver.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineShiftDriver.java
new file mode 100644
index 0000000..10add01
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineShiftDriver.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.crossCity.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 java.util.Date;
+
+/**
+ * 司机预约排班记录
+ */
+@TableName("t_line_shift_driver")
+public class LineShiftDriver {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 线路班次id
+     */
+    @TableField("lineShiftId")
+    private Integer lineShiftId;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 预约日期
+     */
+    @TableField("day")
+    private Date day;
+    /**
+     * 剩余座位数
+     */
+    @TableField("laveSeat")
+    private Integer laveSeat;
+    /**
+     * 剩余座位号(多个以逗号分隔)
+     */
+    @TableField("laveSeatNumber")
+    private String laveSeatNumber;
+    /**
+     * 总座位数
+     */
+    @TableField("totalSeat")
+    private Integer totalSeat;
+    /**
+     * 添加时间
+     */
+    @TableField("inserTime")
+    private Date inserTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineShiftId() {
+        return lineShiftId;
+    }
+
+    public void setLineShiftId(Integer lineShiftId) {
+        this.lineShiftId = lineShiftId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Date getDay() {
+        return day;
+    }
+
+    public void setDay(Date day) {
+        this.day = day;
+    }
+
+    public Integer getLaveSeat() {
+        return laveSeat;
+    }
+
+    public void setLaveSeat(Integer laveSeat) {
+        this.laveSeat = laveSeat;
+    }
+
+    public String getLaveSeatNumber() {
+        return laveSeatNumber;
+    }
+
+    public void setLaveSeatNumber(String laveSeatNumber) {
+        this.laveSeatNumber = laveSeatNumber;
+    }
+
+    public Integer getTotalSeat() {
+        return totalSeat;
+    }
+
+    public void setTotalSeat(Integer totalSeat) {
+        this.totalSeat = totalSeat;
+    }
+
+    public Date getInserTime() {
+        return inserTime;
+    }
+
+    public void setInserTime(Date inserTime) {
+        this.inserTime = inserTime;
+    }
+
+    @Override
+    public String toString() {
+        return "LineShiftDriver{" +
+                "id=" + id +
+                ", lineShiftId=" + lineShiftId +
+                ", driverId=" + driverId +
+                ", day=" + day +
+                ", laveSeat=" + laveSeat +
+                ", laveSeatNumber='" + laveSeatNumber + '\'' +
+                ", totalSeat=" + totalSeat +
+                ", inserTime=" + inserTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineSite.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineSite.java
new file mode 100644
index 0000000..335c508
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/LineSite.java
@@ -0,0 +1,82 @@
+package com.stylefeng.guns.modular.crossCity.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 java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 线路排班
+ */
+@TableName("t_line_site")
+public class LineSite {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 线路id
+     */
+    private Integer lineId;
+    /**
+     * 站点id
+     */
+    private Integer siteId;
+    /**
+     * 类型(1=起点,2=终点)
+     */
+    private Integer type;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getSiteId() {
+        return siteId;
+    }
+
+    public void setSiteId(Integer siteId) {
+        this.siteId = siteId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+
+
+    @Override
+    public String toString() {
+        return "TLineSite{" +
+                "id=" + id +
+                ", lineId=" + lineId +
+                ", siteId=" + siteId +
+                ", type=" + type +
+                "}";
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Location.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Location.java
new file mode 100644
index 0000000..08c7948
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Location.java
@@ -0,0 +1,203 @@
+package com.stylefeng.guns.modular.crossCity.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 java.util.Date;
+
+/**
+ * 站点区域数据
+ */
+@TableName("t_location")
+public class Location {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 站点id
+     */
+    @TableField("siteId")
+    private Integer siteId;
+    /**
+     * 地点类型(1=行政区域,2=电子围栏)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 省名称
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 省编号
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 市编号
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     * 区县名称
+     */
+    @TableField("district")
+    private String district;
+    /**
+     * 区县编号
+     */
+    @TableField("districtCode")
+    private String districtCode;
+    /**
+     * 电子围栏坐标(多个以分号分隔)
+     */
+    @TableField("coordinate")
+    private String coordinate;
+    /**
+     * 电子围栏gid
+     */
+    @TableField("gid")
+    private String gid;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getSiteId() {
+        return siteId;
+    }
+
+    public void setSiteId(Integer siteId) {
+        this.siteId = siteId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getProvinceCode() {
+        return provinceCode;
+    }
+
+    public void setProvinceCode(String provinceCode) {
+        this.provinceCode = provinceCode;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getCityCode() {
+        return cityCode;
+    }
+
+    public void setCityCode(String cityCode) {
+        this.cityCode = cityCode;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getDistrictCode() {
+        return districtCode;
+    }
+
+    public void setDistrictCode(String districtCode) {
+        this.districtCode = districtCode;
+    }
+
+    public String getCoordinate() {
+        return coordinate;
+    }
+
+    public void setCoordinate(String coordinate) {
+        this.coordinate = coordinate;
+    }
+
+    public String getGid() {
+        return gid;
+    }
+
+    public void setGid(String gid) {
+        this.gid = gid;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "Location{" +
+                "id=" + id +
+                ", siteId=" + siteId +
+                ", type=" + type +
+                ", province='" + province + '\'' +
+                ", provinceCode='" + provinceCode + '\'' +
+                ", city='" + city + '\'' +
+                ", cityCode='" + cityCode + '\'' +
+                ", district='" + district + '\'' +
+                ", districtCode='" + districtCode + '\'' +
+                ", coordinate='" + coordinate + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java
new file mode 100644
index 0000000..25c3159
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java
@@ -0,0 +1,894 @@
+package com.stylefeng.guns.modular.crossCity.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 java.util.Date;
+
+/**
+ * 跨城订单
+ */
+@TableName("t_order_cross_city")
+public class OrderCrossCity {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 服务车型id
+     */
+    @TableField("serverCarModelId")
+    private Integer serverCarModelId;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 线路id
+     */
+    @TableField("lineId")
+    private Integer lineId;
+    /**
+     * 预约班次的id
+     */
+    @TableField("lineShiftDriverId")
+    private Integer lineShiftDriverId;
+    /**
+     * 车辆id
+     */
+    @TableField("carId")
+    private Integer carId;
+    /**
+     * 订单号
+     */
+    @TableField("orderNum")
+    private String orderNum;
+    /**
+     * 下单地点经度
+     */
+    @TableField("placementLon")
+    private Double placementLon;
+    /**
+     * 下单地点纬度
+     */
+    @TableField("placementLat")
+    private Double placementLat;
+    /**
+     * 下单地点
+     */
+    @TableField("placementAddress")
+    private String placementAddress;
+    /**
+     * 起点经度
+     */
+    @TableField("startLon")
+    private Double startLon;
+    /**
+     * 起点纬度
+     */
+    @TableField("startLat")
+    private Double startLat;
+    /**
+     * 起点
+     */
+    @TableField("startAddress")
+    private String startAddress;
+    /**
+     * 目的地经度
+     */
+    @TableField("endLon")
+    private Double endLon;
+    /**
+     * 目的地纬度
+     */
+    @TableField("endLat")
+    private Double endLat;
+    /**
+     * 目的地
+     */
+    @TableField("endAddress")
+    private String endAddress;
+    /**
+     * 上车点经度
+     */
+    @TableField("boardingLon")
+    private Double boardingLon;
+    /**
+     * 上车点纬度
+     */
+    @TableField("boardingLat")
+    private Double boardingLat;
+    /**
+     * 上车地点
+     */
+    @TableField("boardingAddress")
+    private String boardingAddress;
+    /**
+     * 上车时间
+     */
+    @TableField("boardingTime")
+    private Date boardingTime;
+    /**
+     * 下车点经度
+     */
+    @TableField("getoffLon")
+    private Double getoffLon;
+    /**
+     * 下车点纬度
+     */
+    @TableField("getoffLat")
+    private Double getoffLat;
+    /**
+     * 下车点
+     */
+    @TableField("getoffAddress")
+    private String getoffAddress;
+    /**
+     * 下车时间
+     */
+    @TableField("getoffTime")
+    private Date getoffTime;
+    /**
+     * 行驶里程数(米)
+     */
+    @TableField("mileage")
+    private Double mileage;
+    /**
+     * 支付方式(1=OK平台支付,2=其他方式支付)
+     */
+    @TableField("payManner")
+    private Integer payManner;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=余额)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 订单金额
+     */
+    @TableField("orderMoney")
+    private Double orderMoney;
+    /**
+     * 红包抵扣金额
+     */
+    @TableField("redPacketMoney")
+    private Double redPacketMoney;
+    /**
+     * 优惠券抵扣金额
+     */
+    @TableField("couponMoney")
+    private Double couponMoney;
+    /**
+     * 红包id
+     */
+    @TableField("redPacketId")
+    private Integer redPacketId;
+    /**
+     * 优惠券id
+     */
+    @TableField("couponId")
+    private Integer couponId;
+    /**
+     * 折扣
+     */
+    @TableField("discount")
+    private Double discount;
+    /**
+     * 折扣优惠金额
+     */
+    @TableField("discountMoney")
+    private Double discountMoney;
+    /**
+     * 折扣活动id
+     */
+    @TableField("activityId")
+    private Integer activityId;
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 支付金额
+     */
+    @TableField("payMoney")
+    private Double payMoney;
+    /**
+     * 乘车人姓名
+     */
+    @TableField("passengers")
+    private String passengers;
+    /**
+     * 乘车人电话
+     */
+    @TableField("passengersPhone")
+    private String passengersPhone;
+    /**
+     * 出行人数
+     */
+    @TableField("peopleNumber")
+    private Integer peopleNumber;
+    /**
+     * 座位编号
+     */
+    @TableField("seatNumber")
+    private String seatNumber;
+    /**
+     * 排序(订单为拼车时的排序-不是所有订单的排序)
+     */
+    @TableField("sort")
+    private Integer sort;
+    /**
+     * 订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 下单时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 出行时间
+     */
+    @TableField("travelTime")
+    private Date travelTime;
+    /**
+     * 抢单时间
+     */
+    @TableField("snatchOrderTime")
+    private Date snatchOrderTime;
+    /**
+     * 司机点出发时间
+     */
+    @TableField("setOutTime")
+    private Date setOutTime;
+    /**
+     * 司机到达预约地点时间
+     */
+    @TableField("arriveTime")
+    private Date arriveTime;
+    /**
+     * 开始服务时间
+     */
+    @TableField("startServiceTime")
+    private Date startServiceTime;
+    /**
+     * 结束服务时间
+     */
+    @TableField("endServiceTime")
+    private Date endServiceTime;
+    /**
+     * 出行方式(1=拼车,2=包车)
+     */
+    @TableField("travelMode")
+    private Integer travelMode;
+    /**
+     * 订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)
+     */
+    @TableField("orderSource")
+    private Integer orderSource;
+    /**
+     * 是否是改派单(1=否,=是)
+     * @return
+     */
+    @TableField("isReassign")
+    private Integer isReassign;
+    /**
+     * 改派通知标识(0=没有改派,1=改派中,2=已改派)用于通知前端获取新司机数据
+     */
+    @TableField("reassignNotice")
+    private Integer reassignNotice;
+    /**
+     * 发票id
+     */
+    @TableField("invoiceId")
+    private Integer invoiceId;
+    /**
+     * 高德猎鹰轨迹id
+     * @return
+     */
+    @TableField("trackId")
+    private String trackId;
+    /**
+     * 备注信息
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 是否删除(1=否,2=是)
+     */
+    @TableField("isDelete")
+    private Integer isDelete;
+    /**
+     * 该派前的订单状态
+     * @return
+     */
+    @TableField("oldState")
+    private Integer oldState;
+    /**
+     * 移动小号
+     * @return
+     */
+    @TableField("telX")
+    private String telX;
+    /**
+     * 绑定小号关系id
+     * @return
+     */
+    @TableField("bindId")
+    private String bindId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getLineShiftDriverId() {
+        return lineShiftDriverId;
+    }
+
+    public void setLineShiftDriverId(Integer lineShiftDriverId) {
+        this.lineShiftDriverId = lineShiftDriverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Double getBoardingLon() {
+        return boardingLon;
+    }
+
+    public void setBoardingLon(Double boardingLon) {
+        this.boardingLon = boardingLon;
+    }
+
+    public Double getBoardingLat() {
+        return boardingLat;
+    }
+
+    public void setBoardingLat(Double boardingLat) {
+        this.boardingLat = boardingLat;
+    }
+
+    public String getBoardingAddress() {
+        return boardingAddress;
+    }
+
+    public void setBoardingAddress(String boardingAddress) {
+        this.boardingAddress = boardingAddress;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Double getGetoffLon() {
+        return getoffLon;
+    }
+
+    public void setGetoffLon(Double getoffLon) {
+        this.getoffLon = getoffLon;
+    }
+
+    public Double getGetoffLat() {
+        return getoffLat;
+    }
+
+    public void setGetoffLat(Double getoffLat) {
+        this.getoffLat = getoffLat;
+    }
+
+    public String getGetoffAddress() {
+        return getoffAddress;
+    }
+
+    public void setGetoffAddress(String getoffAddress) {
+        this.getoffAddress = getoffAddress;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Integer getPayManner() {
+        return payManner;
+    }
+
+    public void setPayManner(Integer payManner) {
+        this.payManner = payManner;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(Double orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public Double getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(Double redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public Double getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(Double couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Integer getRedPacketId() {
+        return redPacketId;
+    }
+
+    public void setRedPacketId(Integer redPacketId) {
+        this.redPacketId = redPacketId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Double getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Double discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Double getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(Double payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+
+    public String getPassengersPhone() {
+        return passengersPhone;
+    }
+
+    public void setPassengersPhone(String passengersPhone) {
+        this.passengersPhone = passengersPhone;
+    }
+
+    public Integer getPeopleNumber() {
+        return peopleNumber;
+    }
+
+    public void setPeopleNumber(Integer peopleNumber) {
+        this.peopleNumber = peopleNumber;
+    }
+
+    public String getSeatNumber() {
+        return seatNumber;
+    }
+
+    public void setSeatNumber(String seatNumber) {
+        this.seatNumber = seatNumber;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Date getSnatchOrderTime() {
+        return snatchOrderTime;
+    }
+
+    public void setSnatchOrderTime(Date snatchOrderTime) {
+        this.snatchOrderTime = snatchOrderTime;
+    }
+
+    public Date getSetOutTime() {
+        return setOutTime;
+    }
+
+    public void setSetOutTime(Date setOutTime) {
+        this.setOutTime = setOutTime;
+    }
+
+    public Date getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Date arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Date getStartServiceTime() {
+        return startServiceTime;
+    }
+
+    public void setStartServiceTime(Date startServiceTime) {
+        this.startServiceTime = startServiceTime;
+    }
+
+    public Date getEndServiceTime() {
+        return endServiceTime;
+    }
+
+    public void setEndServiceTime(Date endServiceTime) {
+        this.endServiceTime = endServiceTime;
+    }
+
+    public Integer getTravelMode() {
+        return travelMode;
+    }
+
+    public void setTravelMode(Integer travelMode) {
+        this.travelMode = travelMode;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public Integer getInvoiceId() {
+        return invoiceId;
+    }
+
+    public void setInvoiceId(Integer invoiceId) {
+        this.invoiceId = invoiceId;
+    }
+
+    public String getTrackId() {
+        return trackId;
+    }
+
+    public void setTrackId(String trackId) {
+        this.trackId = trackId;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public String getTelX() {
+        return telX;
+    }
+
+    public void setTelX(String telX) {
+        this.telX = telX;
+    }
+
+    public String getBindId() {
+        return bindId;
+    }
+
+    public void setBindId(String bindId) {
+        this.bindId = bindId;
+    }
+
+    public Integer getIsReassign() {
+        return isReassign;
+    }
+
+    public void setIsReassign(Integer isReassign) {
+        this.isReassign = isReassign;
+    }
+
+    public Integer getReassignNotice() {
+        return reassignNotice;
+    }
+
+    public void setReassignNotice(Integer reassignNotice) {
+        this.reassignNotice = reassignNotice;
+    }
+
+    public Integer getOldState() {
+        return oldState;
+    }
+
+    public void setOldState(Integer oldState) {
+        this.oldState = oldState;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderCrossCity{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", serverCarModelId=" + serverCarModelId +
+                ", driverId=" + driverId +
+                ", lineId=" + lineId +
+                ", lineShiftDriverId=" + lineShiftDriverId +
+                ", carId=" + carId +
+                ", orderNum='" + orderNum + '\'' +
+                ", placementLon=" + placementLon +
+                ", placementLat=" + placementLat +
+                ", placementAddress='" + placementAddress + '\'' +
+                ", startLon=" + startLon +
+                ", startLat=" + startLat +
+                ", startAddress='" + startAddress + '\'' +
+                ", endLon=" + endLon +
+                ", endLat=" + endLat +
+                ", endAddress='" + endAddress + '\'' +
+                ", boardingLon=" + boardingLon +
+                ", boardingLat=" + boardingLat +
+                ", boardingAddress='" + boardingAddress + '\'' +
+                ", boardingTime=" + boardingTime +
+                ", getoffLon=" + getoffLon +
+                ", getoffLat=" + getoffLat +
+                ", getoffAddress='" + getoffAddress + '\'' +
+                ", getoffTime=" + getoffTime +
+                ", mileage=" + mileage +
+                ", payManner=" + payManner +
+                ", payType=" + payType +
+                ", orderMoney=" + orderMoney +
+                ", redPacketMoney=" + redPacketMoney +
+                ", couponMoney=" + couponMoney +
+                ", redPacketId=" + redPacketId +
+                ", couponId=" + couponId +
+                ", discount=" + discount +
+                ", discountMoney=" + discountMoney +
+                ", activityId=" + activityId +
+                ", companyId=" + companyId +
+                ", payMoney=" + payMoney +
+                ", passengers='" + passengers + '\'' +
+                ", passengersPhone='" + passengersPhone + '\'' +
+                ", peopleNumber=" + peopleNumber +
+                ", seatNumber='" + seatNumber + '\'' +
+                ", sort=" + sort +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                ", travelTime=" + travelTime +
+                ", snatchOrderTime=" + snatchOrderTime +
+                ", setOutTime=" + setOutTime +
+                ", arriveTime=" + arriveTime +
+                ", startServiceTime=" + startServiceTime +
+                ", endServiceTime=" + endServiceTime +
+                ", travelMode=" + travelMode +
+                ", orderSource=" + orderSource +
+                ", isReassign=" + isReassign +
+                ", reassignNotice=" + reassignNotice +
+                ", invoiceId=" + invoiceId +
+                ", trackId='" + trackId + '\'' +
+                ", isDelete=" + isDelete +
+                ", oldState=" + oldState +
+                ", telX='" + telX + '\'' +
+                ", bindId='" + bindId + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Site.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Site.java
new file mode 100644
index 0000000..1019186
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Site.java
@@ -0,0 +1,176 @@
+package com.stylefeng.guns.modular.crossCity.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 java.util.Date;
+
+/**
+ * 线路站点
+ */
+@TableName("t_site")
+public class Site {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 站点名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 省名称
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 省编号
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 市编号
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     * 区县名称
+     */
+    @TableField("district")
+    private String district;
+    /**
+     * 区县编号
+     */
+    @TableField("districtCode")
+    private String districtCode;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 添加人id
+     */
+    @TableField("insertUserId")
+    private Integer insertUserId;
+
+    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 getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getProvinceCode() {
+        return provinceCode;
+    }
+
+    public void setProvinceCode(String provinceCode) {
+        this.provinceCode = provinceCode;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getCityCode() {
+        return cityCode;
+    }
+
+    public void setCityCode(String cityCode) {
+        this.cityCode = cityCode;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getDistrictCode() {
+        return districtCode;
+    }
+
+    public void setDistrictCode(String districtCode) {
+        this.districtCode = districtCode;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUserId() {
+        return insertUserId;
+    }
+
+    public void setInsertUserId(Integer insertUserId) {
+        this.insertUserId = insertUserId;
+    }
+
+    @Override
+    public String toString() {
+        return "Site{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", province='" + province + '\'' +
+                ", provinceCode='" + provinceCode + '\'' +
+                ", city='" + city + '\'' +
+                ", cityCode='" + cityCode + '\'' +
+                ", district='" + district + '\'' +
+                ", districtCode='" + districtCode + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                ", insertUserId=" + insertUserId +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ILineService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ILineService.java
new file mode 100644
index 0000000..c171276
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ILineService.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.crossCity.server;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.crossCity.model.Line;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ILineService extends IService<Line> {
+
+
+    /**
+     * 根据站点id获取线路数据
+     * @param startId
+     * @param endId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryLines(Integer startId, Integer endId, Integer driverId) throws Exception;
+
+
+
+    /**
+     * 根据站点id获取线路数据
+     * @param driverId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> scanCodeQueryLines(Integer driverId) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ILineSiteService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ILineSiteService.java
new file mode 100644
index 0000000..65f0b7d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ILineSiteService.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.crossCity.server;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.crossCity.model.LineSite;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ILineSiteService extends IService<LineSite> {
+
+
+    /**
+     * 根据线路获取排班数据
+     * @param lineId
+     * @param day
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryDriver(Integer lineId, String day, Integer driverId) throws Exception;
+
+
+    /**
+     * 根据司机排班数据id获取数据(剩余座位号和总座位数)
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> querySeat(Integer id) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java
new file mode 100644
index 0000000..cc106a2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java
@@ -0,0 +1,261 @@
+package com.stylefeng.guns.modular.crossCity.server;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderCrossCityService extends IService<OrderCrossCity> {
+
+
+    /**
+     * 计算支付金额
+     * @param startLonLat
+     * @param endLonLat
+     * @param peopleNumber
+     * @param travelMode
+     * @param lineId
+     * @param serverCarModelId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil queryOrderMoney(String startLonLat, String endLonLat, Integer peopleNumber, Integer travelMode, Integer lineId,
+                               Integer serverCarModelId, Integer totalSeat, String seatNumber) throws Exception;
+
+
+
+
+    /**
+     * 获取用户余额和可用优惠券数量
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception;
+
+
+
+
+    /**
+     * 获取优惠券列表
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+
+    /**
+     * 订单完成支付订单操作
+     * @param payType
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil payCrossCityOrder(Integer payType, Integer orderId, Integer couponId, Integer type)throws Exception;
+
+
+
+    /**
+     * 支付完成后的订单处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payOrderCrossCityCallback(Integer id, String order_id, Integer type) throws Exception;
+
+
+    /**
+     * 用户跨城下单操作
+     * @param orderCrossCityWarpper
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception;
+
+
+
+
+    /**
+     * 获取订单数据
+     * @param uid
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    List<OrderCrossCity> queryOrder(Integer uid, Integer...state) throws Exception;
+
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(Integer orderId) throws Exception;
+
+
+
+    /**
+     * 获取取消订单需要支付的金额
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception;
+
+
+
+    /**
+     * 取消订单操作
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    ResultUtil cancleOrderCrossCity(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception;
+
+
+    /**
+     * 删除定时任务
+     * @param orderId
+     * @throws Exception
+     */
+    void deleteTask(Integer orderId) throws Exception;
+
+
+
+    /**
+     * 评论成功后获取红包金额
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception;
+
+
+    /**
+     * 分享成功后添加红包
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil shareRedEnvelope(Integer orderId) throws Exception;
+
+
+
+    /**
+     * 取消订单支付后的处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payCancelOrderCrossCity(Integer id, String order_id, Integer type) throws Exception;
+
+
+
+    /**
+     * 获取员工的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyTravelRecord(@Param("uid") Integer uid);
+
+
+
+    /**
+     * 获取用户端发票页面中的订单列表数据
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney,
+                                                Double endMoney, Integer uid) throws Exception;
+
+
+
+    /**
+     * 添加取消
+     * @param id
+     * @param reason
+     * @param remark
+     * @param uid
+     * @throws Exception
+     */
+    ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception;
+
+
+    /**
+     * 摆渡下单
+     * @param serverCarModelIds
+     * @param travelTime
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @return
+     */
+    ResultUtil<BaseWarpper> saveOrderFerry(String serverCarModelIds, Date travelTime, String placementLon, String placementLat, String startLon,
+                                           String startLat, String startAddress, String endLon, String endLat, String endAddress,
+                                           Integer crossCityOrderId, Integer place, Integer orderSource, Integer uid,String name ,String phone) throws Exception;
+
+
+
+    void pushOrder(List<Map<String, Integer>> list) throws Exception;
+
+
+
+    List<OrderCrossCity> queryListOrder(Integer driverId, Integer lineShiftId, List<Integer> state, String day) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ISiteService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ISiteService.java
new file mode 100644
index 0000000..8a008f5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/ISiteService.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.modular.crossCity.server;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.crossCity.model.Site;
+import com.stylefeng.guns.modular.crossCity.warpper.SiteWarpper;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ISiteService extends IService<Site> {
+
+
+    /**
+     * 获取所有站点
+     * @return
+     * @throws Exception
+     */
+    List<SiteWarpper> querySite(Integer startSiteId) throws Exception;
+
+
+    /**
+     * 根据站点获取地点区域数据
+     * @param siteId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryLocation(Integer siteId) throws Exception;
+
+
+    /**
+     * 判断坐标点是否在站点范围内
+     * @param siteId
+     * @param code
+     * @param lonLat
+     * @return
+     * @throws Exception
+     */
+    boolean areaMonitoring(Integer siteId, String code, String lonLat) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineServiceImpl.java
new file mode 100644
index 0000000..12149ad
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineServiceImpl.java
@@ -0,0 +1,73 @@
+package com.stylefeng.guns.modular.crossCity.server.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.crossCity.dao.LineMapper;
+import com.stylefeng.guns.modular.crossCity.model.Line;
+import com.stylefeng.guns.modular.crossCity.server.ILineService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class LineServiceImpl extends ServiceImpl<LineMapper, Line> implements ILineService {
+
+    @Resource
+    private LineMapper lineMapper;
+
+
+    /**
+     * 根据站点id获取线路
+     * @param startId
+     * @param endId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryLines(Integer startId, Integer endId, Integer driverId) throws Exception {
+        List<Map<String, Object>> list1 = lineMapper.queryLines(startId, 1);
+        List<Map<String, Object>> list2 = lineMapper.queryLines(endId, 2);
+        List<Map<String, Object>> list = new ArrayList<>();
+        for(Map<String, Object> map1 : list1){
+            Integer id1 = Integer.valueOf(map1.get("id").toString());
+            for(Map<String, Object> map2 : list2){
+                Integer id2 = Integer.valueOf(map2.get("id").toString());
+                if(id1.compareTo(id2) == 0){
+                    map1.put("startAddress", map1.get("siteName"));
+                    map1.put("endAddress", map2.get("siteName"));
+                    list.add(map1);
+                }
+            }
+        }
+        if(null != driverId){
+            List<Map<String, Object>> lists = new ArrayList<>();
+            List<Map<String, Object>> list3 = lineMapper.scanCodeQueryLines(driverId);
+            for(Map<String, Object> map1 : list){
+                Integer id2 = Integer.valueOf(map1.get("id").toString());
+                for(Map<String, Object> map : list3){
+                    Integer id1 = Integer.valueOf(map.get("id").toString());
+                    if(id1.compareTo(id2) == 0){
+                        lists.add(map1);
+                    }
+                }
+            }
+            list = lists;
+        }
+        return list;
+    }
+
+
+    /**
+     * 扫码获取司机的所有线路
+     * @param driverId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> scanCodeQueryLines(Integer driverId) throws Exception {
+        return lineMapper.scanCodeQueryLines(driverId);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineSiteServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineSiteServiceImpl.java
new file mode 100644
index 0000000..2261739
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineSiteServiceImpl.java
@@ -0,0 +1,158 @@
+package com.stylefeng.guns.modular.crossCity.server.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.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper;
+import com.stylefeng.guns.modular.crossCity.dao.LineShiftMapper;
+import com.stylefeng.guns.modular.crossCity.dao.LineSiteMapper;
+import com.stylefeng.guns.modular.crossCity.model.LineShift;
+import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver;
+import com.stylefeng.guns.modular.crossCity.model.LineSite;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.ILineSiteService;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.util.RedisUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.util.SystemException;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+@Service
+public class LineSiteServiceImpl extends ServiceImpl<LineSiteMapper, LineSite> implements ILineSiteService {
+
+    @Resource
+    private LineSiteMapper lineSiteMapper;
+
+    @Resource
+    private LineShiftDriverMapper lineShiftDriverMapper;
+
+    @Resource
+    private LineShiftMapper lineShiftMapper;
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+
+
+    /**
+     * 根据线路id获取排班数据
+     * @param lineId
+     * @param day
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryDriver(Integer lineId, String day, Integer driverId) throws Exception {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar c = Calendar.getInstance();
+        c.setTime(new Date());
+        c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+        c.set(Calendar.MILLISECOND, 0);
+        if(c.getTimeInMillis() > sdf.parse(day).getTime()){
+            throw new SystemException("日期不能小于当天");
+        }
+        List<Map<String, Object>> list = new ArrayList<>();
+        List<LineShift> lineShifts = lineShiftMapper.queryByLineId(lineId);
+        List<Map<String, Object>> s = lineSiteMapper.queryDriver(lineId, sdf.parse(day), driverId);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(sdf.parse(day));
+        String vehicle = redisUtil.getValue("VEHICLE");
+        List<Integer> integers = new ArrayList<>();
+        if(ToolUtil.isNotEmpty(vehicle)){
+            integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
+        }
+        for(LineShift lineShift : lineShifts){
+            boolean b = true;
+            String[] split = lineShift.getEndTime().split(":");
+            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
+            calendar.set(Calendar.MINUTE, Integer.valueOf(split[1]));
+            if(calendar.getTimeInMillis() < System.currentTimeMillis()){//结束时间小于当前时间不显示
+                continue;
+            }
+
+            Map<String, Object> data = new HashMap<>();
+            for(Map<String, Object> map : s){
+                //先判断司机是否在限制接单范围内
+                boolean bo = false;
+                for(Integer integer : integers){
+                    if(integer.compareTo(Integer.valueOf(map.get("driverId").toString())) == 0){
+                        bo = true;
+                        break;
+                    }
+                }
+                if(bo){
+                    continue;
+                }
+
+
+                int i = orderTaxiService.selectCount(new EntityWrapper<OrderTaxi>().eq("driverId", map.get("driverId")).in("state", Arrays.asList(2, 3, 4, 5, 11)).eq("DATE_FORMAT(travelTime, '%Y-%m-%d')", day));
+                if(i > 0){
+                    continue;
+                }
+                i = orderPrivateCarService.selectCount(new EntityWrapper<OrderPrivateCar>().eq("driverId", map.get("driverId")).in("state", Arrays.asList(2, 3, 4, 5, 11)).eq("DATE_FORMAT(travelTime, '%Y-%m-%d')", day));
+                if(i > 0){
+                    continue;
+                }
+                List<OrderCrossCity> driverId1 = orderCrossCityService.queryListOrder(Integer.valueOf(map.get("driverId").toString()), lineShift.getId(), Arrays.asList(5), day);
+                if(driverId1.size() > 0){
+                    continue;
+                }
+                if(Integer.valueOf(map.get("laveSeat").toString()) <= 0){
+                    continue;
+                }
+                if(lineShift.getId().intValue() == Integer.valueOf(map.get("id").toString()).intValue()){
+                    b = false;
+                    String content = map.get("content").toString();
+                    JSONObject jsonObject = JSON.parseObject(content);
+                    map.put("price", jsonObject.getString("num1"));
+                    data = map;
+                    list.add(data);
+                }
+            }
+            if(b){
+                data.put("id", lineShift.getId());
+                data.put("startTime", lineShift.getStartTime());
+                list.add(data);
+            }
+        }
+        return list;
+    }
+
+
+    /**
+     * 根据司机排班数据id获取数据(剩余座位号和总座位数)
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> querySeat(Integer id) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(id);
+        map.put("totalNumber", lineShiftDriver.getTotalSeat());
+        map.put("number", lineShiftDriver.getLaveSeat());
+        map.put("content", lineShiftDriver.getLaveSeatNumber());
+        return map;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
new file mode 100644
index 0000000..05bf746
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -0,0 +1,1842 @@
+package com.stylefeng.guns.modular.crossCity.server.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.crossCity.dao.LinePriceMapper;
+import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper;
+import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
+import com.stylefeng.guns.modular.crossCity.model.Line;
+import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.ILineService;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper;
+import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.specialTrain.server.impl.OrderPrivateCarServiceImpl;
+import com.stylefeng.guns.modular.system.dao.*;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+import com.stylefeng.guns.modular.taxi.model.TransactionDetails;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import com.stylefeng.guns.modular.taxi.service.impl.OrderTaxiServiceImpl;
+import io.swagger.models.auth.In;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.util.*;
+
+import static com.stylefeng.guns.modular.taxi.service.impl.OrderTaxiServiceImpl.orderIds;
+
+
+@Service
+@Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+public class OrderCrossCityServiceImpl extends ServiceImpl<OrderCrossCityMapper, OrderCrossCity> implements IOrderCrossCityService {
+
+    @Resource
+    private OrderCrossCityMapper orderCrossCityMapper;
+
+    @Resource
+    private LinePriceMapper linePriceMapper;
+
+    @Resource
+    private UserActivityDiscount1Mapper userActivityDiscount1Mapper;
+
+    @Resource
+    private SysIntegralMapper sysIntegralMapper;
+
+    @Resource
+    private LineShiftDriverMapper lineShiftDriverMapper;
+
+    @Resource
+    private OrderPrivateCarMapper orderPrivateCarMapper;
+
+    @Resource
+    private OrderTaxiMapper orderTaxiMapper;
+
+    @Resource
+    private RegionMapper regionMapper;
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    @Autowired
+    private IUserRedPacketRecordService userRedPacketRecordService;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+//
+//    @Autowired
+//    private ICBCPayUtil icbcPayUtil;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private ILineService lineService;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private ChinaMobileUtil chinaMobileUtil;
+
+    @Autowired
+    private GDFalconUtil gdFalconUtil;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private ICancleOrderService cancleOrderService;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private RestTemplate internalRestTemplate;
+
+    @Autowired
+    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
+
+    @Autowired
+    private IOrderPositionService orderPositionService;
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private ICompanyCityService companyCityService;
+
+    @Autowired
+    private IPushOrderService pushOrderService;
+
+    @Autowired
+    private IOpenCityService openCityService;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+    @Autowired
+    private IOrderFrequentPassengersService orderFrequentPassengersService;
+
+    @Value("${callbackPath}")
+    private String callbackPath;
+
+    public Map<String, Thread> threadMap = new HashMap<>();
+
+    //存储摆渡车无接单后推送标识,实现多个类型的摆渡车订单无人接单后只给前端推送一次
+    public static Map<Integer, Boolean> pushEndMap = new HashMap<>();
+
+
+
+
+
+
+    /**
+     * 计算支付金额
+     * @param startLonLat
+     * @param endLonLat
+     * @param peopleNumber
+     * @param travelMode
+     * @param lineId
+     * @param serverCarModelId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil queryOrderMoney(String startLonLat, String endLonLat, Integer peopleNumber, Integer travelMode, Integer lineId,
+                                      Integer serverCarModelId, Integer totalSeat, String seatNumber) throws Exception {
+        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLonLat, endLonLat, 1);//调用高德计算距离
+        if(null != distance){
+            return this.getPrice(Double.valueOf(distance.get("distance")), peopleNumber, travelMode, lineId, serverCarModelId, totalSeat, seatNumber);
+        }
+        return ResultUtil.error("计算行程距离出错啦!");
+    }
+
+    /**
+     * 获取用户余额和可用优惠券数量
+     * @param orderId
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        map.put("balance", userInfo.getBalance());
+        OrderCrossCity orderCrossCity = this.selectById(orderId);
+        int i = userCouponRecordService.queryAvailable(uid, orderCrossCity.getCompanyId(), 1, 3, orderCrossCity.getOrderMoney());
+        i = i + userCouponRecordService.queryAvailable(uid, orderCrossCity.getCompanyId(), 1, 0, orderCrossCity.getOrderMoney());
+        map.put("coupon", i);
+        return map;
+    }
+
+
+    /**
+     * 获取支付页面的优惠券列表
+     * @param orderId
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(orderId);
+        List<Map<String, Object>> list = userCouponRecordService.queryCoupon(uid, orderCrossCity.getCompanyId(), 1, 3, orderCrossCity.getOrderMoney(), pageNum, size);
+        List<Map<String, Object>> list1 = userCouponRecordService.queryCoupon(uid, orderCrossCity.getCompanyId(), 1, 0, orderCrossCity.getOrderMoney(), pageNum, size);
+        list.addAll(list1);
+        return list;
+    }
+
+
+    /**
+     * 订单支付
+     * @param payType
+     * @param orderId
+     * @param couponId
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil payCrossCityOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(orderId);
+        if(orderCrossCity.getState() != 7){
+            return ResultUtil.error("订单已完成支付,不允许重复支付");
+        }
+        Integer uid = orderCrossCity.getUserId();
+        Double orderMoney = orderCrossCity.getOrderMoney();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+        orderCrossCity.setCouponMoney(0D);//初始化历史数据
+        orderCrossCity.setCouponId(null);
+
+        //计算优惠券
+        UserCouponRecord userCouponRecord = null;
+        if(null != couponId){
+            userCouponRecord = userCouponRecordService.selectById(couponId);
+            if(userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()){
+                return ResultUtil.error("优惠券不能用于此订单");
+            }
+            if(userCouponRecord.getState() == 2){
+                return ResultUtil.error("优惠券已使用");
+            }
+            if(userCouponRecord.getState() == 3){
+                return ResultUtil.error("优惠券已过期");
+            }
+            if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3){
+                return ResultUtil.error("优惠券不能用于此类型订单");
+            }
+            if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){
+                return ResultUtil.error("优惠券不能用于此订单");
+            }
+            orderMoney = orderMoney - userCouponRecord.getMoney();
+            orderCrossCity.setCouponMoney(userCouponRecord.getMoney());
+            orderCrossCity.setCouponId(couponId);
+        }
+
+        //计算红包
+        UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney);
+        if(null != query && orderMoney.compareTo(query.getMoney()) > 0){
+            orderMoney = orderMoney - query.getMoney();
+            orderCrossCity.setRedPacketMoney(query.getMoney());
+            orderCrossCity.setRedPacketId(query.getId());
+        }
+
+        //计算折扣
+//        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId());
+//        if(null != query2){
+//            Double special = query2.getSpecial();
+//            orderCrossCity.setDiscount(special);
+//            double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+//            if(orderMoney.compareTo(v) > 0){
+//                orderCrossCity.setDiscountMoney(orderMoney - v);
+//                orderCrossCity.setActivityId(query2.getId());
+//                orderMoney = v;
+//            }
+//        }
+
+        if(payType == 1){//微信支付
+            String app = type == 1 ? "APP" : "JSAPI";
+            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
+            paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, "", 1);//添加预支付数据
+        }
+        if(payType == 2){//支付宝支付
+            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
+            paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, "", 1);//添加预支付数据
+        }
+
+
+//        if(payType == 1){//微信支付
+//            String value = redisUtil.getValue("appletOpenId");
+//            String appletsOpenId = null;
+//            if(ToolUtil.isNotEmpty(value)){
+//                JSONObject jsonObject = JSON.parseObject(value);
+//                appletsOpenId = jsonObject.getString(uid.toString());
+//            }else{
+//                appletsOpenId = userInfo.getAppletsOpenId();
+//            }
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+//        if(payType == 2){//支付宝支付
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+        if(payType == 3){//余额支付
+            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
+                return ResultUtil.error("余额不足,无法完成支付");
+            }
+
+            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+
+            SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * (null == query1 ? 0 : query1.getIntegral())));//积分
+
+            //添加交易明细
+            transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 3, orderId);
+            userInfoService.updateById(userInfo);
+
+            orderCrossCity.setState(2);//跨城支付完成后才开始服务
+            orderCrossCity.setPayType(3);
+            orderCrossCity.setPayMoney(orderMoney);
+
+            //处理优惠券和红包
+            if(null != userCouponRecord){
+                userCouponRecord.setState(2);
+                userCouponRecord.setEndTime(new Date());
+                userCouponRecordService.updateById(userCouponRecord);
+            }
+            if(null != query){
+                query.setState(2);
+                query.setEndTime(new Date());
+                userRedPacketRecordService.updateById(query);
+            }
+
+            //添加已收入明细
+            Line line = lineService.selectById(orderCrossCity.getLineId());
+            Double speMoney = Double.valueOf(line.getRakeRate());
+            BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入
+            BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入
+            incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue());
+            incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue());
+            Driver driver = driverService.selectById(orderCrossCity.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
+                    pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
+                    pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);
+                }
+            }).start();
+
+            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1);
+        }
+
+        this.updateAllColumnById(orderCrossCity);
+        return resultUtil;
+    }
+
+
+    /**
+     * 支付成功后的回调操作
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    @Override
+    public void payOrderCrossCityCallback(Integer id, String order_id, Integer type) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(id);
+        PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, Integer.valueOf(id), 3, type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderCrossCity.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, 3, query.getOrderId());
+            orderCrossCity.setState(2);//先支付再服务
+            orderCrossCity.setPayType(type);
+            orderCrossCity.setPayMoney(query.getAmount());
+            this.updateById(orderCrossCity);
+
+            UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
+            SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue()
+                    * (null == query1 ? 0 : query1.getIntegral())));//积分
+            userInfoService.updateById(userInfo);
+
+            //处理优惠券和红包
+            if(null != orderCrossCity.getCouponId()){
+                UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderCrossCity.getCouponId());
+                userCouponRecord.setState(2);
+                userCouponRecord.setEndTime(new Date());
+                userCouponRecordService.updateById(userCouponRecord);
+            }
+            if(null != orderCrossCity.getRedPacketId()){
+                UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderCrossCity.getRedPacketId());
+                userRedPacketRecord.setState(2);
+                userRedPacketRecord.setEndTime(new Date());
+                userRedPacketRecordService.updateById(userRedPacketRecord);
+            }
+
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            //添加已收入明细
+            Line line = lineService.selectById(orderCrossCity.getLineId());
+            Double speMoney = Double.valueOf(line.getRakeRate());
+            BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入
+            BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入
+            incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue());
+            incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue());
+            Driver driver = driverService.selectById(orderCrossCity.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
+                    pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
+                    pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);
+                }
+            }).start();
+
+
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId(), 1);
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+    @Resource
+    private DriverWorkMapper driverWorkMapper;
+
+    /**
+     * 跨城下单操作
+     * @param orderCrossCityWarpper
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception {
+        /**
+         * 1.下了即时单就不能下预约单和即时单
+         * 2.下了预约单和再下一张即时单不能再下预约单
+         */
+        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+        List<OrderCrossCity> orderCrossCities1 = orderCrossCityMapper.queryByState(uid, 1, 2, 3, 4, 5, 7, 11);
+        if(orderCrossCities1.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+
+        List<OrderCrossCity> orderCrossCities2 = orderCrossCityMapper.queryOrders(orderCrossCityWarpper.getDriverId(), orderCrossCityWarpper.getLineShiftDriverId(), Arrays.asList(5));
+        if(orderCrossCities2.size() > 0){
+            return ResultUtil.error("司机正在服务中");
+        }
+
+        /**
+         * 先判断司机座位数是否符合出行人数
+         */
+        LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCityWarpper.getLineShiftDriverId());
+        if(orderCrossCityWarpper.getTravelMode() == 1){//拼车判断座位数
+            if(lineShiftDriver.getLaveSeat() < orderCrossCityWarpper.getPeopleNumber()){
+                return ResultUtil.error("司机剩余座位数小于出行人数");
+            }
+        }else{
+            if(lineShiftDriver.getLaveSeat() != lineShiftDriver.getTotalSeat()){
+                return ResultUtil.error("司机车辆上已经有人占座了,不能下包车订单");
+            }
+            if(lineShiftDriver.getLaveSeat() == 0){
+                return ResultUtil.error("司机车辆没有剩余空位了");
+            }
+        }
+        Driver driver = driverService.selectById(orderCrossCityWarpper.getDriverId());
+        if(driver.getState() == 1){
+            return ResultUtil.error("司机处于离线状态");
+        }
+        DriverWork driverWork = driverWorkMapper.queryNewWork(driver.getId(), null, 1);
+        if (!driverWork.getType().contains("3")){
+            return ResultUtil.error("司机暂未开通跨城服务");
+        }
+
+
+
+        OrderCrossCity orderCrossCity = new OrderCrossCity();
+        orderCrossCity.setUserId(uid);
+        orderCrossCity.setServerCarModelId(orderCrossCityWarpper.getServerCarModelId());
+        orderCrossCity.setDriverId(orderCrossCityWarpper.getDriverId());
+        orderCrossCity.setLineId(orderCrossCityWarpper.getLineId());
+        orderCrossCity.setLineShiftDriverId(orderCrossCityWarpper.getLineShiftDriverId());
+        orderCrossCity.setCarId(orderCrossCityWarpper.getCarId());
+        orderCrossCity.setOrderNum(this.getOrderNum(orderCrossCityWarpper.getDriverId(), orderCrossCityWarpper.getLineShiftDriverId()));
+        orderCrossCity.setPlacementLon(orderCrossCityWarpper.getPlacementLon());
+        orderCrossCity.setPlacementLat(orderCrossCityWarpper.getPlacementLat());
+        String placementAddress = orderCrossCityWarpper.getPlacementAddress();
+        placementAddress = placementAddress.replaceAll("& #40;", "(");
+        placementAddress = placementAddress.replaceAll("& #41;", ")");
+        orderCrossCity.setPlacementAddress(placementAddress);
+        orderCrossCity.setStartLon(orderCrossCityWarpper.getStartLon());
+        orderCrossCity.setStartLat(orderCrossCityWarpper.getStartLat());
+        String startAddress = orderCrossCityWarpper.getStartAddress();
+        startAddress = startAddress.replaceAll("& #40;", "(");
+        startAddress = startAddress.replaceAll("& #41;", ")");
+        orderCrossCity.setStartAddress(startAddress);
+        orderCrossCity.setEndLon(orderCrossCityWarpper.getEndLon());
+        orderCrossCity.setEndLat(orderCrossCityWarpper.getEndLat());
+        String endAddress = orderCrossCityWarpper.getEndAddress();
+        endAddress = endAddress.replaceAll("& #40;", "(");
+        endAddress = endAddress.replaceAll("& #41;", ")");
+        orderCrossCity.setEndAddress(endAddress);
+        orderCrossCity.setMileage(0D);
+        ResultUtil<Map<String, Object>> price = this.getPrice(orderCrossCityWarpper.getDistance(), orderCrossCityWarpper.getPeopleNumber(), orderCrossCityWarpper.getTravelMode(), orderCrossCityWarpper.getLineId(),
+                orderCrossCityWarpper.getServerCarModelId(), orderCrossCityWarpper.getTotalSeat(), orderCrossCityWarpper.getSeatNumber());
+        Double money = Double.valueOf(price.getData().get("price").toString());
+        orderCrossCity.setOrderMoney(money);
+        Integer companyId = driver.getCompanyId();
+        orderCrossCity.setCompanyId(companyId);
+        UserInfo userInfo = userInfoService.selectById(uid);
+        orderCrossCity.setPassengers(userInfo.getNickName());
+        orderCrossCity.setPassengersPhone(userInfo.getPhone());
+        orderCrossCity.setPeopleNumber(orderCrossCityWarpper.getPeopleNumber());
+        orderCrossCity.setSeatNumber(orderCrossCityWarpper.getSeatNumber());
+        List<OrderCrossCity> orderCrossCities = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderCrossCity.getOrderNum()).eq("isDelete", 1));
+        orderCrossCity.setSort(orderCrossCities.size() + 1);
+        orderCrossCity.setState(7);//待支付
+        orderCrossCity.setInsertTime(new Date());
+        orderCrossCity.setTravelTime(orderCrossCityWarpper.getTravelTime());
+        orderCrossCity.setSnatchOrderTime(new Date());
+        orderCrossCity.setTravelMode(orderCrossCityWarpper.getTravelMode());
+        orderCrossCity.setOrderSource(orderCrossCityWarpper.getOrderSource());
+        orderCrossCity.setIsDelete(1);
+        orderCrossCity.setRemark(orderCrossCityWarpper.getRemark());
+        orderCrossCity.setIsReassign(1);
+        //调用高德创建轨迹
+        String s = gdFalconUtil.selectTerminal(driver.getPhone());
+        String track = gdFalconUtil.createTrack(s);
+        orderCrossCity.setTrackId(track);
+        if(orderCrossCity.getTravelMode() == 2){//包车
+            orderCrossCity.setSeatNumber(lineShiftDriver.getLaveSeatNumber());
+            orderCrossCity.setPeopleNumber(lineShiftDriver.getLaveSeat());
+        }
+
+        //调用移动的小号接口
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
+        Region region = regionMapper.query(geocode.get("districtCode"));
+//        Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderCrossCity.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1)));
+//        if(String.valueOf(map.get("code")).equals("200")){
+//            orderCrossCity.setTelX(map.get("telX"));
+//            orderCrossCity.setBindId(map.get("bindId"));
+//        }
+        this.insert(orderCrossCity);
+
+        if(ToolUtil.isNotEmpty(orderCrossCityWarpper.getFrequentPassengersId())){
+            List<Integer> list1 = JSON.parseArray(orderCrossCityWarpper.getFrequentPassengersId(), Integer.class);
+            for (Integer integer : list1) {
+                OrderFrequentPassengers orderFrequentPassengers = new OrderFrequentPassengers();
+                orderFrequentPassengers.setOrderId(orderCrossCity.getId());
+                orderFrequentPassengers.setOrderType(3);
+                orderFrequentPassengers.setFrequentPassengersId(integer);
+                orderFrequentPassengersService.insert(orderFrequentPassengers);
+            }
+        }
+
+        if(orderCrossCity.getTravelTime().getTime() < System.currentTimeMillis() + 600000){
+            driver.setState(3);
+            driverService.updateById(driver);
+        }
+
+        //修改预约班次的数据
+        if(orderCrossCity.getTravelMode() == 2){//包车
+            lineShiftDriver.setLaveSeat(0);
+            lineShiftDriver.setLaveSeatNumber("");
+        }else{//拼车
+            lineShiftDriver.setLaveSeat((lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber()) < 0 ? 0 : lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber());
+            String[] split = orderCrossCity.getSeatNumber().split(",");
+            String[] split1 = lineShiftDriver.getLaveSeatNumber().split(",");
+            String seatNumber = "";
+            //先判断选中座位号和剩余座位号是否匹配
+            for(String spl : split){
+                boolean b = true;
+                for(String sp : split1){
+                    if(ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)){
+                        b = false;
+                        break;
+                    }
+                }
+                if(b){
+                    throw new SystemException("您选中的" + spl + "号座位已被占用,请选择其他座位!");
+                }
+            }
+            for(String sp : split1){
+                boolean b = true;
+                for(String spl : split){
+                    if(ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)){
+                        b = false;
+                        break;
+                    }
+                }
+                if(b && ToolUtil.isNotEmpty(sp)){
+                    seatNumber += (sp + ",");
+                }
+            }
+            lineShiftDriver.setLaveSeatNumber((ToolUtil.isNotEmpty(seatNumber) && seatNumber.length() > 0) ?
+                    seatNumber.substring(0, seatNumber.length() - 1) : "");
+        }
+        lineShiftDriverMapper.updateById(lineShiftDriver);
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功!", orderCrossCity.getUserId(), 1);
+
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(orderCrossCity.getId());
+
+        //创建定时任务,取消订单30分钟
+        TimerTask timerTask = new TimerTask() {
+            @Override
+            public void run() {
+                OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId());
+                if(orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null){
+                    orderCrossCity1.setState(10);
+                    orderCrossCityMapper.updateById(orderCrossCity1);
+
+                    OrderCancel orderCancel = new OrderCancel();
+                    orderCancel.setOrderId(orderCrossCity.getId());
+                    orderCancel.setOrderType(3);
+                    orderCancel.setReason("用户未及时付款,系统自动取消订单");
+                    orderCancel.setRemark("用户未及时付款,系统自动取消订单");
+                    orderCancel.setState(2);
+                    orderCancel.setInsertTime(new Date());
+                    orderCancel.setUserType(2);
+                    orderCancelService.insert(orderCancel);
+
+                    //修改司机座位
+                    LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
+                    lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
+                    lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber());
+                    lineShiftDriverMapper.updateById(lineShiftDriver);
+
+                    //修改司机为空闲
+                    List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
+                    if(orderCrossCities.size() == 0){
+                        Driver driver = driverService.selectById(orderCrossCity.getDriverId());
+                        driver.setState(2);
+                        driverService.updateById(driver);
+                    }
+                }
+            }
+        };
+        Timer timer = new Timer();
+        timer.schedule(timerTask, 30 * 60 * 1000);
+
+        return ResultUtil.success(baseWarpper);
+    }
+
+
+    /**
+     * 获取订单
+     * @param uid
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<OrderCrossCity> queryOrder(Integer uid, Integer... state) throws Exception {
+        return orderCrossCityMapper.queryByState(uid, state);
+    }
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
+        Map<String, Object> map = orderCrossCityMapper.queryOrderInfo(orderId);
+        if(null != map.get("reassignNotice") && Integer.valueOf(String.valueOf(map.get("reassignNotice"))) == 2){//改派完成,重新获取了新的司机数据,开始修改数据防止继续调用
+            OrderCrossCity orderCrossCity = this.selectById(orderId);
+            orderCrossCity.setReassignNotice(0);
+            this.updateById(orderCrossCity);
+        }
+        if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
+            map.put("state", map.get("oldState"));
+        }
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(map.get("startLon").toString(), map.get("startLat").toString());
+        map.put("startCity", geocode.get("city"));
+        geocode = gdMapGeocodingUtil.geocode(map.get("endLon").toString(), map.get("endLat").toString());
+        map.put("endCity", geocode.get("city"));
+
+        String driverId = redisUtil.getValue("DEVICE_" + map.get("driverId"));
+        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
+        map.put("orderType", 3);
+        return map;
+    }
+
+    /**
+     * 获取取消订单的支付费用
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(id);
+        if(null == orderCrossCity){
+            return ResultUtil.error("获取数据失败,订单信息有误");
+        }
+        double amount = 0;
+        CancleOrder query = cancleOrderService.query(1, 3, orderCrossCity.getCompanyId());
+        if(null != orderCrossCity.getDriverId() &&
+                (orderCrossCity.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况
+            if(null != query){
+                amount += query.getMoney();
+            }
+        }
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setAmount(amount);
+        return ResultUtil.success(baseWarpper);
+    }
+
+
+    /**
+     * 取消订单操作
+     * @param id
+     * @param payType
+     * @param cancleId
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil cancleOrderCrossCity(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(id);
+        Integer uid = orderCrossCity.getUserId();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+
+        if(null == orderCrossCity){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderCrossCity.getState() != 12){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+        OrderCancel orderCancel = null;
+        if(null == cancleId){
+            orderCancel = orderCancelService.query(id, 3, null, null, 1);
+        }else{
+            orderCancel = orderCancelService.selectById(cancleId);
+        }
+
+        CancleOrder query = cancleOrderService.query(1, 3, orderCrossCity.getCompanyId());
+        if(null != query){
+            if(payType == 1){//微信支付
+                String value = redisUtil.getValue("appletOpenId");
+                String appletsOpenId = null;
+                if(ToolUtil.isNotEmpty(value)){
+                    JSONObject jsonObject = JSON.parseObject(value);
+                    appletsOpenId = jsonObject.getString(uid.toString());
+                }else{
+                    appletsOpenId = userInfo.getAppletsOpenId();
+                }
+                orderCancel.setPayType(1);
+                orderCancelService.updateById(orderCancel);
+
+                String app = type == 1 ? "APP" : "JSAPI";
+                resultUtil = payMoneyUtil.weixinpay("订单取消", "", id + "_3_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/wxCancelOrderTaxi", app, userInfo.getAppletsOpenId());
+                paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 1, query.getMoney(), "", 1);//添加预支付数据
+
+//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",3", 9, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/wxCancelOrderTaxi", "", type, appletsOpenId);
+//                if(map.get("code").equals("200")){
+//                    paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 1, query.getMoney(), map.get("order_id"), 1);//添加预支付数据
+//                    resultUtil = ResultUtil.success(map.get("data"));
+//                }else{
+//                    resultUtil = ResultUtil.error(map.get("msg"), "");
+//                }
+            }
+            if(payType == 2){//支付宝支付
+                orderCancel.setPayType(2);
+                orderCancelService.updateById(orderCancel);
+
+                resultUtil = payMoneyUtil.alipay("订单取消", "订单取消", "", id + "_3_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/aliCancelOrderTaxi");
+                paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 2, query.getMoney(), "", 1);//添加预支付数据
+
+//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",3", 10, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/aliCancelOrderTaxi", "", type, null);
+//                if(map.get("code").equals("200")){
+//                    paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 2, query.getMoney(), map.get("order_id"), 1);//添加预支付数据
+//                    resultUtil = ResultUtil.success(map.get("data"));
+//                }else{
+//                    resultUtil = ResultUtil.error(map.get("msg"), "");
+//                }
+            }
+            if(payType == 3){//余额支付
+                if(userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()){
+                    return ResultUtil.error("余额不足,无法完成支付");
+                }
+
+                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                //添加交易明细
+                transactionDetailsService.saveData(uid, "取消订单", query.getMoney(), 2, 1, 1, 3, id);
+                userInfoService.updateById(userInfo);
+
+                //解除小号绑定
+                if(orderCrossCity.getBindId() != null){
+                    chinaMobileUtil.midAxbUnBindSend(orderCrossCity.getBindId());
+                }
+
+                orderCrossCity.setState(10);
+                orderCrossCity.setTelX("");
+                orderCrossCity.setBindId("");
+                this.updateById(orderCrossCity);
+
+                orderCancel.setState(2);
+                orderCancel.setPayType(3);
+                orderCancelService.updateById(orderCancel);
+
+                //添加已收入明细
+                incomeService.saveData(1, orderCrossCity.getCompanyId(), 3, orderCrossCity.getId(), 3, query.getMoney());
+
+                this.deleteTask(id);//删除定时任务
+
+//                new Thread(new Runnable() {
+//                    @Override
+//                    public void run() {
+//                        pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
+//                    }
+//                }).start();
+
+                //添加消息
+                systemNoticeService.addSystemNotice(1, "您已使用余额成功支付取消订单费用,谢谢使用!", orderCrossCity.getUserId(), 1);
+            }
+        }
+        return resultUtil;
+    }
+
+
+    /**
+     * 计算价格
+     * @param distance
+     * @param peopleNumber
+     * @param travelMode
+     * @param lineId
+     * @param serverCarModelId
+     * @param totalSeat
+     * @param seatNumber
+     * @return
+     */
+    public ResultUtil<Map<String, Object>> getPrice(Double distance, Integer peopleNumber, Integer travelMode, Integer lineId, Integer serverCarModelId, Integer totalSeat, String seatNumber){
+        if(0 >= peopleNumber && peopleNumber > 6){
+            return ResultUtil.error("请输入正确的乘车人数");
+        }
+
+        Map<String, Object> map = new HashMap<>();
+        double distance1 = distance.doubleValue() / 1000;//公里
+        map.put("distance", distance);
+
+        /**
+         * 1.固定价格的包车是整车价格
+         * 2.五座车和七座车的优惠系数是中间特殊位置的优惠折扣
+         * 3.包车的情况不享受中间特殊位置的优惠折扣
+         * 4.浮动计费拼车如果选中中间特殊位置既享受优惠系数又享受中间特殊位置的优惠折扣
+         */
+        Map<String, Object> query = linePriceMapper.query(lineId, serverCarModelId);
+        if(null == query){
+            map.put("distance", 0);
+            map.put("price", 0);
+            return ResultUtil.success(map);
+        }
+        String content = query.get("content").toString();
+        JSONObject jsonObject = JSON.parseObject(content);
+        if(Integer.valueOf(query.get("type").toString()) == 1){//固定金额
+            double num1 = Double.valueOf(jsonObject.getString("num1")).doubleValue();
+            double num2 = Double.valueOf(jsonObject.getString("num2")).doubleValue();
+            double num3 = Double.valueOf(jsonObject.getString("num3")).doubleValue();
+            double num4 = Double.valueOf(jsonObject.getString("num4")).doubleValue();
+            if(travelMode == 1){//拼车
+                String[] split = seatNumber.split(",");
+                boolean b = false;
+                for(String s : split){
+                    if((totalSeat == 4 && s.equals("3")) || (totalSeat == 6 && s.equals("7"))){
+                        b = true;
+                        break;
+                    }
+                }
+                double price1 = 0D;
+                if(b){
+                    price1 = num1 * (totalSeat == 4 ? num3 : num4);
+                    peopleNumber -= 1;
+                }
+                double price = (num1 * peopleNumber) + price1;
+                map.put("price", new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            }else{
+                map.put("price", num2);//包车价
+            }
+
+        }else{//浮动计费
+            //计算公式:实际历程 * 基础单价 * (参考费用 / (参考里程 * 基础单价)) + (实际历程 - 参考里程) * 基础单价 * 优惠系数
+            double num1 = Double.valueOf(jsonObject.getString("num1")).doubleValue();//参考费用
+            double num2 = Double.valueOf(jsonObject.getString("num2")).doubleValue();//参考里程
+            double num3 = Double.valueOf(jsonObject.getString("num3")).doubleValue();//基础单价
+            double num4 = Double.valueOf(jsonObject.getString("num4")).doubleValue();//优惠系数
+            double num5 = Double.valueOf(jsonObject.getString("num5")).doubleValue();//包车系数
+            double num6 = Double.valueOf(jsonObject.getString("num6")).doubleValue();//五座系数
+            double num7 = Double.valueOf(jsonObject.getString("num7")).doubleValue();//七座系数
+            if(travelMode == 1){//拼车
+                double unitPrice = (distance1 * num3 * (num1 / (num2 * num3))) + ((distance1 - num2) * num3 * num4);
+                String[] split = seatNumber.split(",");
+                boolean b = false;
+                for(String s : split){
+                    if((totalSeat == 4 && s.equals("3")) || (totalSeat == 6 && s.equals("5"))){
+                        b = true;
+                        break;
+                    }
+                }
+                double price1 = 0D;
+                if(b){
+                    price1 = unitPrice * (totalSeat == 4 ? num6 : num7);
+                    peopleNumber -= 1;
+                }
+                double price = (unitPrice * peopleNumber) + price1;
+                map.put("price", new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            }else{
+                double unitPrice = (distance1 * num3 * (num1 / (num2 * num3))) + ((distance1 - num2) * num3 * num5);
+                double price = unitPrice * totalSeat;
+                map.put("price", new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            }
+        }
+        return ResultUtil.success(map);
+    }
+
+    /**
+     * 删除定时任务
+     * @param orderId
+     */
+    @Override
+    public void deleteTask(Integer orderId){
+        //发送验证码短信
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("orderId", orderId + "");
+        params.add("orderType", "3");
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = internalRestTemplate.postForObject("http://driver-server/base/netty/deleteTask", requestEntity, String.class);
+        JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+        if(jsonObject.getIntValue("code") != 200){
+            System.err.println("调用driver-server出错了");
+        }
+    }
+
+    /**
+     * 获取红包
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(orderId);
+        Integer companyId = orderCrossCity.getCompanyId();
+
+        Map<String, Object> query = userActivityRedenvelopeService.query(companyId, orderCrossCity.getTravelTime());
+        Double money = 0D;
+        BaseWarpper baseWarpper = new BaseWarpper();
+        if(null != query){
+            Integer type = Integer.valueOf(String.valueOf(query.get("type")));
+            if(type == 1){//固定金额
+                money = Double.valueOf(String.valueOf(query.get("money")));
+            }else{//随机金额
+                Double startMoney = Double.valueOf(String.valueOf(query.get("startMoney")));
+                Double endMoney = Double.valueOf(String.valueOf(query.get("endMoney")));
+                int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue();
+                Random random = new Random();
+                int num = random.nextInt(i);
+                money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+            }
+            //判断当前红包是否大于剩余可领取总金额
+            if(money.compareTo(Double.valueOf(query.get("lavePrice").toString())) > 0){
+                baseWarpper.setAmount(0D);
+                return ResultUtil.success(baseWarpper);
+            }
+        }
+        baseWarpper.setAmount(money);
+
+        if(money > 0){
+            //添加临时红包数据
+            UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
+            userRedPacketRecord.setMoney(money);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(new Date());
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(query.get("effective"))));
+            userRedPacketRecord.setExpirationTime(calendar.getTime());
+            userRedPacketRecord.setInsertTime(new Date());
+            userRedPacketRecord.setCompanyId(Integer.valueOf(String.valueOf(query.get("companyId"))));
+            userRedPacketRecord.setState(0);
+            userRedPacketRecord.setOrderId(orderCrossCity.getId());
+            userRedPacketRecord.setOrderType(3);
+            userRedPacketRecord.setUserId(orderCrossCity.getUserId());
+            userRedPacketRecordService.insert(userRedPacketRecord);
+        }
+
+        return ResultUtil.success(baseWarpper);
+    }
+
+
+    /**
+     * 分享成功后添加红包
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil shareRedEnvelope(Integer orderId) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(orderId);
+        UserRedPacketRecord query = userRedPacketRecordService.query_(orderCrossCity.getUserId(), orderCrossCity.getCompanyId(), 0, 3, null);
+        if(null != query){
+            Double money = query.getMoney();
+            Map<String, Object> map = userActivityRedenvelopeService.query(orderCrossCity.getCompanyId(), orderCrossCity.getTravelTime());
+            Double laveMoney = Double.valueOf(String.valueOf(map.get("laveMoney")));
+            if(money.compareTo(laveMoney) > 0){
+                return ResultUtil.error("手速太慢了,红包已派发完啦!");
+            }
+            //判断当前红包是否大于剩余可领取总金额
+            if(money.compareTo(Double.valueOf(map.get("lavePrice").toString())) > 0){
+                return ResultUtil.error("手速太慢了,红包已派发完啦!");
+            }
+            double v = new BigDecimal(laveMoney).subtract(new BigDecimal(money)).doubleValue();
+
+            UserActivityRedenvelope id = userActivityRedenvelopeService.selectById(String.valueOf(map.get("id")));
+            id.setLaveMoney(v);
+            id.setLavePrice(new BigDecimal(id.getLavePrice() - money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            userActivityRedenvelopeService.updateById(id);
+
+            query.setState(1);
+            query.setRedPacketActivityId(id.getId());
+            userRedPacketRecordService.updateById(query);
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 取消订单支付后的处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    @Override
+    public void payCancelOrderCrossCity(Integer id, String order_id, Integer type) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(id);
+        PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, Integer.valueOf(id), 3, type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderCrossCity.getUserId(), "取消订单", query.getAmount(), 2, 1, 1, 3, query.getOrderId());
+            orderCrossCity.setState(10);
+            //解除小号绑定
+            if(orderCrossCity.getBindId() != null){
+                chinaMobileUtil.midAxbUnBindSend(orderCrossCity.getBindId());
+            }
+            orderCrossCity.setBindId("");
+            orderCrossCity.setTelX("");
+            this.updateById(orderCrossCity);
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            OrderCancel query1 = orderCancelService.query(query.getOrderId(), query.getOrderType(), query.getAmount(), query.getPayType(), 1);
+            if (null != query1){
+                query1.setState(2);
+                orderCancelService.updateById(query1);
+            }
+
+            //添加已收入明细
+            incomeService.saveData(1, orderCrossCity.getCompanyId(), 3, orderCrossCity.getId(), 3, query.getAmount());
+
+            this.deleteTask(orderCrossCity.getId());//删除定时任务
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+//            new Thread(new Runnable() {
+//                @Override
+//                public void run() {
+//                    pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
+//                }
+//            }).start();
+
+            //添加消息
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功支付取消订单费用,谢谢使用!", orderCrossCity.getUserId(), 1);
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+
+    /**
+     * 获取个人中心订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        List<Map<String, Object>> maps = orderCrossCityMapper.queryMyOrderList(uid, pageNum, size);
+        for(Map<String, Object> map : maps){
+            if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
+                map.put("state", map.get("oldState"));
+            }
+        }
+        return maps;
+    }
+
+    @Override
+    public List<Map<String, Object>> queryMyTravelRecord(Integer uid) {
+        return orderCrossCityMapper.queryMyTravelRecord(uid);
+    }
+
+    @Override
+    public List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney, Double endMoney, Integer uid) throws Exception {
+        startTime = dateUtil.getStartOrEndDate(startTime, "start");
+        endTime = dateUtil.getStartOrEndDate(endTime, "end");
+        return orderCrossCityMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+    }
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception {
+        return orderCrossCityMapper.queryRedEnvelope(uid);
+    }
+
+
+    /**
+     * 添加跨城取消(直接取消不需要支付费用,退款)
+     * @param id
+     * @param reason
+     * @param remark
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(remark)){
+            if(ToolUtil.isNotEmpty(remark)){
+                List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+                for(SensitiveWords s : sensitiveWords){
+                    remark = remark.replaceAll(s.getContent(), "***");
+                }
+            }
+        }
+
+        OrderCrossCity orderCrossCity = this.selectById(id);
+        Integer integer = null;
+        if(null == orderCrossCity){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderCrossCity.getState() > 5 && orderCrossCity.getState() != 7 && orderCrossCity.getState() != 11){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+
+        //还原座位
+        CancleOrder query1 = cancleOrderService.query(1, 3, orderCrossCity.getCompanyId());
+        if (null != query1) {
+            integer = orderCancelService.saveData(id, 3, reason, remark, null, null, 2, 1, uid);
+            orderCrossCity.setState(10);
+            this.updateById(orderCrossCity);
+
+            if(orderCrossCity.getState() != 7){//已经支付的情况推送给司机提醒
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
+                        System.err.println("推送取消操作---------------------");
+                    }
+                }).start();
+            }
+
+            //修改司机座位
+            LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
+            lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
+            lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber());
+            lineShiftDriverMapper.updateById(lineShiftDriver);
+
+            //修改司机为空闲
+            List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
+            if(orderCrossCities.size() == 0){
+                Driver driver = driverService.selectById(orderCrossCity.getDriverId());
+                driver.setState(2);
+                driverService.updateById(driver);
+            }
+        }else{
+            return ResultUtil.error("请完善后台取消规则设置");
+        }
+
+        //已支付的情况下进行退款操作
+        if(null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()){
+            if(orderCrossCity.getPayType() == 3){//余额支付
+                UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
+                userInfo.setBalance(userInfo.getBalance() + orderCrossCity.getPayMoney());
+                userInfoService.updateById(userInfo);
+                //添加交易明细
+                transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", orderCrossCity.getPayMoney(), 1, 1, 1, 3, id);
+            }else{
+                PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2);
+                if(null == query){
+                    query = paymentRecordService.query(1, orderCrossCity.getDriverId(), 2, id, 3, orderCrossCity.getPayType(), 2);
+                    if(null == query){
+                        return ResultUtil.error("订单还未进行支付");
+                    }
+                }
+
+                if(query.getPayType() == 1){//微信
+                    Map<String, String> map = payMoneyUtil.wxRefund(query.getCode(), id + "_3", query.getAmount().toString(), query.getAmount().toString(), "/base/cancleOrderWXPay");
+                    if(!"SUCCESS".equals(map.get("return_code"))){
+                        return ResultUtil.error(map.get("return_msg"));
+                    }
+                    //添加交易明细
+                    transactionDetailsService.saveData(query.getUserId(), "跨城订单取消退款", query.getAmount(), 1, 1, query.getType(), 3, id);
+                }else{//支付宝
+                    Map<String, String> map = payMoneyUtil.aliRefund(query.getCode(), query.getAmount().toString());
+                    if(!"10000".equals(map.get("code"))){
+                        return ResultUtil.error(map.get("msg"));
+                    }
+                    //添加交易明细
+                    transactionDetailsService.saveData(query.getUserId(), "跨城订单取消退款", query.getAmount(), 1, 1, query.getType(), 3, id);
+                }
+
+
+//                PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2);
+//                if(null == query){
+//                    return ResultUtil.error("订单还未进行支付");
+//                }
+//                Map<String, Object> merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), id + "_3", orderCrossCity.getOrderNum());
+//                if(Integer.valueOf(merrefund.get("code").toString()) == 0){
+//                    Map<String, Object> refundqry = icbcPayUtil.refundqry("", query.getCode(), orderCrossCity.getOrderNum());
+//                    if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 0){//成功
+//                        //添加交易明细
+//                        transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", query.getAmount(), 1, 1, 1, 3, id);
+//                    }
+//                    if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 1){//失败
+//                        return ResultUtil.error("订单取消失败(退款不成功)");
+//                    }
+//                    if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 2){//未知
+//                        return ResultUtil.error("退款返回未知异常");
+//                    }
+//                }
+            }
+
+            //添加负的收入明细
+            List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", id).eq("orderType", 3));
+            for(Income income : incomes){
+                if(income.getUserType() == 2){//处理司机的收入
+                    Driver driver = driverService.selectById(income.getObjectId());
+                    driver.setBalance(driver.getBalance() - income.getMoney());
+                    driver.setBusinessMoney(driver.getBusinessMoney() - income.getMoney());
+                    driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
+                    driverService.updateById(driver);
+                }
+                Income income1 = new Income();
+                BeanUtils.copyProperties(income, income1);
+                income1.setMoney(income.getMoney() * -1);
+                income1.setId(null);
+                income1.setInsertTime(new Date());
+                incomeService.insert(income1);
+            }
+        }
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您已成功取消出行订单,谢谢使用!", orderCrossCity.getUserId(), 1);
+        Map<String, Object> map = new HashMap<>();
+        map.put("id", integer);
+        return ResultUtil.success(map);
+    }
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(orderId);
+        //计算预计距离和剩余时间
+        String value = redisUtil.getValue("DRIVER" + String.valueOf(orderCrossCity.getDriverId()));
+        if(null == value || "".equals(value)){
+            System.err.println("司机没有上传位置信息");
+
+            //调用获取轨迹中的数据
+            List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 3);
+            if(list.size() > 0){
+                Map<String, Object> map = list.get(list.size() - 1);
+                value = map.get("lon") + "," + map.get("lat");
+            }
+
+        }
+        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderCrossCity.getStartLon() + "," + orderCrossCity.getStartLat(), 1);
+        String d = "0";
+        String t = "0";
+        if(null == distance){
+            System.err.println("查询距离出错了");
+        }else{
+            d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
+            t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
+        }
+        OrderServerWarpper orderServerWarpper = new OrderServerWarpper();
+        orderServerWarpper.setOrderId(orderCrossCity.getId());
+        orderServerWarpper.setOrderType(3);
+        orderServerWarpper.setState(orderCrossCity.getState());
+        orderServerWarpper.setLon(null != value ? value.split(",")[0] : "0.0");
+        orderServerWarpper.setLat(null != value ? value.split(",")[1] : "0.0");
+        orderServerWarpper.setReassignNotice(orderCrossCity.getReassignNotice());
+        if(orderCrossCity.getState() == 2 || orderCrossCity.getState() == 3){//前往预约地
+            orderServerWarpper.setReservationMileage(d);
+            orderServerWarpper.setReservationTime(t);
+            orderServerWarpper.setServedMileage("0");
+            orderServerWarpper.setServedTime("0");
+            orderServerWarpper.setLaveMileage("0");
+            orderServerWarpper.setLaveTime("0");
+        }
+        if(orderCrossCity.getState() == 5 || orderCrossCity.getState() == 6){//服务中
+            distance = gdMapElectricFenceUtil.getDistance(value, orderCrossCity.getEndLon() + "," + orderCrossCity.getEndLat(), 1);
+            if(null == distance){
+                System.err.println("查询距离出错了");
+            }else{
+                d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toPlainString();
+                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
+            }
+            orderServerWarpper.setReservationMileage("0");
+            orderServerWarpper.setReservationTime("0");
+            orderServerWarpper.setServedMileage(String.valueOf(orderCrossCity.getMileage() / 1000));
+            orderServerWarpper.setServedTime(Long.valueOf((new Date().getTime() - orderCrossCity.getStartServiceTime().getTime()) / 60000).intValue() + "");
+            orderServerWarpper.setLaveMileage(d);
+            orderServerWarpper.setLaveTime(t);
+        }
+
+        return orderServerWarpper;
+    }
+
+
+    /**
+     * 摆渡下单
+     * @param serverCarModelIds
+     * @param travelTime
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @return
+     */
+    @Override
+    public ResultUtil<BaseWarpper> saveOrderFerry(String serverCarModelIds, Date travelTime, String placementLon, String placementLat, String startLon,
+                                              String startLat, String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId,
+                                                  Integer place, Integer orderSource, Integer uid,String name,String phone) throws Exception {
+        if(ToolUtil.isEmpty(serverCarModelIds)){
+            return ResultUtil.error("请选择服务车型");
+        }
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(startLon, startLat);
+        boolean b = openCityService.openCity(geocode.get("districtCode"));
+        if(!b){
+            return ResultUtil.error("起点暂未开通");
+        }
+
+        String[] split = serverCarModelIds.split(",");
+        List<Map<String, Integer>> list = new ArrayList<>();
+        Integer orderId = null;
+        for(String serverModelId : split){
+            Map<String, Integer> map = new HashMap<>();
+            if(serverModelId.equals("0")){//出租车
+                ResultUtil<BaseWarpper> resultUtil = this.orderText(travelTime, placementLon, placementLat, startLon, startLat, startAddress, endLon, endLat, endAddress, crossCityOrderId, place, orderSource, uid);
+                if(resultUtil.getCode() != 200){
+                    return resultUtil;
+                }
+                map.put("orderType", 2);
+                map.put("orderId", resultUtil.getData().getId());
+            }else{
+                ResultUtil<BaseWarpper> resultUtil = this.orderPrivateCar(Integer.valueOf(serverModelId), travelTime, placementLon, placementLat, startLon, startLat, startAddress, endLon, endLat, endAddress, crossCityOrderId, place, orderSource, uid,name,phone);
+                if(resultUtil.getCode() != 200){
+                    return resultUtil;
+                }
+                map.put("orderType", 1);
+                map.put("orderId", resultUtil.getData().getId());
+                orderId = resultUtil.getData().getId();
+            }
+            list.add(map);
+        }
+        //推单操作
+        this.pushOrder(list);
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(null == orderId ? list.get(0).get("orderId") : orderId);
+        return ResultUtil.success(baseWarpper);
+    }
+
+
+    /**
+     * 出租车摆渡单
+     * @param travelTime
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @param orderSource
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    private synchronized ResultUtil<BaseWarpper> orderText(Date travelTime, String placementLon, String placementLat, String startLon, String startLat,
+                                 String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId, Integer place, Integer orderSource, Integer uid) throws Exception{
+        //定义用户所属公司
+        OrderTaxi orderTaxi = new OrderTaxi();
+        UserInfo userInfo1 = userInfoService.selectById(uid);
+        Company query = companyCityService.query(startLon, startLat);
+        if(null == query){
+            return ResultUtil.error("出发点暂未开通");
+        }
+        if(null != userInfo1.getCompanyId() && 0 != userInfo1.getCompanyId()){
+            userInfo1.setCompanyId(query.getId());
+            userInfoService.updateById(userInfo1);
+        }
+
+        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
+            orderTaxi.setOrderType(2);
+        }
+
+        orderTaxi.setType(2);
+        orderTaxi.setCrossCityOrderId(crossCityOrderId);
+        orderTaxi.setPlace(place);
+        orderTaxi.setSubstitute(0);
+        orderTaxi.setOrderType(1);
+        orderTaxi.setOrderSource(orderSource);
+        orderTaxi.setTravelTime(travelTime);
+        orderTaxi.setPlacementLon(Double.valueOf(placementLon));
+        orderTaxi.setPlacementLat(Double.valueOf(placementLat));
+        orderTaxi.setStartLon(Double.valueOf(startLon));
+        orderTaxi.setStartLat(Double.valueOf(startLat));
+        orderTaxi.setStartAddress(startAddress);
+        orderTaxi.setEndLon(Double.valueOf(endLon));
+        orderTaxi.setEndLat(Double.valueOf(endLat));
+        orderTaxi.setEndAddress(endAddress);
+        orderTaxi.setOrderNum(orderTaxiService.getOrderNum());
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
+        orderTaxi.setPlacementAddress(geocode.get("address"));
+        String startAddress1 = orderTaxi.getStartAddress();
+        startAddress1 = startAddress1.replaceAll("& #40;", "(");
+        startAddress1 = startAddress1.replaceAll("& #41;", ")");
+        orderTaxi.setStartAddress(startAddress1);//特殊字符转义
+        String endAddress1 = orderTaxi.getEndAddress();
+        endAddress1 = endAddress1.replaceAll("& #40;", "(");
+        endAddress1 = endAddress1.replaceAll("& #41;", ")");
+        orderTaxi.setEndAddress(endAddress1);
+        orderTaxi.setUserId(uid);
+        orderTaxi.setMileage(0D);
+        orderTaxi.setOrderMoney(0D);
+        orderTaxi.setTravelMoney(0D);
+        orderTaxi.setParkMoney(0D);
+        orderTaxi.setRoadTollMoney(0D);
+        orderTaxi.setRedPacketMoney(0D);
+        orderTaxi.setCouponMoney(0D);
+        orderTaxi.setInsertTime(new Date());
+        orderTaxi.setIsReassign(1);
+        if(orderTaxi.getSubstitute() == 0){//不是代下单
+            UserInfo userInfo = userInfoService.selectById(uid);
+            if(ToolUtil.isEmpty(userInfo.getPhone())){
+                return ResultUtil.error("请先绑定手机号码");
+            }
+            orderTaxi.setPassengers(userInfo.getName());
+            orderTaxi.setPassengersPhone(userInfo.getPhone());
+        }
+        orderTaxi.setState(1);//待接单
+
+        orderTaxiService.insert(orderTaxi);
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您的出租车订单已下单成功,我们正在为您指派司机,请稍后!", orderTaxi.getUserId(), 1);
+
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(orderTaxi.getId());
+        return ResultUtil.success(baseWarpper);
+    }
+
+
+    /**
+     * 专车摆渡单
+     * @param serverCarModelId
+     * @param travelTime
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @param orderSource
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    private synchronized ResultUtil<BaseWarpper> orderPrivateCar(Integer serverCarModelId, Date travelTime, String placementLon, String placementLat, String startLon, String startLat,
+                                       String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId, Integer place, Integer orderSource, Integer uid,String name,String phone) throws Exception{
+        //如果出行时间大于当前10分钟则默认为预约单
+        Integer reservation = 1;
+        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
+            reservation = 2;
+        }
+
+        startAddress = startAddress.replaceAll("& #40;", "(");
+        startAddress = startAddress.replaceAll("& #41;", ")");
+        endAddress = endAddress.replaceAll("& #40;", "(");
+        endAddress = endAddress.replaceAll("& #41;", ")");
+        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
+            return ResultUtil.error("请选择服务车型");
+        }
+
+        OrderPrivateCar orderPrivateCar = new OrderPrivateCar();
+        orderPrivateCar.setType(2);
+        orderPrivateCar.setCrossCityOrderId(crossCityOrderId);
+        orderPrivateCar.setPlace(place);
+        orderPrivateCar.setUserId(uid);
+        orderPrivateCar.setServerCarModelId(serverCarModelId);
+        orderPrivateCar.setOrderNum(orderPrivateCarService.getOrderNum());
+        orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
+        orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
+        orderPrivateCar.setPlacementAddress(geocode.get("address"));
+        orderPrivateCar.setStartLon(Double.valueOf(startLon));
+        orderPrivateCar.setStartLat(Double.valueOf(startLat));
+        orderPrivateCar.setStartAddress(startAddress);
+        orderPrivateCar.setEndLon(Double.valueOf(endLon));
+        orderPrivateCar.setEndLat(Double.valueOf(endLat));
+        orderPrivateCar.setEndAddress(endAddress);
+        orderPrivateCar.setSubstitute(0);
+        orderPrivateCar.setPassengers(name);
+        orderPrivateCar.setPassengersPhone(phone);
+        if(orderPrivateCar.getSubstitute() == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
+            UserInfo userInfo = userInfoService.selectById(uid);
+            if(ToolUtil.isEmpty(userInfo.getPhone())){
+                return ResultUtil.error("请先绑定手机号码");
+            }
+            orderPrivateCar.setPassengers(userInfo.getName());
+            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
+        }
+        orderPrivateCar.setState(1);
+        orderPrivateCar.setInsertTime(new Date());
+        orderPrivateCar.setTravelTime(travelTime);
+        orderPrivateCar.setOrderType(reservation);
+        orderPrivateCar.setOrderSource(orderSource);
+
+        orderPrivateCar.setIsReassign(1);
+        orderPrivateCar.setIsDelete(1);
+        orderPrivateCarMapper.insert(orderPrivateCar);
+
+        //添加消息        systemNoticeService.addSystemNotice(1, "您的专车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
+
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(orderPrivateCar.getId());
+       return ResultUtil.success(baseWarpper);
+    }
+
+
+    /**
+     * 摆渡车推单操作
+     * @param list
+     * @throws Exception
+     */
+    public void pushOrder(List<Map<String, Integer>> list) throws Exception{
+        System.err.println("====="+list);
+        for(Map<String, Integer> map : list){
+            Integer orderType = map.get("orderType");
+            Integer orderId1 = map.get("orderId");
+            Thread thread = new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    List<Map<String, Integer>> datas = list;
+                    final Integer orderId = orderId1;
+                    String vehicle = redisUtil.getValue("VEHICLE");
+                    List<Integer> integers = new ArrayList<>();
+                    if(ToolUtil.isNotEmpty(vehicle)){
+                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
+                    }
+                    try {
+                        if(orderType == 1){//专车
+                            Thread.sleep(1000);
+                            System.err.println("====="+orderId);
+                            OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(orderId);
+                            System.err.println("====="+orderPrivateCar);
+                            OrderPrivateCarServiceImpl.orderIds.add(orderPrivateCar.getId());//添加记录,防止调用接口重复提醒无人接单
+                            Company query = companyCityService.query(String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司
+                            List<PushOrder> querys = pushOrderService.querys(null, 1, query.getId());//获取需要推送的次数
+                            for(int i = 1; i <= querys.size(); i++){
+                                //订单被抢后的处理
+                                Integer state = orderPrivateCarMapper.selectById(orderId).getState();
+                                if(state != 1){
+                                    //关闭其他推送线程
+                                    Set<String> keySet = threadMap.keySet();
+                                    for(String key : keySet){
+                                        if(!key.equals(orderId + "_1")){
+                                            Thread thread1 = threadMap.get(key);//中断线程
+                                            if(null != thread1){
+                                                thread1.interrupt();
+                                            }
+                                            threadMap.remove(key);
+                                        }
+                                    }
+                                    //删除其他无效数据
+                                    for(Map<String, Integer> map : datas){
+                                        Integer orderType = map.get("orderType");
+                                        Integer orderId1 = map.get("orderId");
+                                        if(orderType == 1 && orderId != orderPrivateCar.getId()){
+                                            orderPrivateCarMapper.deleteById(orderId1);
+                                        }
+                                        if(orderType == 2){
+                                            orderTaxiMapper.deleteById(orderId1);
+                                        }
+                                    }
+                                    break;
+                                }
+
+                                //开始进行推送的处理
+                                PushOrder pushOrder = pushOrderService.querys(i, 1, query.getId()).get(0);
+                                //获取空闲司机
+                                List<Driver> list = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+                                if(list.size() > 0){
+                                    double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
+                                    int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
+                                    list = list.subList(0, lastIndex);//获取空闲司机中占比数据
+                                    for(Driver driver : list){//开始进行推送
+                                        boolean bo = false;
+                                        for(Integer integer : integers){
+                                            if(integer.compareTo(driver.getId()) == 0){
+                                                bo = true;
+                                                break;
+                                            }
+                                        }
+                                        if(bo){
+                                            continue;
+                                        }
+                                        pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime());
+                                    }
+                                }
+
+                                //所有推送完后的处理
+                                Boolean b = pushEndMap.get(orderPrivateCar.getCrossCityOrderId());
+                                if(i == querys.size() && state == 1 && (null != b && !b.booleanValue())){
+                                    pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1);
+                                    OrderPrivateCarServiceImpl.orderIds.remove(orderPrivateCar.getId());
+                                    pushEndMap.put(orderPrivateCar.getCrossCityOrderId(), Boolean.TRUE);//推送后添加标识
+                                    break;
+                                }
+                                Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
+                            }
+                        }
+
+                        if(orderType == 2){//出租车
+                            OrderTaxi orderTaxi = orderTaxiMapper.selectById(orderId);
+                            OrderTaxiServiceImpl.orderIds.add(orderTaxi.getId());//添加记录,防止调用接口重复提醒无人接单
+                            Company query = companyCityService.query(String.valueOf(orderTaxi.getStartLon()), String.valueOf(orderTaxi.getStartLat()));//获取起点所属分公司
+                            List<PushOrder> querys = pushOrderService.querys(null, 2, query.getId());//获取需要推送的次数
+                            for(int i = 1; i <= querys.size(); i++){
+                                //处理订单被抢
+                                Integer state = orderTaxiMapper.selectById(orderId).getState();
+                                if(state != 1){
+                                    //关闭其他推送任务
+                                    Set<String> keySet = threadMap.keySet();
+                                    for(String key : keySet){
+                                        if(!key.equals(orderId + "_2")){
+                                            Thread thread1 = threadMap.get(key);//中断线程
+                                            if(null != thread1){
+                                                thread1.interrupt();
+                                            }
+                                            threadMap.remove(key);
+                                        }
+                                    }
+                                    //删除其他无效数据
+                                    for(Map<String, Integer> map : datas){
+                                        Integer orderType = map.get("orderType");
+                                        Integer orderId1 = map.get("orderId");
+                                        if(orderType == 1){
+                                            orderPrivateCarMapper.deleteById(orderId1);
+                                        }
+                                        if(orderType == 2 && orderId1 != orderTaxi.getId()){
+                                            orderTaxiMapper.deleteById(orderId1);
+                                        }
+                                    }
+                                    break;
+                                }
+
+                                //开始进行推送
+                                PushOrder pushOrder = pushOrderService.querys(i, 2, query.getId()).get(0);
+                                //获取空闲司机
+                                List<Driver> list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+                                if(list.size() > 0){
+                                    double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
+                                    int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
+                                    list = list.subList(0, lastIndex);//获取空闲司机中占比数据
+                                    for(Driver driver : list){//开始进行推送
+                                        boolean bo = false;
+                                        for(Integer integer : integers){
+                                            if(integer.compareTo(driver.getId()) == 0){
+                                                bo = true;
+                                                break;
+                                            }
+                                        }
+                                        if(bo){
+                                            continue;
+                                        }
+
+
+                                        pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime());
+                                    }
+                                }
+
+                                //所有推送完后的处理
+                                Boolean b = pushEndMap.get(orderTaxi.getCrossCityOrderId());
+                                if(i == querys.size() && state == 1 && (null != b && !b.booleanValue())){
+                                    pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2);
+                                    OrderTaxiServiceImpl.orderIds.remove(orderTaxi.getId());
+                                    pushEndMap.put(orderTaxi.getCrossCityOrderId(), Boolean.TRUE);//推送后添加标识
+                                }
+                                Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
+                            }
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                }
+            });
+            thread.start();
+            threadMap.put(orderId1 + "_" + orderType, thread);
+        }
+    }
+
+    @Override
+    public List<OrderCrossCity> queryListOrder(Integer driverId, Integer lineShiftId, List<Integer> state, String day) throws Exception {
+        return orderCrossCityMapper.queryListOrder(driverId, lineShiftId, state, day);
+    }
+
+    /**
+     * 获取订单编号
+     * @return
+     * @throws Exception
+     */
+    public synchronized String getOrderNum(Integer driverId, Integer lineShiftDriverId) throws Exception{
+        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryOrders(driverId, lineShiftDriverId, Arrays.asList(2, 3, 4, 7));
+        if(orderCrossCities.size() > 0){
+            return orderCrossCities.get(0).getOrderNum();
+        }
+        int size = this.selectCount(null);
+        while (true){
+            String orderNum = "CROSS" + String.valueOf(1000000 + size + 1).substring(1);
+            List<OrderCrossCity> orderNum1 = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderNum));
+            if(orderNum1.size() == 0){
+                return orderNum;
+            }
+            size++;
+        }
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/SiteServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/SiteServiceImpl.java
new file mode 100644
index 0000000..1bf87c0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/SiteServiceImpl.java
@@ -0,0 +1,133 @@
+package com.stylefeng.guns.modular.crossCity.server.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.crossCity.dao.LocationMapper;
+import com.stylefeng.guns.modular.crossCity.dao.SiteMapper;
+import com.stylefeng.guns.modular.crossCity.model.Site;
+import com.stylefeng.guns.modular.crossCity.server.ISiteService;
+import com.stylefeng.guns.modular.crossCity.warpper.SiteWarpper;
+import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+
+@Service
+public class SiteServiceImpl extends ServiceImpl<SiteMapper, Site> implements ISiteService {
+
+    @Resource
+    private SiteMapper siteMapper;
+
+    @Resource
+    private LocationMapper locationMapper;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+
+    /**
+     * 获取站点
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<SiteWarpper> querySite(Integer startSiteId) throws Exception {
+        List<Map<String, Object>> sites = null;
+        if(null == startSiteId){
+            sites = siteMapper.querySite(null);
+        }else{
+            sites = siteMapper.querySite(startSiteId);
+        }
+        Set<String> set = new HashSet<>();
+        for(Map<String, Object> site : sites) {
+            set.add(site.get("cityCode").toString());
+        }
+
+        List<SiteWarpper> list = new ArrayList<>();
+        for(String c : set){
+            SiteWarpper siteWarpper = new SiteWarpper();
+            List<Object> data = new ArrayList<>();
+            String name = "";
+            String code = "";
+            for(Map<String, Object> s : sites){
+                if(c.equals(s.get("cityCode").toString())){
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("id", s.get("id"));
+                    map.put("name", s.get("name").toString());
+                    name = s.get("cityName").toString();
+                    code = s.get("cityCode").toString();
+                    data.add(map);
+                }
+            }
+            siteWarpper.setName(name);
+            siteWarpper.setCode(code);
+            siteWarpper.setSites(data);
+            list.add(siteWarpper);
+        }
+        return list;
+    }
+
+
+    /**
+     * 判断点是都在区域范围内
+     * @param siteId
+     * @param code
+     * @param lonLat
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean areaMonitoring(Integer siteId, String code, String lonLat) throws Exception {
+        List<Map<String, Object>> list = this.queryLocation(siteId);
+        for(Map<String, Object> map : list){
+            if(Integer.valueOf(map.get("type").toString()) == 1){//行政区域
+                if(null != map.get("districtCode")){
+                    if(code.equals(map.get("districtCode").toString())){
+                        return true;
+                    }
+                    continue;
+                }
+                if(null != map.get("cityCode")){
+                    if(code.equals(map.get("cityCode").toString())){
+                        return true;
+                    }
+                    code = code.substring(0, 4) + "00";
+                    if(code.equals(map.get("cityCode").toString())){
+                        return true;
+                    }
+                    continue;
+                }
+                if(null != map.get("provinceCode")){
+                    code = code.substring(0, 2) + "0000";
+                    if(code.equals(map.get("provinceCode").toString())){
+                        return true;
+                    }
+                    continue;
+                }
+            }
+            if(Integer.valueOf(map.get("type").toString()) == 2){//电子围栏
+                String gid = map.get("gid").toString();
+                List<String> list1 = gdMapElectricFenceUtil.monitorElectricFenc("", lonLat);
+                if(list1.contains(gid)){
+                    return true;
+                }
+                continue;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 根据站点id获取地点区域
+     * @param siteId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryLocation(Integer siteId) throws Exception {
+        return locationMapper.queryLocation(siteId);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LineSiteWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LineSiteWarpper.java
new file mode 100644
index 0000000..7f96b62
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LineSiteWarpper.java
@@ -0,0 +1,235 @@
+package com.stylefeng.guns.modular.crossCity.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("线路排班")
+public class LineSiteWarpper {
+    @ApiModelProperty("班次id")
+    private Integer id;
+    @ApiModelProperty("司机预约排班id")
+    private Integer lineShiftDriverId;
+    @ApiModelProperty("发车时间")
+    private String startTime;
+    @ApiModelProperty("司机头像")
+    private String headImgUrl;
+    @ApiModelProperty("司机姓名")
+    private String name;
+    @ApiModelProperty("车牌")
+    private String carLicensePlate;
+    @ApiModelProperty("车辆品牌")
+    private String brand;
+    @ApiModelProperty("车辆颜色")
+    private String carColor;
+    @ApiModelProperty("座位数")
+    private String number;
+    @ApiModelProperty("评分")
+    private Double evaluate;
+    @ApiModelProperty("预估价")
+    private Double price;
+    @ApiModelProperty("司机id")
+    private Integer driverId;
+    @ApiModelProperty("车辆id")
+    private Integer carId;
+    @ApiModelProperty("车辆总座位数")
+    private Integer totalSeat;
+    @ApiModelProperty("服务车型id")
+    private Integer serverCarModelId;
+    @ApiModelProperty("剩余座位编号")
+    private String laveSeatNumber;
+    @ApiModelProperty("剩余座位数")
+    private Integer laveSeat;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineShiftDriverId() {
+        return lineShiftDriverId;
+    }
+
+    public void setLineShiftDriverId(Integer lineShiftDriverId) {
+        this.lineShiftDriverId = lineShiftDriverId;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getHeadImgUrl() {
+        return headImgUrl;
+    }
+
+    public void setHeadImgUrl(String headImgUrl) {
+        this.headImgUrl = headImgUrl;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCarLicensePlate() {
+        return carLicensePlate;
+    }
+
+    public void setCarLicensePlate(String carLicensePlate) {
+        this.carLicensePlate = carLicensePlate;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public String getCarColor() {
+        return carColor;
+    }
+
+    public void setCarColor(String carColor) {
+        this.carColor = carColor;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public Double getEvaluate() {
+        return evaluate;
+    }
+
+    public void setEvaluate(Double evaluate) {
+        this.evaluate = evaluate;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public Integer getTotalSeat() {
+        return totalSeat;
+    }
+
+    public void setTotalSeat(Integer totalSeat) {
+        this.totalSeat = totalSeat;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public String getLaveSeatNumber() {
+        return laveSeatNumber;
+    }
+
+    public void setLaveSeatNumber(String laveSeatNumber) {
+        this.laveSeatNumber = laveSeatNumber;
+    }
+
+    public Integer getLaveSeat() {
+        return laveSeat;
+    }
+
+    public void setLaveSeat(Integer laveSeat) {
+        this.laveSeat = laveSeat;
+    }
+
+    @Override
+    public String toString() {
+        return "LineSiteWarpper{" +
+                "id=" + id +
+                ", startTime='" + startTime + '\'' +
+                ", headImgUrl='" + headImgUrl + '\'' +
+                ", name='" + name + '\'' +
+                ", carLicensePlate='" + carLicensePlate + '\'' +
+                ", brand='" + brand + '\'' +
+                ", carColor='" + carColor + '\'' +
+                ", number='" + number + '\'' +
+                ", evaluate=" + evaluate +
+                ", price=" + price +
+                ", driverId=" + driverId +
+                ", carId=" + carId +
+                ", totalSeat=" + totalSeat +
+                ", serverCarModelId=" + serverCarModelId +
+                ", laveSeatNumber='" + laveSeatNumber + '\'' +
+                ", laveSeat=" + laveSeat +
+                '}';
+    }
+
+    public static List<LineSiteWarpper> getLineSiteWarppers(List<Map<String, Object>> list){
+        List<LineSiteWarpper> data = new ArrayList<>();
+        if(null != list){
+            for(Map<String, Object> map : list){
+                if(null != map){
+                    LineSiteWarpper lineSiteWarpper = new LineSiteWarpper();
+                    lineSiteWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+                    lineSiteWarpper.setLineShiftDriverId(null != map.get("lineShiftDriverId") ? Integer.valueOf(map.get("lineShiftDriverId").toString()) : 0);
+                    lineSiteWarpper.setStartTime(null != map.get("startTime") ? map.get("startTime").toString() : "");
+                    lineSiteWarpper.setHeadImgUrl(null != map.get("headImgUrl") ? map.get("headImgUrl").toString() : "");
+                    lineSiteWarpper.setName(null != map.get("name") ? map.get("name").toString() : "");
+                    lineSiteWarpper.setCarLicensePlate(null != map.get("carLicensePlate") ? map.get("carLicensePlate").toString() : "");
+                    lineSiteWarpper.setBrand(null != map.get("brand") ? map.get("brand").toString() : "");
+                    lineSiteWarpper.setCarColor(null != map.get("carColor") ? map.get("carColor").toString() : "");
+                    lineSiteWarpper.setNumber(null != map.get("number") ? map.get("number").toString() : "");
+                    lineSiteWarpper.setEvaluate(null != map.get("evaluate") ? Double.valueOf(map.get("evaluate").toString()) : 0);
+                    lineSiteWarpper.setPrice(null != map.get("price") ? Double.valueOf(map.get("price").toString()) : 0);
+                    lineSiteWarpper.setDriverId(null != map.get("driverId") ? Integer.valueOf(map.get("driverId").toString()) : 0);
+                    lineSiteWarpper.setCarId(null != map.get("carId") ? Integer.valueOf(map.get("carId").toString()) : 0);
+                    lineSiteWarpper.setTotalSeat(null != map.get("totalSeat") ? Integer.valueOf(map.get("totalSeat").toString()) : 0);
+                    lineSiteWarpper.setServerCarModelId(null != map.get("serverCarModelId") ? Integer.valueOf(map.get("serverCarModelId").toString()) : 0);
+                    lineSiteWarpper.setLaveSeatNumber(null != map.get("laveSeatNumber") ? map.get("laveSeatNumber").toString() : "");
+                    lineSiteWarpper.setLaveSeat(null != map.get("laveSeat") ? Integer.valueOf(map.get("laveSeat").toString()) : 0);
+                    data.add(lineSiteWarpper);
+                }
+            }
+        }
+        return data;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LineWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LineWarpper.java
new file mode 100644
index 0000000..cac8d95
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LineWarpper.java
@@ -0,0 +1,85 @@
+package com.stylefeng.guns.modular.crossCity.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("线路")
+public class LineWarpper {
+    @ApiModelProperty("线路id")
+    private Integer id;
+    @ApiModelProperty("线路名称")
+    private String name;
+    @ApiModelProperty("起点")
+    private String startAddress;
+    @ApiModelProperty("终点")
+    private String endAddress;
+
+    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 getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    @Override
+    public String toString() {
+        return "LineWarpper{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", startAddress='" + startAddress + '\'' +
+                ", endAddress='" + endAddress + '\'' +
+                '}';
+    }
+
+
+    public static LineWarpper getLineWarpper(Map<String, Object> map){
+        LineWarpper lineWarpper = new LineWarpper();
+        if(null != map){
+            lineWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            lineWarpper.setName(null != map.get("name") ? map.get("name").toString() : "");
+            lineWarpper.setStartAddress(null != map.get("startAddress") ? map.get("startAddress").toString() : "");
+            lineWarpper.setEndAddress(null != map.get("endAddress") ? map.get("endAddress").toString() : "");
+        }
+        return lineWarpper;
+    }
+
+
+    public static List<LineWarpper> getLineWarppers(List<Map<String, Object>> maps){
+        List<LineWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                list.add(LineWarpper.getLineWarpper(map));
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LocationWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LocationWarpper.java
new file mode 100644
index 0000000..ab8e5db
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/LocationWarpper.java
@@ -0,0 +1,128 @@
+package com.stylefeng.guns.modular.crossCity.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("站点区域")
+public class LocationWarpper {
+    @ApiModelProperty("区域类型(1=行政区域,2=电子围栏)")
+    private Integer type;
+    @ApiModelProperty("省名称")
+    private String province;
+    @ApiModelProperty("省编号")
+    private String provinceCode;
+    @ApiModelProperty("市名称")
+    private String city;
+    @ApiModelProperty("市编号")
+    private String cityCode;
+    @ApiModelProperty("区县名称")
+    private String district;
+    @ApiModelProperty("区县编号")
+    private String districtCode;
+    @ApiModelProperty("电子围栏坐标多组以分号分隔")
+    private String coordinate;
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getProvinceCode() {
+        return provinceCode;
+    }
+
+    public void setProvinceCode(String provinceCode) {
+        this.provinceCode = provinceCode;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getCityCode() {
+        return cityCode;
+    }
+
+    public void setCityCode(String cityCode) {
+        this.cityCode = cityCode;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getDistrictCode() {
+        return districtCode;
+    }
+
+    public void setDistrictCode(String districtCode) {
+        this.districtCode = districtCode;
+    }
+
+    public String getCoordinate() {
+        return coordinate;
+    }
+
+    public void setCoordinate(String coordinate) {
+        this.coordinate = coordinate;
+    }
+
+    @Override
+    public String toString() {
+        return "LocationWarpper{" +
+                "type=" + type +
+                ", province='" + province + '\'' +
+                ", provinceCode='" + provinceCode + '\'' +
+                ", city='" + city + '\'' +
+                ", cityCode='" + cityCode + '\'' +
+                ", district='" + district + '\'' +
+                ", districtCode='" + districtCode + '\'' +
+                ", coordinate='" + coordinate + '\'' +
+                '}';
+    }
+
+
+    public static List<LocationWarpper> getLocationWarppers(List<Map<String, Object>> list){
+        List<LocationWarpper> data = new ArrayList<>();
+        if(null != list){
+            for(Map<String, Object> map : list){
+                if(null != map){
+                    LocationWarpper locationWarpper = new LocationWarpper();
+                    locationWarpper.setType(null != map.get("type") ? Integer.valueOf(map.get("type").toString()) : 0);
+                    locationWarpper.setProvince(null != map.get("province") ? map.get("province").toString() : "");
+                    locationWarpper.setProvinceCode(null != map.get("provinceCode") ? map.get("provinceCode").toString() : "");
+                    locationWarpper.setCity(null != map.get("city") ? map.get("city").toString() : "");
+                    locationWarpper.setCityCode(null != map.get("cityCode") ? map.get("cityCode").toString() : "");
+                    locationWarpper.setDistrict(null != map.get("district") ? map.get("district").toString() : "");
+                    locationWarpper.setDistrictCode(null != map.get("districtCode") ? map.get("districtCode").toString() : "");
+                    locationWarpper.setCoordinate(null != map.get("coordinate") ? map.get("coordinate").toString() : "");
+                    data.add(locationWarpper);
+                }
+            }
+        }
+        return data;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityWarpper.java
new file mode 100644
index 0000000..5bd5537
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityWarpper.java
@@ -0,0 +1,241 @@
+package com.stylefeng.guns.modular.crossCity.warpper;
+
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+@ApiModel("跨城订单")
+public class OrderCrossCityWarpper {
+    @ApiModelProperty(value = "服务车型id", required = true, dataType = "int")
+    private Integer serverCarModelId;
+    @ApiModelProperty(value = "司机预约排班id", required = true, dataType = "int")
+    private Integer lineShiftDriverId;
+    @ApiModelProperty(value = "司机id", required = true, dataType = "int")
+    private Integer driverId;
+    @ApiModelProperty(value = "线路id", required = true, dataType = "int")
+    private Integer lineId;
+    @ApiModelProperty(value = "车辆id", required = true, dataType = "int")
+    private Integer carId;
+    @ApiModelProperty(value = "下单地点经度", required = true, dataType = "double")
+    private Double placementLon;
+    @ApiModelProperty(value = "下单地点纬度", required = true, dataType = "double")
+    private Double placementLat;
+    @ApiModelProperty(value = "下单详细地址", required = true, dataType = "string")
+    private String placementAddress;
+    @ApiModelProperty(value = "起点经度", required = true, dataType = "double")
+    private Double startLon;
+    @ApiModelProperty(value = "起点纬度", required = true, dataType = "double")
+    private Double startLat;
+    @ApiModelProperty(value = "起点", required = true, dataType = "string")
+    private String startAddress;
+    @ApiModelProperty(value = "终点经度", required = true, dataType = "double")
+    private Double endLon;
+    @ApiModelProperty(value = "终点纬度", required = true, dataType = "double")
+    private Double endLat;
+    @ApiModelProperty(value = "终点详细地址", required = true, dataType = "string")
+    private String endAddress;
+    @ApiModelProperty(value = "出行时间(2020-09-04 12:00:00)", required = true, dataType = "string")
+    private Date travelTime;
+    @ApiModelProperty(value = "出行方式(1=拼车,2=包车)", required = true, dataType = "int")
+    private Integer travelMode;
+    @ApiModelProperty(value = "订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)", required = true, dataType = "int")
+    private Integer orderSource;
+    @ApiModelProperty(value = "出行人数", required = true, dataType = "int")
+    private Integer peopleNumber;
+    @ApiModelProperty(value = "乘车人id[1,2,3]", required = true, dataType = "string")
+    private String frequentPassengersId;
+    @ApiModelProperty(value = "车辆总座位数", required = true, dataType = "int")
+    private Integer totalSeat;
+    @ApiModelProperty(value = "座位编号(1,3,4)", required = true, dataType = "string")
+    private String seatNumber;
+    @ApiModelProperty(value = "备注", required = false, dataType = "string")
+    private String remark;
+    @ApiModelProperty(value = "行驶里程数", required = true, dataType = "double")
+    private Double distance;
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public Integer getLineShiftDriverId() {
+        return lineShiftDriverId;
+    }
+
+    public void setLineShiftDriverId(Integer lineShiftDriverId) {
+        this.lineShiftDriverId = lineShiftDriverId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Integer getTravelMode() {
+        return travelMode;
+    }
+
+    public void setTravelMode(Integer travelMode) {
+        this.travelMode = travelMode;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public Integer getTotalSeat() {
+        return totalSeat;
+    }
+
+    public void setTotalSeat(Integer totalSeat) {
+        this.totalSeat = totalSeat;
+    }
+
+    public Integer getPeopleNumber() {
+        return peopleNumber;
+    }
+
+    public void setPeopleNumber(Integer peopleNumber) {
+        this.peopleNumber = peopleNumber;
+    }
+
+    public String getFrequentPassengersId() {
+        return frequentPassengersId;
+    }
+
+    public void setFrequentPassengersId(String frequentPassengersId) {
+        this.frequentPassengersId = frequentPassengersId;
+    }
+
+    public String getSeatNumber() {
+        return seatNumber;
+    }
+
+    public void setSeatNumber(String seatNumber) {
+        this.seatNumber = seatNumber;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/SiteWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/SiteWarpper.java
new file mode 100644
index 0000000..8ff2ba5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/SiteWarpper.java
@@ -0,0 +1,43 @@
+package com.stylefeng.guns.modular.crossCity.warpper;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+@ApiModel("站点")
+public class SiteWarpper {
+    @ApiModelProperty("所属地区名称")
+    private String name;
+    @ApiModelProperty("所属地区编号")
+    private String code;
+    @ApiModelProperty("站点列表")
+    private List<Object> sites;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public List<Object> getSites() {
+        return sites;
+    }
+
+    public void setSites(List<Object> sites) {
+        this.sites = sites;
+    }
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java
new file mode 100644
index 0000000..7efb1be
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java
@@ -0,0 +1,239 @@
+package com.stylefeng.guns.modular.smallLogistics.controller;
+
+
+import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
+import com.stylefeng.guns.modular.system.model.Region;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 小件物流控制器
+ */
+@Api
+@RestController
+@RequestMapping("")
+public class OrderLogisticsController {
+
+    @Autowired
+    private IOrderLogisticsService orderLogisticsService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+    /**
+     * 根据起点和终点坐标判断是不是同一个市内
+     * @param startLonLat
+     * @param endAddress
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/orderLogistics/judgingTheCity")
+    @ApiOperation(value = "根据起点和终点坐标判断是不是同一个市内", tags = {"用户端-小件物流"}, notes = "只有在选择了同城小件物流的时候调用")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "起点经纬度(103.23265,30.2312)", name = "startLonLat", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "终点详细地址", name = "endAddress", required = true, paramType = "query", dataType = "string")
+    })
+    public ResultUtil judgingTheCity(String startLonLat, String endAddress){
+        try {
+            return orderLogisticsService.judgingTheCity(startLonLat, endAddress);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/api/orderLogistics/queryLogisticsUnitPrice")
+    @ApiOperation(value = "获取小件物流的单价数据", tags = {"用户端-小件物流"}, notes = "ordinary(普通物品),precious(贵重物品),first=0(首次下单)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "业务类型(4=同城小件物流,5=跨城小件物流)", name = "type", required = true, paramType = "query", dataType = "int"),
+            @ApiImplicitParam(value = "起点经纬度(103.23265,30.2312)", name = "startLonLat", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "终点详细地址", name = "endAddress", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil queryLogisticsUnitPrice(Integer type, String startLonLat, String endAddress, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderLogisticsService.queryLogisticsUnitPrice(type, startLonLat, endAddress, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/base/orderLogistics/queryPayMoney")
+    @ApiOperation(value = "获取支付金额", tags = {"用户端-小件物流"}, notes = "ordinary(普通物品),precious(贵重物品)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "货物数量", name = "number", required = true, paramType = "query", dataType = "int"),
+            @ApiImplicitParam(value = "业务类型(4=同城小件物流,5=跨城小件物流)", name = "type", required = true, paramType = "query", dataType = "int"),
+            @ApiImplicitParam(value = "起点经纬度(103.23265,30.2312)", name = "startLonLat", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "终点详细地址", name = "endAddress", required = true, paramType = "query", dataType = "string")
+    })
+    public ResultUtil queryPayMoney(Integer number, Integer type, String startLonLat, String endAddress){
+        try {
+            return orderLogisticsService.queryPayMoney(number, type, startLonLat, endAddress);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 小件物流下单操作
+     * @param type
+     * @param cargoType
+     * @param cargoNumber
+     * @param remark
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param recipient
+     * @param recipientPhone
+     * @param endAddress
+     * @param travelTime
+     * @param orderSource
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/orderLogistics/smallLogistics")
+    @ApiOperation(value = "小件物流下单操作(同城/跨城)", tags = {"用户端-小件物流"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "业务类型(4=同城小件物流,5=跨城小件物流)", name = "type", required = true, paramType = "query", dataType = "int"),
+            @ApiImplicitParam(value = "货物类型(1=普通货物,2=贵重货物)", name = "cargoType", required = true, paramType = "query", dataType = "int"),
+            @ApiImplicitParam(value = "货物数量", name = "cargoNumber", required = true, paramType = "query", dataType = "int"),
+            @ApiImplicitParam(value = "备注", name = "remark", required = false, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "下单点经度(103.23265,30.2312)", name = "placementLon", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "下单点纬度(103.23265,30.2312)", name = "placementLat", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "预约取货点经度(103.23265,30.2312)", name = "startLon", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "预约取货点纬度(103.23265,30.2312)", name = "startLat", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "预约取货点详细地址", name = "startAddress", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "收货人姓名", name = "recipient", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "收货人电话", name = "recipientPhone", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "收货详细地址", name = "endAddress", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "是否加急(1=否,2=是)", name = "urgent", required = true, paramType = "query", dataType = "int"),
+            @ApiImplicitParam(value = "加急费用", name = "tipMoney", required = true, paramType = "query", dataType = "double"),
+            @ApiImplicitParam(value = "预约收货时间(2020-09-17 21:00:00)", name = "travelTime", required = true, paramType = "query", dataType = "string"),
+            @ApiImplicitParam(value = "下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)", name = "orderSource", required = true, paramType = "query", dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> smallLogistics(Integer type, Integer cargoType, Integer cargoNumber, String remark, String placementLon, String placementLat, String startLon, String startLat, String startAddress,
+                                     String recipient, String recipientPhone, String endAddress, Integer urgent, Double tipMoney, Date travelTime, Integer orderSource, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderLogisticsService.smallLogistics(type, cargoType, cargoNumber, remark, placementLon, placementLat, startLon, startLat, startAddress, recipient, recipientPhone, endAddress, urgent, tipMoney, travelTime, orderSource, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @ResponseBody
+    @PostMapping("/api/orderLogistics/queryLogisticsNumber")
+    @ApiOperation(value = "获取首页小件物流订单数量", tags = {"用户端-小件物流"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> queryLogisticsNumber(HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            int i = orderLogisticsService.queryLogisticsNumber(uid);
+            BaseWarpper baseWarppe = new BaseWarpper();
+            baseWarppe.setNumber(i);
+            return ResultUtil.success(baseWarppe);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    @ResponseBody
+    @PostMapping("/api/orderLogistics/payOrderLogisticsSpread")
+    @ApiOperation(value = "小件物流补差价支付", tags = {"用户端-小件物流"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "支付方式(1=微信,2=支付宝,3=余额)", name = "payType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "支付端(1=用户APP端,2=司机APP端,3=用户小程序端)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil payOrderLogisticsSpread(Integer orderId, Integer payType, Integer type, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderLogisticsService.payLogisticsOrder_(payType, orderId, type);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取行政区域数据(小程序)
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/orderLogistics/queryRegion")
+    public Map<String, Object> queryRegion(){
+        try {
+            Map<String, Object> map = orderLogisticsService.queryRegion();
+            return map;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @ResponseBody
+    @PostMapping("/base/orderLogistics/queryRegions")
+    @ApiOperation(value = "获取行政区域三级联动数据", tags = {"用户端-小件物流"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "上级id。第一层传0", name = "parentId", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil queryRegions(Integer parentId){
+        try {
+            List<Region> regions = orderLogisticsService.queryRegions(parentId);
+            return ResultUtil.success(regions);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/OrderLogisticsMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/OrderLogisticsMapper.java
new file mode 100644
index 0000000..8cef2bb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/OrderLogisticsMapper.java
@@ -0,0 +1,61 @@
+package com.stylefeng.guns.modular.smallLogistics.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface OrderLogisticsMapper extends BaseMapper<OrderLogistics> {
+
+
+    List<OrderLogistics> query(@Param("start") Date start, @Param("end") Date end);
+
+
+    /**
+     * 获取个人待完成订单数量
+     * @param uid
+     * @return
+     */
+    int queryLogisticsNumber(@Param("uid") Integer uid);
+
+
+
+    /**
+     * 获取用户的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryMyOrderList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
+                                               @Param("size") Integer size);
+
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyTravelRecord(@Param("uid") Integer uid);
+
+
+    /**
+     * 获取用户单发票页面的订单列表
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryInvoiceOrder(@Param("type") Integer type, @Param("startTime") Date startTime,
+                                                @Param("endTime") Date endTime, @Param("startMoney") Double startMoney,
+                                                @Param("endMoney") Double endMoney, @Param("uid") Integer uid,
+                                                @Param("orderType") Integer orderType);
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/OrderLogisticsSpreadMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/OrderLogisticsSpreadMapper.java
new file mode 100644
index 0000000..b5449e4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/OrderLogisticsSpreadMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.smallLogistics.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.smallLogistics.model.OrderLogisticsSpread;
+
+public interface OrderLogisticsSpreadMapper extends BaseMapper<OrderLogisticsSpread> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/mapping/OrderLogisticsMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/mapping/OrderLogisticsMapper.xml
new file mode 100644
index 0000000..94af681
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/mapping/OrderLogisticsMapper.xml
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.smallLogistics.dao.OrderLogisticsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="userId" property="userId"/>
+        <result column="driverId" property="driverId"/>
+        <result column="carId" property="carId"/>
+        <result column="orderNum" property="orderNum"/>
+        <result column="cargoType" property="cargoType"/>
+        <result column="number" property="number"/>
+        <result column="urgent" property="urgent"/>
+        <result column="cargoNumber" property="cargoNumber"/>
+        <result column="remark" property="remark"/>
+        <result column="placementLon" property="placementLon"/>
+        <result column="placementLat" property="placementLat"/>
+        <result column="placementAddress" property="placementAddress"/>
+        <result column="startLon" property="startLon"/>
+        <result column="startLat" property="startLat"/>
+        <result column="startAddress" property="startAddress"/>
+        <result column="endLon" property="endLon"/>
+        <result column="endLat" property="endLat"/>
+        <result column="endAddress" property="endAddress"/>
+        <result column="recipient" property="recipient"/>
+        <result column="recipientPhone" property="recipientPhone"/>
+        <result column="boardingLon" property="boardingLon"/>
+        <result column="boardingLat" property="boardingLat"/>
+        <result column="boardingAddress" property="boardingAddress"/>
+        <result column="boardingTime" property="boardingTime"/>
+        <result column="getoffLon" property="getoffLon"/>
+        <result column="getoffLat" property="getoffLat"/>
+        <result column="getoffAddress" property="getoffAddress"/>
+        <result column="getoffTime" property="getoffTime"/>
+        <result column="mileage" property="mileage"/>
+        <result column="payManner" property="payManner"/>
+        <result column="payType" property="payType"/>
+        <result column="orderMoney" property="orderMoney"/>
+        <result column="travelMoney" property="travelMoney"/>
+        <result column="tipMoney" property="tipMoney"/>
+        <result column="redPacketMoney" property="redPacketMoney"/>
+        <result column="couponMoney" property="couponMoney"/>
+        <result column="redPacketId" property="redPacketId"/>
+        <result column="couponId" property="couponId"/>
+        <result column="discount" property="discount"/>
+        <result column="discountMoney" property="discountMoney"/>
+        <result column="activityId" property="activityId"/>
+        <result column="companyId" property="companyId"/>
+        <result column="payMoney" property="payMoney"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="travelTime" property="travelTime"/>
+        <result column="snatchOrderTime" property="snatchOrderTime"/>
+        <result column="setOutTime" property="setOutTime"/>
+        <result column="arriveTime" property="arriveTime"/>
+        <result column="startServiceTime" property="startServiceTime"/>
+        <result column="endServiceTime" property="endServiceTime"/>
+        <result column="orderSource" property="orderSource"/>
+        <result column="invoiceId" property="invoiceId"/>
+        <result column="trackId" property="trackId"/>
+        <result column="isDelete" property="isDelete"/>
+        <result column="telX" property="telX"/>
+        <result column="bindId" property="bindId"/>
+        <result column="pickUpCode" property="pickUpCode"/>
+        <result column="isReassign" property="isReassign"/>
+        <result column="reassignNotice" property="reassignNotice"/>
+    </resultMap>
+
+
+
+    <select id="query" resultType="OrderLogistics">
+select
+id as id,
+        type as type,
+        userId as userId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        cargoType as cargoType,
+        cargoNumber as cargoNumber,
+        remark as remark,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        recipient as recipient,
+        recipientPhone as recipientPhone,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        travelMoney as travelMoney,
+        tipMoney as tipMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderSource as orderSource,
+        invoiceId as invoiceId,
+        trackId as trackId,
+        isDelete as isDelete,
+        telX as telX,
+        bindId as bindId
+        from t_order_logistics where isDelete = 1
+        <if test="null != start and null != end">
+            and insertTime between #{start} and #{end}
+        </if>
+    </select>
+
+
+
+    <select id="queryLogisticsNumber" resultType="int">
+        select
+        count(id)
+        from t_order_logistics where isDelete = 1 and state in (1, 2, 3, 4, 5, 7) and userId = #{uid}
+    </select>
+
+
+    <select id="queryMyOrderList" resultType="map">
+        select
+        id as orderId,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+        DATE_FORMAT(travelTime, '%Y-%m-%d %H:%i') as time,
+        endAddress as endAddress,
+        startAddress as startAddress,
+        CONCAT((if(cargoType = 1, '普通小件', '普通大件')), 'X', cargoNumber) as cargoType,
+        driverId as driverId,
+        `type` as orderType,
+        state as state,
+        orderMoney as orderMoney,
+        payMoney as payMoney,
+        (select price from t_order_logistics_spread where orderLogisticsId = a.id) as differenceMoney
+        from t_order_logistics as a where userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+
+
+    <select id="queryMyTravelRecord" resultType="map">
+        select
+        (payMoney * -1) as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        if(type = 4, '同城小件物流订单', '跨城小件物流') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_logistics where (payMoney != 0 or payMoney is not null) and userId = #{uid}  order by insertTime desc
+    </select>
+
+
+
+    <select id="queryInvoiceOrder" resultType="map">
+        select
+        id as id,
+        DATE_FORMAT(travelTime, '%Y-%m-%d %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        payMoney as payMoney,
+        if(type = 4, '同城小件物流订单', '跨城小件物流订单') as orderName,
+        if(invoiceId is null, 1, 2) as invoice,
+        unix_timestamp(insertTime) as insertTime,
+        `type` as orderType
+        from t_order_logistics where state in (9)
+        <if test="type == 1">
+            and invoiceId is null and invoiceId in (select id from t_invoice where state != 2)
+        </if>
+        <if test="type == 2">
+            and invoiceId in (select id from t_invoice where state = 2)
+        </if>
+        <if test="null != startTime and null != endTime">
+            and travelTime between #{startTime} and #{endTime}
+        </if>
+        <if test="null != startMoney and null != endMoney">
+            and payMoney between #{startMoney} and #{endMoney}
+        </if>
+        <if test="null !=uid">
+            and userId = #{uid}
+        </if>
+        <if test="null != orderType">
+            and `type` = #{orderType}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/mapping/OrderLogisticsSpreadMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/mapping/OrderLogisticsSpreadMapper.xml
new file mode 100644
index 0000000..24e1ab5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/dao/mapping/OrderLogisticsSpreadMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.smallLogistics.dao.OrderLogisticsSpreadMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.smallLogistics.model.OrderLogisticsSpread">
+        <id column="id" property="id"/>
+        <result column="orderLogisticsId" property="orderLogisticsId"/>
+        <result column="price" property="price"/>
+        <result column="payType" property="payType"/>
+        <result column="payTime" property="payTime"/>
+        <result column="payMoney" property="payMoney"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/model/OrderLogistics.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/model/OrderLogistics.java
new file mode 100644
index 0000000..268b926
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/model/OrderLogistics.java
@@ -0,0 +1,878 @@
+package com.stylefeng.guns.modular.smallLogistics.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 java.util.Date;
+
+/**
+ * 小件物流订单
+ */
+@TableName("t_order_logistics")
+public class OrderLogistics {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单类型(4=同城物流,5=跨城物流)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 车辆id
+     */
+    @TableField("carId")
+    private Integer carId;
+    /**
+     * 订单号
+     */
+    @TableField("orderNum")
+    private String orderNum;
+    /**
+     * 货物类型(1=普通货物,2=贵重货物)
+     */
+    @TableField("cargoType")
+    private Integer cargoType;
+    /**
+     * 是否加急(1=否,2=是)
+     */
+    @TableField("urgent")
+    private Integer urgent;
+    /**
+     * 货物数量
+     */
+    @TableField("cargoNumber")
+    private Integer cargoNumber;
+    /**
+     * 备注信息
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 下单地点经度
+     */
+    @TableField("placementLon")
+    private Double placementLon;
+    /**
+     * 下单地点纬度
+     */
+    @TableField("placementLat")
+    private Double placementLat;
+    /**
+     * 下单地点
+     */
+    @TableField("placementAddress")
+    private String placementAddress;
+    /**
+     * 起点经度
+     */
+    @TableField("startLon")
+    private Double startLon;
+    /**
+     * 起点纬度
+     */
+    @TableField("startLat")
+    private Double startLat;
+    /**
+     * 起点
+     */
+    @TableField("startAddress")
+    private String startAddress;
+    /**
+     * 目的地经度
+     */
+    @TableField("endLon")
+    private Double endLon;
+    /**
+     * 目的地纬度
+     */
+    @TableField("endLat")
+    private Double endLat;
+    /**
+     * 目的地
+     */
+    @TableField("endAddress")
+    private String endAddress;
+    /**
+     * 收件人姓名
+     */
+    @TableField("recipient")
+    private String recipient;
+    /**
+     * 收件人电话
+     */
+    @TableField("recipientPhone")
+    private String recipientPhone;
+    /**
+     * 上车点经度
+     */
+    @TableField("boardingLon")
+    private Double boardingLon;
+    /**
+     * 上车点纬度
+     */
+    @TableField("boardingLat")
+    private Double boardingLat;
+    /**
+     * 上车地点
+     */
+    @TableField("boardingAddress")
+    private String boardingAddress;
+    /**
+     * 上车时间
+     */
+    @TableField("boardingTime")
+    private Date boardingTime;
+    /**
+     * 下车点经度
+     */
+    @TableField("getoffLon")
+    private Double getoffLon;
+    /**
+     * 下车点纬度
+     */
+    @TableField("getoffLat")
+    private Double getoffLat;
+    /**
+     * 下车点
+     */
+    @TableField("getoffAddress")
+    private String getoffAddress;
+    /**
+     * 下车时间
+     */
+    @TableField("getoffTime")
+    private Date getoffTime;
+    /**
+     * 行驶里程数(米)
+     */
+    @TableField("mileage")
+    private Double mileage;
+    /**
+     * 支付方式(1=OK平台支付,2=其他方式支付)
+     */
+    @TableField("payManner")
+    private Integer payManner;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=余额)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 订单金额
+     */
+    @TableField("orderMoney")
+    private Double orderMoney;
+    /**
+     * 行程费
+     */
+    @TableField("travelMoney")
+    private Double travelMoney;
+    /**
+     * 小费
+     */
+    @TableField("tipMoney")
+    private Double tipMoney;
+    /**
+     * 红包抵扣金额
+     */
+    @TableField("redPacketMoney")
+    private Double redPacketMoney;
+    /**
+     * 优惠券抵扣金额
+     */
+    @TableField("couponMoney")
+    private Double couponMoney;
+    /**
+     * 红包id
+     */
+    @TableField("redPacketId")
+    private Integer redPacketId;
+    /**
+     * 优惠券id
+     */
+    @TableField("couponId")
+    private Integer couponId;
+    /**
+     * 折扣
+     */
+    @TableField("discount")
+    private Double discount;
+    /**
+     * 折扣优惠金额
+     */
+    @TableField("discountMoney")
+    private Double discountMoney;
+    /**
+     * 折扣活动id
+     */
+    @TableField("activityId")
+    private Integer activityId;
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 支付金额
+     */
+    @TableField("payMoney")
+    private Double payMoney;
+    /**
+     * 状态(1=待接单,2=待出发,3=待到达预约地点,4=待取货,5=送货中,6=已送达,7=待支付,8=需补差价,9=已取货,10=已取消,11=已支付差价)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 下单时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 预约取货时间
+     */
+    @TableField("travelTime")
+    private Date travelTime;
+    /**
+     * 抢单时间
+     */
+    @TableField("snatchOrderTime")
+    private Date snatchOrderTime;
+    /**
+     * 司机点出发时间
+     */
+    @TableField("setOutTime")
+    private Date setOutTime;
+    /**
+     * 司机到达预约地点时间
+     */
+    @TableField("arriveTime")
+    private Date arriveTime;
+    /**
+     * 开始服务时间
+     */
+    @TableField("startServiceTime")
+    private Date startServiceTime;
+    /**
+     * 结束服务时间
+     */
+    @TableField("endServiceTime")
+    private Date endServiceTime;
+    /**
+     * 订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)
+     */
+    @TableField("orderSource")
+    private Integer orderSource;
+    /**
+     * 发票id
+     */
+    @TableField("invoiceId")
+    private Integer invoiceId;
+    /**
+     * 高德猎鹰轨迹id
+     * @return
+     */
+    @TableField("trackId")
+    private String trackId;
+    /**
+     * 是否删除(1=否,2=是)
+     */
+    @TableField("isDelete")
+    private Integer isDelete;
+    /**
+     * 移动小号
+     * @return
+     */
+    @TableField("telX")
+    private String telX;
+    /**
+     * 绑定小号关系id
+     * @return
+     */
+    @TableField("bindId")
+    private String bindId;
+    /**
+     * 取件码
+     * @return
+     */
+    @TableField("pickUpCode")
+    private String pickUpCode;
+    /**
+     * 是否是改派单(1=否,=是)
+     * @return
+     */
+    @TableField("isReassign")
+    private Integer isReassign;
+    /**
+     * 改派通知标识(0=没有改派,1=改派中,2=已改派)用于通知前端获取新司机数据
+     */
+    @TableField("reassignNotice")
+    private Integer reassignNotice;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getCargoType() {
+        return cargoType;
+    }
+
+    public void setCargoType(Integer cargoType) {
+        this.cargoType = cargoType;
+    }
+
+    public Integer getUrgent() {
+        return urgent;
+    }
+
+    public void setUrgent(Integer urgent) {
+        this.urgent = urgent;
+    }
+
+    public Integer getCargoNumber() {
+        return cargoNumber;
+    }
+
+    public void setCargoNumber(Integer cargoNumber) {
+        this.cargoNumber = cargoNumber;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public String getRecipient() {
+        return recipient;
+    }
+
+    public void setRecipient(String recipient) {
+        this.recipient = recipient;
+    }
+
+    public String getRecipientPhone() {
+        return recipientPhone;
+    }
+
+    public void setRecipientPhone(String recipientPhone) {
+        this.recipientPhone = recipientPhone;
+    }
+
+    public Double getBoardingLon() {
+        return boardingLon;
+    }
+
+    public void setBoardingLon(Double boardingLon) {
+        this.boardingLon = boardingLon;
+    }
+
+    public Double getBoardingLat() {
+        return boardingLat;
+    }
+
+    public void setBoardingLat(Double boardingLat) {
+        this.boardingLat = boardingLat;
+    }
+
+    public String getBoardingAddress() {
+        return boardingAddress;
+    }
+
+    public void setBoardingAddress(String boardingAddress) {
+        this.boardingAddress = boardingAddress;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Double getGetoffLon() {
+        return getoffLon;
+    }
+
+    public void setGetoffLon(Double getoffLon) {
+        this.getoffLon = getoffLon;
+    }
+
+    public Double getGetoffLat() {
+        return getoffLat;
+    }
+
+    public void setGetoffLat(Double getoffLat) {
+        this.getoffLat = getoffLat;
+    }
+
+    public String getGetoffAddress() {
+        return getoffAddress;
+    }
+
+    public void setGetoffAddress(String getoffAddress) {
+        this.getoffAddress = getoffAddress;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(Double orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public Double getTravelMoney() {
+        return travelMoney;
+    }
+
+    public void setTravelMoney(Double travelMoney) {
+        this.travelMoney = travelMoney;
+    }
+
+    public Double getTipMoney() {
+        return tipMoney;
+    }
+
+    public void setTipMoney(Double tipMoney) {
+        this.tipMoney = tipMoney;
+    }
+
+    public Double getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(Double redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public Double getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(Double couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Integer getRedPacketId() {
+        return redPacketId;
+    }
+
+    public void setRedPacketId(Integer redPacketId) {
+        this.redPacketId = redPacketId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Double getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(Double payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Date getSnatchOrderTime() {
+        return snatchOrderTime;
+    }
+
+    public void setSnatchOrderTime(Date snatchOrderTime) {
+        this.snatchOrderTime = snatchOrderTime;
+    }
+
+    public Date getSetOutTime() {
+        return setOutTime;
+    }
+
+    public void setSetOutTime(Date setOutTime) {
+        this.setOutTime = setOutTime;
+    }
+
+    public Date getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Date arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Date getStartServiceTime() {
+        return startServiceTime;
+    }
+
+    public void setStartServiceTime(Date startServiceTime) {
+        this.startServiceTime = startServiceTime;
+    }
+
+    public Date getEndServiceTime() {
+        return endServiceTime;
+    }
+
+    public void setEndServiceTime(Date endServiceTime) {
+        this.endServiceTime = endServiceTime;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+
+    public Integer getInvoiceId() {
+        return invoiceId;
+    }
+
+    public void setInvoiceId(Integer invoiceId) {
+        this.invoiceId = invoiceId;
+    }
+
+    public Integer getPayManner() {
+        return payManner;
+    }
+
+    public void setPayManner(Integer payManner) {
+        this.payManner = payManner;
+    }
+
+    public String getTrackId() {
+        return trackId;
+    }
+
+    public void setTrackId(String trackId) {
+        this.trackId = trackId;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Double getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Double discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public String getTelX() {
+        return telX;
+    }
+
+    public void setTelX(String telX) {
+        this.telX = telX;
+    }
+
+    public String getBindId() {
+        return bindId;
+    }
+
+    public void setBindId(String bindId) {
+        this.bindId = bindId;
+    }
+
+    public String getPickUpCode() {
+        return pickUpCode;
+    }
+
+    public void setPickUpCode(String pickUpCode) {
+        this.pickUpCode = pickUpCode;
+    }
+
+    public Integer getIsReassign() {
+        return isReassign;
+    }
+
+    public void setIsReassign(Integer isReassign) {
+        this.isReassign = isReassign;
+    }
+
+    public Integer getReassignNotice() {
+        return reassignNotice;
+    }
+
+    public void setReassignNotice(Integer reassignNotice) {
+        this.reassignNotice = reassignNotice;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderLogistics{" +
+                "id=" + id +
+                ", type=" + type +
+                ", userId=" + userId +
+                ", driverId=" + driverId +
+                ", carId=" + carId +
+                ", orderNum='" + orderNum + '\'' +
+                ", cargoType=" + cargoType +
+                ", cargoNumber=" + cargoNumber +
+                ", remark=" + remark +
+                ", placementLon=" + placementLon +
+                ", placementLat=" + placementLat +
+                ", placementAddress='" + placementAddress + '\'' +
+                ", startLon=" + startLon +
+                ", startLat=" + startLat +
+                ", startAddress='" + startAddress + '\'' +
+                ", endLon=" + endLon +
+                ", endLat=" + endLat +
+                ", endAddress='" + endAddress + '\'' +
+                ", recipient='" + recipient + '\'' +
+                ", recipientPhone='" + recipientPhone + '\'' +
+                ", boardingLon=" + boardingLon +
+                ", boardingLat=" + boardingLat +
+                ", boardingAddress='" + boardingAddress + '\'' +
+                ", boardingTime=" + boardingTime +
+                ", getoffLon=" + getoffLon +
+                ", getoffLat=" + getoffLat +
+                ", getoffAddress='" + getoffAddress + '\'' +
+                ", getoffTime=" + getoffTime +
+                ", mileage=" + mileage +
+                ", payManner=" + payManner +
+                ", payType=" + payType +
+                ", orderMoney=" + orderMoney +
+                ", travelMoney=" + travelMoney +
+                ", tipMoney=" + tipMoney +
+                ", redPacketMoney=" + redPacketMoney +
+                ", couponMoney=" + couponMoney +
+                ", redPacketId=" + redPacketId +
+                ", couponId=" + couponId +
+                ", discount=" + discount +
+                ", discountMoney=" + discountMoney +
+                ", activityId=" + activityId +
+                ", companyId=" + companyId +
+                ", payMoney=" + payMoney +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                ", travelTime=" + travelTime +
+                ", snatchOrderTime=" + snatchOrderTime +
+                ", setOutTime=" + setOutTime +
+                ", arriveTime=" + arriveTime +
+                ", startServiceTime=" + startServiceTime +
+                ", endServiceTime=" + endServiceTime +
+                ", orderSource=" + orderSource +
+                ", invoiceId=" + invoiceId +
+                ", trackId='" + trackId + '\'' +
+                ", isDelete=" + isDelete +
+                ", telX='" + telX + '\'' +
+                ", bindId='" + bindId + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/model/OrderLogisticsSpread.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/model/OrderLogisticsSpread.java
new file mode 100644
index 0000000..778c9d8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/model/OrderLogisticsSpread.java
@@ -0,0 +1,106 @@
+package com.stylefeng.guns.modular.smallLogistics.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 java.util.Date;
+
+/**
+ * 小件物流差价
+ */
+@TableName("t_order_logistics_spread")
+public class OrderLogisticsSpread {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 小件物流订单id
+     */
+    @TableField("orderLogisticsId")
+    private Integer orderLogisticsId;
+    /**
+     * 需要支付的差价金额
+     */
+    @TableField("price")
+    private Double price;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=其他)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 支付时间
+     */
+    @TableField("payTime")
+    private Date payTime;
+    /**
+     * 支付金额
+     */
+    @TableField("payMoney")
+    private Double payMoney;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrderLogisticsId() {
+        return orderLogisticsId;
+    }
+
+    public void setOrderLogisticsId(Integer orderLogisticsId) {
+        this.orderLogisticsId = orderLogisticsId;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Date getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(Date payTime) {
+        this.payTime = payTime;
+    }
+
+    public Double getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(Double payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderLogisticsSpread{" +
+                "id=" + id +
+                ", orderLogisticsId=" + orderLogisticsId +
+                ", price=" + price +
+                ", payType=" + payType +
+                ", payTime=" + payTime +
+                ", payMoney=" + payMoney +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/IOrderLogisticsService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/IOrderLogisticsService.java
new file mode 100644
index 0000000..f5bd5e9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/IOrderLogisticsService.java
@@ -0,0 +1,198 @@
+package com.stylefeng.guns.modular.smallLogistics.server;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics;
+import com.stylefeng.guns.modular.system.model.Region;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderLogisticsService extends IService<OrderLogistics> {
+
+
+    /**
+     * 根据起点和终点坐标判断是不是同一个市内
+     * @param startLonLat
+     * @param endAddress
+     * @return
+     */
+    ResultUtil judgingTheCity(String startLonLat, String endAddress) throws Exception;
+
+
+    /**
+     * 获取小件物流的单价数据
+     * @param type
+     * @param startLonLat
+     * @param endAddress
+     * @return
+     * @throws Exception
+     */
+    ResultUtil queryLogisticsUnitPrice(Integer type, String startLonLat, String endAddress, Integer uid) throws Exception;
+
+
+    /**
+     * 获取支付金额
+     * @param type
+     * @param startLonLat
+     * @param endAddress
+     * @return
+     * @throws Exception
+     */
+    ResultUtil queryPayMoney(Integer number, Integer type, String startLonLat, String endAddress) throws Exception;
+
+
+    /**
+     * 小件物流下单操作
+     * @param type
+     * @param cargoType
+     * @param cargoNumber
+     * @param remark
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param recipient
+     * @param recipientPhone
+     * @param endAddress
+     * @param travelTime
+     * @param orderSource
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil smallLogistics(Integer type, Integer cargoType, Integer cargoNumber, String remark, String placementLon, String placementLat, String startLon, String startLat, String startAddress,
+                   String recipient, String recipientPhone, String endAddress, Integer urgent, Double tipMoney, Date travelTime, Integer orderSource, Integer uid) throws Exception;
+
+
+
+
+    /**
+     * 订单完成支付订单操作
+     * @param payType
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil payLogisticsOrder(Integer payType, Integer orderId, Integer type)throws Exception;
+
+
+    /**
+     * 订单补差价支付操作
+     * @param payType
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil payLogisticsOrder_(Integer payType, Integer orderId, Integer type)throws Exception;
+
+
+
+    /**
+     * 支付完成后的订单处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payOrderLogisticsCallback(Integer id, String order_id, Integer type) throws Exception;
+
+
+
+    /**
+     * 差价支付完成后的回调处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payOrderLogisticsSpreadCallback(Integer id, String order_id, Integer type) throws Exception;
+
+
+
+    /**
+     * 获取首页订单数量
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    int queryLogisticsNumber(Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取用户的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyTravelRecord(Integer uid);
+
+
+
+    /**
+     * 获取用户端发票页面中的订单列表数据
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney,
+                                                Double endMoney, Integer uid, Integer orderType) throws Exception;
+
+
+
+    /**
+     * 添加取消
+     * @param id
+     * @param reason
+     * @param remark
+     * @param uid
+     * @throws Exception
+     */
+    ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception;
+
+
+    /**
+     * 获取行政区域数据
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryRegion() throws Exception;
+
+
+    /**
+     * 获取行政区域联动数据
+     * @param parentId
+     * @return
+     * @throws Exception
+     */
+    List<Region> queryRegions(Integer parentId) throws Exception;
+
+
+    /**
+     * 获取用户余额和可用优惠券数量
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/IOrderLogisticsSpreadService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/IOrderLogisticsSpreadService.java
new file mode 100644
index 0000000..5bdd957
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/IOrderLogisticsSpreadService.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.smallLogistics.server;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.smallLogistics.model.OrderLogisticsSpread;
+
+public interface IOrderLogisticsSpreadService extends IService<OrderLogisticsSpread> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
new file mode 100644
index 0000000..04543f9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -0,0 +1,980 @@
+package com.stylefeng.guns.modular.smallLogistics.server.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.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.smallLogistics.dao.OrderLogisticsMapper;
+import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics;
+import com.stylefeng.guns.modular.smallLogistics.model.OrderLogisticsSpread;
+import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
+import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsSpreadService;
+import com.stylefeng.guns.modular.system.dao.RegionMapper;
+import com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper;
+import com.stylefeng.guns.modular.system.dao.SysIntegralMapper;
+import com.stylefeng.guns.modular.system.dao.SystemPriceMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.util.*;
+
+
+@Service
+public class OrderLogisticsServiceImpl extends ServiceImpl<OrderLogisticsMapper, OrderLogistics> implements IOrderLogisticsService {
+
+    @Resource
+    private SystemPriceMapper systemPriceMapper;
+
+    @Resource
+    private OrderLogisticsMapper orderLogisticsMapper;
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+    @Autowired
+    private ICompanyCityService companyCityService;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private IPushOrderService pushOrderService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+//    @Autowired
+//    private ICBCPayUtil icbcPayUtil;
+
+    @Resource
+    private SysIntegralMapper sysIntegralMapper;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private IOrderLogisticsSpreadService orderLogisticsSpreadService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Resource
+    private RegionMapper regionMapper;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+    @Value("${callbackPath}")
+    private String callbackPath;
+
+    private static List<Integer> orderIds = new ArrayList<>();
+
+
+
+    /**
+     * 根据起点和终点坐标判断是不是同一个市内
+     * @param startLonLat
+     * @param endAddress
+     * @return
+     */
+    @Override
+    public ResultUtil judgingTheCity(String startLonLat, String endAddress) throws Exception {
+        Map<String, String> sgeocode = gdMapGeocodingUtil.geocode(startLonLat.split(",")[0], startLonLat.split(",")[1]);
+        String scityCode = sgeocode.get("cityCode");
+        Map<String, Object> geocoding = gdMapGeocodingUtil.geocoding(endAddress);
+        if(Integer.valueOf(geocoding.get("status").toString()) != 0){
+            return ResultUtil.error("收货地址有误,无法查询具体地址信息");
+        }
+        List<String> list = (List<String>)geocoding.get("data");
+        Map<String, String> egeocode = gdMapGeocodingUtil.geocode(list.get(0).split(",")[0], list.get(0).split(",")[1]);
+        String ecityCode = egeocode.get("cityCode");
+        if(!scityCode.equals(ecityCode)){
+            return ResultUtil.error("已超出服务范围,请重新选择跨城小件物流");
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取小件物流的单价
+     * @param type
+     * @param startLonLat
+     * @param endAddress
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil queryLogisticsUnitPrice(Integer type, String startLonLat, String endAddress, Integer uid) throws Exception {
+        Company query = companyCityService.query(startLonLat.split(",")[0], startLonLat.split(",")[1]);
+        if(null == query){
+            return ResultUtil.error("预约取货点暂无企业服务");
+        }
+        Double price1 = 0D;
+        Double price2 = 0D;
+        if(type == 4){//同城
+            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
+            if(null == query1){
+                return ResultUtil.error("请先完善价格设定");
+            }
+            String content = String.valueOf(query1.get("content"));
+            JSONObject jsonObject = JSON.parseObject(content);
+            price1 = jsonObject.getDouble("num2");
+            price2 = jsonObject.getDouble("num13");
+        }else{
+            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
+            if(null == query1){
+                return ResultUtil.error("请先完善价格设定");
+            }
+            String content = String.valueOf(query1.get("content"));
+            JSONObject jsonObject = JSON.parseObject(content);
+            price1 = jsonObject.getDouble("num1");
+            price2 = jsonObject.getDouble("num2");
+        }
+        int i = this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId", uid).eq("isDelete", 1));
+        Map<String, Object> map = new HashMap<>();
+        map.put("ordinary", price1);
+        map.put("precious", price2);
+        map.put("first", i);
+        return ResultUtil.success(map);
+    }
+
+
+    /**
+     * 获取支付金额
+     * @param type
+     * @param startLonLat
+     * @param endAddress
+     * @return
+     * @throws Exception
+     */
+    public ResultUtil queryPayMoney(Integer number, Integer type, String startLonLat, String endAddress) throws Exception{
+        Map<String, Object> geocoding = gdMapGeocodingUtil.geocoding(endAddress);
+        if(Integer.valueOf(geocoding.get("status").toString()) != 0){
+            return ResultUtil.error("收货地址有误,无法查询具体地址信息");
+        }
+        String location = ((List<String>)geocoding.get("data")).get(0);
+        ResultUtil<Map<String, Double>> price = this.getPrice(type, startLonLat.split(",")[0], startLonLat.split(",")[1], location.split(",")[0], location.split(",")[1]);
+        if(price.getCode() == 200 && type == 5){
+            Map<String, Double> data = price.getData();
+            data.put("ordinary", data.get("ordinary") * number);
+            data.put("precious", data.get("precious") * number);
+        }
+        return price;
+    }
+
+
+
+
+    /**
+     * 小件物流下单操作
+     * @param type
+     * @param cargoType
+     * @param cargoNumber
+     * @param remark
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param recipient
+     * @param recipientPhone
+     * @param endAddress
+     * @param travelTime
+     * @param orderSource
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil smallLogistics(Integer type, Integer cargoType, Integer cargoNumber, String remark, String placementLon, String placementLat, String startLon, String startLat, String startAddress, String recipient,
+                                     String recipientPhone, String endAddress, Integer urgent, Double tipMoney, Date travelTime, Integer orderSource, Integer uid) throws Exception {
+        startAddress = startAddress.replaceAll("& #40;", "(");
+        startAddress = startAddress.replaceAll("& #41;", ")");
+        endAddress = endAddress.replaceAll("& #40;", "(");
+        endAddress = endAddress.replaceAll("& #41;", ")");
+        OrderLogistics orderLogistics = new OrderLogistics();
+        Company query = companyCityService.query(placementLon, placementLat);
+        if(null == query){
+            return ResultUtil.error("该地点暂无企业服务");
+        }
+        orderLogistics.setCompanyId(query.getId());
+        orderLogistics.setType(type);
+        orderLogistics.setUserId(uid);
+        orderLogistics.setOrderNum(this.getOrderNum());
+        orderLogistics.setCargoType(cargoType);
+        orderLogistics.setCargoNumber(cargoNumber);
+        orderLogistics.setRemark(remark);
+        orderLogistics.setPlacementLon(Double.valueOf(placementLon));
+        orderLogistics.setPlacementLat(Double.valueOf(placementLat));
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
+        orderLogistics.setPlacementAddress(geocode.get("address"));
+        orderLogistics.setStartLon(Double.valueOf(startLon));
+        orderLogistics.setStartLat(Double.valueOf(startLat));
+        orderLogistics.setStartAddress(startAddress);
+        Map<String, Object> geocoding = gdMapGeocodingUtil.geocoding(endAddress);
+        if(Integer.valueOf(geocoding.get("status").toString()) != 0){
+            return ResultUtil.error("收货地址有误,无法查询具体地址信息");
+        }
+        if(((List<String>)geocoding.get("data")).size() == 0){
+            return ResultUtil.error("无法查询具体地址信息");
+        }
+        String location = ((List<String>)geocoding.get("data")).get(0);
+        orderLogistics.setEndLon(Double.valueOf(location.split(",")[0]));
+        orderLogistics.setEndLat(Double.valueOf(location.split(",")[1]));
+        orderLogistics.setEndAddress(endAddress);
+        orderLogistics.setUrgent(urgent);
+        orderLogistics.setRecipient(recipient);
+        orderLogistics.setRecipientPhone(recipientPhone);
+        orderLogistics.setMileage(0D);
+        orderLogistics.setIsReassign(1);
+        orderLogistics.setReassignNotice(0);
+        ResultUtil<Map<String, Double>> price = this.getPrice(type, String.valueOf(startLon), String.valueOf(startLat), location.split(",")[0], location.split(",")[1]);
+        if(price.getCode() != 200){
+            return price;
+        }
+        Map<String, Double> data = price.getData();
+        orderLogistics.setOrderMoney((cargoType == 1 ? data.get("ordinary") : data.get("precious")) + tipMoney);
+        orderLogistics.setTravelMoney(cargoType == 1 ? data.get("ordinary") : data.get("precious"));
+        if(type == 5){
+            orderLogistics.setOrderMoney(((cargoType == 1 ? data.get("ordinary") : data.get("precious")) * cargoNumber) + tipMoney);
+            orderLogistics.setTravelMoney((cargoType == 1 ? data.get("ordinary") : data.get("precious")) * cargoNumber);
+        }
+        orderLogistics.setTipMoney(tipMoney);
+        orderLogistics.setState(7);//待支付
+        orderLogistics.setInsertTime(new Date());
+        orderLogistics.setTravelTime(travelTime);
+        orderLogistics.setOrderSource(orderSource);
+        orderLogistics.setIsDelete(1);
+        this.insert(orderLogistics);
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您的"+ (type == 4 ? "同城" : "跨城") + "小件物流订单已下单成功,我们正在为您指派司机,请稍后!", orderLogistics.getUserId(), 1);
+
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(orderLogistics.getId());
+        return ResultUtil.success(baseWarpper);
+    }
+
+
+    /**
+     * 获取价格
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    public ResultUtil<Map<String, Double>> getPrice(Integer type, String startLon, String startLat, String endLon, String endLat) throws Exception{
+        Company query = companyCityService.query(startLon, startLat);
+        if(null == query){
+            return ResultUtil.error("预约取货点暂无企业服务");
+        }
+        Double price1 = 0D;
+        Double price2 = 0D;
+        if(type == 4){//同城
+            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
+            Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLon + "," + startLat, endLon + "," + endLat, 1);
+            String content = String.valueOf(query1.get("content"));
+            JSONObject jsonObject = JSON.parseObject(content);
+            String distance1 = distance.get("distance");
+            Double dist = Double.valueOf(distance1) / 1000;
+            if(dist.compareTo(0D) >= 0 && dist.compareTo(jsonObject.getDouble("num1")) < 0){
+                price1 = jsonObject.getDouble("num2");
+            }
+            if(dist.compareTo(0D) >= 0 && dist.compareTo(jsonObject.getDouble("num12")) < 0){
+                price2 = jsonObject.getDouble("num13");
+            }
+
+            if(dist.compareTo(jsonObject.getDouble("num3")) >= 0 && dist.compareTo(jsonObject.getDouble("num4")) < 0){
+                price1 = jsonObject.getDouble("num5");
+            }
+            if(dist.compareTo(jsonObject.getDouble("num14")) >= 0 && dist.compareTo(jsonObject.getDouble("num15")) < 0){
+                price2 = jsonObject.getDouble("num16");
+            }
+
+            if(dist.compareTo(jsonObject.getDouble("num6")) >= 0 && dist.compareTo(jsonObject.getDouble("num7")) < 0){
+                price1 = jsonObject.getDouble("num8");
+            }
+            if(dist.compareTo(jsonObject.getDouble("num17")) >= 0 && dist.compareTo(jsonObject.getDouble("num18")) < 0){
+                price2 = jsonObject.getDouble("num19");
+            }
+
+            if(dist.compareTo(jsonObject.getDouble("num9")) >= 0 && dist.compareTo(jsonObject.getDouble("num10")) < 0){
+                price1 = jsonObject.getDouble("num11");
+            }
+            if(dist.compareTo(jsonObject.getDouble("num20")) >= 0 && dist.compareTo(jsonObject.getDouble("num21")) < 0){
+                price2 = jsonObject.getDouble("num22");
+            }
+        }else{
+            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
+            String content = String.valueOf(query1.get("content"));
+            JSONObject jsonObject = JSON.parseObject(content);
+            price1 = jsonObject.getDouble("num1");
+            price2 = jsonObject.getDouble("num2");
+        }
+        Map<String, Double> map = new HashMap<>();
+        map.put("ordinary", price1);//普通
+        map.put("precious", price2);//贵重
+        return ResultUtil.success(map);
+    }
+
+
+
+    /**
+     * 推送抢单数据
+     * @param orderLogistics
+     * @throws Exception
+     */
+    public void pushOrder(OrderLogistics orderLogistics) throws Exception{
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    orderIds.add(orderLogistics.getId());//添加记录,防止调用接口重复提醒无人接单
+                    String vehicle = redisUtil.getValue("VEHICLE");
+                    List<Integer> integers = new ArrayList<>();
+                    if(ToolUtil.isNotEmpty(vehicle)){
+                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
+                    }
+                    Company query = companyCityService.query(String.valueOf(orderLogistics.getStartLon()), String.valueOf(orderLogistics.getStartLat()));//获取起点所属分公司
+                    List<PushOrder> querys = pushOrderService.querys(null, 1, query.getId());//用专车的推单配置
+                    for(int i = 1; i <= querys.size(); i++){
+                        PushOrder pushOrder = pushOrderService.querys(i, 1, query.getId()).get(0);
+                        //获取空闲司机
+                        List<Driver> list = driverService.queryIdleDriver(orderLogistics.getType(), null, orderLogistics.getStartLon(), orderLogistics.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+                        if(list.size() > 0){
+                            double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
+                            int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
+                            list = list.subList(0, lastIndex);//获取空闲司机中占比数据
+                            for(Driver driver : list){//开始进行推送
+                                boolean bo = false;
+                                for(Integer integer : integers){
+                                    if(integer.compareTo(driver.getId()) == 0){
+                                        bo = true;
+                                        break;
+                                    }
+                                }
+                                if(bo){
+                                    continue;
+                                }
+                                pushUtil.pushOrderState(2, driver.getId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), pushOrder.getPushTime());
+                            }
+                        }
+                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
+                        Integer state = orderLogisticsMapper.selectById(orderLogistics.getId()).getState();
+                        if(state > 1){
+                            break;
+                        }
+                        if(i == querys.size() && state == 1){
+//                            pushUtil.pushEndPush(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType());
+                            orderIds.remove(orderLogistics.getId());
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+    }
+
+
+
+
+    /**
+     * 订单支付
+     * @param payType
+     * @param orderId
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil payLogisticsOrder(Integer payType, Integer orderId, Integer type) throws Exception {
+        OrderLogistics orderLogistics = this.selectById(orderId);
+        if(orderLogistics.getState() != 7){
+            return ResultUtil.error("订单已完成支付,不允许重复支付");
+        }
+        Integer uid = orderLogistics.getUserId();
+        Double orderMoney = orderLogistics.getOrderMoney();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+
+        if(payType == 1){//微信支付
+            String app = type == 1 ? "APP" : "JSAPI";
+            resultUtil = payMoneyUtil.weixinpay("小件物流下单支付", "", orderId + "_" + orderLogistics.getType() + "_" + UUIDUtil.getRandomCode(5), orderMoney.toString(),  "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
+            paymentRecordService.saveData(1, orderLogistics.getUserId(), 1, orderId, orderLogistics.getType(), 1, orderMoney, "", 1);//添加预支付数据
+        }
+        if(payType == 2){//支付宝支付
+            resultUtil = payMoneyUtil.alipay("小件物流下单支付", "小件物流下单支付", "", orderId + "_" + orderLogistics.getType() + "_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
+            paymentRecordService.saveData(1, orderLogistics.getUserId(), 1, orderId, orderLogistics.getType(), 2, orderMoney, "", 1);//添加预支付数据
+        }
+
+
+//        if(payType == 1){//微信支付
+//            String value = redisUtil.getValue("appletOpenId");
+//            String appletsOpenId = null;
+//            if(ToolUtil.isNotEmpty(value)){
+//                JSONObject jsonObject = JSON.parseObject(value);
+//                appletsOpenId = jsonObject.getString(uid.toString());
+//            }else{
+//                appletsOpenId = userInfo.getAppletsOpenId();
+//            }
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + "," + orderLogistics.getType(), 9, 5, uid.toString(), "小件物流下单支付", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderLogistics.getUserId(), 1, orderId, orderLogistics.getType(), 1, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+//        if(payType == 2){//支付宝支付
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + "," + orderLogistics.getType(), 10, 5, uid.toString(), "小件物流下单支付", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderLogistics.getUserId(), 1, orderId, orderLogistics.getType(), 2, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+        if(payType == 3){//余额支付
+            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
+                return ResultUtil.error("余额不足,无法完成支付");
+            }
+
+            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+
+            SysIntegral query1 = sysIntegralMapper.query(orderLogistics.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
+
+            //添加交易明细
+            transactionDetailsService.saveData(uid, "小件物流下单支付", orderMoney, 2, 1, 1, 4, orderId);
+            userInfoService.updateById(userInfo);
+
+            orderLogistics.setState(1);//小件物流先支付后司机抢单
+            orderLogistics.setPayType(3);
+            orderLogistics.setPayMoney(orderMoney);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
+                }
+            }).start();
+
+            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成小件物流订单支付,谢谢使用!", uid, 1);
+
+            this.pushOrder(orderLogistics);//推单
+        }
+
+        this.updateById(orderLogistics);
+        return resultUtil;
+    }
+
+
+
+
+    /**
+     * 补差价支付
+     * @param payType
+     * @param orderId
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil payLogisticsOrder_(Integer payType, Integer orderId, Integer type) throws Exception {
+        OrderLogistics orderLogistics = this.selectById(orderId);
+        Integer uid = orderLogistics.getUserId();
+        OrderLogisticsSpread orderLogisticsSpread = orderLogisticsSpreadService.selectOne(new EntityWrapper<OrderLogisticsSpread>().eq("orderLogisticsId", orderId));
+        Double orderMoney = orderLogisticsSpread.getPrice();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+
+        if(payType == 1){//微信支付
+            String app = type == 1 ? "APP" : "JSAPI";
+            resultUtil = payMoneyUtil.weixinpay("小件物流补差价", "", orderId + "_" + orderLogistics.getType() + "_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderLogisticsSpread", app, userInfo.getAppletsOpenId());
+            paymentRecordService.saveData(1, orderLogistics.getUserId(), 1, orderId, orderLogistics.getType(), 1, orderMoney, "", 1);//添加预支付数据
+        }
+        if(payType == 2){//支付宝支付
+            resultUtil = payMoneyUtil.alipay("小件物流补差价", "小件物流补差价", "", orderId + "_" + orderLogistics.getType() + "_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderLogisticsSpread");
+            paymentRecordService.saveData(1, orderLogistics.getUserId(), 1, orderId, orderLogistics.getType(), 2, orderMoney, "", 1);//添加预支付数据
+        }
+
+//        if(payType == 1){//微信支付
+//            String value = redisUtil.getValue("appletOpenId");
+//            String appletsOpenId = null;
+//            if(ToolUtil.isNotEmpty(value)){
+//                JSONObject jsonObject = JSON.parseObject(value);
+//                appletsOpenId = jsonObject.getString(uid.toString());
+//            }else{
+//                appletsOpenId = userInfo.getAppletsOpenId();
+//            }
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + "," + orderLogistics.getType(), 9, 5, uid.toString(), "小件物流补差价", orderMoney, callbackPath + "/base/wxPayOrderLogisticsSpread", "", type, appletsOpenId);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderLogistics.getUserId(), 1, orderId, orderLogistics.getType(), 1, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+//        if(payType == 2){//支付宝支付
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + "," + orderLogistics.getType(), 10, 5, uid.toString(), "小件物流补差价", orderMoney, callbackPath + "/base/aliPayOrderLogisticsSpread", "", type, null);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderLogistics.getUserId(), 1, orderId, orderLogistics.getType(), 2, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+        if(payType == 3){//余额支付
+            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
+                return ResultUtil.error("余额不足,无法完成支付");
+            }
+
+            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+
+            SysIntegral query1 = sysIntegralMapper.query(orderLogistics.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
+
+            //添加交易明细
+            transactionDetailsService.saveData(uid, "小件物流补差价", orderMoney, 2, 1, 1, 4, orderId);
+            userInfoService.updateById(userInfo);
+
+            orderLogistics.setState(12);//已支付差价
+            this.updateById(orderLogistics);
+
+            orderLogistics.setOrderMoney(orderLogistics.getOrderMoney() + orderMoney);
+            orderLogistics.setTravelMoney(orderLogistics.getTravelMoney() + orderMoney);
+            orderLogistics.setPayMoney(orderLogistics.getPayMoney() + orderMoney);
+
+            orderLogisticsSpread.setPayMoney(orderMoney);
+            orderLogisticsSpread.setPayTime(new Date());
+            orderLogisticsSpread.setPayType(3);
+            orderLogisticsSpreadService.updateById(orderLogisticsSpread);
+
+            //添加已收入明细
+            Company company = companyService.selectById(orderLogistics.getCompanyId());
+            Double speMoney =  orderLogistics.getType() == 4 ? company.getSameLogisticsMoney() : company.getCrossLogisticsMoney();
+            BigDecimal d = null;
+            BigDecimal c = null;
+            if(company.getIsSpeFixedOrProportional() == 2){//固定
+                d = new BigDecimal(speMoney);
+                c = new BigDecimal(orderMoney).subtract(d);
+            }
+            if(company.getIsSpeFixedOrProportional() == 1){//比例
+                d = new BigDecimal(orderMoney).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                c = new BigDecimal(orderMoney).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+
+            Income income = incomeService.selectOne(new EntityWrapper<Income>().eq("userType", 1).eq("objectId", orderLogistics.getCompanyId()).eq("type", 2).eq("incomeId", orderLogistics.getId()).eq("orderType", orderLogistics.getType()));
+            income.setMoney(income.getMoney() + d.doubleValue());
+            incomeService.updateById(income);
+            income = incomeService.selectOne(new EntityWrapper<Income>().eq("userType", 2).eq("objectId", orderLogistics.getDriverId()).eq("type", 2).eq("incomeId", orderLogistics.getId()).eq("orderType", orderLogistics.getType()));
+            income.setMoney(income.getMoney() + c.doubleValue());
+            incomeService.updateById(income);
+            Driver driver = driverService.selectById(orderLogistics.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
+                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
+                }
+            }).start();
+
+            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成小件物流订单差价支付,谢谢使用!", uid, 1);
+        }
+
+        this.updateById(orderLogistics);
+        return resultUtil;
+    }
+
+
+
+    @Override
+    public void payOrderLogisticsCallback(Integer id, String order_id, Integer type) throws Exception {
+        OrderLogistics orderLogistics = this.selectById(id);
+        PaymentRecord query = paymentRecordService.query(1, orderLogistics.getUserId(), 1, Integer.valueOf(id), orderLogistics.getType(), type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderLogistics.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, orderLogistics.getType(), query.getOrderId());
+            orderLogistics.setState(1);//先支付后抢单
+            orderLogistics.setPayType(type);
+            orderLogistics.setPayMoney(query.getAmount());
+            this.updateById(orderLogistics);
+
+            UserInfo userInfo = userInfoService.selectById(orderLogistics.getUserId());
+            SysIntegral query1 = sysIntegralMapper.query(orderLogistics.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
+            userInfoService.updateById(userInfo);
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
+                }
+            }).start();
+
+
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成小件物流订单支付,谢谢使用!", orderLogistics.getUserId(), 1);
+
+            this.pushOrder(orderLogistics);//推单
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+
+
+
+    @Override
+    public void payOrderLogisticsSpreadCallback(Integer id, String order_id, Integer type) throws Exception {
+        OrderLogistics orderLogistics = this.selectById(id);
+        OrderLogisticsSpread orderLogisticsSpread = orderLogisticsSpreadService.selectOne(new EntityWrapper<OrderLogisticsSpread>().eq("orderLogisticsId", id));
+        PaymentRecord query = paymentRecordService.query(1, orderLogistics.getUserId(), 1, Integer.valueOf(id), orderLogistics.getType(), type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderLogistics.getUserId(), "小件物流补差价", query.getAmount(), 2, 1, 1, 4, query.getOrderId());
+            orderLogistics.setState(4);//待取货
+
+            orderLogistics.setOrderMoney(orderLogistics.getOrderMoney() + query.getAmount());
+            orderLogistics.setTravelMoney(orderLogistics.getTravelMoney() + query.getAmount());
+            orderLogistics.setPayMoney(orderLogistics.getPayMoney() + query.getAmount());
+
+            orderLogisticsSpread.setPayMoney(query.getAmount());
+            orderLogisticsSpread.setPayTime(new Date());
+            orderLogisticsSpread.setPayType(3);
+            orderLogisticsSpreadService.updateById(orderLogisticsSpread);
+
+            UserInfo userInfo = userInfoService.selectById(orderLogistics.getUserId());
+            SysIntegral query1 = sysIntegralMapper.query(orderLogistics.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
+            userInfoService.updateById(userInfo);
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            //添加已收入明细
+            Company company = companyService.selectById(orderLogistics.getCompanyId());
+            Double speMoney =  orderLogistics.getType() == 4 ? company.getSameLogisticsMoney() : company.getCrossLogisticsMoney();
+            BigDecimal d = null;
+            BigDecimal c = null;
+            if(company.getIsSpeFixedOrProportional() == 2){//固定
+                d = new BigDecimal(speMoney);
+                c = new BigDecimal(query.getAmount()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            if(company.getIsSpeFixedOrProportional() == 1){//比例
+                d = new BigDecimal(query.getAmount()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                c = new BigDecimal(query.getAmount()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            Income income = incomeService.selectOne(new EntityWrapper<Income>().eq("userType", 1).eq("objectId", orderLogistics.getCompanyId()).eq("type", 2).eq("incomeId", orderLogistics.getId()).eq("orderType", orderLogistics.getType()));
+            income.setMoney(income.getMoney() + d.doubleValue());
+            incomeService.updateById(income);
+            income = incomeService.selectOne(new EntityWrapper<Income>().eq("userType", 2).eq("objectId", orderLogistics.getDriverId()).eq("type", 2).eq("incomeId", orderLogistics.getId()).eq("orderType", orderLogistics.getType()));
+            income.setMoney(income.getMoney() + c.doubleValue());
+            incomeService.updateById(income);
+            Driver driver = driverService.selectById(orderLogistics.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
+                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
+                }
+            }).start();
+
+
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成小件物流订单差价支付,谢谢使用!", orderLogistics.getUserId(), 1);
+            this.updateById(orderLogistics);
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+
+
+
+
+
+    /**
+     * 获取首页订单数量
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public int queryLogisticsNumber(Integer uid) throws Exception {
+        return orderLogisticsMapper.queryLogisticsNumber(uid);
+    }
+
+
+    /**
+     * 获取个人中心订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        List<Map<String, Object>> maps = orderLogisticsMapper.queryMyOrderList(uid, pageNum, size);
+        return maps;
+    }
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryMyTravelRecord(Integer uid) {
+        return orderLogisticsMapper.queryMyTravelRecord(uid);
+    }
+
+
+    @Override
+    public List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney, Double endMoney, Integer uid, Integer orderType) throws Exception {
+        startTime = dateUtil.getStartOrEndDate(startTime, "start");
+        endTime = dateUtil.getStartOrEndDate(endTime, "end");
+        return orderLogisticsMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid, orderType);
+    }
+
+
+
+    @Override
+    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(remark)){
+            if(ToolUtil.isNotEmpty(remark)){
+                List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+                for(SensitiveWords s : sensitiveWords){
+                    remark = remark.replaceAll(s.getContent(), "***");
+                }
+            }
+        }
+
+        OrderLogistics orderLogistics = this.selectById(id);
+        Integer integer = null;
+        if(null == orderLogistics){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderLogistics.getState() > 5 && orderLogistics.getState() != 7 && orderLogistics.getState() != 8  && orderLogistics.getState() != 11){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+
+        if(orderLogistics.getState() == 7){
+            integer = orderCancelService.saveData(orderLogistics.getId(), orderLogistics.getType(), reason, remark, null, null, 2, 1, orderLogistics.getUserId());
+            orderLogistics.setState(10);
+            this.updateById(orderLogistics);
+            //添加消息
+            systemNoticeService.addSystemNotice(1, "您已成功取消小件物流订单,谢谢使用!", orderLogistics.getUserId(), 1);
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", integer);
+            return ResultUtil.success(map);
+        }
+
+
+        //回退支付金额
+        if(null != orderLogistics.getPayType() && null != orderLogistics.getPayMoney()) {//已支付
+            if(orderLogistics.getPayType() == 3){//余额支付
+                UserInfo userInfo = userInfoService.selectById(orderLogistics.getUserId());
+                userInfo.setBalance(userInfo.getBalance() + orderLogistics.getPayMoney());
+                userInfoService.updateById(userInfo);
+            }else{
+                //调用回退接口
+                PaymentRecord query = paymentRecordService.query(1, orderLogistics.getUserId(), 1, orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getPayType(), 2);
+                boolean b = false;
+
+                if(query.getPayType() == 1){//微信
+                    Map<String, String> map = payMoneyUtil.wxRefund(query.getCode(), orderLogistics.getId() + "_" + orderLogistics.getType(), query.getAmount().toString(), query.getAmount().toString(), "/base/cancleOrderWXPay");
+                    if(!"SUCCESS".equals(map.get("return_code"))){
+                        return ResultUtil.error(map.get("return_msg"));
+                    }
+                }else{//支付宝
+                    Map<String, String> map = payMoneyUtil.aliRefund(query.getCode(), query.getAmount().toString());
+                    if(!"10000".equals(map.get("code"))){
+                        return ResultUtil.error(map.get("msg"));
+                    }
+                }
+
+
+//                //调用回退接口
+//                PaymentRecord query = paymentRecordService.query(1, orderLogistics.getUserId(), 1, orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getPayType(), 2);
+//                boolean b = false;
+//                Map<String, Object> merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), orderLogistics.getId() + "_" + orderLogistics.getType(), orderLogistics.getOrderNum());
+//                if (Integer.valueOf(merrefund.get("code").toString()) == 0) {
+//                    Map<String, Object> refundqry = icbcPayUtil.refundqry("", query.getCode(), orderLogistics.getOrderNum());
+//                    if (Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 0) {//成功
+//                        b = true;
+//                    }
+//                    if (Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 1) {//失败
+//                        return ResultUtil.error("订单取消失败(退款不成功)");
+//                    }
+//                    if (Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 2) {//未知
+//                        return ResultUtil.error("退款返回未知异常");
+//
+//                    }
+//                }
+                if(b){
+
+                }
+            }
+            //添加交易明细
+            transactionDetailsService.saveData(orderLogistics.getUserId(), "小件物流取消退款", orderLogistics.getPayMoney(), 1, 1, 1, 4, orderLogistics.getId());
+
+            integer = orderCancelService.saveData(orderLogistics.getId(), orderLogistics.getType(), reason, remark, null, null, 2, 1, orderLogistics.getUserId());
+            orderLogistics.setState(10);
+            this.updateById(orderLogistics);
+
+            //添加负的收入明细
+            List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", id).eq("orderType", orderLogistics.getType()));
+            for(Income income : incomes){
+                if(income.getUserType() == 2){//处理司机的收入
+                    Driver driver = driverService.selectById(income.getObjectId());
+                    driver.setBalance(driver.getBalance() - income.getMoney());
+                    driver.setBusinessMoney(driver.getBusinessMoney() - income.getMoney());
+                    driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
+                    driverService.updateById(driver);
+                }
+                Income income1 = new Income();
+                BeanUtils.copyProperties(income, income1);
+                income1.setMoney(income.getMoney() * -1);
+                income1.setId(null);
+                income1.setInsertTime(new Date());
+                incomeService.insert(income1);
+            }
+
+        }
+
+        if(null != orderLogistics.getDriverId()){
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
+                }
+            }).start();
+        }
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您已成功取消小件物流订单,谢谢使用!", orderLogistics.getUserId(), 1);
+        Map<String, Object> map = new HashMap<>();
+        map.put("id", integer);
+        return ResultUtil.success(map);
+    }
+
+
+    /**
+     * 获取行政区域数据
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryRegion() throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        List<Region> querys = regionMapper.querys(0);
+        Map<Integer, String> map1 = new HashMap<>();
+        Map<Integer, String> map2 = new HashMap<>();
+        Map<Integer, String> map3 = new HashMap<>();
+        for(Region region : querys){
+            map1.put(Integer.valueOf(region.getCode()), region.getName());
+
+            List<Region> querys1 = regionMapper.querys(region.getId());
+            for(Region region1 : querys1){
+                map2.put(Integer.valueOf(region1.getCode()), region1.getName());
+
+                List<Region> querys2 = regionMapper.querys(region1.getId());
+                for(Region region2 : querys2) {
+                    map3.put(Integer.valueOf(region2.getCode()), region2.getName());
+                }
+            }
+        }
+        map.put("province_list", map1);
+        map.put("city_list", map2);
+        map.put("county_list", map3);
+        return map;
+    }
+
+
+    /**
+     * 获取行政区域
+     * @param parentId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Region> queryRegions(Integer parentId) throws Exception {
+        return regionMapper.querys(parentId);
+    }
+
+    @Override
+    public Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        map.put("balance", userInfo.getBalance());
+        map.put("coupon", 0);
+        return map;
+    }
+
+
+
+    public synchronized String getOrderNum() throws Exception{
+        int size = this.selectCount(null);
+        return "LOGISTICS" + String.valueOf(1000000 + size + 1).substring(1);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsSpreadService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsSpreadService.java
new file mode 100644
index 0000000..2502f85
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsSpreadService.java
@@ -0,0 +1,12 @@
+package com.stylefeng.guns.modular.smallLogistics.server.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.smallLogistics.dao.OrderLogisticsSpreadMapper;
+import com.stylefeng.guns.modular.smallLogistics.model.OrderLogisticsSpread;
+import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsSpreadService;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class OrderLogisticsSpreadService extends ServiceImpl<OrderLogisticsSpreadMapper, OrderLogisticsSpread> implements IOrderLogisticsSpreadService {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/controller/OrderPrivateCarController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/controller/OrderPrivateCarController.java
new file mode 100644
index 0000000..0c8ec75
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/controller/OrderPrivateCarController.java
@@ -0,0 +1,154 @@
+package com.stylefeng.guns.modular.specialTrain.controller;
+
+
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+@Api
+@RestController
+@RequestMapping("")
+public class OrderPrivateCarController {
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+
+    /**
+     * 专车下单
+     * @param serverCarModelId
+     * @param travelTime
+     * @param orderType
+     * @param substitute
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @param passengers
+     * @param passengersPhone
+     * @param orderSource
+     * @param driverId
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/orderPrivateCar/saveOrderPrivateCar")
+    @ApiOperation(value = "专车下单/扫码下单", tags = {"用户端-专车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单类型(1=普通订单,2=摆渡订单)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "服务车型id(扫码下单不用上传)", name = "serverCarModelId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "出行时间(2020-08-20 10:10)", name = "travelTime", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "是否预约(1=否,2=是)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "是否代下单(0=否,1=是)", name = "substitute", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "下单地点经度", name = "placementLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "下单地点纬度", name = "placementLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点经度", name = "startLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点纬度", name = "startLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点地址", name = "startAddress", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点经度", name = "endLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点纬度", name = "endLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点地址", name = "endAddress", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)", name = "orderSource", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "司机id(扫码下单必传)", name = "driverId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "乘客姓名(代下单必传)", name = "passengers", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "乘客电话(代下单必传)", name = "passengersPhone", required = false, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer orderType, Integer substitute, String placementLon, String placementLat, String startLon, String startLat,
+                                                       String startAddress, String endLon, String endLat, String endAddress, String passengers, String passengersPhone, Integer orderSource, Integer driverId,
+                                                       Integer type, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderPrivateCarService.saveOrderPrivateCar(serverCarModelId, travelTime, orderType, substitute, placementLon, placementLat,
+                    startLon, startLat, startAddress, endLon, endLat, endAddress, passengers, passengersPhone, orderSource, driverId, type, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 专车下单
+     * @param serverCarModelId
+     * @param travelTime
+     * @param orderType
+     * @param substitute
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @param passengers
+     * @param passengersPhone
+     * @param orderSource
+     * @param driverId
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/orderPrivateCar/saveOrderPrivateCars")
+    @ApiOperation(value = "专车下单/扫码下单[2024.05.11]", tags = {"用户端-专车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单类型(1=普通订单,2=摆渡订单)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "服务车型id(扫码下单不用上传)", name = "serverCarModelId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "出行时间(2020-08-20 10:10)", name = "travelTime", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "是否预约(1=否,2=是)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "是否代下单(0=否,1=是)", name = "substitute", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "下单地点经度", name = "placementLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "下单地点纬度", name = "placementLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点经度", name = "startLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点纬度", name = "startLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点地址", name = "startAddress", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点经度", name = "endLon", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "终点纬度", name = "endLat", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "终点地址", name = "endAddress", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)", name = "orderSource", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "司机id(扫码下单必传)", name = "driverId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "乘客姓名(代下单必传)", name = "passengers", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "乘客电话(代下单必传)", name = "passengersPhone", required = false, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> saveOrderPrivateCars(Integer serverCarModelId, Date travelTime, Integer orderType, Integer substitute, String placementLon, String placementLat, String startLon, String startLat,
+                                                       String startAddress, String endLon, String endLat, String endAddress, String passengers, String passengersPhone, Integer orderSource, Integer driverId,
+                                                       Integer type, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderPrivateCarService.saveOrderPrivateCars(serverCarModelId, travelTime, orderType, substitute, placementLon, placementLat,
+                    startLon, startLat, startAddress, endLon, endLat, endAddress, passengers, passengersPhone, orderSource, driverId, type, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java
new file mode 100644
index 0000000..e416902
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java
@@ -0,0 +1,90 @@
+package com.stylefeng.guns.modular.specialTrain.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface OrderPrivateCarMapper extends BaseMapper<OrderPrivateCar> {
+
+
+    /**
+     * 根据状态数据订单数据
+     * @param uid
+     * @param orderType
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    List<OrderPrivateCar> queryByState(@Param("uid") Integer uid, @Param("orderType") Integer orderType,
+                                       @Param("type") Integer type, @Param("state") Integer...state) throws Exception;
+
+
+
+    List<OrderPrivateCar> query(@Param("start") Date start, @Param("end") Date end) throws Exception;
+
+
+
+
+    List<OrderPrivateCar> queryByState_(@Param("uid") Integer uid, @Param("state") Integer... state);
+
+
+
+    /**
+     * 获取用户的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryMyOrderList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
+                                               @Param("size") Integer size);
+
+
+
+    /**
+     * 获取用户单发票页面的订单列表
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryInvoiceOrder(@Param("type") Integer type, @Param("startTime") Date startTime,
+                                                @Param("endTime") Date endTime, @Param("startMoney") Double startMoney,
+                                                @Param("endMoney") Double endMoney, @Param("uid") Integer uid);
+
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(@Param("orderId") Integer orderId);
+
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyTravelRecord(@Param("uid") Integer uid);
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryRedEnvelope(@Param("uid") Integer uid);
+
+
+    List<OrderPrivateCar> queryByDriver(@Param("driverId") Integer driverId, @Param("state") Integer...state);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml
new file mode 100644
index 0000000..df4edbb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml
@@ -0,0 +1,546 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="crossCityOrderId" property="crossCityOrderId"/>
+        <result column="place" property="place"/>
+        <result column="userId" property="userId"/>
+        <result column="serverCarModelId" property="serverCarModelId"/>
+        <result column="driverId" property="driverId"/>
+        <result column="carId" property="carId"/>
+        <result column="orderNum" property="orderNum"/>
+        <result column="placementLon" property="placementLon"/>
+        <result column="placementLat" property="placementLat"/>
+        <result column="placementAddress" property="placementAddress"/>
+        <result column="startLon" property="startLon"/>
+        <result column="startLat" property="startLat"/>
+        <result column="startAddress" property="startAddress"/>
+        <result column="endLon" property="endLon"/>
+        <result column="endLat" property="endLat"/>
+        <result column="endAddress" property="endAddress"/>
+        <result column="boardingLon" property="boardingLon"/>
+        <result column="boardingLat" property="boardingLat"/>
+        <result column="boardingAddress" property="boardingAddress"/>
+        <result column="boardingTime" property="boardingTime"/>
+        <result column="getoffLon" property="getoffLon"/>
+        <result column="getoffLat" property="getoffLat"/>
+        <result column="getoffAddress" property="getoffAddress"/>
+        <result column="getoffTime" property="getoffTime"/>
+        <result column="mileage" property="mileage"/>
+        <result column="payManner" property="payManner"/>
+        <result column="payType" property="payType"/>
+        <result column="orderMoney" property="orderMoney"/>
+        <result column="startMileage" property="startMileage"/>
+        <result column="startMoney" property="startMoney"/>
+        <result column="mileageKilometers" property="mileageKilometers"/>
+        <result column="mileageMoney" property="mileageMoney"/>
+        <result column="duration" property="duration"/>
+        <result column="durationMoney" property="durationMoney"/>
+        <result column="wait" property="wait"/>
+        <result column="waitMoney" property="waitMoney"/>
+        <result column="longDistance" property="longDistance"/>
+        <result column="longDistanceMoney" property="longDistanceMoney"/>
+        <result column="parkMoney" property="parkMoney"/>
+        <result column="roadTollMoney" property="roadTollMoney"/>
+        <result column="redPacketMoney" property="redPacketMoney"/>
+        <result column="couponMoney" property="couponMoney"/>
+        <result column="redPacketId" property="redPacketId"/>
+        <result column="couponId" property="couponId"/>
+        <result column="discount" property="discount"/>
+        <result column="discountMoney" property="discountMoney"/>
+        <result column="activityId" property="activityId"/>
+        <result column="companyId" property="companyId"/>
+        <result column="payMoney" property="payMoney"/>
+        <result column="substitute" property="substitute"/>
+        <result column="passengers" property="passengers"/>
+        <result column="passengersPhone" property="passengersPhone"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="travelTime" property="travelTime"/>
+        <result column="snatchOrderTime" property="snatchOrderTime"/>
+        <result column="setOutTime" property="setOutTime"/>
+        <result column="arriveTime" property="arriveTime"/>
+        <result column="startServiceTime" property="startServiceTime"/>
+        <result column="endServiceTime" property="endServiceTime"/>
+        <result column="orderType" property="orderType"/>
+        <result column="orderSource" property="orderSource"/>
+        <result column="invoiceId" property="invoiceId"/>
+        <result column="isReassign" property="isReassign"/>
+        <result column="reassignNotice" property="reassignNotice"/>
+        <result column="trackId" property="trackId"/>
+        <result column="isDelete" property="isDelete"/>
+        <result column="oldState" property="oldState"/>
+        <result column="telX" property="telX"/>
+        <result column="bindId" property="bindId"/>
+    </resultMap>
+
+
+
+    <select id="queryByState" resultType="OrderPrivateCar">
+        select
+        id as id,
+        `type` as `type`,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        startMileage as startMileage,
+        startMoney as startMoney,
+        mileageKilometers as mileageKilometers,
+        mileageMoney as mileageMoney,
+        duration as duration,
+        durationMoney as durationMoney,
+        wait as wait,
+        waitMoney as waitMoney,
+        longDistance as longDistance,
+        longDistanceMoney as longDistanceMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId
+        from t_order_private_car where isDelete = 1 and userId = #{uid}
+        <if test="null != orderType">
+            and orderType = #{orderType}
+        </if>
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != type">
+            and `type` = #{type}
+        </if>
+    </select>
+
+
+
+    <select id="query" resultType="OrderPrivateCar">
+        select
+        id as id,
+        `type` as `type`,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        startMileage as startMileage,
+        startMoney as startMoney,
+        mileageKilometers as mileageKilometers,
+        mileageMoney as mileageMoney,
+        duration as duration,
+        durationMoney as durationMoney,
+        wait as wait,
+        waitMoney as waitMoney,
+        longDistance as longDistance,
+        longDistanceMoney as longDistanceMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId
+        from t_order_private_car where isDelete = 1
+        <if test="null != start and null != end">
+            and insertTime between #{start} and #{end}
+        </if>
+    </select>
+
+
+
+    <select id="queryByState_" resultType="OrderPrivateCar">
+        select
+        id as id,
+        `type` as `type`,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        startMileage as startMileage,
+        startMoney as startMoney,
+        mileageKilometers as mileageKilometers,
+        mileageMoney as mileageMoney,
+        duration as duration,
+        durationMoney as durationMoney,
+        wait as wait,
+        waitMoney as waitMoney,
+        longDistance as longDistance,
+        longDistanceMoney as longDistanceMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId
+        from t_order_private_car where isDelete = 1 and userId = #{uid}
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
+
+
+    <select id="queryMyOrderList" resultType="map">
+        select
+        id as orderId,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+        DATE_FORMAT(travelTime, '%m月%d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (1) as orderType,
+        state as state,
+        oldState as oldState
+        from t_order_private_car where userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+
+
+    <select id="queryInvoiceOrder" resultType="map">
+        select
+        id as id,
+        DATE_FORMAT(travelTime, '%Y-%m-%d %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        payMoney as payMoney,
+        ('专车订单') as orderName,
+        if(invoiceId is null, 1, 2) as invoice,
+        unix_timestamp(insertTime) as insertTime,
+        (1) as orderType
+        from t_order_private_car where state in (8, 9)
+        <if test="type == 1">
+            and invoiceId is null and invoiceId in (select id from t_invoice where state != 2)
+        </if>
+        <if test="type == 2">
+            and invoiceId in (select id from t_invoice where state = 2)
+        </if>
+        <if test="null != startTime and null != endTime">
+            and travelTime between #{startTime} and #{endTime}
+        </if>
+        <if test="null != startMoney and null != endMoney">
+            and payMoney between #{startMoney} and #{endMoney}
+        </if>
+        <if test="null !=uid">
+            and userId = #{uid}
+        </if>
+    </select>
+
+
+    <select id="queryOrderInfo" resultType="map">
+        select
+        a.id as orderId,
+        a.type as type,
+        a.state as state,
+        DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as insertTime,
+        DATE_FORMAT(a.travelTime, '%m月%d日 %H:%i') as travelTime,
+        DATE_FORMAT(a.travelTime, '%Y-%m-%d %H:%i:%s') as travelTime1,
+        DATE_FORMAT(a.arriveTime, '%Y-%m-%d %H:%i:%s') as arriveTime,
+        a.startLon as startLon,
+        a.startLat as startLat,
+        a.startAddress as startAddress,
+        a.endLon as endLon,
+        a.endLat as endLat,
+        a.endAddress as endAddress,
+		a.driverId as driverId,
+		a.orderMoney as orderMoney,
+        a.startMileage as startMileage,
+        a.startMoney as startMoney,
+        a.mileageKilometers as mileageKilometers,
+        a.mileageMoney as mileageMoney,
+        a.duration as duration,
+        a.durationMoney as durationMoney,
+        a.wait as wait,
+        a.waitMoney as waitMoney,
+        a.longDistance as longDistance,
+        a.longDistanceMoney as longDistanceMoney,
+		a.parkMoney as parkMoney,
+		a.roadTollMoney as roadTollMoney,
+		a.redPacketMoney as redPacketMoney,
+		a.couponMoney as couponMoney,
+		a.discount as discount,
+		a.discountMoney as discountMoney,
+		a.payMoney as payMoney,
+		a.reassignNotice as reassignNotice,
+		a.oldState as oldState,
+		b.headImgUrl as driverAvatar,
+		b.`name` as driverName,
+		c.carLicensePlate as licensePlate,
+		c.carColor as carColor,
+		CONCAT(f.`name`, d.`name`) as brand,
+		((select sum(fraction) from t_order_evaluate where driverId = a.driverId) / (select count(id) from t_order_evaluate where driverId = a.driverId)) as score,
+		(
+		(select count(id) from t_order_private_car where driverId = a.driverId and state in (7, 8, 9)) +
+		(select count(id) from t_order_taxi where driverId = a.driverId and state in (7, 8, 9)) +
+		(select count(id) from t_order_cross_city where driverId = a.driverId and state in (6, 8, 9))
+		) as orderNum,
+		b.phone as driverPhone,
+		if(a.state = 12, (select money from t_order_cancel where orderId = a.id and orderType = 1 and state = 1 order by insertTime desc limit 0, 1), if(a.state = 10, (select money from t_order_cancel where orderId = a.id and orderType = 1 and state = 2 order by insertTime desc limit 0, 1), 0)) as cancelPayMoney,
+		if(a.state = 12, (select id from t_order_cancel where orderId = a.id and orderType = 1 and state = 1 order by insertTime desc limit 0, 1), 0) as cancelId,
+		g.fraction as orderScore,
+		g.content as evaluate,
+		a.telX as telX,
+		h.userType as cancelUserType,
+		h.money as cancelMoney,
+		h.reason as cancelReason,
+		h.remark as cancelRemark
+        from t_order_private_car a
+		left join t_driver b on (a.driverId = b.id)
+		left join t_car c on (a.carId = c.id)
+		left join t_car_model d on (c.carModelId = d.id)
+		left join t_car_brand f on (d.brandId = f.id)
+		left join t_order_evaluate g on (a.id = g.orderId and g.orderType = 1)
+		left join t_order_cancel h on (a.id = h.orderId and h.orderType = 1 and h.state = 2)
+		where a.id = #{orderId}
+    </select>
+
+
+
+    <select id="queryMyTravelRecord" resultType="map">
+        select
+        (payMoney * -1) as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        ('专车订单') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_private_car where payMoney != 0 and userId = #{uid} and state in (8, 9, 10, 11, 12)
+    </select>
+
+
+    <select id="queryRedEnvelope" resultType="map">
+        select
+        redPacketMoney as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        ('专车订单') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_private_car where userId = #{uid} and state in (8, 9) and redPacketId is not null
+    </select>
+
+
+    <select id="queryByDriver" resultType="OrderPrivateCar">
+        select
+        id as id,
+        `type` as `type`,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        startMileage as startMileage,
+        startMoney as startMoney,
+        mileageKilometers as mileageKilometers,
+        mileageMoney as mileageMoney,
+        duration as duration,
+        durationMoney as durationMoney,
+        wait as wait,
+        waitMoney as waitMoney,
+        longDistance as longDistance,
+        longDistanceMoney as longDistanceMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId
+        from t_order_private_car where isDelete = 1 and driverId = #{driverId} and state in
+        <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java
new file mode 100644
index 0000000..155bf32
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java
@@ -0,0 +1,1035 @@
+package com.stylefeng.guns.modular.specialTrain.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 java.util.Date;
+
+/**
+ * 专车车订单
+ */
+@TableName("t_order_private_car")
+public class OrderPrivateCar {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单类型(1=普通订单,2=摆渡订单)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 跨城订单id(摆渡车专用)
+     */
+    @TableField("crossCityOrderId")
+    private Integer crossCityOrderId;
+    /**
+     * 摆渡方位(1=跨城起点,2=跨城终点)
+     */
+    @TableField("place")
+    private Integer place;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 服务车型id
+     */
+    @TableField("serverCarModelId")
+    private Integer serverCarModelId;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 车辆id
+     */
+    @TableField("carId")
+    private Integer carId;
+    /**
+     * 订单号
+     */
+    @TableField("orderNum")
+    private String orderNum;
+    /**
+     * 下单地点经度
+     */
+    @TableField("placementLon")
+    private Double placementLon;
+    /**
+     * 下单地点纬度
+     */
+    @TableField("placementLat")
+    private Double placementLat;
+    /**
+     * 下单地点
+     */
+    @TableField("placementAddress")
+    private String placementAddress;
+    /**
+     * 起点经度
+     */
+    @TableField("startLon")
+    private Double startLon;
+    /**
+     * 起点纬度
+     */
+    @TableField("startLat")
+    private Double startLat;
+    /**
+     * 起点
+     */
+    @TableField("startAddress")
+    private String startAddress;
+    /**
+     * 目的地经度
+     */
+    @TableField("endLon")
+    private Double endLon;
+    /**
+     * 目的地纬度
+     */
+    @TableField("endLat")
+    private Double endLat;
+    /**
+     * 目的地
+     */
+    @TableField("endAddress")
+    private String endAddress;
+    /**
+     * 上车点经度
+     */
+    @TableField("boardingLon")
+    private Double boardingLon;
+    /**
+     * 上车点纬度
+     */
+    @TableField("boardingLat")
+    private Double boardingLat;
+    /**
+     * 上车地点
+     */
+    @TableField("boardingAddress")
+    private String boardingAddress;
+    /**
+     * 上车时间
+     */
+    @TableField("boardingTime")
+    private Date boardingTime;
+    /**
+     * 下车点经度
+     */
+    @TableField("getoffLon")
+    private Double getoffLon;
+    /**
+     * 下车点纬度
+     */
+    @TableField("getoffLat")
+    private Double getoffLat;
+    /**
+     * 下车点
+     */
+    @TableField("getoffAddress")
+    private String getoffAddress;
+    /**
+     * 下车时间
+     */
+    @TableField("getoffTime")
+    private Date getoffTime;
+    /**
+     * 行驶里程数(米)
+     */
+    @TableField("mileage")
+    private Double mileage;
+    /**
+     * 支付方式(1=OK平台支付,2=其他方式支付)
+     */
+    @TableField("payManner")
+    private Integer payManner;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=余额)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 订单金额
+     */
+    @TableField("orderMoney")
+    private Double orderMoney;
+    /**
+     * 起步里程
+     */
+    @TableField("startMileage")
+    private Double startMileage;
+    /**
+     * 起步价
+     */
+    @TableField("startMoney")
+    private Double startMoney;
+    /**
+     * 里程公里
+     */
+    @TableField("mileageKilometers")
+    private Double mileageKilometers;
+    /**
+     * 里程费
+     */
+    @TableField("mileageMoney")
+    private Double mileageMoney;
+    /**
+     * 时长分钟
+     */
+    @TableField("duration")
+    private Double duration;
+    /**
+     * 时长费
+     */
+    @TableField("durationMoney")
+    private Double durationMoney;
+    /**
+     * 等待分钟
+     */
+    @TableField("wait")
+    private Double wait;
+    /**
+     * 等待费
+     */
+    @TableField("waitMoney")
+    private Double waitMoney;
+    /**
+     * 远途公里
+     */
+    @TableField("longDistance")
+    private Double longDistance;
+    /**
+     * 远途费
+     */
+    @TableField("longDistanceMoney")
+    private Double longDistanceMoney;
+    /**
+     * 停车费
+     */
+    @TableField("parkMoney")
+    private Double parkMoney;
+    /**
+     * 过路费
+     */
+    @TableField("roadTollMoney")
+    private Double roadTollMoney;
+    /**
+     * 红包抵扣金额
+     */
+    @TableField("redPacketMoney")
+    private Double redPacketMoney;
+    /**
+     * 优惠券抵扣金额
+     */
+    @TableField("couponMoney")
+    private Double couponMoney;
+    /**
+     * 红包id
+     */
+    @TableField("redPacketId")
+    private Integer redPacketId;
+    /**
+     * 优惠券id
+     */
+    @TableField("couponId")
+    private Integer couponId;
+    /**
+     * 折扣
+     */
+    @TableField("discount")
+    private Double discount;
+    /**
+     * 折扣优惠金额
+     */
+    @TableField("discountMoney")
+    private Double discountMoney;
+    /**
+     * 折扣活动id
+     */
+    @TableField("activityId")
+    private Integer activityId;
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 支付金额
+     */
+    @TableField("payMoney")
+    private Double payMoney;
+    /**
+     * 是否是代下单(0:否,1:是)
+     */
+    @TableField("substitute")
+    private Integer substitute;
+    /**
+     * 乘车人姓名
+     */
+    @TableField("passengers")
+    private String passengers;
+    /**
+     * 乘车人电话
+     */
+    @TableField("passengersPhone")
+    private String passengersPhone;
+    /**
+     * 订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 下单时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 出行时间
+     */
+    @TableField("travelTime")
+    private Date travelTime;
+    /**
+     * 抢单时间
+     */
+    @TableField("snatchOrderTime")
+    private Date snatchOrderTime;
+    /**
+     * 司机点出发时间
+     */
+    @TableField("setOutTime")
+    private Date setOutTime;
+    /**
+     * 司机到达预约地点时间
+     */
+    @TableField("arriveTime")
+    private Date arriveTime;
+    /**
+     * 开始服务时间
+     */
+    @TableField("startServiceTime")
+    private Date startServiceTime;
+    /**
+     * 结束服务时间
+     */
+    @TableField("endServiceTime")
+    private Date endServiceTime;
+    /**
+     * 订单类型(1=普通,2=预约)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)
+     */
+    @TableField("orderSource")
+    private Integer orderSource;
+    /**
+     * 发票id
+     */
+    @TableField("invoiceId")
+    private Integer invoiceId;
+    /**
+     * 是否是改派单(1=否,=是)
+     * @return
+     */
+    @TableField("isReassign")
+    private Integer isReassign;
+    /**
+     * 改派通知标识(0=没有改派,1=改派中,2=已改派)用于通知前端获取新司机数据
+     */
+    @TableField("reassignNotice")
+    private Integer reassignNotice;
+    /**
+     * 高德猎鹰轨迹id
+     * @return
+     */
+    @TableField("trackId")
+    private String trackId;
+    /**
+     * 是否删除(1=否,2=是)
+     */
+    @TableField("isDelete")
+    private Integer isDelete;
+    /**
+     * 该派前的订单状态
+     * @return
+     */
+    @TableField("oldState")
+    private Integer oldState;
+    /**
+     * 移动小号
+     * @return
+     */
+    @TableField("telX")
+    private String telX;
+    /**
+     * 绑定小号关系id
+     * @return
+     */
+    @TableField("bindId")
+    private String bindId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getCrossCityOrderId() {
+        return crossCityOrderId;
+    }
+
+    public void setCrossCityOrderId(Integer crossCityOrderId) {
+        this.crossCityOrderId = crossCityOrderId;
+    }
+
+    public Integer getPlace() {
+        return place;
+    }
+
+    public void setPlace(Integer place) {
+        this.place = place;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Double getBoardingLon() {
+        return boardingLon;
+    }
+
+    public void setBoardingLon(Double boardingLon) {
+        this.boardingLon = boardingLon;
+    }
+
+    public Double getBoardingLat() {
+        return boardingLat;
+    }
+
+    public void setBoardingLat(Double boardingLat) {
+        this.boardingLat = boardingLat;
+    }
+
+    public String getBoardingAddress() {
+        return boardingAddress;
+    }
+
+    public void setBoardingAddress(String boardingAddress) {
+        this.boardingAddress = boardingAddress;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Double getGetoffLon() {
+        return getoffLon;
+    }
+
+    public void setGetoffLon(Double getoffLon) {
+        this.getoffLon = getoffLon;
+    }
+
+    public Double getGetoffLat() {
+        return getoffLat;
+    }
+
+    public void setGetoffLat(Double getoffLat) {
+        this.getoffLat = getoffLat;
+    }
+
+    public String getGetoffAddress() {
+        return getoffAddress;
+    }
+
+    public void setGetoffAddress(String getoffAddress) {
+        this.getoffAddress = getoffAddress;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Integer getPayManner() {
+        return payManner;
+    }
+
+    public void setPayManner(Integer payManner) {
+        this.payManner = payManner;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(Double orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public Double getStartMileage() {
+        return startMileage;
+    }
+
+    public void setStartMileage(Double startMileage) {
+        this.startMileage = startMileage;
+    }
+
+    public Double getStartMoney() {
+        return startMoney;
+    }
+
+    public void setStartMoney(Double startMoney) {
+        this.startMoney = startMoney;
+    }
+
+    public Double getMileageKilometers() {
+        return mileageKilometers;
+    }
+
+    public void setMileageKilometers(Double mileageKilometers) {
+        this.mileageKilometers = mileageKilometers;
+    }
+
+    public Double getMileageMoney() {
+        return mileageMoney;
+    }
+
+    public void setMileageMoney(Double mileageMoney) {
+        this.mileageMoney = mileageMoney;
+    }
+
+    public Double getDuration() {
+        return duration;
+    }
+
+    public void setDuration(Double duration) {
+        this.duration = duration;
+    }
+
+    public Double getDurationMoney() {
+        return durationMoney;
+    }
+
+    public void setDurationMoney(Double durationMoney) {
+        this.durationMoney = durationMoney;
+    }
+
+    public Double getWait() {
+        return wait;
+    }
+
+    public void setWait(Double wait) {
+        this.wait = wait;
+    }
+
+    public Double getWaitMoney() {
+        return waitMoney;
+    }
+
+    public void setWaitMoney(Double waitMoney) {
+        this.waitMoney = waitMoney;
+    }
+
+    public Double getLongDistance() {
+        return longDistance;
+    }
+
+    public void setLongDistance(Double longDistance) {
+        this.longDistance = longDistance;
+    }
+
+    public Double getLongDistanceMoney() {
+        return longDistanceMoney;
+    }
+
+    public void setLongDistanceMoney(Double longDistanceMoney) {
+        this.longDistanceMoney = longDistanceMoney;
+    }
+
+    public Double getParkMoney() {
+        return parkMoney;
+    }
+
+    public void setParkMoney(Double parkMoney) {
+        this.parkMoney = parkMoney;
+    }
+
+    public Double getRoadTollMoney() {
+        return roadTollMoney;
+    }
+
+    public void setRoadTollMoney(Double roadTollMoney) {
+        this.roadTollMoney = roadTollMoney;
+    }
+
+    public Double getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(Double redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public Double getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(Double couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Integer getRedPacketId() {
+        return redPacketId;
+    }
+
+    public void setRedPacketId(Integer redPacketId) {
+        this.redPacketId = redPacketId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Double getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Double discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Double getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(Double payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Integer getSubstitute() {
+        return substitute;
+    }
+
+    public void setSubstitute(Integer substitute) {
+        this.substitute = substitute;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+
+    public String getPassengersPhone() {
+        return passengersPhone;
+    }
+
+    public void setPassengersPhone(String passengersPhone) {
+        this.passengersPhone = passengersPhone;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Date getSnatchOrderTime() {
+        return snatchOrderTime;
+    }
+
+    public void setSnatchOrderTime(Date snatchOrderTime) {
+        this.snatchOrderTime = snatchOrderTime;
+    }
+
+    public Date getSetOutTime() {
+        return setOutTime;
+    }
+
+    public void setSetOutTime(Date setOutTime) {
+        this.setOutTime = setOutTime;
+    }
+
+    public Date getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Date arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Date getStartServiceTime() {
+        return startServiceTime;
+    }
+
+    public void setStartServiceTime(Date startServiceTime) {
+        this.startServiceTime = startServiceTime;
+    }
+
+    public Date getEndServiceTime() {
+        return endServiceTime;
+    }
+
+    public void setEndServiceTime(Date endServiceTime) {
+        this.endServiceTime = endServiceTime;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public Integer getInvoiceId() {
+        return invoiceId;
+    }
+
+    public void setInvoiceId(Integer invoiceId) {
+        this.invoiceId = invoiceId;
+    }
+
+    public Integer getIsReassign() {
+        return isReassign;
+    }
+
+    public void setIsReassign(Integer isReassign) {
+        this.isReassign = isReassign;
+    }
+
+    public Integer getReassignNotice() {
+        return reassignNotice;
+    }
+
+    public void setReassignNotice(Integer reassignNotice) {
+        this.reassignNotice = reassignNotice;
+    }
+
+    public String getTrackId() {
+        return trackId;
+    }
+
+    public void setTrackId(String trackId) {
+        this.trackId = trackId;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getOldState() {
+        return oldState;
+    }
+
+    public void setOldState(Integer oldState) {
+        this.oldState = oldState;
+    }
+
+    public String getTelX() {
+        return telX;
+    }
+
+    public void setTelX(String telX) {
+        this.telX = telX;
+    }
+
+    public String getBindId() {
+        return bindId;
+    }
+
+    public void setBindId(String bindId) {
+        this.bindId = bindId;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderPrivateCar{" +
+                "id=" + id +
+                ", type=" + type +
+                ", crossCityOrderId=" + crossCityOrderId +
+                ", place=" + place +
+                ", userId=" + userId +
+                ", serverCarModelId=" + serverCarModelId +
+                ", driverId=" + driverId +
+                ", carId=" + carId +
+                ", orderNum='" + orderNum + '\'' +
+                ", placementLon=" + placementLon +
+                ", placementLat=" + placementLat +
+                ", placementAddress='" + placementAddress + '\'' +
+                ", startLon=" + startLon +
+                ", startLat=" + startLat +
+                ", startAddress='" + startAddress + '\'' +
+                ", endLon=" + endLon +
+                ", endLat=" + endLat +
+                ", endAddress='" + endAddress + '\'' +
+                ", boardingLon=" + boardingLon +
+                ", boardingLat=" + boardingLat +
+                ", boardingAddress='" + boardingAddress + '\'' +
+                ", boardingTime=" + boardingTime +
+                ", getoffLon=" + getoffLon +
+                ", getoffLat=" + getoffLat +
+                ", getoffAddress='" + getoffAddress + '\'' +
+                ", getoffTime=" + getoffTime +
+                ", mileage=" + mileage +
+                ", payManner=" + payManner +
+                ", payType=" + payType +
+                ", orderMoney=" + orderMoney +
+                ", startMileage=" + startMileage +
+                ", startMoney=" + startMoney +
+                ", mileageKilometers=" + mileageKilometers +
+                ", mileageMoney=" + mileageMoney +
+                ", duration=" + duration +
+                ", durationMoney=" + durationMoney +
+                ", wait=" + wait +
+                ", waitMoney=" + waitMoney +
+                ", longDistance=" + longDistance +
+                ", longDistanceMoney=" + longDistanceMoney +
+                ", parkMoney=" + parkMoney +
+                ", roadTollMoney=" + roadTollMoney +
+                ", redPacketMoney=" + redPacketMoney +
+                ", couponMoney=" + couponMoney +
+                ", redPacketId=" + redPacketId +
+                ", couponId=" + couponId +
+                ", discount=" + discount +
+                ", discountMoney=" + discountMoney +
+                ", activityId=" + activityId +
+                ", companyId=" + companyId +
+                ", payMoney=" + payMoney +
+                ", substitute=" + substitute +
+                ", passengers='" + passengers + '\'' +
+                ", passengersPhone='" + passengersPhone + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                ", travelTime=" + travelTime +
+                ", snatchOrderTime=" + snatchOrderTime +
+                ", setOutTime=" + setOutTime +
+                ", arriveTime=" + arriveTime +
+                ", startServiceTime=" + startServiceTime +
+                ", endServiceTime=" + endServiceTime +
+                ", orderType=" + orderType +
+                ", orderSource=" + orderSource +
+                ", invoiceId=" + invoiceId +
+                ", isReassign=" + isReassign +
+                ", reassignNotice=" + reassignNotice +
+                ", trackId='" + trackId + '\'' +
+                ", isDelete=" + isDelete +
+                ", oldState=" + oldState +
+                ", telX='" + telX + '\'' +
+                ", bindId='" + bindId + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java
new file mode 100644
index 0000000..815f283
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java
@@ -0,0 +1,279 @@
+package com.stylefeng.guns.modular.specialTrain.server;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderPrivateCarService extends IService<OrderPrivateCar> {
+
+
+
+
+    /**
+     * 专车下单操作
+     * @param serverCarModelId  服务车型id
+     * @param travelTime        出行时间
+     * @param reservation       是否预约(1=否,2=是)
+     * @param instead           是否代下单(0=否,1=是)
+     * @param startLon          起点经度
+     * @param startLat          起点纬度
+     * @param startAddress      起点详细地址
+     * @param endLon            终点经度
+     * @param endLat            终点纬度
+     * @param endAddress        终点详细地址
+     * @param name              乘客姓名
+     * @param phone             乘客电话
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat,
+                                                String startLon, String startLat, String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid) throws Exception;
+
+    /**
+     * 专车一键叫车
+     * @param serverCarModelId
+     * @param travelTime
+     * @param reservation
+     * @param instead
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @param name
+     * @param phone
+     * @param orderSource
+     * @param driverId
+     * @param type
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> saveOrderPrivateCars(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat,
+                                                 String startLon, String startLat, String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid) throws Exception;
+
+
+    /**
+     * 继续推送操作
+     * @param id
+     * @throws Exception
+     */
+    ResultUtil pushOrderPrivateCar(Integer id) throws Exception;
+
+
+
+    /**
+     * 获取取消订单需要支付的金额
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception;
+
+
+
+    /**
+     * 添加取消
+     * @param id
+     * @param reason
+     * @param remark
+     * @param uid
+     * @throws Exception
+     */
+    ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception;
+
+
+    /**
+     * 取消订单操作
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    ResultUtil cancleOrderPrivateCar(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception;
+
+
+    String getOrderNum() throws Exception;
+
+    /**
+     * 删除定时任务
+     * @param orderId
+     */
+    void deleteTask(Integer orderId);
+
+
+
+    /**
+     * 获取用户余额和可用优惠券数量
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取优惠券列表
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+
+
+    /**
+     * 订单完成支付订单操作
+     * @param payType
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type)throws Exception;
+
+
+
+
+    /**
+     * 评论成功后获取红包金额
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception;
+
+
+
+
+
+    /**
+     * 分享成功后添加红包
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil shareRedEnvelope(Integer orderId) throws Exception;
+
+
+
+
+    /**
+     * 取消订单支付后的处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payCancelOrderPrivateCar(Integer id, String order_id, Integer type) throws Exception;
+
+
+
+    /**
+     * 支付完成后的订单处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception;
+
+
+
+    /**
+     * 获取订单数据
+     * @param uid
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    List<OrderPrivateCar> queryOrder(Integer uid, Integer...state) throws Exception;
+
+
+
+
+    /**
+     * 获取员工的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+
+    /**
+     * 获取用户端发票页面中的订单列表数据
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney,
+                                                Double endMoney, Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(Integer orderId) throws Exception;
+
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyTravelRecord(Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception;
+
+
+    /**
+     * 获取下单推送完后没有司机下单的提醒
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    EndPushWarpper queryEndPush(Integer uid) throws Exception;
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception;
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
new file mode 100644
index 0000000..911a8e9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -0,0 +1,1441 @@
+package com.stylefeng.guns.modular.specialTrain.server.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.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.crossCity.server.impl.OrderCrossCityServiceImpl;
+import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.dao.*;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.util.StringUtils;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.util.*;
+
+
+@Service
+public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
+
+    @Resource
+    private OrderPrivateCarMapper orderPrivateCarMapper;
+
+    @Resource
+    private CarServiceMapper carServiceMapper;
+
+    @Resource
+    private OrderTaxiMapper orderTaxiMapper;
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+    @Resource
+    private UserActivityDiscount1Mapper userActivityDiscount1Mapper;
+
+    @Resource
+    private SysIntegralMapper sysIntegralMapper;
+
+    @Resource
+    private OrderCrossCityMapper orderCrossCityMapper;
+
+    @Resource
+    private RegionMapper regionMapper;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private IDriverServiceService driverServiceService;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private ICompanyCityService companyCityService;
+
+    @Autowired
+    private IPushOrderService pushOrderService;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private ICancleOrderService cancleOrderService;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private RestTemplate internalRestTemplate;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+//    @Autowired
+//    private ICBCPayUtil icbcPayUtil;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private ChinaMobileUtil chinaMobileUtil;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    @Autowired
+    private IUserRedPacketRecordService userRedPacketRecordService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private GDFalconUtil gdFalconUtil;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private IOrderPositionService orderPositionService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+    public static List<Integer> orderIds = new ArrayList<>();
+
+    @Value("${callbackPath}")
+    private String callbackPath;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+
+
+    /**
+     * 专车下单操作
+     * @param serverCarModelId  服务车型id
+     * @param travelTime        出行时间
+     * @param reservation       是否预约(1=否,2=是)
+     * @param instead           是否代下单(0=否,1=是)
+     * @param startLon          起点经度
+     * @param startLat          起点纬度
+     * @param startAddress      起点详细地址
+     * @param endLon            终点经度
+     * @param endLat            终点纬度
+     * @param endAddress        终点详细地址
+     * @param name              乘客姓名
+     * @param phone             乘客电话
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat, String startLon, String startLat,
+                                          String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid) throws Exception {
+
+        //如果出行时间大于当前10分钟则默认为预约单
+        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
+            reservation = 2;
+        }
+
+        /**
+         * 1.下了即时单就不能下预约单和即时单
+         * 2.下了预约单和再下一张即时单不能再下预约单
+         */
+        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+
+        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0 && reservation == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0 && reservation == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+        if(ToolUtil.isEmpty(placementLon) || ToolUtil.isEmpty(placementLat) || 0 == Double.valueOf(placementLon) || 0 == Double.valueOf(placementLat)){
+            return ResultUtil.error("请先开启定位功能");
+        }
+
+        startAddress = startAddress.replaceAll("& #40;", "(");
+        startAddress = startAddress.replaceAll("& #41;", ")");
+        endAddress = endAddress.replaceAll("& #40;", "(");
+        endAddress = endAddress.replaceAll("& #41;", ")");
+        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
+            return ResultUtil.error("请选择服务车型");
+        }
+
+        OrderPrivateCar orderPrivateCar = new OrderPrivateCar();
+        orderPrivateCar.setType(type);
+        orderPrivateCar.setUserId(uid);
+        orderPrivateCar.setServerCarModelId(serverCarModelId);
+        orderPrivateCar.setOrderNum(this.getOrderNum());
+        orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
+        orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
+        orderPrivateCar.setPlacementAddress(geocode.get("address"));
+        orderPrivateCar.setStartLon(Double.valueOf(startLon));
+        orderPrivateCar.setStartLat(Double.valueOf(startLat));
+        orderPrivateCar.setStartAddress(startAddress);
+        orderPrivateCar.setEndLon(Double.valueOf(endLon));
+        orderPrivateCar.setEndLat(Double.valueOf(endLat));
+        orderPrivateCar.setEndAddress(endAddress);
+        orderPrivateCar.setSubstitute(instead);
+        orderPrivateCar.setPassengers(name);
+        orderPrivateCar.setPassengersPhone(phone);
+        if(instead == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
+            UserInfo userInfo = userInfoService.selectById(uid);
+            if(ToolUtil.isEmpty(userInfo.getPhone())){
+                return ResultUtil.error("请先绑定手机号码");
+            }
+            orderPrivateCar.setPassengers(userInfo.getName());
+            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
+        }
+        orderPrivateCar.setState(1);
+        orderPrivateCar.setInsertTime(new Date());
+        orderPrivateCar.setTravelTime(travelTime);
+        orderPrivateCar.setOrderType(reservation);
+        orderPrivateCar.setOrderSource(orderSource);
+        if(orderSource == 2){//扫码下单
+            Driver driver = driverService.selectById(driverId);
+            if(null == driver){
+                return ResultUtil.error("司机信息有误,无法完成下单");
+            }
+            if(driver.getAuthState() == 1){
+                return ResultUtil.error("司机信息还未完成审核,无法完成下单");
+            }
+            if(driver.getAuthState() == 3){
+                return ResultUtil.error("司机账户已被冻结,无法提供服务");
+            }
+            if(driver.getAuthState() == 4){
+                return ResultUtil.error("司机信息未通过审核,无法提供服务");
+            }
+            if(driver.getState() == 1){
+                return ResultUtil.error("司机还未上线,无法提供服务");
+            }
+            if(driver.getState() == 3){
+                return ResultUtil.error("司机正在服务中,无法提供服务");
+            }
+            List<DriverService> query = driverServiceService.query(driverId, 1);
+            if(query.size() == 0){
+                return ResultUtil.error("该司机不能服务此业务");
+            }
+
+            orderPrivateCar.setDriverId(driverId);
+            orderPrivateCar.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
+                    driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
+            orderPrivateCar.setState(2);
+            orderPrivateCar.setCarId(driver.getCarId());
+            CarService query1 = carServiceMapper.query(1, driver.getCarId());
+            orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
+            orderPrivateCar.setSnatchOrderTime(new Date());
+
+            //调用高德创建轨迹
+            String s = gdFalconUtil.selectTerminal(driver.getPhone());
+            String track = gdFalconUtil.createTrack(s);
+            orderPrivateCar.setTrackId(track);
+
+            //调用移动的小号接口
+//            Map<String, String> geocode1 = gdMapGeocodingUtil.geocode(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
+//            Region region = regionMapper.query(geocode1.get("districtCode"));
+//            Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderPrivateCar.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1)));
+//            if(String.valueOf(map.get("code")).equals("200")){
+//                orderPrivateCar.setTelX(map.get("telX"));
+//                orderPrivateCar.setBindId(map.get("bindId"));
+//            }
+
+            driver.setState(3);
+            driverService.updateById(driver);
+        }
+
+        orderPrivateCar.setIsReassign(1);
+        orderPrivateCar.setIsDelete(1);
+        this.insert(orderPrivateCar);
+
+        if(orderSource == 2){//扫码下单
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0);
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 2, 0);
+                    pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
+                }
+            }).start();
+        }
+
+        //推单操作
+        if(orderPrivateCar.getState() == 1){
+            this.pushOrder(orderPrivateCar);
+        }
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您的专车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
+
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(orderPrivateCar.getId());
+        return ResultUtil.success(baseWarpper);
+    }
+
+    @Override
+    public ResultUtil<BaseWarpper> saveOrderPrivateCars(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat,
+                                                        String startLon, String startLat, String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid) throws Exception {
+        //如果出行时间大于当前10分钟则默认为预约单
+        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
+            reservation = 2;
+        }
+
+        /**
+         * 1.下了即时单就不能下预约单和即时单
+         * 2.下了预约单和再下一张即时单不能再下预约单
+         */
+        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+
+        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0 && reservation == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0 && reservation == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+        if(ToolUtil.isEmpty(placementLon) || ToolUtil.isEmpty(placementLat) || 0 == Double.valueOf(placementLon) || 0 == Double.valueOf(placementLat)){
+            return ResultUtil.error("请先开启定位功能");
+        }
+
+        startAddress = startAddress.replaceAll("& #40;", "(");
+        startAddress = startAddress.replaceAll("& #41;", ")");
+        if(StringUtils.hasLength(endAddress)){
+            endAddress = endAddress.replaceAll("& #40;", "(");
+            endAddress = endAddress.replaceAll("& #41;", ")");
+        }
+        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
+            return ResultUtil.error("请选择服务车型");
+        }
+
+        OrderPrivateCar orderPrivateCar = new OrderPrivateCar();
+        orderPrivateCar.setType(type);
+        orderPrivateCar.setUserId(uid);
+        orderPrivateCar.setServerCarModelId(serverCarModelId);
+        orderPrivateCar.setOrderNum(this.getOrderNum());
+        orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
+        orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
+        orderPrivateCar.setPlacementAddress(geocode.get("address"));
+        orderPrivateCar.setStartLon(Double.valueOf(startLon));
+        orderPrivateCar.setStartLat(Double.valueOf(startLat));
+        orderPrivateCar.setStartAddress(startAddress);
+        if(StringUtils.hasLength(endAddress)){
+            orderPrivateCar.setEndLon(Double.valueOf(endLon));
+            orderPrivateCar.setEndLat(Double.valueOf(endLat));
+            orderPrivateCar.setEndAddress(endAddress);
+        }
+        orderPrivateCar.setSubstitute(instead);
+        orderPrivateCar.setPassengers(name);
+        orderPrivateCar.setPassengersPhone(phone);
+        if(instead == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
+            UserInfo userInfo = userInfoService.selectById(uid);
+            if(ToolUtil.isEmpty(userInfo.getPhone())){
+                return ResultUtil.error("请先绑定手机号码");
+            }
+            orderPrivateCar.setPassengers(userInfo.getName());
+            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
+        }
+        orderPrivateCar.setState(1);
+        orderPrivateCar.setInsertTime(new Date());
+        orderPrivateCar.setTravelTime(travelTime);
+        orderPrivateCar.setOrderType(reservation);
+        orderPrivateCar.setOrderSource(orderSource);
+        if(orderSource == 2){//扫码下单
+            Driver driver = driverService.selectById(driverId);
+            if(null == driver){
+                return ResultUtil.error("司机信息有误,无法完成下单");
+            }
+            if(driver.getAuthState() == 1){
+                return ResultUtil.error("司机信息还未完成审核,无法完成下单");
+            }
+            if(driver.getAuthState() == 3){
+                return ResultUtil.error("司机账户已被冻结,无法提供服务");
+            }
+            if(driver.getAuthState() == 4){
+                return ResultUtil.error("司机信息未通过审核,无法提供服务");
+            }
+            if(driver.getState() == 1){
+                return ResultUtil.error("司机还未上线,无法提供服务");
+            }
+            if(driver.getState() == 3){
+                return ResultUtil.error("司机正在服务中,无法提供服务");
+            }
+            List<DriverService> query = driverServiceService.query(driverId, 1);
+            if(query.size() == 0){
+                return ResultUtil.error("该司机不能服务此业务");
+            }
+
+            orderPrivateCar.setDriverId(driverId);
+            orderPrivateCar.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
+                    driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
+            orderPrivateCar.setState(2);
+            orderPrivateCar.setCarId(driver.getCarId());
+            CarService query1 = carServiceMapper.query(1, driver.getCarId());
+            orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
+            orderPrivateCar.setSnatchOrderTime(new Date());
+
+            //调用高德创建轨迹
+//            String s = gdFalconUtil.selectTerminal(driver.getPhone());
+//            String track = gdFalconUtil.createTrack(s);
+//            orderPrivateCar.setTrackId(track);
+
+            //调用移动的小号接口
+//            Map<String, String> geocode1 = gdMapGeocodingUtil.geocode(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
+//            Region region = regionMapper.query(geocode1.get("districtCode"));
+//            Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderPrivateCar.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1)));
+//            if(String.valueOf(map.get("code")).equals("200")){
+//                orderPrivateCar.setTelX(map.get("telX"));
+//                orderPrivateCar.setBindId(map.get("bindId"));
+//            }
+
+            driver.setState(3);
+            driverService.updateById(driver);
+        }
+
+        orderPrivateCar.setIsReassign(1);
+        orderPrivateCar.setIsDelete(1);
+        this.insert(orderPrivateCar);
+
+        if(orderSource == 2){//扫码下单
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0);
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 2, 0);
+                    pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
+                }
+            }).start();
+        }
+
+        //推单操作
+        if(orderPrivateCar.getState() == 1){
+            this.pushOrder(orderPrivateCar);
+        }
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您的专车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
+
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(orderPrivateCar.getId());
+        return ResultUtil.success(baseWarpper);
+    }
+
+    /**
+     * 下单后继续等待
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil pushOrderPrivateCar(Integer id) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(id);
+        if(null == orderPrivateCar){
+            return ResultUtil.error("推送订单失败,订单信息有误");
+        }
+        if(orderPrivateCar.getState() != 1){
+            return ResultUtil.error("订单已被司机接单,不能重复推送");
+        }
+        //处理摆渡订单的继续推单操作
+        if(orderPrivateCar.getType() == 2){
+            OrderCrossCityServiceImpl.pushEndMap.put(orderPrivateCar.getCrossCityOrderId(), false);//还原标识数据
+            List<OrderPrivateCar> list = this.selectList(new EntityWrapper<OrderPrivateCar>().eq("type", 2).eq("crossCityOrderId", orderPrivateCar.getCrossCityOrderId()).eq("place", orderPrivateCar.getPlace()));
+            List<Map<String, Integer>> orders = new ArrayList<>();
+            for(OrderPrivateCar orderPrivateCar1 : list){
+                if(orderPrivateCar1.getState() != 1){
+                    return ResultUtil.error("订单已被司机接单,推单取消");
+                }
+                Map<String, Integer> map = new HashMap<>();
+                map.put("orderType", 1);
+                map.put("orderId", orderPrivateCar1.getId());
+                orders.add(map);
+            }
+//            List<OrderTaxi> list1 = orderTaxiService.selectList(new EntityWrapper<OrderTaxi>().eq("type", 2).eq("crossCityOrderId", orderPrivateCar.getCrossCityOrderId()).eq("place", orderPrivateCar.getPlace()));
+//            for(OrderTaxi orderTaxi : list1){
+//                if(orderTaxi.getState() != 1){
+//                    return ResultUtil.error("订单已被司机接单,推单取消");
+//                }
+//                Map<String, Integer> map = new HashMap<>();
+//                map.put("orderType", 2);
+//                map.put("orderId", orderTaxi.getId());
+//                orders.add(map);
+//            }
+            //开始重新推单
+            orderCrossCityService.pushOrder(orders);
+
+        }else{
+            this.pushOrder(orderPrivateCar);
+        }
+        return ResultUtil.success();
+    }
+
+    @Override
+    public ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(id);
+        if(null == orderPrivateCar){
+            return ResultUtil.error("获取数据失败,订单信息有误");
+        }
+        double amount = 0;
+        CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
+        if(null != orderPrivateCar.getDriverId() &&
+                (orderPrivateCar.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况
+            if(null != query){
+                amount += query.getMoney();
+            }
+        }
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setAmount(amount);
+        return ResultUtil.success(baseWarpper);
+    }
+
+    @Override
+    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(remark)){
+            if(ToolUtil.isNotEmpty(remark)){
+                List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+                for(SensitiveWords s : sensitiveWords){
+                    remark = remark.replaceAll(s.getContent(), "***");
+                }
+            }
+        }
+
+        OrderPrivateCar orderPrivateCar = this.selectById(id);
+        Integer integer = null;
+        if(null == orderPrivateCar){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderPrivateCar.getState() > 5 && orderPrivateCar.getState() != 11){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+        if(null == orderPrivateCar.getDriverId()){//没有接单的情况
+            if(orderPrivateCar.getType() == 2){//摆渡车
+                OrderCrossCityServiceImpl.pushEndMap.remove(orderPrivateCar.getCrossCityOrderId());//删除标识数据
+                List<OrderPrivateCar> list = this.selectList(new EntityWrapper<OrderPrivateCar>().eq("type", 2).eq("crossCityOrderId", orderPrivateCar.getCrossCityOrderId()).eq("place", orderPrivateCar.getPlace()));
+                for(OrderPrivateCar orderPrivateCar1 : list){
+                    orderCancelService.saveData(orderPrivateCar1.getId(), 1, "无司机接单", "无司机接单", null, null, 2, 1, uid);
+                    orderPrivateCar1.setState(10);
+                    this.updateById(orderPrivateCar1);
+                }
+                List<OrderTaxi> list1 = orderTaxiService.selectList(new EntityWrapper<OrderTaxi>().eq("type", 2).eq("crossCityOrderId", orderPrivateCar.getCrossCityOrderId()).eq("place", orderPrivateCar.getPlace()));
+                for(OrderTaxi orderTaxi : list1){
+                    orderCancelService.saveData(orderTaxi.getId(), 2, "无司机接单", "无司机接单", null, null, 2, 1, uid);
+                    orderTaxi.setState(10);
+                    orderTaxiService.updateById(orderTaxi);
+                }
+            }else{
+                integer = orderCancelService.saveData(id, 1, "无司机接单", "无司机接单", null, null, 2, 1, uid);
+                orderPrivateCar.setState(10);
+                this.updateById(orderPrivateCar);
+            }
+        }else {
+            CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
+            if (null != query) {
+                if ((orderPrivateCar.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < System.currentTimeMillis() && query.getMoney().compareTo(0D) > 0) {//收费的情况
+                    orderPrivateCar.setState(12);
+                    this.updateById(orderPrivateCar);
+                    integer = orderCancelService.saveData(id, 1, reason, remark, null, query.getMoney(), 1, 1, uid);
+                } else {
+                    integer = orderCancelService.saveData(id, 1, reason, remark, null, null, 2, 1, uid);
+
+                    orderPrivateCar.setState(10);
+                    this.updateById(orderPrivateCar);
+                }
+                this.deleteTask(id);//删除定时任务
+
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+                        System.err.println("推送取消操作---------------------");
+                    }
+                }).start();
+
+                //修改司机为空闲
+                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+                driver.setState(2);
+                driverService.updateById(driver);
+            }else{
+                return ResultUtil.error("请完善后台取消规则设置");
+            }
+
+        }
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){
+                    //上传数据
+                    pushMinistryOfTransportUtil.orderCancel(orderPrivateCar.getId());
+                }
+            }
+        }).start();
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您已成功取消出行订单,谢谢使用!", orderPrivateCar.getUserId(), 1);
+        Map<String, Object> map = new HashMap<>();
+        map.put("id", integer);
+        return ResultUtil.success(map);
+    }
+
+
+    /**
+     * 取消订单操作
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil cancleOrderPrivateCar(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(id);
+        Integer uid = orderPrivateCar.getUserId();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+
+        if(null == orderPrivateCar){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderPrivateCar.getState() != 12){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+        OrderCancel orderCancel = null;
+        if(null == cancleId){
+            orderCancel = orderCancelService.query(id, 1, null, null, 1);
+        }else{
+            orderCancel = orderCancelService.selectById(cancleId);
+        }
+
+        CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
+        if(null != query){
+            if(payType == 1){//微信支付
+
+                String value = redisUtil.getValue("appletOpenId");
+                String appletsOpenId = null;
+                if(ToolUtil.isNotEmpty(value)){
+                    JSONObject jsonObject = JSON.parseObject(value);
+                    appletsOpenId = jsonObject.getString(uid.toString());
+                }else{
+                    appletsOpenId = userInfo.getAppletsOpenId();
+                }
+                orderCancel.setPayType(1);
+                orderCancelService.updateById(orderCancel);
+                String app = type == 1 ? "APP" : "JSAPI";
+                resultUtil = payMoneyUtil.weixinpay("订单取消", "", id + "_1_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/wxCancelOrderTaxi", app, userInfo.getAppletsOpenId());
+                paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 1, query.getMoney(), "", 1);//添加预支付数据
+
+
+//                String value = redisUtil.getValue("appletOpenId");
+//                String appletsOpenId = null;
+//                if(ToolUtil.isNotEmpty(value)){
+//                    JSONObject jsonObject = JSON.parseObject(value);
+//                    appletsOpenId = jsonObject.getString(uid.toString());
+//                }else{
+//                    appletsOpenId = userInfo.getAppletsOpenId();
+//                }
+//                orderCancel.setPayType(1);
+//                orderCancelService.updateById(orderCancel);
+//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",1", 9, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/wxCancelOrderTaxi", "", type, appletsOpenId);
+//                if(map.get("code").equals("200")){
+//                    paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 1, query.getMoney(), map.get("order_id"), 1);//添加预支付数据
+//                    resultUtil = ResultUtil.success(map.get("data"));
+//                }else{
+//                    resultUtil = ResultUtil.error(map.get("msg"), "");
+//                }
+            }
+            if(payType == 2){//支付宝支付
+                orderCancel.setPayType(2);
+                orderCancelService.updateById(orderCancel);
+
+                resultUtil = payMoneyUtil.alipay("订单取消", "订单取消", "", id + "_1_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/aliCancelOrderTaxi");
+                paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 2, query.getMoney(), "", 1);//添加预支付数据
+
+//                orderCancel.setPayType(2);
+//                orderCancelService.updateById(orderCancel);
+//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",1", 10, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/aliCancelOrderTaxi", "", type, null);
+//                if(map.get("code").equals("200")){
+//                    paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 2, query.getMoney(), map.get("order_id"), 1);//添加预支付数据
+//                    resultUtil = ResultUtil.success(map.get("data"));
+//                }else{
+//                    resultUtil = ResultUtil.error(map.get("msg"), "");
+//                }
+            }
+            if(payType == 3){//余额支付
+                if(userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()){
+                    return ResultUtil.error("余额不足,无法完成支付");
+                }
+
+                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                //添加交易明细
+                transactionDetailsService.saveData(uid, "取消订单", query.getMoney(), 2, 1, 1, 1, id);
+                userInfoService.updateById(userInfo);
+
+                //解除小号绑定
+                if(orderPrivateCar.getBindId() != null){
+                    chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId());
+                }
+
+                orderPrivateCar.setState(10);
+                orderPrivateCar.setTelX("");
+                orderPrivateCar.setBindId("");
+                this.updateById(orderPrivateCar);
+
+                orderCancel.setState(2);
+                orderCancel.setPayType(3);
+                orderCancelService.updateById(orderCancel);
+
+                //添加已收入明细
+                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, query.getMoney());
+
+                this.deleteTask(id);//删除定时任务
+
+//                new Thread(new Runnable() {
+//                    @Override
+//                    public void run() {
+//                        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+//                    }
+//                }).start();
+
+                //添加消息
+                systemNoticeService.addSystemNotice(1, "您已使用余额成功支付取消订单费用,谢谢使用!", orderPrivateCar.getUserId(), 1);
+            }
+        }
+        return resultUtil;
+    }
+
+
+    /**
+     * 推送抢单数据
+     * @param orderPrivateCar
+     * @throws Exception
+     */
+    public void pushOrder(OrderPrivateCar orderPrivateCar) throws Exception{
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    orderIds.add(orderPrivateCar.getId());//添加记录,防止调用接口重复提醒无人接单
+                    String vehicle = redisUtil.getValue("VEHICLE");
+                    List<Integer> integers = new ArrayList<>();
+                    if(ToolUtil.isNotEmpty(vehicle)){
+                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
+                    }
+                    Company query = companyCityService.query(String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司
+                    System.out.println("获取起点所属分公司"+query);
+                    List<PushOrder> querys = pushOrderService.querys(null, 1, query.getId());//获取需要推送的次数
+                    System.out.println("获取需要推送的次数"+querys);
+                    for(int i = 1; i <= querys.size(); i++){
+                        PushOrder pushOrder = pushOrderService.querys(i, 1, query.getId()).get(0);
+                        //获取空闲司机
+                        List<Driver> list = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+                        System.out.println("获取空闲司机"+list);
+                        if(list.size() > 0){
+                            double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
+                            System.out.println("推送占比计算成小数"+driverProportion);
+                            int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
+                            System.out.println("计算占比转成整数"+lastIndex);
+                            list = list.subList(0, lastIndex);//获取空闲司机中占比数据
+                            System.out.println("获取空闲司机中占比数据"+list);
+                            for(Driver driver : list){//开始进行推送
+                                boolean bo = false;
+                                for(Integer integer : integers){
+                                    if(integer.compareTo(driver.getId()) == 0){
+                                        bo = true;
+                                        break;
+                                    }
+                                }
+                                if(bo){
+                                    continue;
+                                }
+                                System.out.println("推送前");
+                                pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime());
+                                System.out.println("推送后");
+                            }
+                        }
+                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
+                        Integer state = orderPrivateCarMapper.selectById(orderPrivateCar.getId()).getState();
+                        if(state > 1){
+                            break;
+                        }
+                        if(i == querys.size() && state == 1){
+                            pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1);
+                            orderIds.remove(orderPrivateCar.getId());
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+    }
+
+    @Override
+    public synchronized String getOrderNum() throws Exception{
+        int size = this.selectCount(null);
+        return "PRIVATE" + String.valueOf(1000000 + size + 1).substring(1);
+    }
+
+    /**
+     * 删除定时任务
+     * @param orderId
+     */
+    @Override
+    public void deleteTask(Integer orderId){
+        //发送验证码短信
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("orderId", orderId + "");
+        params.add("orderType", "1");
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = internalRestTemplate.postForObject("http://driver-server/base/netty/deleteTask", requestEntity, String.class);
+        JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+        if(jsonObject.getIntValue("code") != 200){
+            System.err.println("调用driver-server出错了");
+        }
+    }
+
+    @Override
+    public Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        map.put("balance", userInfo.getBalance());
+        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
+        int i = userCouponRecordService.queryAvailable(uid, orderPrivateCar.getCompanyId(), 1, 1, orderPrivateCar.getOrderMoney());
+        i = i + userCouponRecordService.queryAvailable(uid, orderPrivateCar.getCompanyId(), 1, 0, orderPrivateCar.getOrderMoney());
+        map.put("coupon", i);
+        return map;
+    }
+
+    @Override
+    public List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
+        List<Map<String, Object>> list = userCouponRecordService.queryCoupon(uid, orderPrivateCar.getCompanyId(), 1, 1, orderPrivateCar.getOrderMoney(), pageNum, size);
+        List<Map<String, Object>> list1 = userCouponRecordService.queryCoupon(uid, orderPrivateCar.getCompanyId(), 1, 0, orderPrivateCar.getOrderMoney(), pageNum, size);
+        list.addAll(list1);
+        return list;
+    }
+
+    @Override
+    public ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
+        if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){
+            return ResultUtil.error("订单已完成支付,不允许重复支付");
+        }
+        if(orderPrivateCar.getState() != 7){
+            return ResultUtil.error("订单不在待支付状态,不允许支付");
+        }
+        Integer uid = orderPrivateCar.getUserId();
+        Double orderMoney = orderPrivateCar.getOrderMoney();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+        orderPrivateCar.setCouponMoney(0D);//初始化历史数据
+        orderPrivateCar.setCouponId(null);
+
+        //计算优惠券
+        UserCouponRecord userCouponRecord = null;
+        if(null != couponId){
+            userCouponRecord = userCouponRecordService.selectById(couponId);
+            if(userCouponRecord.getCompanyId() != orderPrivateCar.getCompanyId()){
+                return ResultUtil.error("优惠券不能用于此订单");
+            }
+            if(userCouponRecord.getState() == 2){
+                return ResultUtil.error("优惠券已使用");
+            }
+            if(userCouponRecord.getState() == 3){
+                return ResultUtil.error("优惠券已过期");
+            }
+            if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 1){
+                return ResultUtil.error("优惠券不能用于此类型订单");
+            }
+            if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){
+                return ResultUtil.error("优惠券不能用于此订单");
+            }
+            orderMoney = orderMoney - userCouponRecord.getMoney();
+            orderPrivateCar.setCouponMoney(userCouponRecord.getMoney());
+            orderPrivateCar.setCouponId(couponId);
+        }
+
+
+        //计算红包
+        UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderPrivateCar.getCompanyId(), 1, 1, orderMoney);
+        if(null != query && query.getMoney().compareTo(orderMoney) < 0){
+            orderMoney = orderMoney - query.getMoney();
+            orderPrivateCar.setRedPacketMoney(query.getMoney());
+            orderPrivateCar.setRedPacketId(query.getId());
+        }
+
+        //计算折扣
+        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderPrivateCar.getCompanyId());
+        if(null != query2){
+            Double special = query2.getSpecial();
+            orderPrivateCar.setDiscount(special);
+            double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+            if(orderMoney.compareTo(v) > 0){
+                orderPrivateCar.setDiscountMoney(orderMoney - v);
+                orderPrivateCar.setActivityId(query2.getId());
+                orderMoney = v;
+            }
+        }
+        if(payType == 1){//微信支付
+            String app = type == 1 ? "APP" : "JSAPI";
+            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
+            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, "", 1);//添加预支付数据
+        }
+        if(payType == 2) {//支付宝支付
+            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
+            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, "", 1);//添加预支付数据
+        }
+
+
+//        if(payType == 1){//微信支付
+//            String value = redisUtil.getValue("appletOpenId");
+//            String appletsOpenId = null;
+//            if(ToolUtil.isNotEmpty(value)){
+//                JSONObject jsonObject = JSON.parseObject(value);
+//                appletsOpenId = jsonObject.getString(uid.toString());
+//            }else{
+//                appletsOpenId = userInfo.getAppletsOpenId();
+//            }
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",1", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+//        if(payType == 2) {//支付宝支付
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",1", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null);
+//            if (map.get("code").equals("200")) {
+//                paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            } else {
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+        if(payType == 3){//余额支付
+            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
+                return ResultUtil.error("余额不足,无法完成支付");
+            }
+
+            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+
+            SysIntegral query1 = sysIntegralMapper.query(orderPrivateCar.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
+
+            //添加交易明细
+            transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 1, orderId);
+            userInfoService.updateById(userInfo);
+
+            orderPrivateCar.setState(8);
+            orderPrivateCar.setPayType(3);
+            orderPrivateCar.setPayMoney(orderMoney);
+
+            //处理优惠券和红包
+            if(null != userCouponRecord){
+                userCouponRecord.setState(2);
+                userCouponRecord.setEndTime(new Date());
+                userCouponRecordService.updateById(userCouponRecord);
+            }
+            if(null != query){
+                query.setState(2);
+                query.setEndTime(new Date());
+                userRedPacketRecordService.updateById(query);
+            }
+
+            //添加已收入明细
+            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
+            Double speMoney = company.getSpeMoney();
+            BigDecimal d = null;//企业收入
+            BigDecimal c = null;//司机收入
+            if(company.getIsSpeFixedOrProportional() == 2){//固定
+                d = new BigDecimal(speMoney);
+                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
+            }
+            if(company.getIsSpeFixedOrProportional() == 1){//比例
+                Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
+                d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue());
+            incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue());
+            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+                }
+            }).start();
+
+            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1);
+
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){//上传数据
+                        pushMinistryOfTransportUtil.operatePay(orderId);
+                    }
+                }
+            }).start();
+        }
+
+        this.updateAllColumnById(orderPrivateCar);
+        return resultUtil;
+    }
+
+    @Override
+    public synchronized ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
+        Integer companyId = orderPrivateCar.getCompanyId();
+
+        Map<String, Object> query = userActivityRedenvelopeService.query(companyId, orderPrivateCar.getTravelTime());
+        Double money = 0D;
+        BaseWarpper baseWarpper = new BaseWarpper();
+        if(null != query){
+            Integer type = Integer.valueOf(String.valueOf(query.get("type")));
+            if(type == 1){//固定金额
+                money = Double.valueOf(String.valueOf(query.get("money")));
+            }else{//随机金额
+                Double startMoney = Double.valueOf(String.valueOf(query.get("startMoney")));
+                Double endMoney = Double.valueOf(String.valueOf(query.get("endMoney")));
+                int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue();
+                Random random = new Random();
+                int num = random.nextInt(i);
+                money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+            }
+            //判断当前红包是否大于剩余可领取总金额
+            if(money.compareTo(Double.valueOf(query.get("lavePrice").toString())) > 0){
+                baseWarpper.setAmount(0D);
+                return ResultUtil.success(baseWarpper);
+            }
+        }
+        baseWarpper.setAmount(money);
+
+        if(money > 0){
+            //添加临时红包数据
+            UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
+            userRedPacketRecord.setMoney(money);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(new Date());
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(query.get("effective"))));
+            userRedPacketRecord.setExpirationTime(calendar.getTime());
+            userRedPacketRecord.setInsertTime(new Date());
+            userRedPacketRecord.setCompanyId(Integer.valueOf(String.valueOf(query.get("companyId"))));
+            userRedPacketRecord.setState(0);
+            userRedPacketRecord.setOrderId(orderPrivateCar.getId());
+            userRedPacketRecord.setOrderType(1);
+            userRedPacketRecord.setUserId(orderPrivateCar.getUserId());
+            userRedPacketRecordService.insert(userRedPacketRecord);
+        }
+
+        return ResultUtil.success(baseWarpper);
+    }
+
+    @Override
+    public synchronized ResultUtil shareRedEnvelope(Integer orderId) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
+        UserRedPacketRecord query = userRedPacketRecordService.query_(orderPrivateCar.getUserId(), orderPrivateCar.getCompanyId(), 0, 1, null);
+        if(null != query){
+            Double money = query.getMoney();
+            Map<String, Object> map = userActivityRedenvelopeService.query(orderPrivateCar.getCompanyId(), orderPrivateCar.getTravelTime());
+            Double laveMoney = Double.valueOf(String.valueOf(map.get("laveMoney")));
+            if(money.compareTo(laveMoney) > 0){
+                return ResultUtil.error("手速太慢了,红包已派发完啦!");
+            }
+            //判断当前红包是否大于剩余可领取总金额
+            if(money.compareTo(Double.valueOf(map.get("lavePrice").toString())) > 0){
+                return ResultUtil.error("手速太慢了,红包已派发完啦!");
+            }
+            double v = new BigDecimal(laveMoney).subtract(new BigDecimal(money)).doubleValue();
+
+            UserActivityRedenvelope id = userActivityRedenvelopeService.selectById(String.valueOf(map.get("id")));
+            id.setLaveMoney(v);
+            id.setLavePrice(new BigDecimal(id.getLavePrice() - money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            userActivityRedenvelopeService.updateById(id);
+
+            query.setState(1);
+            query.setRedPacketActivityId(id.getId());
+            userRedPacketRecordService.updateById(query);
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 取消订单支付后的处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    @Override
+    public void payCancelOrderPrivateCar(Integer id, String order_id, Integer type) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(id);
+        PaymentRecord query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 1, type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "取消订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId());
+            orderPrivateCar.setState(10);
+            //解除小号绑定
+            if(orderPrivateCar.getBindId() != null){
+                chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId());
+            }
+            orderPrivateCar.setBindId("");
+            orderPrivateCar.setTelX("");
+            this.updateById(orderPrivateCar);
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            OrderCancel query1 = orderCancelService.query(query.getOrderId(), query.getOrderType(), query.getAmount(), query.getPayType(), 1);
+            if (null != query1){
+                query1.setState(2);
+                orderCancelService.updateById(query1);
+            }
+
+            //添加已收入明细
+            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, query.getAmount());
+
+            this.deleteTask(orderPrivateCar.getId());//删除定时任务
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+//            new Thread(new Runnable() {
+//                @Override
+//                public void run() {
+//                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+//                }
+//            }).start();
+
+            //添加消息
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功支付取消订单费用,谢谢使用!", orderPrivateCar.getUserId(), 1);
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+
+    @Override
+    public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(id);
+        PaymentRecord query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 1, type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId());
+            orderPrivateCar.setState(8);
+            orderPrivateCar.setPayType(type);
+            orderPrivateCar.setPayMoney(query.getAmount());
+            this.updateById(orderPrivateCar);
+
+            UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
+            SysIntegral query1 = sysIntegralMapper.query(orderPrivateCar.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
+            userInfoService.updateById(userInfo);
+
+            //处理优惠券和红包
+            if(null != orderPrivateCar.getCouponId()){
+                UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
+                userCouponRecord.setState(2);
+                userCouponRecord.setEndTime(new Date());
+                userCouponRecordService.updateById(userCouponRecord);
+            }
+            if(null != orderPrivateCar.getRedPacketId()){
+                UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
+                userRedPacketRecord.setState(2);
+                userRedPacketRecord.setEndTime(new Date());
+                userRedPacketRecordService.updateById(userRedPacketRecord);
+            }
+
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            //添加已收入明细
+            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
+            Double taxi = company.getSpeMoney();
+            BigDecimal d = null;//企业收入
+            BigDecimal c = null;//司机收入
+            if(company.getIsSpeFixedOrProportional() == 2){//固定
+                d = new BigDecimal(taxi);
+                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            if(company.getIsSpeFixedOrProportional() == 1){//比例
+                Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
+                d = new BigDecimal(price).multiply(new BigDecimal(taxi).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue());
+            incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue());
+            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+                }
+            }).start();
+
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成出行订单支付,谢谢使用!", orderPrivateCar.getUserId(), 1);
+
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){//上传数据
+                        pushMinistryOfTransportUtil.operatePay(orderPrivateCar.getId());
+                    }
+                }
+            }).start();
+
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+
+    @Override
+    public List<OrderPrivateCar> queryOrder(Integer uid, Integer... state) throws Exception {
+        return orderPrivateCarMapper.queryByState_(uid, state);
+    }
+
+    @Override
+    public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        List<Map<String, Object>> maps = orderPrivateCarMapper.queryMyOrderList(uid, pageNum, size);
+        for(Map<String, Object> map : maps){
+            if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
+                map.put("state", map.get("oldState"));
+            }
+        }
+        return maps;
+    }
+
+    @Override
+    public List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney, Double endMoney, Integer uid) throws Exception {
+        startTime = dateUtil.getStartOrEndDate(startTime, "start");
+        endTime = dateUtil.getStartOrEndDate(endTime, "end");
+        return orderPrivateCarMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+    }
+
+    @Override
+    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
+        Map<String, Object> map = orderPrivateCarMapper.queryOrderInfo(orderId);
+        if(null != map.get("reassignNotice") && Integer.valueOf(String.valueOf(map.get("reassignNotice"))) == 2){//改派完成,重新获取了新的司机数据,开始修改数据防止继续调用
+            OrderPrivateCar orderPrivateCar = this.selectById(orderId);
+            orderPrivateCar.setReassignNotice(0);
+            this.updateById(orderPrivateCar);
+        }
+        if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
+            map.put("state", map.get("oldState"));
+        }
+        if(Integer.valueOf(String.valueOf(map.get("state"))) != 8 && Integer.valueOf(String.valueOf(map.get("state"))) != 9){
+            map.put("redPacketMoney", null);
+            map.put("couponMoney", null);
+        }
+
+        String driverId = redisUtil.getValue("DEVICE_" + map.get("driverId"));
+        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
+        map.put("orderType", 1);
+        return map;
+    }
+
+    @Override
+    public List<Map<String, Object>> queryMyTravelRecord(Integer uid) throws Exception {
+        return orderPrivateCarMapper.queryMyTravelRecord(uid);
+    }
+
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
+        //计算预计距离和剩余时间
+        String value = redisUtil.getValue("DRIVER" + String.valueOf(orderPrivateCar.getDriverId()));
+        if(null == value || "".equals(value)){
+            System.err.println("司机没有上传位置信息");
+
+            //调用获取轨迹中的数据
+            List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 2);
+            if(list.size() > 0){
+                Map<String, Object> map = list.get(list.size() - 1);
+                value = map.get("lon") + "," + map.get("lat");
+            }
+
+        }
+        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), 1);
+        String d = "0";
+        String t = "0";
+        if(null == distance){
+            System.err.println("查询距离出错了");
+        }else{
+            d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
+            t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + "";
+        }
+        OrderServerWarpper orderServerWarpper = new OrderServerWarpper();
+        orderServerWarpper.setOrderId(orderPrivateCar.getId());
+        orderServerWarpper.setOrderType(1);
+        orderServerWarpper.setState(orderPrivateCar.getState());
+        orderServerWarpper.setLon(null != value ? value.split(",")[0] : "0.0");
+        orderServerWarpper.setLat(null != value ? value.split(",")[1] : "0.0");
+        orderServerWarpper.setReassignNotice(orderPrivateCar.getReassignNotice());
+        if(orderPrivateCar.getState() == 2 || orderPrivateCar.getState() == 3){//前往预约地
+            orderServerWarpper.setReservationMileage(d);
+            orderServerWarpper.setReservationTime(t);
+            orderServerWarpper.setServedMileage("0");
+            orderServerWarpper.setServedTime("0");
+            orderServerWarpper.setLaveMileage("0");
+            orderServerWarpper.setLaveTime("0");
+        }
+        if(orderPrivateCar.getState() == 5 || orderPrivateCar.getState() == 6){//服务中
+            distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), 1);
+            if(null == distance){
+                System.err.println("查询距离出错了");
+            }else{
+                d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
+                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + "";
+            }
+            orderServerWarpper.setReservationMileage("0");
+            orderServerWarpper.setReservationTime("0");
+            orderServerWarpper.setServedMileage(String.valueOf((null == orderPrivateCar.getMileage() ? 0 : orderPrivateCar.getMileage()) / 1000));
+            orderServerWarpper.setServedTime(Long.valueOf((new Date().getTime() - orderPrivateCar.getStartServiceTime().getTime()) / 60000).intValue() + "");
+            orderServerWarpper.setLaveMileage(d);
+            orderServerWarpper.setLaveTime(t);
+        }
+
+        return orderServerWarpper;
+    }
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception {
+        return orderPrivateCarMapper.queryRedEnvelope(uid);
+    }
+
+
+
+    /**
+     * 获取下单推送完后没有司机接单的提醒
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public EndPushWarpper queryEndPush(Integer uid) throws Exception {
+        List<OrderPrivateCar> list = orderPrivateCarMapper.queryByState(uid, null, null, 1);
+        EndPushWarpper endPushWarpper = new EndPushWarpper();
+        if(list.size() > 0){
+            OrderPrivateCar orderPrivateCar = list.get(0);
+            if(!orderIds.contains(orderPrivateCar.getId())){
+                endPushWarpper.setOrderId(orderPrivateCar.getId());
+                endPushWarpper.setOrderType(1);
+                endPushWarpper.setState(1);
+                List<PushOrder> querys = pushOrderService.querys(null, 2, orderPrivateCar.getCompanyId());//获取需要推送的次数
+                int time = 0;
+                for(int i = 1; i <= querys.size(); i++){
+                    PushOrder pushOrder = pushOrderService.querys(i, 2, orderPrivateCar.getCompanyId()).get(0);
+                    time += pushOrder.getPushTime() * 1000;
+                }
+                //当前时间减去推单总时间大于下单时间
+                if((System.currentTimeMillis() - time) > orderPrivateCar.getInsertTime().getTime()){
+                    endPushWarpper.setState(2);
+                }
+            }
+        }
+        return endPushWarpper;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthIntercepter.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthIntercepter.java
new file mode 100644
index 0000000..72de0e6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthIntercepter.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.system.auth;
+
+import com.alibaba.fastjson.JSON;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class AuthIntercepter implements HandlerInterceptor {
+	private final static Logger log = LoggerFactory.getLogger(AuthIntercepter.class);
+	
+	@Autowired
+	AuthService authService;
+
+	@Override
+	public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws IOException {
+		String appid = req.getParameter("appid");
+		String sign = req.getParameter("sign");
+        ResultUtil resultUtil = authService.checkSyncAuth(appid, sign, req);
+        if (resultUtil.getCode() != 200) {
+			res.setStatus(HttpStatus.OK.value());
+			res.setHeader("Content-type", "text/html;charset=UTF-8");
+			res.getWriter().print(JSON.toJSONString(resultUtil));//Res.Failure("req timeout, please try again")
+			return false;
+		}
+		return true;
+	}
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthService.java
new file mode 100644
index 0000000..03ca925
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthService.java
@@ -0,0 +1,51 @@
+package com.stylefeng.guns.modular.system.auth;
+
+
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.web.util.HtmlUtils;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Service
+public class AuthService {
+	
+	private final static Logger log = LoggerFactory.getLogger(AuthService.class);
+
+	public static final AuthService me = new AuthService();
+	
+	/**
+	 * 鉴权
+	 * @param appid
+	 * @param sign
+	 * @param requset
+	 * @return
+	 */
+	public ResultUtil checkSyncAuth(String appid, String sign, HttpServletRequest requset) {
+		try {
+			if (StringUtils.isBlank(sign)) {
+				return ResultUtil.sign();
+			}
+			// 1.鉴权
+			String signUrl = AuthenticationKit.getSignUrl(requset, "sign");
+			signUrl = signUrl.replaceAll("& #40;", "\\(");
+			signUrl = signUrl.replaceAll("& #41;", "\\)");
+			String signUrlEncode = AuthenticationKit.signUrlEncode(signUrl, appid);
+			if(sign.indexOf(" ") != -1 && signUrlEncode.indexOf("+") != -1){//处理前后端加密差异
+				signUrlEncode = signUrlEncode.replaceAll("\\+", " ");
+			}
+
+			// 签名无
+			if (StringUtils.isBlank(sign) || !sign.equals(signUrlEncode)) {
+				return ResultUtil.sign();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			return ResultUtil.runErr();
+		}
+		return ResultUtil.success();
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthenticationKit.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthenticationKit.java
new file mode 100644
index 0000000..e64c052
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthenticationKit.java
@@ -0,0 +1,233 @@
+package com.stylefeng.guns.modular.system.auth;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.tomcat.util.codec.binary.Base64;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/**
+ * 
+ * 接口鉴权工具类
+ * 
+ * @author gwx 2017-12-23
+ *
+ */
+public class AuthenticationKit {
+	public static final String utf8="UTF-8";
+	
+	/**
+	 * 返回64 位 token
+	 * 
+	 * @param key 自定义安全字符
+	 * @return
+	 * @throws Exception
+	 */
+	public static String getToken(String key) throws Exception {
+		// 随机生成 32位字符
+		String salt = HashKit.generateSaltForSha256();
+		// 获取当前时间
+		long cur = System.currentTimeMillis();
+		// 生成64位token
+		String access_token = getToken256(key, salt, cur);
+		return access_token;
+	}
+	
+	/**
+	 * 返回64 位 token
+	 * 
+	 * @param key
+	 * @return
+	 * @throws Exception
+	 */
+	public static String getToken256(String key, String salt, long cur) throws Exception {
+		// 生成64位token
+		String access_token = HashKit.sha256(salt + cur + key);
+		return access_token;
+	}
+
+	/**
+	 * 返回到秒
+	 * 
+	 * @return
+	 */
+	public static String createTimestamp() {
+		long l = System.currentTimeMillis();
+		return Long.toString(l / 1000);
+	}
+
+	/**
+	 * 返回noce 不带 短杠"-"
+	 * 
+	 * @return
+	 */
+	public static String createNonceStr() {
+		return getUUID();
+	}
+
+	public static String getUUID() {
+		UUID uuid = UUID.randomUUID();
+		String str = uuid.toString();
+		str = str.replaceAll("-", "");
+		return str;
+	}
+
+	/**
+	 * 组装路径
+	 * 
+	 * @param params
+	 * @return
+	 */
+	public static String localSignParam(Map<String, String> params) {
+		return localSignUrl(null, params, false);
+	}
+
+	
+	/**
+	 * 组装签名路径
+	 * @param url
+	 * @param params
+	 * @return
+	 */
+	public static String localSignUrl(String url, Map<String, String> params, boolean urlEncode) {
+        StringBuilder strBuilder = new StringBuilder();
+//        if(StringUtils.isNotBlank(url) && url.lastIndexOf("?")==-1){
+//        	strBuilder.append(url).append("?");
+//        }
+
+		Set es = params.entrySet();//所有参与传参的参数按照accsii排序(升序)
+		Iterator it = es.iterator();
+		while(it.hasNext()) {
+			Map.Entry entry = (Map.Entry)it.next();
+			String k = (String)entry.getKey();
+			Object v = entry.getValue();
+			if(null != v && !"".equals(v)) {
+				strBuilder.append(k + "=" + v + "&");
+			}
+		}
+		return strBuilder.substring(0, strBuilder.length() - 1);
+
+//        for (String key : params.keySet()) {
+//            if (params.get(key) != null) {
+//            	String lowerKey = key.toLowerCase();
+//            	String encodeKey = lowerKey;
+//            	String encodedValue = params.get(key);
+//                if (urlEncode){
+//                	encodeKey = UrlEncoderUtils.encode(lowerKey);
+//                	encodedValue = UrlEncoderUtils.encode(encodedValue);
+//                }
+//                if (!seeOne) {
+//                	seeOne = true;
+//                } else {
+//                	strBuilder.append("&");
+//                }
+//                strBuilder.append(encodeKey).append("=").append(encodedValue);
+//            }
+//        }
+//        return strBuilder.toString();
+    }
+
+
+	/**
+	 * 加密签名路径生成签名
+	 * 
+	 * @param signUrl
+	 *            /token?appid=12345&timestamp=1512440267&nonce=12345
+	 * @param encryptKey
+	 * @return
+	 * @throws Exception
+	 */
+	public static String signUrlEncode(String signUrl, String encryptKey) throws Exception {
+		byte[] signByte = HMACSHA1.HmacSHA1Encrypt(signUrl, encryptKey);
+		String localSign = Base64.encodeBase64String(signByte);
+		return localSign;
+	}
+
+	/**
+	 * 返回鉴权 签名路径
+	 * 
+	 * @param req
+	 * @return
+	 */
+	public static String getSignUrl(HttpServletRequest req) {
+		return getSignUrl(req,"");
+	}
+
+	/**
+	 * 服务端 获取 客户端请求 组装验证签名
+	 * @param req
+	 * @param delParams 移除不相关 的签名参数
+	 * @return
+	 */
+	public static String getSignUrl(HttpServletRequest req, String... delParams) {
+		// 获取相对的访问路径
+		String url = req.getServletPath();
+		Map<String, String> paramMap = packageRequestGetParams(req);
+		if (paramMap.size() > 0) {
+			// 删除
+			for (int i = 0, len = delParams.length; i < len; i++) {
+				paramMap.remove(delParams[i]);
+			}
+			return localSignUrl(url, paramMap, false);
+		}
+		return null;
+	}
+
+
+	/**
+	 * 组装签名路径 客户端测试用
+	 * @param url api访问地址 "/apid"
+	 * @param appid 
+	 * @return
+	 */
+	public static String getSignUrl(String url, String appid, Map<String, String> queryParas) {
+		Map<String, String> params = new TreeMap<String, String>();
+		params.put("appid", appid);
+		params.put("nonce", createNonceStr());
+		params.put("timestamp", createTimestamp());
+		if(queryParas!=null && queryParas.size()>0){
+			params.putAll(queryParas);
+		}
+		return localSignUrl(url, params, false);
+	}
+	
+	/**
+	 * 组装签名路径 客户端测试用
+	 * @param url api访问地址 "/apid"
+	 * @param appid 
+	 * @return
+	 */
+	public static String getSignUrl(String url, String appid) {
+		return getSignUrl(url, appid, "");
+	}
+	
+	/**
+	 * 
+	 * @param url
+	 * @param appid
+	 * @param params
+	 * @return
+	 */
+	public static String getSignUrl(String url, String appid, String params) {
+		String urlTmp = getSignUrl(url, appid, new HashMap<String,String>());
+		return urlTmp + UrlEncoderUtils.encode(params);
+	}
+
+	/**
+	 * 解析get参数返回treemap
+	 * @param req
+	 * @return
+	 */
+	public static Map<String, String> packageRequestGetParams(
+			HttpServletRequest req) {
+		Map<String, String> paramMap = new TreeMap<String, String>();
+		Enumeration pNames = req.getParameterNames();
+		while (pNames.hasMoreElements()) {
+			String key = (String) pNames.nextElement();
+			String value = req.getParameter(key);
+			paramMap.put(key, value);
+		}
+		return paramMap;
+	}
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/Configuration.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/Configuration.java
new file mode 100644
index 0000000..cd4da6e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/Configuration.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.auth;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+
+@Component
+public class Configuration implements WebMvcConfigurer {
+
+    @Autowired
+    private AuthIntercepter authIntercepter;
+
+    /**
+     * 重写添加拦截器方法并添加配置拦截器
+     *
+     * @param registry
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+//        registry.addInterceptor(authIntercepter).addPathPatterns("/api/**")
+//                .excludePathPatterns("/base/**");
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HMACSHA1.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HMACSHA1.java
new file mode 100644
index 0000000..44b89ef
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HMACSHA1.java
@@ -0,0 +1,63 @@
+package com.stylefeng.guns.modular.system.auth;
+
+import org.apache.tomcat.util.codec.binary.Base64;
+
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+public class HMACSHA1 {
+
+	private static final String MAC_NAME = "HmacSHA1";
+	private static final String ENCODING = "UTF-8";
+
+	/*
+	 * 展示了一个生成指定算法密钥的过程 初始化HMAC密钥
+	 * 
+	 * @return
+	 * 
+	 * @throws Exception
+	 * 
+	 * public static String initMacKey() throws Exception { //得到一个 指定算法密钥的密钥生成器
+	 * KeyGenerator KeyGenerator keyGenerator
+	 * =KeyGenerator.getInstance(MAC_NAME); //生成一个密钥 SecretKey secretKey
+	 * =keyGenerator.generateKey(); return null; }
+	 */
+
+	/**
+	 * 使用 HMAC-SHA1 签名方法对对encryptText进行签名
+	 * 
+	 * @param encryptText
+	 *            被签名的字符串
+	 * @param encryptKey
+	 *            密钥
+	 * @return
+	 * @throws Exception
+	 */
+	public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception {
+		byte[] data = encryptKey.getBytes(ENCODING);
+		// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
+		Mac mac = Mac.getInstance(MAC_NAME);
+		SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
+		// 生成一个指定 Mac 算法 的 Mac 对象
+		// 用给定密钥初始化 Mac 对象
+		mac.init(secretKey);
+
+		byte[] text = encryptText.getBytes(ENCODING);
+		// 完成 Mac 操作
+		return mac.doFinal(text);
+	}
+
+	public static void main(String[] args) {
+
+		String encryptText = "123";
+		String encryptKey = "adc";
+		try {
+			byte[] b = HmacSHA1Encrypt(encryptText, encryptKey);
+			String str = HashKit.toHex(b);
+			String str2 = new String(Base64.encodeBase64(b));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HashKit.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HashKit.java
new file mode 100644
index 0000000..9c42b0a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HashKit.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.modular.system.auth;
+/**
+ * Copyright (c) 2011-2017, James Zhan 詹波 (jfinal@126.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.security.MessageDigest;
+
+public class HashKit {
+
+	public static final long FNV_OFFSET_BASIS_64 = 0xcbf29ce484222325L;
+	public static final long FNV_PRIME_64 = 0x100000001b3L;
+
+	private static final java.security.SecureRandom random = new java.security.SecureRandom();
+	private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray();
+	private static final char[] CHAR_ARRAY = "_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+			.toCharArray();
+
+	public static long fnv1a64(String key) {
+		long hash = FNV_OFFSET_BASIS_64;
+		for (int i = 0, size = key.length(); i < size; i++) {
+			hash ^= key.charAt(i);
+			hash *= FNV_PRIME_64;
+		}
+		return hash;
+	}
+
+	public static String md5(String srcStr) {
+		return hash("MD5", srcStr);
+	}
+
+	public static String sha1(String srcStr) {
+		return hash("SHA-1", srcStr);
+	}
+
+	public static String sha256(String srcStr) {
+		return hash("SHA-256", srcStr);
+	}
+
+	public static String sha384(String srcStr) {
+		return hash("SHA-384", srcStr);
+	}
+
+	public static String sha512(String srcStr) {
+		return hash("SHA-512", srcStr);
+	}
+
+	public static String hash(String algorithm, String srcStr) {
+		try {
+			MessageDigest md = MessageDigest.getInstance(algorithm);
+			byte[] bytes = md.digest(srcStr.getBytes("utf-8"));
+			return toHex(bytes);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	public static String toHex(byte[] bytes) {
+		StringBuilder ret = new StringBuilder(bytes.length * 2);
+		for (int i = 0; i < bytes.length; i++) {
+			ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);
+			ret.append(HEX_DIGITS[bytes[i] & 0x0f]);
+		}
+		return ret.toString();
+	}
+
+	/**
+	 * md5 128bit 16bytes sha1 160bit 20bytes sha256 256bit 32bytes sha384
+	 * 384bit 48bytes sha512 512bit 64bytes
+	 */
+	public static String generateSalt(int saltLength) {
+		StringBuilder salt = new StringBuilder(saltLength);
+		for (int i = 0; i < saltLength; i++) {
+			salt.append(CHAR_ARRAY[random.nextInt(CHAR_ARRAY.length)]);
+		}
+		return salt.toString();
+	}
+
+	public static String generateSaltForSha256() {
+		return generateSalt(32);
+	}
+
+	public static String generateSaltForSha512() {
+		return generateSalt(64);
+	}
+
+	public static boolean slowEquals(byte[] a, byte[] b) {
+		if (a == null || b == null) {
+			return false;
+		}
+
+		int diff = a.length ^ b.length;
+		for (int i = 0; i < a.length && i < b.length; i++) {
+			diff |= a[i] ^ b[i];
+		}
+		return diff == 0;
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/UrlEncoderUtils.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/UrlEncoderUtils.java
new file mode 100644
index 0000000..0bb025b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/UrlEncoderUtils.java
@@ -0,0 +1,44 @@
+package com.stylefeng.guns.modular.system.auth;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+public class UrlEncoderUtils {
+
+    private static final String PATH_DELIMITER = "/";
+    private static final Logger log = LoggerFactory.getLogger(UrlEncoderUtils.class);
+
+    public static String encode(String originUrl) {
+        try {
+            return URLEncoder.encode(originUrl, "UTF-8").replace("+", "%20").replace("*", "%2A")
+                    .replace("%7E", "~");
+        } catch (UnsupportedEncodingException e) {
+            log.error("URLEncoder error, encode utf8, exception: {}", e);
+        }
+        return null;
+    }
+
+    // encode路径, 不包括分隔符
+    public static String encodeEscapeDelimiter(String urlPath) {
+        StringBuilder pathBuilder = new StringBuilder();
+        String[] pathSegmentsArr = urlPath.split(PATH_DELIMITER);
+
+        boolean isFirstSegMent = true;
+        for (String pathSegment : pathSegmentsArr) {
+            if (isFirstSegMent) {
+                pathBuilder.append(encode(pathSegment));
+                isFirstSegMent = false;
+            } else {
+                pathBuilder.append(PATH_DELIMITER).append(encode(pathSegment));
+            }
+        }
+        if (urlPath.endsWith(PATH_DELIMITER)) {
+            pathBuilder.append(PATH_DELIMITER);
+        }
+        return pathBuilder.toString();
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/BlackboardController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/BlackboardController.java
new file mode 100644
index 0000000..49d2df0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/BlackboardController.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.modular.system.service.INoticeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 总览信息
+ *
+ * @author fengshuonan
+ * @Date 2017年3月4日23:05:54
+ */
+@Controller
+@RequestMapping("/blackboard")
+public class BlackboardController extends BaseController {
+
+    @Autowired
+    private INoticeService noticeService;
+
+    /**
+     * 跳转到黑板
+     */
+    @RequestMapping("")
+    public String blackboard(Model model) {
+        List<Map<String, Object>> notices = noticeService.list(null);
+        model.addAttribute("noticeList", notices);
+        return "/blackboard.html";
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DeptController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DeptController.java
new file mode 100644
index 0000000..032b0eb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DeptController.java
@@ -0,0 +1,164 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.dictmap.DeptDict;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Dept;
+import com.stylefeng.guns.modular.system.service.IDeptService;
+import com.stylefeng.guns.modular.system.warpper.DeptWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 部门控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年2月17日20:27:22
+ */
+@Controller
+@RequestMapping("/dept")
+public class DeptController extends BaseController {
+
+    private String PREFIX = "/system/dept/";
+
+    @Autowired
+    private IDeptService deptService;
+
+    /**
+     * 跳转到部门管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "dept.html";
+    }
+
+    /**
+     * 跳转到添加部门
+     */
+    @RequestMapping("/dept_add")
+    public String deptAdd() {
+        return PREFIX + "dept_add.html";
+    }
+
+    /**
+     * 跳转到修改部门
+     */
+    @Permission
+    @RequestMapping("/dept_update/{deptId}")
+    public String deptUpdate(@PathVariable Integer deptId, Model model) {
+        Dept dept = deptService.selectById(deptId);
+        model.addAttribute(dept);
+        model.addAttribute("pName", ConstantFactory.me().getDeptName(dept.getPid()));
+        LogObjectHolder.me().set(dept);
+        return PREFIX + "dept_edit.html";
+    }
+
+    /**
+     * 获取部门的tree列表
+     */
+    @RequestMapping(value = "/tree")
+    @ResponseBody
+    public List<ZTreeNode> tree() {
+        List<ZTreeNode> tree = this.deptService.tree();
+        tree.add(ZTreeNode.createParent());
+        return tree;
+    }
+
+    /**
+     * 新增部门
+     */
+    @BussinessLog(value = "添加部门", key = "simplename", dict = DeptDict.class)
+    @RequestMapping(value = "/add")
+    @Permission
+    @ResponseBody
+    public Object add(Dept dept) {
+        if (ToolUtil.isOneEmpty(dept, dept.getSimplename())) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //完善pids,根据pid拿到pid的pids
+        deptSetPids(dept);
+        return this.deptService.insert(dept);
+    }
+
+    /**
+     * 获取所有部门列表
+     */
+    @RequestMapping(value = "/list")
+    @Permission
+    @ResponseBody
+    public Object list(String condition) {
+        List<Map<String, Object>> list = this.deptService.list(condition);
+        return super.warpObject(new DeptWarpper(list));
+    }
+
+    /**
+     * 部门详情
+     */
+    @RequestMapping(value = "/detail/{deptId}")
+    @Permission
+    @ResponseBody
+    public Object detail(@PathVariable("deptId") Integer deptId) {
+        return deptService.selectById(deptId);
+    }
+
+    /**
+     * 修改部门
+     */
+    @BussinessLog(value = "修改部门", key = "simplename", dict = DeptDict.class)
+    @RequestMapping(value = "/update")
+    @Permission
+    @ResponseBody
+    public Object update(Dept dept) {
+        if (ToolUtil.isEmpty(dept) || dept.getId() == null) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        deptSetPids(dept);
+        deptService.updateById(dept);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除部门
+     */
+    @BussinessLog(value = "删除部门", key = "deptId", dict = DeptDict.class)
+    @RequestMapping(value = "/delete")
+    @Permission
+    @ResponseBody
+    public Object delete(@RequestParam Integer deptId) {
+
+        //缓存被删除的部门名称
+        LogObjectHolder.me().set(ConstantFactory.me().getDeptName(deptId));
+
+        deptService.deleteDept(deptId);
+
+        return SUCCESS_TIP;
+    }
+
+    private void deptSetPids(Dept dept) {
+        if (ToolUtil.isEmpty(dept.getPid()) || dept.getPid().equals(0)) {
+            dept.setPid(0);
+            dept.setPids("[0],");
+        } else {
+            int pid = dept.getPid();
+            Dept temp = deptService.selectById(pid);
+            String pids = temp.getPids();
+            dept.setPid(pid);
+            dept.setPids(pids + "[" + pid + "],");
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DictController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DictController.java
new file mode 100644
index 0000000..780a39f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DictController.java
@@ -0,0 +1,142 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.dictmap.DictMap;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Dict;
+import com.stylefeng.guns.modular.system.service.IDictService;
+import com.stylefeng.guns.modular.system.warpper.DictWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年4月26日 12:55:31
+ */
+@Controller
+@RequestMapping("/dict")
+public class DictController extends BaseController {
+
+    private String PREFIX = "/system/dict/";
+
+    @Autowired
+    private IDictService dictService;
+
+    /**
+     * 跳转到字典管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "dict.html";
+    }
+
+    /**
+     * 跳转到添加字典
+     */
+    @RequestMapping("/dict_add")
+    public String deptAdd() {
+        return PREFIX + "dict_add.html";
+    }
+
+    /**
+     * 跳转到修改字典
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping("/dict_edit/{dictId}")
+    public String deptUpdate(@PathVariable Integer dictId, Model model) {
+        Dict dict = dictService.selectById(dictId);
+        model.addAttribute("dict", dict);
+        List<Dict> subDicts = dictService.selectList(new EntityWrapper<Dict>().eq("pid", dictId));
+        model.addAttribute("subDicts", subDicts);
+        LogObjectHolder.me().set(dict);
+        return PREFIX + "dict_edit.html";
+    }
+
+    /**
+     * 新增字典
+     *
+     * @param dictValues 格式例如   "1:启用;2:禁用;3:冻结"
+     */
+    @BussinessLog(value = "添加字典记录", key = "dictName,dictValues", dict = DictMap.class)
+    @RequestMapping(value = "/add")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object add(String dictCode,String dictTips,String dictName, String dictValues) {
+        if (ToolUtil.isOneEmpty(dictCode,dictName, dictValues)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.dictService.addDict(dictCode,dictName,dictTips,dictValues);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 获取所有字典列表
+     */
+    @RequestMapping(value = "/list")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object list(String condition) {
+        List<Map<String, Object>> list = this.dictService.list(condition);
+        return super.warpObject(new DictWarpper(list));
+    }
+
+    /**
+     * 字典详情
+     */
+    @RequestMapping(value = "/detail/{dictId}")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object detail(@PathVariable("dictId") Integer dictId) {
+        return dictService.selectById(dictId);
+    }
+
+    /**
+     * 修改字典
+     */
+    @BussinessLog(value = "修改字典", key = "dictName,dictValues", dict = DictMap.class)
+    @RequestMapping(value = "/update")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object update(Integer dictId,String dictCode,String dictName, String dictTips,String dictValues) {
+        if (ToolUtil.isOneEmpty(dictId, dictCode, dictName, dictValues)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        dictService.editDict(dictId, dictCode,dictName, dictTips,dictValues);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除字典记录
+     */
+    @BussinessLog(value = "删除字典记录", key = "dictId", dict = DictMap.class)
+    @RequestMapping(value = "/delete")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object delete(@RequestParam Integer dictId) {
+
+        //缓存被删除的名称
+        LogObjectHolder.me().set(ConstantFactory.me().getDictName(dictId));
+
+        this.dictService.delteDict(dictId);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/KaptchaController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/KaptchaController.java
new file mode 100644
index 0000000..59bab03
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/KaptchaController.java
@@ -0,0 +1,114 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.google.code.kaptcha.Constants;
+import com.google.code.kaptcha.Producer;
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.util.FileUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+
+/**
+ * 验证码生成
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 23:10
+ */
+@Controller
+@RequestMapping("/kaptcha")
+public class KaptchaController {
+
+    @Autowired
+    private GunsProperties gunsProperties;
+
+    @Autowired
+    private Producer producer;
+
+    /**
+     * 生成验证码
+     */
+    @RequestMapping("")
+    public void index(HttpServletRequest request, HttpServletResponse response) {
+        HttpSession session = request.getSession();
+
+        response.setDateHeader("Expires", 0);
+
+        // Set standard HTTP/1.1 no-cache headers.
+        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
+
+        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
+        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
+
+        // Set standard HTTP/1.0 no-cache header.
+        response.setHeader("Pragma", "no-cache");
+
+        // return a jpeg
+        response.setContentType("image/jpeg");
+
+        // create the text for the image
+        String capText = producer.createText();
+
+        // store the text in the session
+        session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
+
+        // create the image with the text
+        BufferedImage bi = producer.createImage(capText);
+        ServletOutputStream out = null;
+        try {
+            out = response.getOutputStream();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        // write the data out
+        try {
+            ImageIO.write(bi, "jpg", out);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        try {
+            try {
+                out.flush();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        } finally {
+            try {
+                out.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 返回图片
+     *
+     * @author stylefeng
+     * @Date 2017/5/24 23:00
+     */
+    @RequestMapping("/{pictureId}")
+    public void renderPicture(@PathVariable("pictureId") String pictureId, HttpServletResponse response) {
+        String path = gunsProperties.getFileUploadPath() + pictureId;
+        try {
+            byte[] bytes = FileUtil.toByteArray(path);
+            response.getOutputStream().write(bytes);
+        } catch (Exception e) {
+            //如果找不到图片就返回一个默认图片
+            try {
+                response.sendRedirect("/static/img/girl.gif");
+            } catch (IOException e1) {
+                e1.printStackTrace();
+            }
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LogController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LogController.java
new file mode 100644
index 0000000..a61f929
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LogController.java
@@ -0,0 +1,84 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.baomidou.mybatisplus.mapper.SqlRunner;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.common.constant.state.BizLogType;
+import com.stylefeng.guns.core.support.BeanKit;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+import com.stylefeng.guns.modular.system.service.IOperationLogService;
+import com.stylefeng.guns.modular.system.warpper.LogWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 日志管理的控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年4月5日 19:45:36
+ */
+@Controller
+@RequestMapping("/log")
+public class LogController extends BaseController {
+
+    private static String PREFIX = "/system/log/";
+
+    @Autowired
+    private IOperationLogService operationLogService;
+
+    /**
+     * 跳转到日志管理的首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "log.html";
+    }
+
+    /**
+     * 查询操作日志列表
+     */
+    @RequestMapping("/list")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String beginTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) String logName, @RequestParam(required = false) Integer logType) {
+        Page<OperationLog> page = new PageFactory<OperationLog>().defaultPage();
+        List<Map<String, Object>> result = operationLogService.getOperationLogs(page, beginTime, endTime, logName, BizLogType.valueOf(logType), page.getOrderByField(), page.isAsc());
+        page.setRecords((List<OperationLog>) new LogWarpper(result).warp());
+        return super.packForBT(page);
+    }
+
+    /**
+     * 查询操作日志详情
+     */
+    @RequestMapping("/detail/{id}")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object detail(@PathVariable Integer id) {
+        OperationLog operationLog = operationLogService.selectById(id);
+        Map<String, Object> stringObjectMap = BeanKit.beanToMap(operationLog);
+        return super.warpObject(new LogWarpper(stringObjectMap));
+    }
+
+    /**
+     * 清空日志
+     */
+    @BussinessLog(value = "清空业务日志")
+    @RequestMapping("/delLog")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object delLog() {
+        SqlRunner.db().delete("delete from sys_operation_log");
+        return SUCCESS_TIP;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginController.java
new file mode 100644
index 0000000..f32483a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginController.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.google.code.kaptcha.Constants;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.exception.InvalidKaptchaException;
+import com.stylefeng.guns.core.log.LogManager;
+import com.stylefeng.guns.core.log.factory.LogTaskFactory;
+import com.stylefeng.guns.core.node.MenuNode;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.ApiMenuFilter;
+import com.stylefeng.guns.core.util.KaptchaUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.IMenuService;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import java.util.List;
+
+import static com.stylefeng.guns.core.support.HttpKit.getIp;
+
+/**
+ * 登录控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年1月10日 下午8:25:24
+ */
+@Controller
+public class LoginController extends BaseController {
+
+    @Autowired
+    private IMenuService menuService;
+
+    @Autowired
+    private IUserService userService;
+
+    /**
+     * 跳转到主页
+     */
+    @RequestMapping(value = "/", method = RequestMethod.GET)
+    public String index(Model model) {
+        //获取菜单列表
+        List<Integer> roleList = ShiroKit.getUser().getRoleList();
+        if (roleList == null || roleList.size() == 0) {
+            ShiroKit.getSubject().logout();
+            model.addAttribute("tips", "该用户没有角色,无法登陆");
+            return "/login.html";
+        }
+        List<MenuNode> menus = menuService.getMenusByRoleIds(roleList);
+        List<MenuNode> titles = MenuNode.buildTitle(menus);
+        titles = ApiMenuFilter.build(titles);
+
+        model.addAttribute("titles", titles);
+
+        //获取用户头像
+        Integer id = ShiroKit.getUser().getId();
+        User user = userService.selectById(id);
+        String avatar = user.getAvatar();
+        model.addAttribute("avatar", avatar);
+
+        return "/index.html";
+    }
+
+    /**
+     * 跳转到登录页面
+     */
+    @RequestMapping(value = "/login", method = RequestMethod.GET)
+    public String login() {
+        if (ShiroKit.isAuthenticated() || ShiroKit.getUser() != null) {
+            return REDIRECT + "/";
+        } else {
+            return "/login.html";
+        }
+    }
+
+    /**
+     * 点击登录执行的动作
+     */
+    @RequestMapping(value = "/login", method = RequestMethod.POST)
+    public String loginVali() {
+
+        String username = super.getPara("username").trim();
+        String password = super.getPara("password").trim();
+        String remember = super.getPara("remember");
+
+        //验证验证码是否正确
+        if (KaptchaUtil.getKaptchaOnOff()) {
+            String kaptcha = super.getPara("kaptcha").trim();
+            String code = (String) super.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
+            if (ToolUtil.isEmpty(kaptcha) || !kaptcha.equalsIgnoreCase(code)) {
+                throw new InvalidKaptchaException();
+            }
+        }
+
+        Subject currentUser = ShiroKit.getSubject();
+        UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray());
+
+        if ("on".equals(remember)) {
+            token.setRememberMe(true);
+        } else {
+            token.setRememberMe(false);
+        }
+
+        currentUser.login(token);
+
+        ShiroUser shiroUser = ShiroKit.getUser();
+        super.getSession().setAttribute("shiroUser", shiroUser);
+        super.getSession().setAttribute("username", shiroUser.getAccount());
+
+        LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp()));
+
+        ShiroKit.getSession().setAttribute("sessionFlag", true);
+
+        return REDIRECT + "/";
+    }
+
+    /**
+     * 退出登录
+     */
+    @RequestMapping(value = "/logout", method = RequestMethod.GET)
+    public String logOut() {
+        LogManager.me().executeLog(LogTaskFactory.exitLog(ShiroKit.getUser().getId(), getIp()));
+        ShiroKit.getSubject().logout();
+        deleteAllCookie();
+        return REDIRECT + "/login";
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginLogController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginLogController.java
new file mode 100644
index 0000000..9655379
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginLogController.java
@@ -0,0 +1,69 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.baomidou.mybatisplus.mapper.SqlRunner;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import com.stylefeng.guns.modular.system.service.ILoginLogService;
+import com.stylefeng.guns.modular.system.warpper.LogWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 日志管理的控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年4月5日 19:45:36
+ */
+@Controller
+@RequestMapping("/loginLog")
+public class LoginLogController extends BaseController {
+
+    private static String PREFIX = "/system/log/";
+
+    @Autowired
+    private ILoginLogService loginLogService;
+
+    /**
+     * 跳转到日志管理的首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "login_log.html";
+    }
+
+    /**
+     * 查询登录日志列表
+     */
+    @RequestMapping("/list")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String beginTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) String logName) {
+        Page<LoginLog> page = new PageFactory<LoginLog>().defaultPage();
+        List<Map<String, Object>> result = loginLogService.getLoginLogs(page, beginTime, endTime, logName, page.getOrderByField(), page.isAsc());
+        page.setRecords((List<LoginLog>) new LogWarpper(result).warp());
+        return super.packForBT(page);
+    }
+
+    /**
+     * 清空日志
+     */
+    @BussinessLog("清空登录日志")
+    @RequestMapping("/delLoginLog")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object delLog() {
+        SqlRunner.db().delete("delete from sys_login_log");
+        return SUCCESS_TIP;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/MenuController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/MenuController.java
new file mode 100644
index 0000000..37c72fc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/MenuController.java
@@ -0,0 +1,244 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.Tip;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.dictmap.MenuDict;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.constant.state.MenuStatus;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.core.support.BeanKit;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Menu;
+import com.stylefeng.guns.modular.system.service.IMenuService;
+import com.stylefeng.guns.modular.system.warpper.MenuWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 菜单控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年2月12日21:59:14
+ */
+@Controller
+@RequestMapping("/menu")
+public class MenuController extends BaseController {
+
+    private static String PREFIX = "/system/menu/";
+
+    @Autowired
+    private IMenuService menuService;
+
+    /**
+     * 跳转到菜单列表列表页面
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "menu.html";
+    }
+
+    /**
+     * 跳转到菜单列表列表页面
+     */
+    @RequestMapping(value = "/menu_add")
+    public String menuAdd() {
+        return PREFIX + "menu_add.html";
+    }
+
+    /**
+     * 跳转到菜单详情列表页面
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/menu_edit/{menuId}")
+    public String menuEdit(@PathVariable Long menuId, Model model) {
+        if (ToolUtil.isEmpty(menuId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        Menu menu = this.menuService.selectById(menuId);
+
+        //获取父级菜单的id
+        Menu temp = new Menu();
+        temp.setCode(menu.getPcode());
+        Menu pMenu = this.menuService.selectOne(new EntityWrapper<>(temp));
+
+        //如果父级是顶级菜单
+        if (pMenu == null) {
+            menu.setPcode("0");
+        } else {
+            //设置父级菜单的code为父级菜单的id
+            menu.setPcode(String.valueOf(pMenu.getId()));
+        }
+
+        Map<String, Object> menuMap = BeanKit.beanToMap(menu);
+        menuMap.put("pcodeName", ConstantFactory.me().getMenuNameByCode(temp.getCode()));
+        model.addAttribute("menu", menuMap);
+        LogObjectHolder.me().set(menu);
+        return PREFIX + "menu_edit.html";
+    }
+
+    /**
+     * 修该菜单
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/edit")
+    @BussinessLog(value = "修改菜单", key = "name", dict = MenuDict.class)
+    @ResponseBody
+    public Tip edit(@Valid Menu menu, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //设置父级菜单编号
+        menuSetPcode(menu);
+
+        this.menuService.updateById(menu);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 获取菜单列表
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String menuName, @RequestParam(required = false) String level) {
+        List<Map<String, Object>> menus = this.menuService.selectMenus(menuName, level);
+        return super.warpObject(new MenuWarpper(menus));
+    }
+
+    /**
+     * 新增菜单
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/add")
+    @BussinessLog(value = "菜单新增", key = "name", dict = MenuDict.class)
+    @ResponseBody
+    public Tip add(@Valid Menu menu, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+        //判断是否存在该编号
+        String existedMenuName = ConstantFactory.me().getMenuNameByCode(menu.getCode());
+        if (ToolUtil.isNotEmpty(existedMenuName)) {
+            throw new GunsException(BizExceptionEnum.EXISTED_THE_MENU);
+        }
+
+        //设置父级菜单编号
+        menuSetPcode(menu);
+
+        menu.setStatus(MenuStatus.ENABLE.getCode());
+        this.menuService.insert(menu);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除菜单
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/remove")
+    @BussinessLog(value = "删除菜单", key = "menuId", dict = MenuDict.class)
+    @ResponseBody
+    public Tip remove(@RequestParam Long menuId) {
+        if (ToolUtil.isEmpty(menuId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+        //缓存菜单的名称
+        LogObjectHolder.me().set(ConstantFactory.me().getMenuName(menuId));
+
+        this.menuService.delMenuContainSubMenus(menuId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 查看菜单
+     */
+    @RequestMapping(value = "/view/{menuId}")
+    @ResponseBody
+    public Tip view(@PathVariable Long menuId) {
+        if (ToolUtil.isEmpty(menuId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.menuService.selectById(menuId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 获取菜单列表(首页用)
+     */
+    @RequestMapping(value = "/menuTreeList")
+    @ResponseBody
+    public List<ZTreeNode> menuTreeList() {
+        List<ZTreeNode> roleTreeList = this.menuService.menuTreeList();
+        return roleTreeList;
+    }
+
+    /**
+     * 获取菜单列表(选择父级菜单用)
+     */
+    @RequestMapping(value = "/selectMenuTreeList")
+    @ResponseBody
+    public List<ZTreeNode> selectMenuTreeList() {
+        List<ZTreeNode> roleTreeList = this.menuService.menuTreeList();
+        roleTreeList.add(ZTreeNode.createParent());
+        return roleTreeList;
+    }
+
+    /**
+     * 获取角色列表
+     */
+    @RequestMapping(value = "/menuTreeListByRoleId/{roleId}")
+    @ResponseBody
+    public List<ZTreeNode> menuTreeListByRoleId(@PathVariable Integer roleId) {
+        List<Long> menuIds = this.menuService.getMenuIdsByRoleId(roleId);
+        if (ToolUtil.isEmpty(menuIds)) {
+            List<ZTreeNode> roleTreeList = this.menuService.menuTreeList();
+            return roleTreeList;
+        } else {
+            List<ZTreeNode> roleTreeListByUserId = this.menuService.menuTreeListByMenuIds(menuIds);
+            return roleTreeListByUserId;
+        }
+    }
+
+    /**
+     * 根据请求的父级菜单编号设置pcode和层级
+     */
+    private void menuSetPcode(@Valid Menu menu) {
+        if (ToolUtil.isEmpty(menu.getPcode()) || menu.getPcode().equals("0")) {
+            menu.setPcode("0");
+            menu.setPcodes("[0],");
+            menu.setLevels(1);
+        } else {
+            long code = Long.parseLong(menu.getPcode());
+            Menu pMenu = menuService.selectById(code);
+            Integer pLevels = pMenu.getLevels();
+            menu.setPcode(pMenu.getCode());
+
+            //如果编号和父编号一致会导致无限递归
+            if (menu.getCode().equals(menu.getPcode())) {
+                throw new GunsException(BizExceptionEnum.MENU_PCODE_COINCIDENCE);
+            }
+
+            menu.setLevels(pLevels + 1);
+            menu.setPcodes(pMenu.getPcodes() + "[" + pMenu.getCode() + "],");
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/NoticeController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/NoticeController.java
new file mode 100644
index 0000000..7211823
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/NoticeController.java
@@ -0,0 +1,138 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.constant.dictmap.NoticeMap;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Notice;
+import com.stylefeng.guns.modular.system.service.INoticeService;
+import com.stylefeng.guns.modular.system.warpper.NoticeWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通知控制器
+ *
+ * @author fengshuonan
+ * @Date 2017-05-09 23:02:21
+ */
+@Controller
+@RequestMapping("/notice")
+public class NoticeController extends BaseController {
+
+    private String PREFIX = "/system/notice/";
+
+    @Autowired
+    private INoticeService noticeService;
+
+    /**
+     * 跳转到通知列表首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "notice.html";
+    }
+
+    /**
+     * 跳转到添加通知
+     */
+    @RequestMapping("/notice_add")
+    public String noticeAdd() {
+        return PREFIX + "notice_add.html";
+    }
+
+    /**
+     * 跳转到修改通知
+     */
+    @RequestMapping("/notice_update/{noticeId}")
+    public String noticeUpdate(@PathVariable Integer noticeId, Model model) {
+        Notice notice = this.noticeService.selectById(noticeId);
+        model.addAttribute("notice",notice);
+        LogObjectHolder.me().set(notice);
+        return PREFIX + "notice_edit.html";
+    }
+
+    /**
+     * 跳转到首页通知
+     */
+    @RequestMapping("/hello")
+    public String hello() {
+        List<Map<String, Object>> notices = noticeService.list(null);
+        super.setAttr("noticeList",notices);
+        return "/blackboard.html";
+    }
+
+    /**
+     * 获取通知列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        List<Map<String, Object>> list = this.noticeService.list(condition);
+        return super.warpObject(new NoticeWrapper(list));
+    }
+
+    /**
+     * 新增通知
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    @BussinessLog(value = "新增通知",key = "title",dict = NoticeMap.class)
+    public Object add(Notice notice) {
+        if (ToolUtil.isOneEmpty(notice, notice.getTitle(), notice.getContent())) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        notice.setCreater(ShiroKit.getUser().getId());
+        notice.setCreatetime(new Date());
+        notice.insert();
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除通知
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    @BussinessLog(value = "删除通知",key = "noticeId",dict = NoticeMap.class)
+    public Object delete(@RequestParam Integer noticeId) {
+
+        //缓存通知名称
+        LogObjectHolder.me().set(ConstantFactory.me().getNoticeTitle(noticeId));
+
+        this.noticeService.deleteById(noticeId);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改通知
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    @BussinessLog(value = "修改通知",key = "title",dict = NoticeMap.class)
+    public Object update(Notice notice) {
+        if (ToolUtil.isOneEmpty(notice, notice.getId(), notice.getTitle(), notice.getContent())) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        Notice old = this.noticeService.selectById(notice.getId());
+        old.setTitle(notice.getTitle());
+        old.setContent(notice.getContent());
+        old.updateById();
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/RoleController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/RoleController.java
new file mode 100644
index 0000000..6e7893d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/RoleController.java
@@ -0,0 +1,230 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.Tip;
+import com.stylefeng.guns.core.cache.CacheKit;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.cache.Cache;
+import com.stylefeng.guns.core.common.constant.dictmap.RoleDict;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.core.util.Convert;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Role;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.IRoleService;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import com.stylefeng.guns.modular.system.warpper.RoleWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 角色控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年2月12日21:59:14
+ */
+@Controller
+@RequestMapping("/role")
+public class RoleController extends BaseController {
+
+    private static String PREFIX = "/system/role";
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private IRoleService roleService;
+
+    /**
+     * 跳转到角色列表页面
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "/role.html";
+    }
+
+    /**
+     * 跳转到添加角色
+     */
+    @RequestMapping(value = "/role_add")
+    public String roleAdd() {
+        return PREFIX + "/role_add.html";
+    }
+
+    /**
+     * 跳转到修改角色
+     */
+    @Permission
+    @RequestMapping(value = "/role_edit/{roleId}")
+    public String roleEdit(@PathVariable Integer roleId, Model model) {
+        if (ToolUtil.isEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        Role role = this.roleService.selectById(roleId);
+        model.addAttribute(role);
+        model.addAttribute("pName", ConstantFactory.me().getSingleRoleName(role.getPid()));
+        model.addAttribute("deptName", ConstantFactory.me().getDeptName(role.getDeptid()));
+        LogObjectHolder.me().set(role);
+        return PREFIX + "/role_edit.html";
+    }
+
+    /**
+     * 跳转到角色分配
+     */
+    @Permission
+    @RequestMapping(value = "/role_assign/{roleId}")
+    public String roleAssign(@PathVariable("roleId") Integer roleId, Model model) {
+        if (ToolUtil.isEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        model.addAttribute("roleId", roleId);
+        model.addAttribute("roleName", ConstantFactory.me().getSingleRoleName(roleId));
+        return PREFIX + "/role_assign.html";
+    }
+
+    /**
+     * 获取角色列表
+     */
+    @Permission
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String roleName) {
+        List<Map<String, Object>> roles = this.roleService.selectRoles(super.getPara("roleName"));
+        return super.warpObject(new RoleWarpper(roles));
+    }
+
+    /**
+     * 角色新增
+     */
+    @RequestMapping(value = "/add")
+    @BussinessLog(value = "添加角色", key = "name", dict = RoleDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip add(@Valid Role role, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        role.setId(null);
+        this.roleService.insert(role);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 角色修改
+     */
+    @RequestMapping(value = "/edit")
+    @BussinessLog(value = "修改角色", key = "name", dict = RoleDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip edit(@Valid Role role, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.roleService.updateById(role);
+
+        //删除缓存
+        CacheKit.removeAll(Cache.CONSTANT);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除角色
+     */
+    @RequestMapping(value = "/remove")
+    @BussinessLog(value = "删除角色", key = "roleId", dict = RoleDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip remove(@RequestParam Integer roleId) {
+        if (ToolUtil.isEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+        //不能删除超级管理员角色
+        if (roleId.equals(Const.ADMIN_ROLE_ID)) {
+            throw new GunsException(BizExceptionEnum.CANT_DELETE_ADMIN);
+        }
+
+        //缓存被删除的角色名称
+        LogObjectHolder.me().set(ConstantFactory.me().getSingleRoleName(roleId));
+
+        this.roleService.delRoleById(roleId);
+
+        //删除缓存
+        CacheKit.removeAll(Cache.CONSTANT);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 查看角色
+     */
+    @RequestMapping(value = "/view/{roleId}")
+    @ResponseBody
+    public Tip view(@PathVariable Integer roleId) {
+        if (ToolUtil.isEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.roleService.selectById(roleId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 配置权限
+     */
+    @RequestMapping("/setAuthority")
+    @BussinessLog(value = "配置权限", key = "roleId,ids", dict = RoleDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip setAuthority(@RequestParam("roleId") Integer roleId, @RequestParam("ids") String ids) {
+        if (ToolUtil.isOneEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.roleService.setAuthority(roleId, ids);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 获取角色列表
+     */
+    @RequestMapping(value = "/roleTreeList")
+    @ResponseBody
+    public List<ZTreeNode> roleTreeList() {
+        List<ZTreeNode> roleTreeList = this.roleService.roleTreeList();
+        roleTreeList.add(ZTreeNode.createParent());
+        return roleTreeList;
+    }
+
+    /**
+     * 获取角色列表
+     */
+    @RequestMapping(value = "/roleTreeListByUserId/{userId}")
+    @ResponseBody
+    public List<ZTreeNode> roleTreeListByUserId(@PathVariable Integer userId) {
+        User theUser = this.userService.selectById(userId);
+        String roleid = theUser.getRoleid();
+        if (ToolUtil.isEmpty(roleid)) {
+            List<ZTreeNode> roleTreeList = this.roleService.roleTreeList();
+            return roleTreeList;
+        } else {
+            String[] strArray = Convert.toStrArray(",", roleid);
+            List<ZTreeNode> roleTreeListByUserId = this.roleService.roleTreeListByRoleId(strArray);
+            return roleTreeListByUserId;
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/UserMgrController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/UserMgrController.java
new file mode 100644
index 0000000..b84703f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/UserMgrController.java
@@ -0,0 +1,373 @@
+package com.stylefeng.guns.modular.system.controller;
+
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.Tip;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.dictmap.UserDict;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.constant.state.ManagerStatus;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.datascope.DataScope;
+import com.stylefeng.guns.core.db.Db;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.UserMapper;
+import com.stylefeng.guns.modular.system.factory.UserFactory;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import com.stylefeng.guns.modular.system.transfer.UserDto;
+import com.stylefeng.guns.modular.system.warpper.UserWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.naming.NoPermissionException;
+import javax.validation.Valid;
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 系统管理员控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年1月11日 下午1:08:17
+ */
+@Controller
+@RequestMapping("/mgr")
+public class UserMgrController extends BaseController {
+
+    private static String PREFIX = "/system/user/";
+
+    @Autowired
+    private GunsProperties gunsProperties;
+
+    @Autowired
+    private IUserService userService;
+
+    /**
+     * 跳转到查看管理员列表的页面
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "user.html";
+    }
+
+    /**
+     * 跳转到查看管理员列表的页面
+     */
+    @RequestMapping("/user_add")
+    public String addView() {
+        return PREFIX + "user_add.html";
+    }
+
+    /**
+     * 跳转到角色分配页面
+     */
+    //@RequiresPermissions("/mgr/role_assign")  //利用shiro自带的权限检查
+    @Permission
+    @RequestMapping("/role_assign/{userId}")
+    public String roleAssign(@PathVariable Integer userId, Model model) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        User user = (User) Db.create(UserMapper.class).selectOneByCon("id", userId);
+        model.addAttribute("userId", userId);
+        model.addAttribute("userAccount", user.getAccount());
+        return PREFIX + "user_roleassign.html";
+    }
+
+    /**
+     * 跳转到编辑管理员页面
+     */
+    @Permission
+    @RequestMapping("/user_edit/{userId}")
+    public String userEdit(@PathVariable Integer userId, Model model) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        assertAuth(userId);
+        User user = this.userService.selectById(userId);
+        model.addAttribute(user);
+        model.addAttribute("roleName", ConstantFactory.me().getRoleName(user.getRoleid()));
+        model.addAttribute("deptName", ConstantFactory.me().getDeptName(user.getDeptid()));
+        LogObjectHolder.me().set(user);
+        return PREFIX + "user_edit.html";
+    }
+
+    /**
+     * 跳转到查看用户详情页面
+     */
+    @RequestMapping("/user_info")
+    public String userInfo(Model model) {
+        Integer userId = ShiroKit.getUser().getId();
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        User user = this.userService.selectById(userId);
+        model.addAttribute(user);
+        model.addAttribute("roleName", ConstantFactory.me().getRoleName(user.getRoleid()));
+        model.addAttribute("deptName", ConstantFactory.me().getDeptName(user.getDeptid()));
+        LogObjectHolder.me().set(user);
+        return PREFIX + "user_view.html";
+    }
+
+    /**
+     * 跳转到修改密码界面
+     */
+    @RequestMapping("/user_chpwd")
+    public String chPwd() {
+        return PREFIX + "user_chpwd.html";
+    }
+
+    /**
+     * 修改当前用户的密码
+     */
+    @RequestMapping("/changePwd")
+    @ResponseBody
+    public Object changePwd(@RequestParam String oldPwd, @RequestParam String newPwd, @RequestParam String rePwd) {
+        if (!newPwd.equals(rePwd)) {
+            throw new GunsException(BizExceptionEnum.TWO_PWD_NOT_MATCH);
+        }
+        Integer userId = ShiroKit.getUser().getId();
+        User user = userService.selectById(userId);
+        String oldMd5 = ShiroKit.md5(oldPwd, user.getSalt());
+        if (user.getPassword().equals(oldMd5)) {
+            String newMd5 = ShiroKit.md5(newPwd, user.getSalt());
+            user.setPassword(newMd5);
+            user.updateById();
+            return SUCCESS_TIP;
+        } else {
+            throw new GunsException(BizExceptionEnum.OLD_PWD_NOT_RIGHT);
+        }
+    }
+
+    /**
+     * 查询管理员列表
+     */
+    @RequestMapping("/list")
+    @Permission
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String name, @RequestParam(required = false) String beginTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) Integer deptid) {
+        if (ShiroKit.isAdmin()) {
+            List<Map<String, Object>> users = userService.selectUsers(null, name, beginTime, endTime, deptid);
+            return new UserWarpper(users).warp();
+        } else {
+            DataScope dataScope = new DataScope(ShiroKit.getDeptDataScope());
+            List<Map<String, Object>> users = userService.selectUsers(dataScope, name, beginTime, endTime, deptid);
+            return new UserWarpper(users).warp();
+        }
+    }
+
+    /**
+     * 添加管理员
+     */
+    @RequestMapping("/add")
+    @BussinessLog(value = "添加管理员", key = "account", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip add(@Valid UserDto user, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+        // 判断账号是否重复
+        User theUser = userService.getByAccount(user.getAccount());
+        if (theUser != null) {
+            throw new GunsException(BizExceptionEnum.USER_ALREADY_REG);
+        }
+
+        // 完善账号信息
+        user.setSalt(ShiroKit.getRandomSalt(5));
+        user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt()));
+        user.setStatus(ManagerStatus.OK.getCode());
+        user.setCreatetime(new Date());
+
+        this.userService.insert(UserFactory.createUser(user));
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改管理员
+     *
+     * @throws NoPermissionException
+     */
+    @RequestMapping("/edit")
+    @BussinessLog(value = "修改管理员", key = "account", dict = UserDict.class)
+    @ResponseBody
+    public Tip edit(@Valid UserDto user, BindingResult result) throws NoPermissionException {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+        User oldUser = userService.selectById(user.getId());
+
+        if (ShiroKit.hasRole(Const.ADMIN_NAME)) {
+            this.userService.updateById(UserFactory.editUser(user, oldUser));
+            return SUCCESS_TIP;
+        } else {
+            assertAuth(user.getId());
+            ShiroUser shiroUser = ShiroKit.getUser();
+            if (shiroUser.getId().equals(user.getId())) {
+                this.userService.updateById(UserFactory.editUser(user, oldUser));
+                return SUCCESS_TIP;
+            } else {
+                throw new GunsException(BizExceptionEnum.NO_PERMITION);
+            }
+        }
+    }
+
+    /**
+     * 删除管理员(逻辑删除)
+     */
+    @RequestMapping("/delete")
+    @BussinessLog(value = "删除管理员", key = "userId", dict = UserDict.class)
+    @Permission
+    @ResponseBody
+    public Tip delete(@RequestParam Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //不能删除超级管理员
+        if (userId.equals(Const.ADMIN_ID)) {
+            throw new GunsException(BizExceptionEnum.CANT_DELETE_ADMIN);
+        }
+        assertAuth(userId);
+        this.userService.setStatus(userId, ManagerStatus.DELETED.getCode());
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 查看管理员详情
+     */
+    @RequestMapping("/view/{userId}")
+    @ResponseBody
+    public User view(@PathVariable Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        assertAuth(userId);
+        return this.userService.selectById(userId);
+    }
+
+    /**
+     * 重置管理员的密码
+     */
+    @RequestMapping("/reset")
+    @BussinessLog(value = "重置管理员密码", key = "userId", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip reset(@RequestParam Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        assertAuth(userId);
+        User user = this.userService.selectById(userId);
+        user.setSalt(ShiroKit.getRandomSalt(5));
+        user.setPassword(ShiroKit.md5(Const.DEFAULT_PWD, user.getSalt()));
+        this.userService.updateById(user);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 冻结用户
+     */
+    @RequestMapping("/freeze")
+    @BussinessLog(value = "冻结用户", key = "userId", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip freeze(@RequestParam Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //不能冻结超级管理员
+        if (userId.equals(Const.ADMIN_ID)) {
+            throw new GunsException(BizExceptionEnum.CANT_FREEZE_ADMIN);
+        }
+        assertAuth(userId);
+        this.userService.setStatus(userId, ManagerStatus.FREEZED.getCode());
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 解除冻结用户
+     */
+    @RequestMapping("/unfreeze")
+    @BussinessLog(value = "解除冻结用户", key = "userId", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip unfreeze(@RequestParam Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        assertAuth(userId);
+        this.userService.setStatus(userId, ManagerStatus.OK.getCode());
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 分配角色
+     */
+    @RequestMapping("/setRole")
+    @BussinessLog(value = "分配角色", key = "userId,roleIds", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip setRole(@RequestParam("userId") Integer userId, @RequestParam("roleIds") String roleIds) {
+        if (ToolUtil.isOneEmpty(userId, roleIds)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //不能修改超级管理员
+        if (userId.equals(Const.ADMIN_ID)) {
+            throw new GunsException(BizExceptionEnum.CANT_CHANGE_ADMIN);
+        }
+        assertAuth(userId);
+        this.userService.setRoles(userId, roleIds);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 上传图片
+     */
+    @RequestMapping(method = RequestMethod.POST, path = "/upload")
+    @ResponseBody
+    public String upload(@RequestPart("file") MultipartFile picture) {
+
+        String pictureName = UUID.randomUUID().toString() + "." + ToolUtil.getFileSuffix(picture.getOriginalFilename());
+        try {
+            String fileSavePath = gunsProperties.getFileUploadPath();
+            picture.transferTo(new File(fileSavePath + pictureName));
+        } catch (Exception e) {
+            throw new GunsException(BizExceptionEnum.UPLOAD_ERROR);
+        }
+        return pictureName;
+    }
+
+    /**
+     * 判断当前登录的用户是否有操作这个用户的权限
+     */
+    private void assertAuth(Integer userId) {
+        if (ShiroKit.isAdmin()) {
+            return;
+        }
+        List<Integer> deptDataScope = ShiroKit.getDeptDataScope();
+        User user = this.userService.selectById(userId);
+        Integer deptid = user.getDeptid();
+        if (deptDataScope.contains(deptid)) {
+            return;
+        } else {
+            throw new GunsException(BizExceptionEnum.NO_PERMITION);
+        }
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/AdvertisementMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/AdvertisementMapper.java
new file mode 100644
index 0000000..cc3795d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/AdvertisementMapper.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Advertisement;
+import com.stylefeng.guns.modular.system.warpper.AdvertisementWarpper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface AdvertisementMapper extends BaseMapper<Advertisement> {
+
+
+    /**
+     * 获取广告
+     * @param type  广告类型(1:弹窗广告,2:底部广告)
+     * @return
+     * @throws Exception
+     */
+    List<AdvertisementWarpper> queryAdvertisement(@Param("code") String code, @Param("type") Integer type);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/AgreementMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/AgreementMapper.java
new file mode 100644
index 0000000..aab92db
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/AgreementMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Agreement;
+import org.apache.ibatis.annotations.Param;
+
+public interface AgreementMapper extends BaseMapper<Agreement> {
+
+
+    /**
+     * 获取协议内容
+     * @param type
+     * @return
+     */
+    String queryByType(@Param("type") Integer type, @Param("useType") Integer useType);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CancleOrderMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CancleOrderMapper.java
new file mode 100644
index 0000000..178b7c5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CancleOrderMapper.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.CancleOrder;
+import org.apache.ibatis.annotations.Param;
+
+public interface CancleOrderMapper extends BaseMapper<CancleOrder> {
+
+
+    /**
+     * 获取取消订单配置
+     * @param type
+     * @param orderType
+     * @return
+     */
+    CancleOrder query(@Param("type") Integer type, @Param("orderType") Integer orderType,
+                      @Param("companyId") Integer companyId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java
new file mode 100644
index 0000000..a815807
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Car;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface CarMapper extends BaseMapper<Car> {
+
+
+    /**
+     * 获取空闲车辆
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryIdleData(@Param("companyId") Integer companyId) throws Exception;
+
+
+    /**
+     * 车牌查询
+     * @param licensePlate
+     * @return
+     * @throws Exception
+     */
+    Car query(@Param("licensePlate") String licensePlate) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarServiceMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarServiceMapper.java
new file mode 100644
index 0000000..66c9fac
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarServiceMapper.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.CarService;
+import org.apache.ibatis.annotations.Param;
+
+public interface CarServiceMapper extends BaseMapper<CarService> {
+
+
+    CarService query(@Param("type") Integer orderType, @Param("carId") Integer carId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CompanyCityMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CompanyCityMapper.java
new file mode 100644
index 0000000..5ab918b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CompanyCityMapper.java
@@ -0,0 +1,10 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.CompanyCity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface CompanyCityMapper extends BaseMapper<CompanyCity> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CompanyMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CompanyMapper.java
new file mode 100644
index 0000000..43f3ff0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CompanyMapper.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Company;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface CompanyMapper extends BaseMapper<Company> {
+
+
+    /**
+     * 根据行政区域代码获取企业
+     * @param code
+     * @return
+     */
+    List<Company> query(@Param("province") String province, @Param("city") String city, @Param("code") String code);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ComplaintMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ComplaintMapper.java
new file mode 100644
index 0000000..c198609
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ComplaintMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Complaint;
+
+public interface ComplaintMapper extends BaseMapper<Complaint> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java
new file mode 100644
index 0000000..a92fb85
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Dept;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 部门表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface DeptMapper extends BaseMapper<Dept> {
+
+    /**
+     * 获取ztree的节点列表
+     */
+    List<ZTreeNode> tree();
+
+    /**
+     * 获取所有部门列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String condition);
+
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java
new file mode 100644
index 0000000..55677f1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Dict;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 字典表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface DictMapper extends BaseMapper<Dict> {
+
+    /**
+     * 根据编码获取词典列表
+     */
+    List<Dict> selectByCode(@Param("code") String code);
+
+    /**
+     * 查询字典列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String conditiion);
+
+    /**
+     * 根据父类编码获取词典列表
+     */
+    List<Dict> selectByParentCode(@Param("code") String code);
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityHistoryMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityHistoryMapper.java
new file mode 100644
index 0000000..4aea57d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityHistoryMapper.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.DriverActivityHistory;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface DriverActivityHistoryMapper extends BaseMapper<DriverActivityHistory> {
+
+
+
+    List<Map<String, Object>> query(@Param("driverId") Integer driverId, @Param("pageNum") Integer pageNum,
+                                    @Param("size") Integer size);
+
+
+
+
+    List<DriverActivityHistory> queryList(@Param("driverId") Integer driverId, @Param("type") Integer type,
+                                          @Param("carryOut") Integer carryOut, @Param("start") Date start,
+                                          @Param("end") Date end);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityRegisteredMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityRegisteredMapper.java
new file mode 100644
index 0000000..4944499
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityRegisteredMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.DriverActivityRegistered;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DriverActivityRegisteredMapper extends BaseMapper<DriverActivityRegistered> {
+
+    /**
+     * 获取当前有效活动
+     * @param type
+     * @param companyId
+     * @return
+     */
+    List<Map<String, Object>> query(@Param("type") Integer type, @Param("companyId") Integer companyId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java
new file mode 100644
index 0000000..27592b2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java
@@ -0,0 +1,43 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Driver;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DriverMapper extends BaseMapper<Driver> {
+
+
+    /**
+     * 获取当前已上班type业务类型、设置了可以接此类型的单据且空闲的司机
+     * @param type
+     * @return
+     */
+    List<Driver> queryIdleDriver(@Param("type") Integer type, @Param("companyId") Integer companyId);
+
+
+    /**
+     * 获取当前已上班type业务类型、设置了可以接此类型的单据、服务车型匹配且空闲的司机
+     * @param type
+     * @param serverCarModelId
+     * @param companyId
+     * @return
+     */
+    List<Driver> queryIdleDriver_(@Param("type") Integer type, @Param("serverCarModelId") Integer serverCarModelId,
+                                 @Param("companyId") Integer companyId);
+
+
+    /**
+     * 根据订单id获取司机数据
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderDriver(@Param("orderId") Integer orderId, @Param("orderType") Integer orderType);
+
+
+
+
+    Map<String, Object> queryDriverInfo(@Param("id") Integer id);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverOrdersMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverOrdersMapper.java
new file mode 100644
index 0000000..7d6e28c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverOrdersMapper.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.DriverOrders;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DriverOrdersMapper extends BaseMapper<DriverOrders> {
+
+
+    DriverOrders query(@Param("uid") Integer uid, @Param("type") Integer type);
+
+
+
+    List<Integer> queryOrders(@Param("uid") Integer uid);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverServiceMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverServiceMapper.java
new file mode 100644
index 0000000..16ca189
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverServiceMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.DriverService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DriverServiceMapper extends BaseMapper<DriverService> {
+
+
+    /**
+     * 获取司机的业务类型
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<DriverService> queryBusiness(@Param("uid") Integer uid, @Param("type") Integer... type);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverWorkMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverWorkMapper.java
new file mode 100644
index 0000000..27e7654
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverWorkMapper.java
@@ -0,0 +1,10 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.DriverWork;
+import org.apache.ibatis.annotations.Param;
+
+public interface DriverWorkMapper extends BaseMapper<DriverWork> {
+    DriverWork queryNewWork(@Param("driverId") Integer driverId, @Param("type") Integer type,
+                            @Param("state") Integer state);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ExpenseMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ExpenseMapper.java
new file mode 100644
index 0000000..312d243
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ExpenseMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Expense;
+
+/**
+ * <p>
+  * 报销表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-12-04
+ */
+public interface ExpenseMapper extends BaseMapper<Expense> {
+
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/FeedbackMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/FeedbackMapper.java
new file mode 100644
index 0000000..21f6b40
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/FeedbackMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Feedback;
+
+public interface FeedbackMapper extends BaseMapper<Feedback> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/FrequentPassengersMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/FrequentPassengersMapper.java
new file mode 100644
index 0000000..89f75af
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/FrequentPassengersMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.FrequentPassengers;
+
+public interface FrequentPassengersMapper extends BaseMapper<FrequentPassengers> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java
new file mode 100644
index 0000000..67bfb34
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java
@@ -0,0 +1,12 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.GDInterface;
+import org.apache.ibatis.annotations.Param;
+
+public interface GDInterfaceMapper extends BaseMapper<GDInterface> {
+
+
+    GDInterface query(@Param("name") String name, @Param("explanation") String explanation,
+                      @Param("time") String time);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java
new file mode 100644
index 0000000..e8b8cfa
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Income;
+
+public interface IncomeMapper extends BaseMapper<Income> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IntegralGoodsMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IntegralGoodsMapper.java
new file mode 100644
index 0000000..496eca2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IntegralGoodsMapper.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.IntegralGoods;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IntegralGoodsMapper extends BaseMapper<IntegralGoods> {
+
+
+    List<Map<String, Object>> queryGoods(@Param("pageNum") Integer pageNum, @Param("size") Integer size);
+
+
+    Map<String, Object> queryGoodsInfo(@Param("id") Integer id);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IntegralOrderMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IntegralOrderMapper.java
new file mode 100644
index 0000000..5d1673b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IntegralOrderMapper.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.IntegralOrder;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IntegralOrderMapper extends BaseMapper<IntegralOrder> {
+
+
+    /**
+     * 获取历史记录
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryConvertHistory(@Param("pageNum") Integer pageNum, @Param("size") Integer size,
+                                                  @Param("uid") Integer uid);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/InvoiceMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/InvoiceMapper.java
new file mode 100644
index 0000000..640a921
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/InvoiceMapper.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Invoice;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface InvoiceMapper extends BaseMapper<Invoice> {
+
+
+    /**
+     * 获取发票历史记录
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyInvoice(@Param("pageNum") Integer pageNum, @Param("size") Integer size,
+                                             @Param("uid") Integer uid);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java
new file mode 100644
index 0000000..2e55025
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 登录记录 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface LoginLogMapper extends BaseMapper<LoginLog> {
+
+    /**
+     * 获取登录日志
+     */
+    List<Map<String, Object>> getLoginLogs(@Param("page") Page<LoginLog> page, @Param("beginTime") String beginTime,
+                                           @Param("endTime") String endTime, @Param("logName") String logName, @Param("orderByField") String orderByField, @Param("isAsc") boolean isAsc);
+
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java
new file mode 100644
index 0000000..ea0232d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java
@@ -0,0 +1,80 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.core.node.MenuNode;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Menu;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+  * 菜单表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface MenuMapper extends BaseMapper<Menu> {
+
+    /**
+     * 根据条件查询菜单
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Map<String, Object>> selectMenus(@Param("condition") String condition, @Param("level") String level);
+
+    /**
+     * 根据条件查询菜单
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Long> getMenuIdsByRoleId(@Param("roleId") Integer roleId);
+
+    /**
+     * 获取菜单列表树
+     *
+     * @return
+     * @date 2017年2月19日 下午1:33:51
+     */
+    List<ZTreeNode> menuTreeList();
+
+    /**
+     * 获取菜单列表树
+     *
+     * @return
+     * @date 2017年2月19日 下午1:33:51
+     */
+    List<ZTreeNode> menuTreeListByMenuIds(List<Long> menuIds);
+
+    /**
+     * 删除menu关联的relation
+     *
+     * @param menuId
+     * @return
+     * @date 2017年2月19日 下午4:10:59
+     */
+    int deleteRelationByMenu(Long menuId);
+
+    /**
+     * 获取资源url通过角色id
+     *
+     * @param roleId
+     * @return
+     * @date 2017年2月19日 下午7:12:38
+     */
+    List<String> getResUrlsByRoleId(Integer roleId);
+
+    /**
+     * 根据角色获取菜单
+     *
+     * @param roleIds
+     * @return
+     * @date 2017年2月19日 下午10:35:40
+     */
+    List<MenuNode> getMenusByRoleIds(List<Integer> roleIds);
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java
new file mode 100644
index 0000000..5638129
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java
@@ -0,0 +1,25 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Notice;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 通知表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface NoticeMapper extends BaseMapper<Notice> {
+
+    /**
+     * 获取通知列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String condition);
+
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OpenCityBusinessMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OpenCityBusinessMapper.java
new file mode 100644
index 0000000..c982df7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OpenCityBusinessMapper.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.OpenCityBusiness;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface OpenCityBusinessMapper extends BaseMapper<OpenCityBusiness> {
+
+
+    /**
+     * 获取业务类型
+     * @param province  省名称
+     * @param city      市名称
+     * @param district  区县名称
+     * @return
+     */
+    List<OpenCityBusiness> queryBusiness(@Param("province") String province, @Param("city") String city,
+                                         @Param("district") String district);
+
+
+    /**
+     * 根据开通城市id获取业务类型
+     * @param id
+     * @return
+     */
+    List<OpenCityBusiness> queryBusinessById(@Param("id") Integer id);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OpenCityMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OpenCityMapper.java
new file mode 100644
index 0000000..1286955
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OpenCityMapper.java
@@ -0,0 +1,25 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.OpenCity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface OpenCityMapper extends BaseMapper<OpenCity> {
+
+
+    /**
+     * 获取开通城市列表(有效的)
+     * @return
+     */
+    List<OpenCity> queryOpenCity();
+
+
+    /**
+     * 获取开通城市
+     * @param code
+     * @return
+     */
+    List<OpenCity> queryByCode(@Param("code") String code);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java
new file mode 100644
index 0000000..eaf5760
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 操作日志 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface OperationLogMapper extends BaseMapper<OperationLog> {
+
+    /**
+     * 获取操作日志
+     */
+    List<Map<String, Object>> getOperationLogs(@Param("page") Page<OperationLog> page, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("logName") String logName, @Param("logType") String logType, @Param("orderByField") String orderByField, @Param("isAsc") boolean isAsc);
+
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java
new file mode 100644
index 0000000..acdcc4e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.OrderCancel;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface OrderCancelMapper extends BaseMapper<OrderCancel> {
+
+
+    /**
+     * 获取数据
+     * @param orderId
+     * @param orderType
+     * @param money
+     * @param payType
+     * @param state
+     * @return
+     */
+    OrderCancel query(@Param("orderId") Integer orderId, @Param("orderType") Integer orderType,
+                      @Param("money") Double money, @Param("payType") Integer payType,
+                      @Param("state") Integer state);
+
+
+    /**
+     * 获取用户取消记录
+     * @param uid
+     * @param isPay 1=不需要支付,2=需要支付
+     * @return
+     */
+    List<Map<String, Object>> queryCancel(@Param("uid") Integer uid, @Param("isPay") Integer isPay);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderEvaluateMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderEvaluateMapper.java
new file mode 100644
index 0000000..14325e4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderEvaluateMapper.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.OrderEvaluate;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface OrderEvaluateMapper extends BaseMapper<OrderEvaluate> {
+
+
+    /**
+     * 获取历史评价数据
+     * @param driverId
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryOrderEvaluate(@Param("driverId") Integer driverId, @Param("pageNum") Integer pageNum,
+                                                 @Param("size") Integer size);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderFrequentPassengersMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderFrequentPassengersMapper.java
new file mode 100644
index 0000000..53eef29
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderFrequentPassengersMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.OrderFrequentPassengers;
+
+public interface OrderFrequentPassengersMapper extends BaseMapper<OrderFrequentPassengers> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPositionMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPositionMapper.java
new file mode 100644
index 0000000..aa40295
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPositionMapper.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.OrderPosition;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface OrderPositionMapper extends BaseMapper<OrderPosition> {
+
+
+    /**
+     * 获取轨迹数据
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    List<Map<String, Object>> queryTrack(@Param("orderId") Integer orderId, @Param("orderType") Integer orderType);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PhoneMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PhoneMapper.java
new file mode 100644
index 0000000..eda261d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PhoneMapper.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Phone;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface PhoneMapper extends BaseMapper<Phone> {
+
+
+    /**
+     * 根据行政区域获取设置的电话
+     * @param code
+     * @return
+     */
+    List<Phone> queryPhones(@Param("province") String province, @Param("city") String city, @Param("code") String code);
+
+
+    /**
+     * 获取电话数据
+     * @param type
+     * @param platform
+     * @param code
+     * @return
+     */
+    Phone query(@Param("type") Integer type, @Param("platform") Integer platform,
+                @Param("province") String province, @Param("city") String city,
+                @Param("code") String code);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ProblemMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ProblemMapper.java
new file mode 100644
index 0000000..30965fd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ProblemMapper.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Problem;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ProblemMapper extends BaseMapper<Problem> {
+
+
+    /**
+     * 获取提交的留言
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryProblems(@Param("pageNum") Integer pageNum, @Param("size") Integer size,
+                                            @Param("uid") Integer uid);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PushOrderMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PushOrderMapper.java
new file mode 100644
index 0000000..58c8fe0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PushOrderMapper.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.PushOrder;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface PushOrderMapper extends BaseMapper<PushOrder> {
+
+
+    /**
+     * 获取推送配置
+     * @param type
+     * @param pushType
+     * @return
+     */
+    List<PushOrder> querys(@Param("type") Integer type, @Param("pushType") Integer pushType,
+                           @Param("companyId") Integer companyId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RedPacketRecordMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RedPacketRecordMapper.java
new file mode 100644
index 0000000..7b966cb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RedPacketRecordMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.RedPacketRecord;
+import org.apache.ibatis.annotations.Param;
+
+public interface RedPacketRecordMapper extends BaseMapper<RedPacketRecord> {
+
+
+    /**
+     * 根据企业id获取红包数据
+     * @param companyId
+     * @return
+     */
+    RedPacketRecord queryDate(@Param("companyId") Integer companyId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java
new file mode 100644
index 0000000..01eedcd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Region;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface RegionMapper extends BaseMapper<Region> {
+
+
+
+    Region query(@Param("code") String code);
+
+
+    List<Region> querys(@Param("parentId") Integer parentId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java
new file mode 100644
index 0000000..828a596
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Relation;
+
+/**
+ * <p>
+  * 角色和菜单关联表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface RelationMapper extends BaseMapper<Relation> {
+
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java
new file mode 100644
index 0000000..d95d87f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java
@@ -0,0 +1,53 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Role;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+  * 角色表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface RoleMapper extends BaseMapper<Role> {
+
+    /**
+     * 根据条件查询角色列表
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Map<String, Object>> selectRoles(@Param("condition") String condition);
+
+    /**
+     * 删除某个角色的所有权限
+     *
+     * @param roleId 角色id
+     * @return
+     * @date 2017年2月13日 下午7:57:51
+     */
+    int deleteRolesById(@Param("roleId") Integer roleId);
+
+    /**
+     * 获取角色列表树
+     *
+     * @return
+     * @date 2017年2月18日 上午10:32:04
+     */
+    List<ZTreeNode> roleTreeList();
+
+    /**
+     * 获取角色列表树
+     *
+     * @return
+     * @date 2017年2月18日 上午10:32:04
+     */
+    List<ZTreeNode> roleTreeListByRoleId(String[] roleId);
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SensitiveWordsMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SensitiveWordsMapper.java
new file mode 100644
index 0000000..1f67288
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SensitiveWordsMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.SensitiveWords;
+
+public interface SensitiveWordsMapper extends BaseMapper<SensitiveWords> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ServerCarModelMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ServerCarModelMapper.java
new file mode 100644
index 0000000..351f1a9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ServerCarModelMapper.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.ServerCarModel;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ServerCarModelMapper extends BaseMapper<ServerCarModel> {
+
+
+    /**
+     * 获取业务对应的所有有效服务车型
+     * @param type
+     * @return
+     */
+    List<Map<String, Object>> queryServerCarModel(@Param("type") Integer type);
+
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SmsrecordMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SmsrecordMapper.java
new file mode 100644
index 0000000..3f6b057
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SmsrecordMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Smsrecord;
+
+public interface SmsrecordMapper extends BaseMapper<Smsrecord> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponRecordMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponRecordMapper.java
new file mode 100644
index 0000000..ec91830
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponRecordMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.SysCouponRecord;
+
+/**
+ * <p>
+ * 系统设置-优惠券记录 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-15
+ */
+public interface SysCouponRecordMapper extends BaseMapper<SysCouponRecord> {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysIntegralMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysIntegralMapper.java
new file mode 100644
index 0000000..848238a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysIntegralMapper.java
@@ -0,0 +1,10 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.SysIntegral;
+import org.apache.ibatis.annotations.Param;
+
+public interface SysIntegralMapper extends BaseMapper<SysIntegral> {
+
+    SysIntegral query(@Param("companyId") Integer companyId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysReformistMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysReformistMapper.java
new file mode 100644
index 0000000..0d648ce
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysReformistMapper.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.SysReformist;
+import org.apache.ibatis.annotations.Param;
+
+public interface SysReformistMapper extends BaseMapper<SysReformist> {
+
+
+    /**
+     * 获取改派金额
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    Double queryMoney(@Param("companyId") Integer companyId) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemNoticeMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemNoticeMapper.java
new file mode 100644
index 0000000..87eeb73
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemNoticeMapper.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.SystemNotice;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface SystemNoticeMapper extends BaseMapper<SystemNotice> {
+
+
+    /**
+     * 获取未阅读数量
+     * @param uid
+     * @return
+     */
+    Integer queryNoReadNoticeNum(@Param("uid") Integer uid);
+
+
+    /**
+     * 获取消息列表
+     * @param type
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryList(@Param("type") Integer type, @Param("pageNum") Integer pageNum,
+                                        @Param("size") Integer size, @Param("uid") Integer uid);
+
+
+    /**
+     * 阅读操作
+     * @param id
+     * @param uid
+     */
+    void readSystemNotice(@Param("id") Integer id, @Param("uid") Integer uid);
+
+
+    /**
+     * 删除数据
+     * @param id
+     * @param uid
+     */
+    void delSystemNotice(@Param("id") Integer id, @Param("uid") Integer uid);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemPriceMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemPriceMapper.java
new file mode 100644
index 0000000..ef37769
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemPriceMapper.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.SystemPrice;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
+
+public interface SystemPriceMapper extends BaseMapper<SystemPrice> {
+
+
+    /**
+     * 获取价格
+     * @param companyId
+     * @param type
+     * @return
+     */
+    Map<String, Object> query(@Param("companyId") Integer companyId, @Param("type") Integer type,
+                              @Param("serverCarModelId") Integer serverCarModelId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TActivityGeneralizationMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TActivityGeneralizationMapper.java
new file mode 100644
index 0000000..6ccc602
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TActivityGeneralizationMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.TActivityGeneralization;
+
+/**
+ * <p>
+ * 推广活动 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TActivityGeneralizationMapper extends BaseMapper<TActivityGeneralization> {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TNoticesMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TNoticesMapper.java
new file mode 100644
index 0000000..32365a9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TNoticesMapper.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.TNotices;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface TNoticesMapper extends BaseMapper<TNotices> {
+
+
+    /**
+     * 获取公告列表
+     * @param type
+     * @return
+     */
+    List<TNotices> queryNotices(@Param("type") Integer type);
+
+
+    /**
+     * 获取用户的公告数据
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryList(@Param("pageNum") Integer pageNum, @Param("size") Integer size,
+                                        @Param("uid") Integer uid);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCitySiteMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCitySiteMapper.java
new file mode 100644
index 0000000..901a74e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCitySiteMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.TOpenCitySite;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 开通城市表 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@Mapper
+public interface TOpenCitySiteMapper extends BaseMapper<TOpenCitySite> {
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityBalanceMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityBalanceMapper.java
new file mode 100644
index 0000000..d16d268
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityBalanceMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.UserActivityBalance;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface UserActivityBalanceMapper extends BaseMapper<UserActivityBalance> {
+
+
+    /**
+     * 获取满足条件的活动
+     * @param companyId
+     * @return
+     */
+    List<Map<String, Object>> query(@Param("money") Double money, @Param("companyId") Integer companyId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount1Mapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount1Mapper.java
new file mode 100644
index 0000000..91dbaf6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount1Mapper.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.UserActivityDiscount1;
+import org.apache.ibatis.annotations.Param;
+
+public interface UserActivityDiscount1Mapper extends BaseMapper<UserActivityDiscount1> {
+
+
+    UserActivityDiscount1 query(@Param("companyId") Integer companyId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityInviteMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityInviteMapper.java
new file mode 100644
index 0000000..04d23cb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityInviteMapper.java
@@ -0,0 +1,14 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.UserActivityInvite;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface UserActivityInviteMapper extends BaseMapper<UserActivityInvite> {
+
+
+    List<Map<String, Object>> query(@Param("companyId") Integer companyId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRedenvelopeMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRedenvelopeMapper.java
new file mode 100644
index 0000000..4c2e118
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRedenvelopeMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.UserActivityRedenvelope;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.Map;
+
+public interface UserActivityRedenvelopeMapper extends BaseMapper<UserActivityRedenvelope> {
+
+
+    /**
+     * 获取红包活动
+     * @param companyId
+     * @return
+     */
+    Map<String, Object> query(@Param("companyId") Integer companyId, @Param("travelTime") Date travelTime);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRegisteredMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRegisteredMapper.java
new file mode 100644
index 0000000..4b973fe
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRegisteredMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.UserActivityRegistered;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface UserActivityRegisteredMapper extends BaseMapper<UserActivityRegistered> {
+
+
+    /**
+     * 获取当前有效的注册活动
+     * @param companyId
+     * @return
+     */
+    List<Map<String, Object>> query(@Param("companyId") Integer companyId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserCouponRecordMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserCouponRecordMapper.java
new file mode 100644
index 0000000..675c7bb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserCouponRecordMapper.java
@@ -0,0 +1,55 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.UserCouponRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface UserCouponRecordMapper extends BaseMapper<UserCouponRecord> {
+
+
+    /**
+     * 获取可用优惠券数量
+     * @param uid
+     * @param companyId
+     * @param state
+     * @param couponUseType
+     * @return
+     */
+    int queryAvailable(@Param("uid") Integer uid, @Param("companyId") Integer companyId,
+                       @Param("state") Integer state, @Param("couponUseType") Integer couponUseType,
+                       @Param("money") Double money);
+
+
+    /**
+     * 获取优惠券列表
+     * @param uid
+     * @param companyId
+     * @param state
+     * @param couponUseType
+     * @return
+     */
+    List<Map<String, Object>> queryCoupon(@Param("uid") Integer uid, @Param("companyId") Integer companyId,
+                                          @Param("state") Integer state, @Param("couponUseType") Integer couponUseType,
+                                          @Param("money") Double money, @Param("pageNum") Integer pageNum,
+                                          @Param("size") Integer size);
+
+    /**
+     * 获取优惠券列表
+     * @param state
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyCoupons(@Param("state") Integer state, @Param("pageNum") Integer pageNum,
+                                             @Param("size") Integer size, @Param("uid") Integer uid);
+
+
+    /**
+     * 修改过期状态
+     */
+    void updateTimeOut();
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java
new file mode 100644
index 0000000..9738a84
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java
@@ -0,0 +1,55 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
+
+public interface UserInfoMapper extends BaseMapper<UserInfo> {
+
+
+    /**
+     * 电话号查询用户
+     * @param phone
+     * @return
+     */
+    UserInfo queryByPhone(@Param("phone") String phone);
+
+
+    /**
+     * 根据微信openid获取用户
+     * @param openid
+     * @param unionid
+     * @return
+     */
+    UserInfo queryByOpenid(@Param("openid") String openid);
+
+    UserInfo queryByOpenid2(@Param("openid") String openid);
+
+
+    /**
+     * 获取用户详情
+     * @param uid
+     * @return
+     */
+    Map<String, Object> queryUserInfo(@Param("uid") Integer uid, @Param("phone") String phone);
+
+
+    /**
+     * 设置紧急联系人
+     * @param name
+     * @param phone
+     * @param uid
+     */
+    void setUrgentUser(@Param("name") String name, @Param("phone") String phone,
+                       @Param("uid") Integer uid);
+
+
+    /**
+     * 获取实名认证数据
+     * @param uid
+     * @return
+     */
+    Map<String, Object> queryRealName(@Param("uid") Integer uid);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java
new file mode 100644
index 0000000..c15c8fc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java
@@ -0,0 +1,45 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.core.datascope.DataScope;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 管理员表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface UserMapper extends BaseMapper<User> {
+
+    /**
+     * 修改用户状态
+     */
+    int setStatus(@Param("userId") Integer userId, @Param("status") int status);
+
+    /**
+     * 修改密码
+     */
+    int changePwd(@Param("userId") Integer userId, @Param("pwd") String pwd);
+
+    /**
+     * 根据条件查询用户列表
+     */
+    List<Map<String, Object>> selectUsers(@Param("dataScope") DataScope dataScope, @Param("name") String name, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("deptid") Integer deptid);
+
+    /**
+     * 设置用户的角色
+     */
+    int setRoles(@Param("userId") Integer userId, @Param("roleIds") String roleIds);
+
+    /**
+     * 通过账号获取用户
+     */
+    User getByAccount(@Param("account") String account);
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserRedPacketRecordMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserRedPacketRecordMapper.java
new file mode 100644
index 0000000..6e6b030
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserRedPacketRecordMapper.java
@@ -0,0 +1,42 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.UserRedPacketRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface UserRedPacketRecordMapper extends BaseMapper<UserRedPacketRecord> {
+
+
+    /**
+     * 获取不大于money值的红包数据
+     * @param uid
+     * @param companyId
+     * @param state
+     * @param orderType
+     * @param money
+     * @return
+     */
+    UserRedPacketRecord query(@Param("uid") Integer uid, @Param("companyId") Integer companyId,
+                              @Param("state") Integer state, @Param("orderType") Integer orderType,
+                              @Param("money") Double money);
+
+
+
+    UserRedPacketRecord query_(@Param("uid") Integer uid, @Param("companyId") Integer companyId,
+                              @Param("state") Integer state, @Param("orderType") Integer orderType,
+                              @Param("money") Double money);
+
+
+    /**
+     * 获取红包列表
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyRedEnvelope(@Param("pageNum") Integer pageNum, @Param("size") Integer size,
+                                                 @Param("uid") Integer uid);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VerifiedMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VerifiedMapper.java
new file mode 100644
index 0000000..584e0b2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VerifiedMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Verified;
+
+public interface VerifiedMapper extends BaseMapper<Verified> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VersionManagementMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VersionManagementMapper.java
new file mode 100644
index 0000000..89b007a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VersionManagementMapper.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.VersionManagement;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
+
+public interface VersionManagementMapper extends BaseMapper<VersionManagement> {
+
+
+    /**
+     * 获取最新版本
+     * @return
+     */
+    Map<String, Object> queryNewVersion(@Param("type") Integer type);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/WithdrawalMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/WithdrawalMapper.java
new file mode 100644
index 0000000..aa3f7ac
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/WithdrawalMapper.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Withdrawal;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WithdrawalMapper extends BaseMapper<Withdrawal> {
+
+
+    /**
+     * 获取历史提交数据
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryWithdrawal(@Param("uid") Integer uid, @Param("userType") Integer userType,
+                                              @Param("pageNum") Integer pageNum, @Param("size") Integer size);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/AdvertisementMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/AdvertisementMapper.xml
new file mode 100644
index 0000000..1a661ff
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/AdvertisementMapper.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.AdvertisementMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Advertisement">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="imgUrl" property="imgUrl"/>
+        <result column="type" property="type"/>
+        <result column="isJump" property="isJump"/>
+        <result column="jumpType" property="jumpType"/>
+        <result column="jumpUrl" property="jumpUrl"/>
+        <result column="content" property="content"/>
+        <result column="state" property="state"/>
+        <result column="provinceId" property="provinceId"/>
+
+        <result column="flag" property="flag"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="insertUser" property="insertUser"/>
+        <result column="updateTime" property="updateTime"/>
+        <result column="updateUser" property="updateUser"/>
+    </resultMap>
+
+
+    <select id="queryAdvertisement" resultType="com.stylefeng.guns.modular.system.warpper.AdvertisementWarpper">
+        select
+        id as id,
+        name as name,
+        imgUrl as imgUrl,
+        type as type,
+        isJump as isJump,
+        jumpType as jumpType,
+        jumpUrl as jumpUrl,
+        content as content,
+        state as state,
+        provinceId as provinceId
+        from t_advertisement where flag != 3 and state = 1 and provinceId in (select id from t_region where code = #{code})
+        <if test="null != type">
+          and `type` = #{type}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/AgreementMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/AgreementMapper.xml
new file mode 100644
index 0000000..dc077e8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/AgreementMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.AgreementMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Agreement">
+        <id column="id" property="id"/>
+        <result column="useType" property="useType"/>
+        <result column="content" property="content"/>
+        <result column="type" property="type"/>
+
+        <result column="flag" property="flag"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="insertUser" property="insertUser"/>
+        <result column="updateTime" property="updateTime"/>
+        <result column="updateUser" property="updateUser"/>
+    </resultMap>
+
+
+
+    <select id="queryByType" resultType="java.lang.String">
+        select content from t_agreement where `type` = #{type} and flag != 3
+        <if test="null != useType">
+            and useType = #{useType}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CancleOrderMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CancleOrderMapper.xml
new file mode 100644
index 0000000..5c55a67
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CancleOrderMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.CancleOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.CancleOrder">
+        <id column="id" property="id"/>
+        <result column="companyId" property="companyId"/>
+        <result column="minuteNum" property="minuteNum"/>
+        <result column="money" property="money"/>
+        <result column="type" property="type"/>
+        <result column="orderType" property="orderType"/>
+    </resultMap>
+
+
+    <select id="query" resultType="CancleOrder">
+        select
+        id as id,
+        companyId as companyId,
+        minuteNum as minuteNum,
+        money as money,
+        `type` as `type`,
+        orderType as orderType
+        from t_sys_cancle_order where `type` = #{type} and orderType = #{orderType} and companyId = #{companyId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml
new file mode 100644
index 0000000..858805f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.CarMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Car">
+        <id column="id" property="id"/>
+        <result column="isPlatCar" property="isPlatCar"/>
+        <result column="companyId" property="companyId"/>
+        <result column="franchiseeId" property="franchiseeId"/>
+        <result column="carColor" property="carColor"/>
+        <result column="carModelId" property="carModelId"/>
+        <result column="carBrandId" property="carBrandId"/>
+        <result column="carLicensePlate" property="carLicensePlate"/>
+        <result column="carPhoto" property="carPhoto"/>
+        <result column="drivingLicenseNumber" property="drivingLicenseNumber"/>
+        <result column="drivingLicensePhoto" property="drivingLicensePhoto"/>
+        <result column="annualInspectionTime" property="annualInspectionTime"/>
+        <result column="insurancePhoto" property="insurancePhoto" />
+        <result column="commercialInsuranceTime" property="commercialInsuranceTime"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="state" property="state"/>
+        <result column="addType" property="addType"/>
+        <result column="addObjectId" property="addObjectId"/>
+    </resultMap>
+
+
+
+    <select id="queryIdleData" resultType="map">
+        select
+        a.id as id,
+        CONCAT(a.carLicensePlate, '-',c.`name`, b.`name`, ' ', a.carColor) as name
+        from t_car a
+        left join t_car_model b on (a.carModelId = b.id)
+        left join t_car_brand c on (b.brandId = c.id)
+        where a.state = 1
+        <choose>
+            <when test="companyId != 1">
+                and  a.companyId = #{companyId} or a.franchiseeId = #{companyId}
+            </when>
+            <otherwise>
+                and a.isPlatCar = 1
+            </otherwise>
+
+        </choose>
+    </select>
+
+
+    <select id="query" resultType="com.stylefeng.guns.modular.system.model.Car">
+        select
+        id as id,
+        isPlatCar as isPlatCar,
+        companyId as companyId,
+        franchiseeId as franchiseeId,
+        carColor as carColor,
+        carModelId as carModelId,
+        carBrandId as carBrandId,
+        carLicensePlate as carLicensePlate,
+        carPhoto as carPhoto,
+        drivingLicenseNumber as drivingLicenseNumber,
+        drivingLicensePhoto as drivingLicensePhoto,
+        annualInspectionTime as annualInspectionTime,
+        insurancePhoto as insurancePhoto,
+        commercialInsuranceTime as commercialInsuranceTime,
+        insertTime as insertTime,
+        state as state,
+        addType as addType,
+        addObjectId as addObjectId
+        from t_car where state = 1 and carLicensePlate = #{licensePlate}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarServiceMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarServiceMapper.xml
new file mode 100644
index 0000000..919a8b2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarServiceMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.CarServiceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.CarService">
+        <id column="id" property="id"/>
+        <result column="carId" property="carId"/>
+        <result column="type" property="type"/>
+        <result column="serverCarModelId" property="serverCarModelId"/>
+    </resultMap>
+
+
+    <select id="query" resultType="CarService">
+        select
+        id as id,
+        carId as carId,
+        `type` as `type`,
+        serverCarModelId as serverCarModelId
+        from t_car_service where `type` = #{type} and carId = #{carId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CompanyCityMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CompanyCityMapper.xml
new file mode 100644
index 0000000..2dba5b5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CompanyCityMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.CompanyCityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.CompanyCity">
+        <id column="id" property="id"/>
+        <result column="companyId" property="companyId"/>
+        <result column="provinceCode" property="provinceCode"/>
+        <result column="cityCode" property="cityCode"/>
+        <result column="areaCode" property="areaCode"/>
+        <result column="state" property="state"/>
+    </resultMap>
+
+    <select id="query" resultType="CompanyCity">
+        select
+        id as id,
+        companyId as companyId,
+        provinceCode as provinceCode,
+        cityCode as cityCode,
+        areaCode as areaCode,
+        state as state
+        from t_company_city where state = 1
+        <if test="null != province">
+            and provinceCode = #{province}
+        </if>
+        <if test="null != city">
+            and cityCode = #{city}
+        </if>
+        <if test="null != code">
+            and areaCode = #{code}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CompanyMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CompanyMapper.xml
new file mode 100644
index 0000000..9007d02
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CompanyMapper.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.CompanyMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Company">
+        <id column="id" property="id"/>
+        <result column="isSpe" property="isSpe"/>
+        <result column="isTaxi" property="isTaxi"/>
+        <result column="isCross" property="isCross"/>
+        <result column="isCrossLogistics" property="isCrossLogistics"/>
+        <result column="isSameLogistics" property="isSameLogistics"/>
+        <result column="isCharter" property="isCharter"/>
+        <result column="isSpeFixedOrProportional" property="isSpeFixedOrProportional"/>
+        <result column="isTaxiFixedOrProportional" property="isTaxiFixedOrProportional"/>
+        <result column="isCrossLogisticsFixedOrProportional" property="isCrossLogisticsFixedOrProportional"/>
+        <result column="isSameLogisticsFixedOrProportional" property="isSameLogisticsFixedOrProportional"/>
+        <result column="speMoney" property="speMoney"/>
+        <result column="taxiMoney" property="taxiMoney"/>
+        <result column="crossLogisticsMoney" property="crossLogisticsMoney"/>
+        <result column="sameLogisticsMoney" property="sameLogisticsMoney"/>
+        <result column="isNeedFerry" property="isNeedFerry"/>
+        <result column="name" property="name"/>
+        <result column="type" property="type"/>
+        <result column="superiorId" property="superiorId"/>
+        <result column="principalName" property="principalName"/>
+        <result column="principalPhone" property="principalPhone"/>
+        <result column="adminName" property="adminName"/>
+        <result column="adminPhone" property="adminPhone"/>
+        <result column="urgentPhoen" property="urgentPhoen"/>
+        <result column="setupTime" property="setupTime"/>
+        <result column="identifier" property="identifier"/>
+        <result column="addressCode" property="addressCode"/>
+        <result column="businessScope" property="businessScope"/>
+        <result column="contactAddress" property="contactAddress"/>
+        <result column="documentAddress" property="documentAddress"/>
+        <result column="economicType" property="economicType"/>
+        <result column="regCapital" property="regCapital"/>
+        <result column="legalName" property="legalName"/>
+        <result column="legalId" property="legalId"/>
+        <result column="legalPhone" property="legalPhone"/>
+        <result column="legalPhotoUrl" property="legalPhotoUrl"/>
+        <result column="licensingAgency" property="licensingAgency"/>
+        <result column="licenseTime" property="licenseTime"/>
+        <result column="licenseStartTime" property="licenseStartTime"/>
+        <result column="licenseEndTime" property="licenseEndTime"/>
+        <result column="licenseNumber" property="licenseNumber"/>
+        <result column="carNum" property="carNum"/>
+        <result column="driverNum" property="driverNum"/>
+        <result column="mac" property="mac"/>
+        <result column="state" property="state"/>
+        <result column="flag" property="flag"/>
+        <result column="upload" property="upload"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+    <select id="query" resultType="Company">
+        select
+        id as id,
+        isSpe as isSpe,
+        isTaxi as isTaxi,
+        isCross as isCross,
+        isCrossLogistics as isCrossLogistics,
+        isSameLogistics as isSameLogistics,
+        isCharter as isCharter,
+        isSpeFixedOrProportional as isSpeFixedOrProportional,
+        isTaxiFixedOrProportional as isTaxiFixedOrProportional,
+        isCrossLogisticsFixedOrProportional as isCrossLogisticsFixedOrProportional,
+        isSameLogisticsFixedOrProportional as isSameLogisticsFixedOrProportional,
+        speMoney as speMoney,
+        taxiMoney as taxiMoney,
+        crossLogisticsMoney as crossLogisticsMoney,
+        sameLogisticsMoney as sameLogisticsMoney,
+        isNeedFerry as isNeedFerry,
+        name as name,
+        type as type,
+        superiorId as superiorId,
+        principalName as principalName,
+        principalPhone as principalPhone,
+        adminName as adminName,
+        adminPhone as adminPhone,
+        urgentPhoen as urgentPhoen,
+        setupTime as setupTime,
+        identifier as identifier,
+        addressCode as addressCode,
+        businessScope as businessScope,
+        contactAddress as contactAddress,
+        documentAddress as documentAddress,
+        economicType as economicType,
+        regCapital as regCapital,
+        legalName as legalName,
+        legalId as legalId,
+        legalPhone as legalPhone,
+        legalPhotoUrl as legalPhotoUrl,
+        licensingAgency as licensingAgency,
+        licenseTime as licenseTime,
+        licenseStartTime as licenseStartTime,
+        licenseEndTime as licenseEndTime,
+        licenseNumber as licenseNumber,
+        carNum as carNum,
+        driverNum as driverNum,
+        mac as mac,
+        state as state,
+        flag as flag,
+        upload as upload,
+        insertTime as insertTime
+        from t_company where flag != 3 and state = 0 and id in (
+        select companyId from t_company_city where state = 1
+        <if test="null != province and null != city and null != code">
+            and provinceCode = #{province} and cityCode = #{city} and areaCode = #{code}
+        </if>
+        <if test="null != province and null != city and null == code">
+            and provinceCode = #{province} and cityCode = #{city} and (areaCode = '' or areaCode is null)
+        </if>
+        <if test="null != province and null == city and null == code">
+            and provinceCode = #{province} and (cityCode = '' or cityCode is null) and (areaCode = '' or areaCode is null)
+        </if>
+        )
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ComplaintMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ComplaintMapper.xml
new file mode 100644
index 0000000..bda2762
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ComplaintMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.ComplaintMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Complaint">
+        <id column="id" property="id"/>
+        <result column="userId" property="userId"/>
+        <result column="reason" property="reason"/>
+        <result column="driverId" property="driverId"/>
+        <result column="description" property="description"/>
+        <result column="isHandle" property="isHandle"/>
+        <result column="insert_time" property="insertTime"/>
+        <result column="handleResult" property="handleResult"/>
+        <result column="handleUserId" property="handleUserId"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml
new file mode 100644
index 0000000..c89d952
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DeptMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Dept">
+        <id column="id" property="id"/>
+        <result column="num" property="num"/>
+        <result column="pid" property="pid"/>
+        <result column="pids" property="pids"/>
+        <result column="simplename" property="simplename"/>
+        <result column="fullname" property="fullname"/>
+        <result column="tips" property="tips"/>
+        <result column="version" property="version"/>
+    </resultMap>
+
+    <select id="tree" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+		select id,pid as pId,simplename as name,
+		(
+		CASE
+		WHEN (pId = 0 OR pId IS NULL) THEN
+		'true'
+		ELSE
+		'false'
+		END
+		) as isOpen from sys_dept
+	</select>
+
+    <select id="list" resultType="map">
+        select * from sys_dept
+        <if test="condition != null and condition != ''">
+            where simplename like CONCAT('%',#{condition},'%') or fullname like CONCAT('%',#{condition},'%')
+        </if>
+        order by num ASC
+    </select>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml
new file mode 100644
index 0000000..54742bd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DictMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Dict">
+        <id column="id" property="id"/>
+        <result column="num" property="num"/>
+        <result column="pid" property="pid"/>
+        <result column="name" property="name"/>
+        <result column="code" property="code"/>
+        <result column="tips" property="tips"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+		id, num, pid, name,code,tips
+	</sql>
+
+    <select id="selectByCode" resultType="dict">
+        select
+        <include refid="Base_Column_List"/>
+        from sys_dict
+        where code = #{code}
+    </select>
+
+    <select id="selectByParentCode" resultType="dict">
+        select
+        <include refid="Base_Column_List"/>
+        from sys_dict
+        where pid in(select id  from sys_dict where code = #{code}) order by num asc
+    </select>
+
+    <select id="list" resultType="map">
+        select * from sys_dict
+        where pid = 0
+        <if test="condition != null and condition != ''">
+            AND name like CONCAT('%',#{condition},'%')
+        </if>
+        order by id ASC
+    </select>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityHistoryMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityHistoryMapper.xml
new file mode 100644
index 0000000..3e7c904
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityHistoryMapper.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverActivityHistoryMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverActivityHistory">
+        <id column="id" property="id"/>
+        <result column="day" property="day"/>
+        <result column="driverId" property="driverId"/>
+        <result column="type" property="type"/>
+        <result column="activityId" property="activityId"/>
+        <result column="carryOut" property="carryOut"/>
+        <result column="money" property="money"/>
+        <result column="collectionTime" property="collectionTime"/>
+        <result column="insertTime" property="insertTime"/>
+
+    </resultMap>
+
+
+
+    <select id="query" resultType="map">
+        select * from
+        (
+            select
+            DATE_FORMAT(`day`, '%Y.%m.%d') as time,
+            if((select count(id) from t_driver_activity_history where driverId = #{driverId}) > (select count(id) from t_driver_activity_history where driverId = #{driverId} and carryOut = 2), 1, 2) as carryOut
+            from t_driver_activity_history where driverId = #{driverId} group by `day`
+        ) as a order by a.time desc limit #{pageNum}, #{size}
+    </select>
+
+    <select id="queryList" resultType="DriverActivityHistory">
+        select
+        id as id,
+        `day` as `day`,
+        driverId as driverId,
+        `type` as `type`,
+        activityId as activityId,
+        carryOut as carryOut,
+        money as money,
+        collectionTime as collectionTime,
+        insertTime as insertTime
+        from t_driver_activity_history where `day` between #{start} and #{end}
+        <if test="null != type">
+            and `type` = #{type}
+        </if>
+        <if test="null != carryOut">
+            and carryOut = #{carryOut}
+        </if>
+        <if test="null != driverId">
+            and driverId = #{driverId}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityRegisteredMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityRegisteredMapper.xml
new file mode 100644
index 0000000..4ad136c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityRegisteredMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverActivityRegisteredMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverActivityRegistered">
+        <id column="id" property="id"/>
+        <result column="companyId" property="companyId"/>
+        <result column="driverActivityId" property="driverActivityId"/>
+        <result column="type" property="type"/>
+        <result column="money" property="money"/>
+        <result column="startTime" property="startTime"/>
+        <result column="endTime" property="endTime"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+
+    <select id="query" resultType="map">
+        select
+        a.id as id,
+        CONCAT('邀请', if(a.`type` = 1, '司机', '用户'), '注册奖励', a.money, '元') as content,
+        a.money as money
+        from t_driver_activity_registered a
+        left join t_driver_activity b on (a.driverActivityId = b.id)
+        where now() between a.startTime and a.endTime and a.companyId = #{companyId} and a.`type` = #{type} and b.status = 3
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml
new file mode 100644
index 0000000..d9e6a0c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml
@@ -0,0 +1,335 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Driver">
+        <id column="id" property="id" />
+        <result column="account" property="account" />
+        <result column="jobNumber" property="jobNumber" />
+        <result column="phone" property="phone" />
+        <result column="password" property="password" />
+        <result column="name" property="name" />
+        <result column="sex" property="sex" />
+        <result column="idCard" property="idCard" />
+        <result column="companyId" property="companyId" />
+        <result column="franchiseeId" property="franchiseeId" />
+        <result column="headImgUrl" property="headImgUrl" />
+        <result column="faceImgUrl" property="faceImgUrl" />
+        <result column="idCardImgUrl1" property="idCardImgUrl1" />
+        <result column="idCardImgUrl2" property="idCardImgUrl2" />
+        <result column="placeOfEmployment" property="placeOfEmployment" />
+        <result column="birthday" property="birthday" />
+        <result column="bankCardNumber" property="bankCardNumber" />
+        <result column="driverNationality" property="driverNationality" />
+        <result column="driverNation" property="driverNation" />
+        <result column="driverMaritalStatus" property="driverMaritalStatus" />
+        <result column="driverLanguageLevel" property="driverLanguageLevel" />
+        <result column="driverEducation" property="driverEducation" />
+        <result column="driverCensus" property="driverCensus" />
+        <result column="driverAddress" property="driverAddress" />
+        <result column="driverContactAddress" property="driverContactAddress" />
+        <result column="driverAge" property="driverAge" />
+        <result column="driveCard" property="driveCard" />
+        <result column="driveCardImgUrl" property="driveCardImgUrl" />
+        <result column="driverType" property="driverType" />
+        <result column="getDriverLicenseDate" property="getDriverLicenseDate" />
+        <result column="driverLicenseOn" property="driverLicenseOn" />
+        <result column="driverLicenseOff" property="driverLicenseOff" />
+        <result column="taxiDriver" property="taxiDriver" />
+        <result column="taxiAptitudeCard" property="taxiAptitudeCard" />
+        <result column="networkCarlssueImg" property="networkCarlssueImg"/>
+        <result column="networkCarlssueOrganization" property="networkCarlssueOrganization" />
+        <result column="networkCarlssueDate" property="networkCarlssueDate" />
+        <result column="getNetworkCarProofDate" property="getNetworkCarProofDate" />
+        <result column="networkCarProofOn" property="networkCarProofOn" />
+        <result column="networkCarProofOff" property="networkCarProofOff" />
+        <result column="registerDate" property="registerDate" />
+        <result column="fullTimeDriver" property="fullTimeDriver" />
+        <result column="inDriverBlacklist" property="inDriverBlacklist" />
+        <result column="commercialType" property="commercialType" />
+        <result column="contractCompany" property="contractCompany" />
+        <result column="contractOn" property="contractOn" />
+        <result column="contractOff" property="contractOff" />
+        <result column="emergencyContact" property="emergencyContact" />
+        <result column="emergencyContactPhone" property="emergencyContactPhone" />
+        <result column="emergencyContactAddress" property="emergencyContactAddress" />
+        <result column="remark" property="remark" />
+        <result column="isPlatCar" property="isPlatCar" />
+        <result column="carId" property="carId" />
+        <result column="authState" property="authState" />
+        <result column="state" property="state" />
+        <result column="addType" property="addType" />
+        <result column="balance" property="balance" />
+        <result column="activityMoney" property="activityMoney" />
+        <result column="laveActivityMoney" property="laveActivityMoney" />
+        <result column="businessMoney" property="businessMoney" />
+        <result column="laveBusinessMoney" property="laveBusinessMoney" />
+        <result column="laveBusinessMoney" property="laveBusinessMoney" />
+        <result column="appletsOpenId" property="appletsOpenId"/>
+
+
+        <result column="flag" property="flag"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="insertUser" property="insertUser"/>
+        <result column="updateTime" property="updateTime"/>
+        <result column="updateUser" property="updateUser"/>
+    </resultMap>
+
+
+
+    <select id="queryIdleDriver" resultType="Driver">
+        select
+        id as id,
+        account as account,
+        jobNumber as jobNumber,
+        phone as phone,
+        password as password,
+        name as name,
+        sex as sex,
+        idCard as idCard,
+        companyId as companyId,
+        franchiseeId as franchiseeId,
+        headImgUrl as headImgUrl,
+        faceImgUrl as faceImgUrl,
+        idCardImgUrl1 as idCardImgUrl1,
+        idCardImgUrl2 as idCardImgUrl2,
+        placeOfEmployment as placeOfEmployment,
+        birthday as birthday,
+        bankCardNumber as bankCardNumber,
+        driverNationality as driverNationality,
+        driverNation as driverNation,
+        driverMaritalStatus as driverMaritalStatus,
+        driverLanguageLevel as driverLanguageLevel,
+        driverEducation as driverEducation,
+        driverCensus as driverCensus,
+        driverAddress as driverAddress,
+        driverContactAddress as driverContactAddress,
+        driverAge as driverAge,
+        driveCard as driveCard,
+        driveCardImgUrl as driveCardImgUrl,
+        driverType as driverType,
+        getDriverLicenseDate as getDriverLicenseDate,
+        driverLicenseOn as driverLicenseOn,
+        driverLicenseOff as driverLicenseOff,
+        taxiDriver as taxiDriver,
+        taxiAptitudeCard as taxiAptitudeCard,
+        networkCarlssueImg as networkCarlssueImg,
+        networkCarlssueOrganization as networkCarlssueOrganization,
+        networkCarlssueDate as networkCarlssueDate,
+        getNetworkCarProofDate as getNetworkCarProofDate,
+        networkCarProofOn as networkCarProofOn,
+        networkCarProofOff as networkCarProofOff,
+        registerDate as registerDate,
+        fullTimeDriver as fullTimeDriver,
+        inDriverBlacklist as inDriverBlacklist,
+        commercialType as commercialType,
+        contractCompany as contractCompany,
+        contractOn as contractOn,
+        contractOff as contractOff,
+        emergencyContact as emergencyContact,
+        emergencyContactPhone as emergencyContactPhone,
+        emergencyContactAddress as emergencyContactAddress,
+        remark as remark,
+        isPlatCar as isPlatCar,
+        carId as carId,
+        authState as authState,
+        state as state,
+        addType as addType,
+        balance as balance,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_driver
+        where flag != 3 and state = 2 and authState = 2
+        <if test="null != companyId">
+            <choose>
+                <when test="companyId != 1">
+                    and companyId = #{companyId} or franchiseeId = #{companyId}
+                </when>
+                <otherwise>
+                    and companyId is null or companyId = 0 or companyId = 1 or franchiseeId is null or franchiseeId = 0
+                </otherwise>
+            </choose>
+
+        </if>
+        and id in
+        (
+          select driverId from t_driver_work where startTime &lt; now() and state = 1 and `type` like CONCAT('%', #{type}, '%')
+        )
+        and id in (select driverId from t_driver_orders where `type` = #{type})
+    </select>
+
+
+
+
+    <select id="queryIdleDriver_" resultType="Driver">
+        select
+        id as id,
+        account as account,
+        jobNumber as jobNumber,
+        phone as phone,
+        password as password,
+        name as name,
+        sex as sex,
+        idCard as idCard,
+        companyId as companyId,
+        franchiseeId as franchiseeId,
+        headImgUrl as headImgUrl,
+        faceImgUrl as faceImgUrl,
+        idCardImgUrl1 as idCardImgUrl1,
+        idCardImgUrl2 as idCardImgUrl2,
+        placeOfEmployment as placeOfEmployment,
+        birthday as birthday,
+        bankCardNumber as bankCardNumber,
+        driverNationality as driverNationality,
+        driverNation as driverNation,
+        driverMaritalStatus as driverMaritalStatus,
+        driverLanguageLevel as driverLanguageLevel,
+        driverEducation as driverEducation,
+        driverCensus as driverCensus,
+        driverAddress as driverAddress,
+        driverContactAddress as driverContactAddress,
+        driverAge as driverAge,
+        driveCard as driveCard,
+        driveCardImgUrl as driveCardImgUrl,
+        driverType as driverType,
+        getDriverLicenseDate as getDriverLicenseDate,
+        driverLicenseOn as driverLicenseOn,
+        driverLicenseOff as driverLicenseOff,
+        taxiDriver as taxiDriver,
+        taxiAptitudeCard as taxiAptitudeCard,
+        networkCarlssueImg as networkCarlssueImg,
+        networkCarlssueOrganization as networkCarlssueOrganization,
+        networkCarlssueDate as networkCarlssueDate,
+        getNetworkCarProofDate as getNetworkCarProofDate,
+        networkCarProofOn as networkCarProofOn,
+        networkCarProofOff as networkCarProofOff,
+        registerDate as registerDate,
+        fullTimeDriver as fullTimeDriver,
+        inDriverBlacklist as inDriverBlacklist,
+        commercialType as commercialType,
+        contractCompany as contractCompany,
+        contractOn as contractOn,
+        contractOff as contractOff,
+        emergencyContact as emergencyContact,
+        emergencyContactPhone as emergencyContactPhone,
+        emergencyContactAddress as emergencyContactAddress,
+        remark as remark,
+        isPlatCar as isPlatCar,
+        carId as carId,
+        authState as authState,
+        state as state,
+        addType as addType,
+        balance as balance,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_driver
+        where flag != 3 and state = 2 and authState = 2 and failCount = 0
+        <if test="null != companyId">
+            <choose>
+                <when test="companyId != 1">
+                    and companyId = #{companyId} or franchiseeId = #{companyId}
+                </when>
+                <otherwise>
+                    and companyId is null or companyId = 0 or companyId = 1 or franchiseeId is null or franchiseeId = 0
+                </otherwise>
+            </choose>
+        </if>
+        and id in
+        (
+        select driverId from t_driver_work
+        where startTime &lt; now() and state = 1 and `type` like CONCAT('%', #{type}, '%')
+        )
+        and id in (select driverId from t_driver_orders where `type` = #{type})
+        and carId in (select carId from t_car_service where `type` = #{type}
+        <if test="null != serverCarModelId">
+            and serverCarModelId = #{serverCarModelId}
+        </if>
+        )
+    </select>
+
+
+
+    <select id="queryOrderDriver" resultType="map">
+        select
+        b.id as orderId,
+        b.state as state,
+        a.id as driverId,
+        a.`name` as `name`,
+        a.headImgUrl as avatar,
+        a.phone as phone,
+        c.carLicensePlate as carCode,
+        CONCAT(f.`name`, d.`name`,  '.', c.carColor) as carName,
+        (select sum(fraction) / count(id) from t_order_evaluate where driverId = a.id) as score,
+        (
+        (select count(id) from t_order_private_car where state in (7, 8, 9) and driverId = a.id) +
+        (select count(id) from t_order_taxi where state in (7, 8, 9) and driverId = a.id) +
+        (select count(id) from t_order_cross_city where state in (6, 8, 9) and driverId = a.id)
+        ) as num,
+        DATE_FORMAT(b.startServiceTime, '%m月%d日 %H:%i') as `time`,
+        b.startAddress as `start`,
+        b.endAddress as `end`
+        from t_driver a
+        <if test="orderType == 1">
+            left join t_order_private_car b on (a.id = b.driverId)
+        </if>
+        <if test="orderType == 2">
+            left join t_order_taxi b on (a.id = b.driverId)
+        </if>
+        <if test="orderType == 3">
+            left join t_order_cross_city b on (a.id = b.driverId)
+        </if>
+        <if test="orderType == 4">
+            left join t_order_tat_order_logisticsxi b on (a.id = b.driverId)
+        </if>
+        <if test="orderType == 5">
+            left join t_order_logistics b on (a.id = b.driverId)
+        </if>
+        <if test="orderType == 7">
+            left join t_order_transfer b on (a.id = b.driverId)
+        </if>
+        left join t_car c on (b.carId = c.id)
+        left join t_car_model d on (c.carModelId = d.id)
+        left join t_car_brand f on (d.brandId = f.id)
+        where b.id = #{orderId}
+    </select>
+
+
+
+    <select id="queryDriverInfo" resultType="map">
+        select
+        a.id as id,
+        a.headImgUrl as avatar,
+        a.`name` as `name`,
+        a.phone as phone,
+        a.idCard as idcode,
+        b.carLicensePlate as licensePlate,
+        b.carColor as carColor,
+        CONCAT(d.`name`, c.`name`) as brand,
+        if((select count(id) from t_driver_work where state = 1 and driverId = a.id) = 0, 1, if(
+        (
+        (select count(id) from t_order_private_car where state not in (6, 7, 8, 9, 10, 12) and driverId = a.id) +
+        (select count(id) from t_order_taxi where state not in (6, 7, 8, 9, 10, 12) and driverId = a.id) +
+        (select count(id) from t_order_cross_city where state not in (6, 7, 8, 9, 10, 12) and driverId = a.id) +
+        (select count(id) from t_order_transfer where state not in (6, 7, 8, 9, 10, 12) and driverId = a.id)
+            ) = 0, 2, 3)) as state,
+        (
+        (select count(id) from t_order_private_car where state in (7, 8, 9) and driverId = a.id) +
+        (select count(id) from t_order_taxi where state in (7, 8, 9) and driverId = a.id) +
+        (select count(id) from t_order_cross_city where state in (6, 8, 9) and driverId = a.id) +
+         (select count(id) from t_order_transfer where state in (7, 8, 9) and driverId = a.id)
+                ) as orderNum,
+        ((select sum(fraction) from t_order_evaluate where driverId = a.id) / (select count(id) from t_order_evaluate where driverId = a.id)) as fraction
+        from t_driver a
+        left join t_car b on (a.carId = b.id)
+        left join t_car_model c on (b.carModelId = c.id)
+        left join t_car_brand d on (c.brandId = d.id)
+        where a.id = #{id}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverOrdersMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverOrdersMapper.xml
new file mode 100644
index 0000000..6137000
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverOrdersMapper.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverOrdersMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverOrders">
+        <id column="id" property="id"/>
+        <result column="driverId" property="driverId"/>
+        <result column="type" property="type"/>
+    </resultMap>
+
+
+    <select id="query" resultType="DriverOrders">
+        select
+        id as id,
+        driverId as driverId,
+        `type` as `type`
+        from t_driver_orders where driverId = #{uid} and `type` = #{type}
+    </select>
+
+
+    <select id="queryOrders" resultType="int">
+        select `type` from t_driver_orders where driverId = #{uid}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverServiceMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverServiceMapper.xml
new file mode 100644
index 0000000..9995d25
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverServiceMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverServiceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverService">
+        <id column="id" property="id" />
+        <result column="driverId" property="driverId" />
+        <result column="type" property="type" />
+    </resultMap>
+
+
+    <select id="queryBusiness" resultType="DriverService">
+        select
+        id as id,
+        driverId as driverId,
+        `type` as `type`
+        from t_driver_service where driverId = #{uid}
+        <if test="null != type">
+            and `type` in
+            <foreach collection="type" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverWorkMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverWorkMapper.xml
new file mode 100644
index 0000000..ab998da
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverWorkMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverWorkMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverWork">
+        <id column="id" property="id" />
+        <result column="driverId" property="driverId" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="type" property="type" />
+        <result column="state" property="state" />
+    </resultMap>
+    <select id="queryNewWork" resultType="com.stylefeng.guns.modular.system.model.DriverWork">
+        select
+        id as id,
+        driverId as driverId,
+        startTime as startTime,
+        endTime as endTime,
+        `type` as `type`,
+        state as state
+        from t_driver_work where 1 = 1
+        <if test="null != driverId">
+            and driverId = #{driverId}
+        </if>
+        <if test="null != type">
+            and type like CONCAT('%', #{type}, '%')
+        </if>
+        <if test="null != state">
+            and state = #{state}
+        </if>
+        order by startTime desc limit 0,1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ExpenseMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ExpenseMapper.xml
new file mode 100644
index 0000000..74e8be4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ExpenseMapper.xml
@@ -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.stylefeng.guns.modular.system.dao.ExpenseMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Expense">
+		<id column="id" property="id" />
+		<result column="money" property="money" />
+		<result column="desc" property="desc" />
+		<result column="createtime" property="createtime" />
+		<result column="state" property="state" />
+		<result column="userid" property="userid" />
+	</resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, money, desc, createtime, state, userid
+    </sql>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/FeedbackMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/FeedbackMapper.xml
new file mode 100644
index 0000000..8cac652
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/FeedbackMapper.xml
@@ -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.stylefeng.guns.modular.system.dao.FeedbackMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Feedback">
+        <id column="id" property="id"/>
+        <result column="userId" property="userId"/>
+        <result column="handleUserId" property="handleUserId"/>
+        <result column="content" property="content"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="imgUrl" property="imgUrl"/>
+        <result column="flag" property="flag"/>
+        <result column="state" property="state"/>
+        <result column="cldate" property="cldate"/>
+        <result column="remark" property="remark"/>
+        <result column="type" property="type"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/FrequentPassengersMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/FrequentPassengersMapper.xml
new file mode 100644
index 0000000..2ca4334
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/FrequentPassengersMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.FrequentPassengersMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.FrequentPassengers">
+        <id column="id" property="id"/>
+        <result column="userId" property="userId"/>
+        <result column="name" property="name"/>
+        <result column="sex" property="sex"/>
+        <result column="phone" property="phone"/>
+        <result column="idcode" property="idcode"/>
+        <result column="status" property="status"/>
+        <result column="createTime" property="createTime"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml
new file mode 100644
index 0000000..bbd4fce
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.GDInterfaceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.GDInterface">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="explanation" property="explanation"/>
+        <result column="num" property="num"/>
+        <result column="time" property="time"/>
+    </resultMap>
+    
+    
+    <select id="query" resultType="GDInterface">
+        select * from t_gdinterface where `name` like #{name} and explanation like #{explanation} and `time` = #{time} limit 0, 1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml
new file mode 100644
index 0000000..c672369
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.IncomeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Income">
+        <id column="id" property="id"/>
+        <result column="userType" property="userType"/>
+        <result column="objectId" property="objectId"/>
+        <result column="type" property="type"/>
+        <result column="incomeId" property="incomeId"/>
+        <result column="orderType" property="orderType"/>
+        <result column="money" property="money"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IntegralGoodsMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IntegralGoodsMapper.xml
new file mode 100644
index 0000000..be601d6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IntegralGoodsMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.IntegralGoodsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.IntegralGoods">
+        <id column="id" property="id"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="name" property="name"/>
+        <result column="imgUrl" property="imgUrl"/>
+        <result column="integral" property="integral"/>
+        <result column="instructions" property="instructions"/>
+        <result column="state" property="state"/>
+        <result column="insertUserId" property="insertUserId"/>
+        <result column="insertUserRole" property="insertUserRole"/>
+    </resultMap>
+
+
+    <select id="queryGoods" resultType="map">
+        select
+        id as id,
+        `name` as `name`,
+        imgUrl as url,
+        integral as integral,
+        instructions as instructions
+        from t_integral_goods where state = 1 order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+
+
+    <select id="queryGoodsInfo" resultType="map">
+        select
+        id as id,
+        `name` as `name`,
+        imgUrl as url,
+        integral as integral,
+        instructions as instructions
+        from t_integral_goods where id = #{id}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IntegralOrderMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IntegralOrderMapper.xml
new file mode 100644
index 0000000..2dbcd1b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IntegralOrderMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.IntegralOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.IntegralOrder">
+        <id column="id" property="id"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="userId" property="userId"/>
+        <result column="goodsId" property="goodsId"/>
+        <result column="integral" property="integral"/>
+        <result column="num" property="num"/>
+        <result column="consigneeName" property="consigneeName"/>
+        <result column="consigneePhone" property="consigneePhone"/>
+        <result column="consigneeAddress" property="consigneeAddress"/>
+        <result column="remark" property="remark"/>
+        <result column="state" property="state"/>
+    </resultMap>
+
+
+    <select id="queryConvertHistory" resultType="map">
+        select
+        a.id as id,
+        b.`name` as `name`,
+        DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i') as time,
+        CONCAT(a.integral * -1, '积分') as integral
+        from t_integral_order a
+        left join t_integral_goods b on (a.goodsId = b.id)
+        where a.state != 3 and a.userId = #{uid}
+        order by a.insertTime desc limit #{pageNum}, #{size}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/InvoiceMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/InvoiceMapper.xml
new file mode 100644
index 0000000..e4b4588
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/InvoiceMapper.xml
@@ -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.stylefeng.guns.modular.system.dao.InvoiceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Invoice">
+        <id column="id" property="id"/>
+        <result column="money" property="money"/>
+        <result column="orderNum" property="orderNum"/>
+        <result column="type" property="type"/>
+        <result column="name" property="name"/>
+        <result column="code" property="code"/>
+        <result column="content" property="content"/>
+        <result column="remark" property="remark"/>
+        <result column="address" property="address"/>
+        <result column="bank" property="bank"/>
+        <result column="email" property="email"/>
+        <result column="userId" property="userId"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+
+    <select id="queryMyInvoice" resultType="map">
+        select
+        id as id,
+        insertTime as insertTime,
+        ('电子发票') as type,
+        ('出行服务') as content,
+        state as state,
+        money as money
+        from t_invoice where userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml
new file mode 100644
index 0000000..94423d9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.LoginLogMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.LoginLog">
+		<id column="id" property="id" />
+		<result column="logname" property="logname" />
+		<result column="userid" property="userid" />
+		<result column="createtime" property="createtime" />
+		<result column="succeed" property="succeed" />
+		<result column="message" property="message" />
+		<result column="ip" property="ip" />
+	</resultMap>
+
+	<select id="getLoginLogs" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+		select * from sys_login_log where 1 = 1
+		<if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+			and (createTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+		</if>
+		<if test="logName != null and logName !=''">
+			and logname like CONCAT('%',#{logName},'%')
+		</if>
+		<choose>
+			<when test="orderByField != null and orderByField !=''">
+				<choose>
+					<when test="isAsc == true">
+						order by ${orderByField} ASC
+					</when>
+					<otherwise>
+						order by ${orderByField} DESC
+					</otherwise>
+				</choose>
+			</when>
+			<otherwise>
+				order by createtime DESC
+			</otherwise>
+		</choose>
+	</select>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml
new file mode 100644
index 0000000..849dc3f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.MenuMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Menu">
+		<id column="id" property="id" />
+		<result column="code" property="code" />
+		<result column="pcode" property="pcode" />
+		<result column="pcodes" property="pcodes" />
+		<result column="name" property="name" />
+		<result column="icon" property="icon" />
+		<result column="url" property="url" />
+		<result column="num" property="num" />
+		<result column="levels" property="levels" />
+		<result column="ismenu" property="ismenu" />
+		<result column="tips" property="tips" />
+		<result column="status" property="status" />
+		<result column="isopen" property="isopen" />
+	</resultMap>
+
+    <sql id="Base_Column_List">
+        id, code, pcode, name, icon, url, num, levels,pcodes,
+        tips, status,isopen,ismenu
+    </sql>
+
+    <select id="selectMenus" resultType="map">
+        select
+        <include refid="Base_Column_List" />
+        from sys_menu
+        where status = 1
+        <if test="condition != null and condition != ''">
+            and (name like CONCAT('%',#{condition},'%') or code like CONCAT('%',#{condition},'%'))
+        </if>
+        <if test="level != null and level != ''">
+            and levels = #{level}
+        </if>
+    </select>
+
+    <select id="getMenuIdsByRoleId" resultType="long">
+        select menuid from
+        sys_relation where roleid = #{roleId}
+    </select>
+
+    <select id="menuTreeList" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+        SELECT
+        m1.id AS id,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS NULL) THEN
+        0
+        ELSE
+        m2.id
+        END
+        ) AS pId,
+        m1. NAME
+        AS NAME,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS NULL) THEN
+        'true'
+        ELSE
+        'false'
+        END
+        ) as isOpen
+        FROM
+        sys_menu m1
+        LEFT join sys_menu m2 ON m1.pcode = m2. CODE
+        ORDER BY
+        m1.id ASC
+    </select>
+
+    <select id="menuTreeListByMenuIds" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+        SELECT
+        m1.id AS id,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS NULL) THEN
+        0
+        ELSE
+        m2.id
+        END
+        ) AS pId,
+        m1. NAME AS NAME,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS
+        NULL) THEN
+        'true'
+        ELSE
+        'false'
+        END
+        ) as isOpen,
+        (
+        CASE
+        WHEN (m3.ID = 0 OR m3.ID
+        IS NULL) THEN
+        'false'
+        ELSE
+        'true'
+        END
+        ) "checked"
+        FROM
+        sys_menu m1
+        LEFT JOIN
+        sys_menu m2
+        ON m1.pcode = m2. CODE
+        left join (
+        SELECT
+        ID
+        FROM
+        sys_menu
+        WHERE
+        ID IN
+        <foreach collection="list" index="index" item="i" open="("
+                 separator="," close=")">
+            #{i}
+        </foreach>
+        ) m3 on m1.id = m3.id
+        ORDER BY
+        m1.id ASC
+    </select>
+
+    <delete id="deleteRelationByMenu">
+        delete from sys_relation where menuid = #{menuId}
+    </delete>
+
+    <select id="getResUrlsByRoleId" resultType="string">
+        select url from
+        sys_relation rel
+        inner join sys_menu m on rel.menuid = m.id
+        where rel.roleid = #{roleId}
+    </select>
+
+    <select id="getMenusByRoleIds" resultType="com.stylefeng.guns.core.node.MenuNode">
+        SELECT
+        m1.id AS id,
+        m1.icon AS icon,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS NULL) THEN
+        0
+        ELSE
+        m2.id
+        END
+        ) AS parentId,
+        m1.NAME as name,
+        m1.url as url,
+        m1.levels as levels,
+        m1.ismenu as ismenu,
+        m1.num as num
+        FROM
+        sys_menu m1
+        LEFT join sys_menu m2 ON m1.pcode = m2. CODE
+        INNER JOIN (
+        SELECT
+        ID
+        FROM
+        sys_menu
+        WHERE
+        ID IN (
+        SELECT
+        menuid
+        FROM
+        sys_relation rela
+        WHERE
+        rela.roleid IN
+        <foreach collection="list" index="index" item="i" open="(" separator="," close=")">
+            #{i}
+        </foreach>
+        )
+        ) m3 ON m1.id = m3.id
+        where m1.ismenu = 1
+        order by levels,num asc
+    </select>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml
new file mode 100644
index 0000000..6d4ba33
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.NoticeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Notice">
+        <id column="id" property="id"/>
+        <result column="title" property="title"/>
+        <result column="type" property="type"/>
+        <result column="content" property="content"/>
+        <result column="createtime" property="createtime"/>
+        <result column="creater" property="creater"/>
+    </resultMap>
+
+    <select id="list" resultType="map">
+        select * from sys_notice
+        <if test="condition != null and condition != ''">
+            where title like CONCAT('%',#{condition},'%') or content like CONCAT('%',#{condition},'%')
+        </if>
+        order by createtime DESC
+    </select>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OpenCityBusinessMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OpenCityBusinessMapper.xml
new file mode 100644
index 0000000..f1938ef
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OpenCityBusinessMapper.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.OpenCityBusinessMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OpenCityBusiness">
+        <id column="id" property="id"/>
+        <result column="openCityId" property="openCityId"/>
+        <result column="businessType" property="businessType"/>
+        <result column="sort" property="sort"/>
+
+        <result column="flag" property="flag"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="insertUser" property="insertUser"/>
+        <result column="updateTime" property="updateTime"/>
+        <result column="updateUser" property="updateUser"/>
+    </resultMap>
+
+
+
+    <select id="queryBusiness" resultType="OpenCityBusiness">
+        select
+        a.id as id,
+        a.openCityId as openCityId,
+        a.businessType as businessType,
+        a.sort as sort,
+        a.flag as flag,
+        a.insertTime as insertTime,
+        a.insertUser as insertUser,
+        a.updateTime as updateTime,
+        a.updateUser as updateUser
+        from t_open_city_business a
+        left join t_open_city b on (a.openCityId = b.id)
+        where a.flag != 3 and b.flag != 3
+        <if test="null != district">
+            and b.provinceName = #{district}
+        </if>
+        <if test="null != city">
+            and b.cityName = #{city}
+        </if>
+        <if test="null != province">
+            and b.areaName = #{province}
+        </if>
+        order by a.sort
+    </select>
+
+
+    <select id="queryBusinessById" resultType="OpenCityBusiness">
+        select
+        id as id,
+        openCityId as openCityId,
+        businessType as businessType,
+        sort as sort,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_open_city_business
+        where flag != 3 and openCityId = #{id} order by sort
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OpenCityMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OpenCityMapper.xml
new file mode 100644
index 0000000..9c6a66e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OpenCityMapper.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.OpenCityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OpenCity">
+        <id column="id" property="id"/>
+        <result column="code" property="code"/>
+        <result column="lon" property="lon"/>
+        <result column="lat" property="lat"/>
+        <result column="isQualifications" property="isQualifications"/>
+        <result column="areaName" property="areaName"/>
+        <result column="cityName" property="cityName"/>
+        <result column="provinceName" property="provinceName"/>
+
+        <result column="flag" property="flag"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="insertUser" property="insertUser"/>
+        <result column="updateTime" property="updateTime"/>
+        <result column="updateUser" property="updateUser"/>
+    </resultMap>
+
+
+
+    <select id="queryOpenCity" resultType="OpenCity">
+        select
+        id as id,
+        code as code,
+        lon as lon,
+        lat as lat,
+        isQualifications as isQualifications,
+        areaName as areaName,
+        cityName as cityName,
+        provinceName as provinceName,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_open_city where flag = 1
+    </select>
+
+
+    <select id="queryByCode" resultType="OpenCity">
+        select
+        id as id,
+        code as code,
+        lon as lon,
+        lat as lat,
+        isQualifications as isQualifications,
+        areaName as areaName,
+        cityName as cityName,
+        provinceName as provinceName,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_open_city where flag = 1 and code = #{code}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml
new file mode 100644
index 0000000..1d0d711
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.OperationLogMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OperationLog">
+		<id column="id" property="id" />
+		<result column="logtype" property="logtype" />
+		<result column="logname" property="logname" />
+		<result column="userid" property="userid" />
+		<result column="classname" property="classname" />
+		<result column="method" property="method" />
+		<result column="createtime" property="createtime" />
+		<result column="succeed" property="succeed" />
+		<result column="message" property="message" />
+	</resultMap>
+
+	<select id="getOperationLogs" resultType="map">
+		select * from sys_operation_log where 1 = 1
+		<if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+			and (createTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+		</if>
+		<if test="logName != null and logName !=''">
+			and logname like CONCAT('%',#{logName},'%')
+		</if>
+		<if test="logType != null and logType !=''">
+			and logtype like CONCAT('%',#{logType},'%')
+		</if>
+		<choose>
+			<when test="orderByField != null and orderByField !=''">
+				<choose>
+					<when test="isAsc == true">
+						order by ${orderByField} ASC
+					</when>
+					<otherwise>
+						order by ${orderByField} DESC
+					</otherwise>
+				</choose>
+			</when>
+			<otherwise>
+				order by createtime DESC
+			</otherwise>
+		</choose>
+	</select>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml
new file mode 100644
index 0000000..27646c8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.OrderCancelMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OrderCancel">
+        <id column="id" property="id"/>
+        <result column="orderId" property="orderId"/>
+        <result column="orderType" property="orderType"/>
+        <result column="reason" property="reason"/>
+        <result column="remark" property="remark"/>
+        <result column="payType" property="payType"/>
+        <result column="money" property="money"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="userType" property="userType"/>
+        <result column="userId" property="userId"/>
+    </resultMap>
+
+
+    <select id="query" resultType="OrderCancel">
+        select
+        id as id,
+        orderId as orderId,
+        orderType as orderType,
+        reason as reason,
+        remark as remark,
+        payType as payType,
+        money as money,
+        state as state,
+        insertTime as insertTime,
+        userType as userType,
+        userId as userId
+        from t_order_cancel where 1 = 1
+        <if test="null != orderId">
+            and orderId = #{orderId}
+        </if>
+        <if test="null != orderType">
+            and orderType = #{orderType}
+        </if>
+        <if test="null != money">
+            and money = #{money}
+        </if>
+        <if test="null != payType">
+            and payType = #{payType}
+        </if>
+        <if test="null != state">
+            and state = #{state}
+        </if>
+        order by insertTime desc limit 0,1
+    </select>
+
+
+    <select id="queryCancel" resultType="map">
+        select
+        (money * -1) as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        CONCAT(if(orderType = 1, '专车', if(orderType = 2, '出租车', if(orderType = 3, '跨城', if(orderType = 4, '同城小件物流', if(orderType = 5, '跨城小件物流', '包车'))))), '订单取消') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_cancel where state = 2 and userType = 1 and money is not null and userId = #{uid}
+        <choose>
+            <when test="1 == isPay">
+                and money is null
+            </when>
+            <otherwise>
+                and money is not null
+            </otherwise>
+        </choose>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderEvaluateMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderEvaluateMapper.xml
new file mode 100644
index 0000000..65ab64e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderEvaluateMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.OrderEvaluateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OrderEvaluate">
+        <id column="id" property="id"/>
+        <result column="orderId" property="orderId"/>
+        <result column="driverId" property="driverId"/>
+        <result column="orderType" property="orderType"/>
+        <result column="fraction" property="fraction"/>
+        <result column="content" property="content"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="userId" property="userId"/>
+    </resultMap>
+
+
+
+    <select id="queryOrderEvaluate" resultType="map">
+        select
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        content as content,
+        fraction as fraction
+        from t_order_evaluate where driverId = #{driverId} and unix_timestamp(insertTime) &lt; unix_timestamp(now()) - 86400 order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderFrequentPassengersMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderFrequentPassengersMapper.xml
new file mode 100644
index 0000000..15b2586
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderFrequentPassengersMapper.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.OrderFrequentPassengersMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OrderFrequentPassengers">
+        <id column="id" property="id"/>
+        <result column="orderType" property="orderType"/>
+        <result column="orderId" property="orderId"/>
+        <result column="frequentPassengersId" property="frequentPassengersId"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPositionMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPositionMapper.xml
new file mode 100644
index 0000000..923d815
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPositionMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.OrderPositionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OrderPosition">
+        <id column="id" property="id"/>
+        <result column="orderType" property="orderType"/>
+        <result column="orderId" property="orderId"/>
+        <result column="driverId" property="driverId"/>
+        <result column="lon" property="lon"/>
+        <result column="lat" property="lat"/>
+        <result column="directionAngle" property="directionAngle"/>
+        <result column="altitude" property="altitude"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+
+
+    <select id="queryTrack" resultType="map">
+        select
+        lon as lon,
+        lat as lat
+        from t_order_position where orderId = #{orderId} and orderType = #{orderType} order by insertTime
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PhoneMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PhoneMapper.xml
new file mode 100644
index 0000000..213317e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PhoneMapper.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.PhoneMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Phone">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="platform" property="platform"/>
+        <result column="phone" property="phone" />
+        <result column="companyId" property="companyId"/>
+    </resultMap>
+
+
+
+    <select id="queryPhones" resultType="Phone">
+        select
+        id as id,
+        type as type,
+        platform as platform,
+        phone as phone,
+        companyId as companyId
+        from t_phone where companyId in (
+        select companyId from t_company_city where state = 1
+        <if test="null != province">
+            and provinceCode = #{province}
+        </if>
+        <if test="null != city">
+            and cityCode = #{city}
+        </if>
+        <if test="null != code">
+            and areaCode = #{code}
+        </if>
+        )
+    </select>
+
+
+    <select id="query" resultType="Phone">
+        select
+        id as id,
+        type as type,
+        platform as platform,
+        phone as phone,
+        companyId as companyId
+        from t_phone where 1 = 1
+        <if test="null != type">
+            and type = #{type}
+        </if>
+        <if test="null != platform">
+            and platform = #{platform}
+        </if>
+        <if test="platform != 1">
+            and companyId in (
+            select companyId from t_company_city where state = 1
+            <if test="null != province">
+                and provinceCode = #{province}
+            </if>
+            <if test="null != city">
+                and cityCode = #{city}
+            </if>
+            <if test="null != code">
+                and areaCode = #{code}
+            </if>
+            )
+        </if>
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ProblemMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ProblemMapper.xml
new file mode 100644
index 0000000..56a4987
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ProblemMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.ProblemMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Problem">
+        <id column="id" property="id"/>
+        <result column="userId" property="userId"/>
+        <result column="content" property="content"/>
+        <result column="answer" property="answer"/>
+        <result column="handleUserId" property="handleUserId"/>
+        <result column="handleTime" property="handleTime"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="state" property="state"/>
+    </resultMap>
+
+
+    <select id="queryProblems" resultType="map">
+        select
+        id as id,
+        DATE_FORMAT(insertTime, '%Y.%m.%d %H:%i') as insertTime,
+        content as content,
+        answer as answer
+        from t_problem where userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PushOrderMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PushOrderMapper.xml
new file mode 100644
index 0000000..04d7e4c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PushOrderMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.PushOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.PushOrder">
+        <id column="id" property="id"/>
+        <result column="companyId" property="companyId"/>
+        <result column="pushDistance" property="pushDistance"/>
+        <result column="pushTime" property="pushTime"/>
+        <result column="driverProportion" property="driverProportion"/>
+        <result column="type" property="type"/>
+        <result column="pushType" property="pushType"/>
+    </resultMap>
+
+
+    <select id="querys" resultType="PushOrder">
+        select
+        id as id,
+        companyId as companyId,
+        pushDistance as pushDistance,
+        pushTime as pushTime,
+        driverProportion as driverProportion,
+        `type` as `type`,
+        pushType as pushType
+        from t_sys_push_order where companyId = #{companyId}
+        <if test="null != type">
+            and `type` = #{type}
+        </if>
+        <if test="null != pushType">
+            and pushType = #{pushType}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RedPacketRecordMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RedPacketRecordMapper.xml
new file mode 100644
index 0000000..3c46afe
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RedPacketRecordMapper.xml
@@ -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.stylefeng.guns.modular.system.dao.RedPacketRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.RedPacketRecord">
+        <id column="id" property="id"/>
+        <result column="money" property="money"/>
+        <result column="insert_time" property="insertTime"/>
+        <result column="companyId" property="companyId"/>
+        <result column="name" property="name"/>
+        <result column="type" property="type"/>
+        <result column="totalMoney" property="totalMoney"/>
+        <result column="laveMoney" property="laveMoney"/>
+        <result column="startMoney" property="startMoney"/>
+        <result column="endMoney" property="endMoney"/>
+    </resultMap>
+
+
+
+    <select id="queryDate" resultType="RedPacketRecord">
+        select
+        id as id,
+        money as money,
+        insert_time as insertTime,
+        companyId as companyId,
+        name as name,
+        type as type,
+        totalMoney as totalMoney,
+        laveMoney as laveMoney,
+        startMoney as startMoney,
+        endMoney as endMoney
+        from t_sys_red_packet_record a where laveMoney != 0 and companyId = #{companyId} limit 0,1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml
new file mode 100644
index 0000000..bfcd926
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.RegionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Region">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="code" property="code" />
+        <result column="citycode" property="citycode" />
+        <result column="parent_id" property="parentId" />
+        <result column="english" property="english" />
+    </resultMap>
+
+
+    <select id="query" resultType="Region">
+        select
+        id as id,
+        name as name,
+        code as code,
+        citycode as citycode,
+        parent_id as parentId,
+        english as english
+        from t_region where code = #{code}
+    </select>
+
+
+    <select id="querys" resultType="Region">
+        select
+        id as id,
+        name as name,
+        code as code,
+        citycode as citycode,
+        parent_id as parentId,
+        english as english
+        from t_region where parent_id = #{parentId} order by code
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml
new file mode 100644
index 0000000..2f4be0a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.RelationMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Relation">
+		<id column="id" property="id" />
+		<result column="menuid" property="menuid" />
+		<result column="roleid" property="roleid" />
+	</resultMap>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml
new file mode 100644
index 0000000..ff4878c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.RoleMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Role">
+		<id column="id" property="id" />
+		<result column="num" property="num" />
+		<result column="pid" property="pid" />
+		<result column="name" property="name" />
+		<result column="deptid" property="deptid" />
+		<result column="tips" property="tips" />
+		<result column="version" property="version" />
+	</resultMap>
+
+	<sql id="Base_Column_List">
+		id, num, pid, name, deptid, tips, version
+	</sql>
+
+	<select id="selectRoles" resultType="map">
+		select
+		<include refid="Base_Column_List" />
+		from sys_role
+		<if test="condition != null">
+			where name like CONCAT('%',#{condition},'%')
+		</if>
+	</select>
+
+	<delete id="deleteRolesById">
+		delete from sys_relation where roleid = #{roleId}
+	</delete>
+
+	<select id="roleTreeList" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+		select id "id",pId
+		"pId",name as "name",(case when (pId=0 or pId is null) then 'true'
+		else 'false' end) "open" from sys_role
+	</select>
+
+	<select id="roleTreeListByRoleId" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+		SELECT
+		r.id "id",
+		pId "pId",
+		NAME AS "name",
+		(
+		CASE
+		WHEN (pId = 0 OR pId IS NULL) THEN
+		'true'
+		ELSE
+		'false'
+		END
+		) "open",
+		(
+		CASE
+		WHEN (r1.ID = 0 OR r1.ID IS NULL) THEN
+		'false'
+		ELSE
+		'true'
+		END
+		) "checked"
+		FROM
+		sys_role r
+		LEFT JOIN (
+		SELECT
+		ID
+		FROM
+		sys_role
+		WHERE
+		ID IN
+
+		<foreach collection="array" index="index" item="i" open="(" separator="," close=")">
+			#{i}
+		</foreach>
+
+		) r1 ON r.ID = r1.ID
+		ORDER BY
+		pId,
+		num ASC
+	</select>
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SensitiveWordsMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SensitiveWordsMapper.xml
new file mode 100644
index 0000000..3a5eadd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SensitiveWordsMapper.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SensitiveWords">
+        <id column="id" property="id" />
+        <result column="createTime" property="createTime" />
+        <result column="content" property="content" />
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ServerCarModelMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ServerCarModelMapper.xml
new file mode 100644
index 0000000..95202f6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ServerCarModelMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.ServerCarModelMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.ServerCarModel">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="name" property="name"/>
+        <result column="img" property="img"/>
+        <result column="price" property="price"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+
+    <select id="queryServerCarModel" resultType="map">
+        select
+        id as id,
+        `name` as `name`,
+        img as img,
+        price as price
+        from t_server_carmodel where state = 1 and `type` = #{type}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SmsrecordMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SmsrecordMapper.xml
new file mode 100644
index 0000000..eff60ea
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SmsrecordMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.SmsrecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Smsrecord">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="phone" property="phone"/>
+        <result column="code" property="code"/>
+        <result column="content" property="content"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysIntegralMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysIntegralMapper.xml
new file mode 100644
index 0000000..de4ac06
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysIntegralMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.SysIntegralMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SysIntegral">
+        <id column="id" property="id" />
+        <result column="companyId" property="companyId" />
+        <result column="integral" property="integral" />
+    </resultMap>
+
+
+
+    <select id="query" resultType="com.stylefeng.guns.modular.system.model.SysIntegral">
+        select * from t_sys_integral where companyId = #{companyId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysReformistMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysReformistMapper.xml
new file mode 100644
index 0000000..27f52b2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysReformistMapper.xml
@@ -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.stylefeng.guns.modular.system.dao.SysReformistMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SysReformist">
+        <id column="id" property="id"/>
+        <result column="companyId" property="companyId"/>
+        <result column="money" property="money"/>
+        <result column="isSpecialCar" property="isSpecialCar"/>
+        <result column="isTaxiCar" property="isTaxiCar"/>
+    </resultMap>
+
+
+
+    <select id="queryMoney" resultType="double">
+        select money from t_sys_reformist where companyId = #{companyId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemNoticeMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemNoticeMapper.xml
new file mode 100644
index 0000000..b68c6fc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemNoticeMapper.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.SystemNoticeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SystemNotice">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="noticeType" property="noticeType"/>
+        <result column="userType" property="userType"/>
+        <result column="noticesId" property="noticesId"/>
+        <result column="content" property="content"/>
+        <result column="userId" property="userId"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="read" property="read"/>
+    </resultMap>
+
+
+    <select id="queryNoReadNoticeNum" resultType="int">
+        select count(id) from t_system_notice where userType = 1 and userId = #{uid} and `read` = 1
+    </select>
+
+
+    <select id="queryList" resultType="map">
+        select
+        id as id,
+        noticeType as noticeType,
+        `type` as `type`,
+        content as content,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as `time`,
+        `read` as `read`
+        from t_system_notice where `type` = 2 and userType = 1 and userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+
+
+
+    <update id="readSystemNotice">
+        update t_system_notice set `read` = 2 where id = #{id} and userId = #{uid} and userType = 1
+    </update>
+
+
+    <delete id="delSystemNotice">
+        delete from t_system_notice where userType = 1
+        <if test="null != uid">
+            and userId = #{uid}
+        </if>
+        <if test="null != id">
+            and id = #{id}
+        </if>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemPriceMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemPriceMapper.xml
new file mode 100644
index 0000000..0e2480f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemPriceMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.SystemPriceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SystemPrice">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="companyId" property="companyId"/>
+        <result column="serverCarModelId" property="serverCarModelId"/>
+        <result column="content" property="content"/>
+    </resultMap>
+
+    <select id="query" resultType="map">
+        select
+        id as id,
+        content as content
+        from t_system_price where state = 1 and companyId = #{companyId}
+        <if test="null != type">
+            and `type` = #{type}
+        </if>
+        <if test="null != serverCarModelId">
+            and serverCarModelId = #{serverCarModelId}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TNoticesMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TNoticesMapper.xml
new file mode 100644
index 0000000..dec5956
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TNoticesMapper.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TNoticesMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TNotices">
+        <id column="id" property="id"/>
+        <result column="title" property="title"/>
+        <result column="content" property="content"/>
+        <result column="sort" property="sort"/>
+        <result column="isShow" property="isShow"/>
+        <result column="isBroadcast" property="isBroadcast"/>
+        <result column="type" property="type"/>
+        <result column="imgUrl" property="imgUrl"/>
+        <result column="isDelete" property="isDelete"/>
+        <result column="isUser" property="isUser"/>
+        <result column="isDriver" property="isDriver"/>
+
+        <result column="flag" property="flag"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="insertUser" property="insertUser"/>
+        <result column="updateTime" property="updateTime"/>
+        <result column="updateUser" property="updateUser"/>
+    </resultMap>
+
+
+    <select id="queryNotices" resultType="com.stylefeng.guns.modular.system.model.TNotices">
+        select
+        id as id,
+        title as title,
+        content as content,
+        sort as sort,
+        isShow as isShow,
+        isBroadcast as isBroadcast,
+        `type` as `type`,
+        imgUrl as imgUrl,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_notices where flag != 3 and isDelete = 1 and `type` = #{type}
+        <if test="type == 2">
+            and isBroadcast = 1
+        </if>
+        <if test="type == 1">
+            and isShow = 1
+        </if>
+    </select>
+
+
+    <select id="queryList" resultType="map">
+        select
+        b.id as id,
+        a.title as title,
+        a.content as content,
+        (1) as `type`,
+        a.imgUrl as img,
+        DATE_FORMAT(b.insertTime, '%Y-%m-%d %H:%i') as `time`,
+        b.`read` as `read`
+        from t_notices a
+        left join t_system_notice b on (a.id = b.noticesId)
+        where a.`type` = 2 and a.flag != 3 and a.isShow = 1 and b.type = 1 and b.userType = 1
+        and b.userId = #{uid} order by b.insertTime desc limit #{pageNum}, #{size}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityBalanceMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityBalanceMapper.xml
new file mode 100644
index 0000000..0d16040
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityBalanceMapper.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityBalanceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityBalance">
+        <id column="id" property="id"/>
+        <result column="enable" property="enable"/>
+        <result column="userActivityId" property="userActivityId"/>
+        <result column="money" property="money"/>
+        <result column="generalNum" property="generalNum"/>
+        <result column="generalCouponId" property="generalCouponId"/>
+        <result column="specialNum" property="specialNum"/>
+        <result column="specialCouponId" property="specialCouponId"/>
+        <result column="taxiNum" property="taxiNum"/>
+        <result column="taxiCouponId" property="taxiCouponId"/>
+        <result column="intercityNum" property="intercityNum"/>
+        <result column="intercityCouponId" property="intercityCouponId"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="startTime" property="startTime"/>
+        <result column="endTime" property="endTime"/>
+        <result column="totalPrice" property="totalPrice"/>
+        <result column="lavePrice" property="lavePrice"/>
+    </resultMap>
+
+
+
+    <select id="query" resultType="map">
+        select
+        a.id as id,
+        a.generalNum as generalNum,
+        a.specialNum as specialNum,
+        a.taxiNum as taxiNum,
+        a.intercityNum as intercityNum,
+        b.id as bId,
+        c.id as cId,
+        d.id as dId,
+        e.id as eId,
+        b.companyId as bcompanyId,
+        c.companyId as ccompanyId,
+        d.companyId as dcompanyId,
+        e.companyId as ecompanyId,
+        b.money as bmoney,
+        c.money as cmoney,
+        d.money as dmoney,
+        e.money as emoney,
+        b.fullMoney as bfullMoney,
+        c.fullMoney as cfullMoney,
+        d.fullMoney as dfullMoney,
+        e.fullMoney as efullMoney,
+        b.couponUseType as bcouponUseType,
+        c.couponUseType as ccouponUseType,
+        d.couponUseType as dcouponUseType,
+        e.couponUseType as ecouponUseType,
+        b.couponType as bcouponType,
+        c.couponType as ccouponType,
+        d.couponType as dcouponType,
+        e.couponType as ecouponType,
+        a.effective as beffective,
+        a.effective as ceffective,
+        a.effective as deffective,
+        a.effective as eeffective,
+        a.totalPrice as totalPrice,
+        a.lavePrice as lavePrice
+        from t_user_activity_balance a
+        left join t_sys_coupon_record b on (a.generalCouponId = b.id)
+        left join t_sys_coupon_record c on (a.specialCouponId = c.id)
+        left join t_sys_coupon_record d on (a.taxiCouponId = d.id)
+        left join t_sys_coupon_record e on (a.intercityCouponId = e.id)
+		left join t_user_activity f on (a.userActivityId = f.id)
+        where a.`enable` = 2 and f.status = 3 and now() between a.startTime and a.endTime and a.money &lt;= #{money}
+        and b.companyId = #{companyId} and c.companyId = #{companyId} and d.companyId = #{companyId} and e.companyId = #{companyId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount1Mapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount1Mapper.xml
new file mode 100644
index 0000000..4c9e5e3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount1Mapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityDiscount1Mapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityDiscount1">
+        <id column="id" property="id"/>
+        <result column="userActivityId" property="userActivityId"/>
+        <result column="special" property="special"/>
+        <result column="taxi" property="taxi"/>
+        <result column="logistics" property="logistics"/>
+        <result column="startTime" property="startTime"/>
+        <result column="endTime" property="endTime"/>
+        <result column="enable" property="enable"/>
+    </resultMap>
+
+
+    <select id="query" resultType="UserActivityDiscount1">
+        select
+        a.id as id,
+        a.userActivityId as userActivityId,
+        a.special as special,
+        a.taxi as taxi,
+        a.logistics as logistics,
+        a.startTime as startTime,
+        a.endTime as endTime,
+        a.`enable` as `enable`
+        from t_user_activity_discount1 a
+        left join t_user_activity b on (a.userActivityId = b.id)
+        where now() between a.startTime and a.endTime and b.`status` = 3 and b.companyId = #{companyId} order by b.insertTime desc limit 0,1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityInviteMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityInviteMapper.xml
new file mode 100644
index 0000000..b5ebff3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityInviteMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityInviteMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityInvite">
+        <id column="id" property="id"/>
+        <result column="userActivityId" property="userActivityId"/>
+        <result column="couponId" property="couponId"/>
+        <result column="totalNum" property="totalNum"/>
+        <result column="startTime" property="startTime"/>
+        <result column="endTime" property="endTime"/>
+        <result column="enable" property="enable"/>
+        <result column="effective" property="effective"/>
+        <result column="totalPrice" property="totalPrice"/>
+        <result column="lavePrice" property="lavePrice"/>
+    </resultMap>
+
+
+
+    <select id="query" resultType="map">
+        select
+        a.id as id,
+        a.userActivityId as userActivityId,
+        a.couponId as couponId,
+        a.totalNum as totalNum,
+        a.startTime as startTime,
+        a.endTime as endTime,
+        a.enable as enable,
+        a.effective as effective,
+        c.money as money,
+        c.fullMoney as fullMoney,
+        c.couponUseType as couponUseType,
+        c.couponType as couponType,
+        a.totalPrice as totalPrice,
+        a.lavePrice as lavePrice
+        from t_user_activity_invite a
+        left join t_user_activity b on (a.userActivityId = b.id)
+        left join t_sys_coupon_record c on (a.couponId = c.id)
+        where now() between a.startTime and a.endTime and a.enable = 2 and b.status = 3 and b.companyId = #{companyId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRedenvelopeMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRedenvelopeMapper.xml
new file mode 100644
index 0000000..7789d90
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRedenvelopeMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityRedenvelopeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityRedenvelope">
+        <id column="id" property="id"/>
+        <result column="userActivityId" property="userActivityId"/>
+        <result column="redEnvelopeId" property="redEnvelopeId"/>
+        <result column="totalMoney" property="totalMoney"/>
+        <result column="laveMoney" property="laveMoney"/>
+        <result column="startTime" property="startTime"/>
+        <result column="endTime" property="endTime"/>
+        <result column="enable" property="enable"/>
+        <result column="totalPrice" property="totalPrice"/>
+        <result column="lavePrice" property="lavePrice"/>
+    </resultMap>
+
+
+
+    <select id="query" resultType="map">
+        select
+        a.id as id,
+        a.laveMoney as laveMoney,
+        a.userActivityId as userActivityId,
+        b.money as money,
+        b.`type` as `type`,
+        b.startMoney as startMoney,
+        b.endMoney as endMoney,
+        b.companyId as companyId,
+        b.effective as effective,
+        a.totalPrice as totalPrice,
+        a.lavePrice as lavePrice
+        from t_user_activity_redenvelope a
+        left join t_sys_red_packet_record b on (a.redEnvelopeId = b.id)
+        left join t_user_activity c on (a.userActivityId = c.id)
+        where a.`enable` = 2 and c.status = 3 and #{travelTime} between a.startTime and a.endTime and a.laveMoney > 0 and b.companyId = #{companyId} limit 0,1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRegisteredMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRegisteredMapper.xml
new file mode 100644
index 0000000..8d9c7a8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRegisteredMapper.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityRegisteredMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityRegistered">
+        <id column="id" property="id"/>
+        <result column="userActivityId" property="userActivityId"/>
+        <result column="couponId" property="couponId"/>
+        <result column="totalNum" property="totalNum"/>
+        <result column="laveNum" property="laveNum"/>
+        <result column="startTime" property="startTime"/>
+        <result column="endTime" property="endTime"/>
+        <result column="enable" property="enable"/>
+        <result column="totalPrice" property="totalPrice"/>
+        <result column="lavePrice" property="lavePrice"/>
+    </resultMap>
+
+
+
+
+    <select id="query" resultType="map">
+        select
+        a.id as id,
+        a.userActivityId as userActivityId,
+        a.couponId as couponId,
+        a.totalNum as totalNum,
+        a.laveNum as laveNum,
+        a.startTime as startTime,
+        a.endTime as endTime,
+        a.`enable` as `enable`,
+        b.money as money,
+        b.fullMoney as fullMoney,
+        b.companyId as companyId,
+        b.couponUseType as couponUseType,
+        b.couponType as couponType,
+        a.effective as effective,
+        a.totalPrice as totalPrice,
+        a.lavePrice as lavePrice
+        from t_user_activity_registered a
+        left join t_sys_coupon_record b on (a.couponId = b.id)
+		left join t_user_activity c on (a.userActivityId = c.id)
+        where now() between a.startTime and a.endTime and a.laveNum > 0 and a.`enable` = 2 and  b.companyId = #{companyId} and c.`status` = 3
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserCouponRecordMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserCouponRecordMapper.xml
new file mode 100644
index 0000000..947c9e6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserCouponRecordMapper.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserCouponRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserCouponRecord">
+        <id column="id" property="id"/>
+        <result column="money" property="money"/>
+        <result column="fullMoney" property="fullMoney"/>
+        <result column="expirationTime" property="expirationTime"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="companyId" property="companyId"/>
+        <result column="state" property="state"/>
+        <result column="endTime" property="endTime"/>
+        <result column="couponUseType" property="couponUseType"/>
+        <result column="couponType" property="couponType"/>
+        <result column="userId" property="userId"/>
+        <result column="couponId" property="couponId"/>
+        <result column="couponActivityId" property="couponActivityId"/>
+        <result column="activityType" property="activityType"/>
+        <result column="paymentRecordId" property="paymentRecordId"/>
+    </resultMap>
+
+
+
+    <select id="queryAvailable" resultType="int">
+        select
+        count(a.id)
+        from t_user_coupon_record a
+        left join t_company b on (a.companyId = b.id)
+        where a.expirationTime >= now()
+        <if test="null != uid">
+            and a.userId = #{uid}
+        </if>
+        <if test="null != companyId">
+            and a.companyId = #{companyId}
+        </if>
+        <if test="null != state">
+            and a.state = #{state}
+        </if>
+        <if test="null != couponUseType">
+            and a.couponUseType = #{couponUseType}
+        </if>
+        <if test="null != money">
+            and if(a.couponType = 1, a.money &lt;= #{money}, a.fullMoney &lt;= #{money})
+        </if>
+    </select>
+
+    <select id="queryCoupon" resultType="map">
+        select
+        a.id as id,
+        a.money as money,
+        a.couponUseType as userType,
+        DATE_FORMAT(a.expirationTime, '%Y-%m-%d') as time,
+        a.couponType as `type`,
+        a.fullMoney as fullMoney,
+        a.state as state,
+        b.`name` as `name`,
+        a.activityType as activityType,
+        a.couponId as couponId
+        from t_user_coupon_record a
+        left join t_company b on (a.companyId = b.id)
+        where a.expirationTime >= now()
+        <if test="null != uid">
+            and a.userId = #{uid}
+        </if>
+        <if test="null != companyId">
+            and a.companyId = #{companyId}
+        </if>
+        <if test="null != state">
+            and a.state = #{state}
+        </if>
+        <if test="null != couponUseType">
+            and a.couponUseType = #{couponUseType}
+        </if>
+        <if test="null != money">
+            and if(a.couponType = 1, a.money &lt;= #{money}, a.fullMoney &lt;= #{money})
+        </if>
+        order by a.insertTime desc
+        <if test="null != pageNum and null != size">
+            limit #{pageNum}, #{size}
+        </if>
+    </select>
+
+
+
+
+
+
+    <select id="queryMyCoupons" resultType="map">
+        select
+        a.id as id,
+        a.money as money,
+        a.couponUseType as userType,
+        DATE_FORMAT(a.expirationTime, '%Y-%m-%d') as time,
+        a.couponType as `type`,
+        a.fullMoney as fullMoney,
+        a.state as state,
+        b.`name` as `name`
+        from t_user_coupon_record a
+        left join t_company b on (a.companyId = b.id)
+        where 1 = 1
+        <if test="null != uid">
+            and a.userId = #{uid}
+        </if>
+        <if test="null != state">
+            <if test="state == 1">
+                and a.state = 1
+            </if>
+            <if test="state == 2">
+                and a.state in (2,3)
+            </if>
+        </if>
+        order by a.insertTime desc
+        <if test="null != pageNum and null != size">
+            limit #{pageNum}, #{size}
+        </if>
+    </select>
+
+
+
+    <update id="updateTimeOut">
+        update t_user_coupon_record set state = 3,endTime = now() where now() > expirationTime and state = 1
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml
new file mode 100644
index 0000000..da4654c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserInfo">
+        <id column="id" property="id"/>
+        <result column="companyId" property="companyId"/>
+        <result column="registIp" property="registIp"/>
+        <result column="registAreaCode" property="registAreaCode"/>
+        <result column="phone" property="phone"/>
+        <result column="nickName" property="nickName"/>
+        <result column="avatar" property="avatar"/>
+        <result column="birthday" property="birthday"/>
+        <result column="sex" property="sex"/>
+        <result column="emergencyContact" property="emergencyContact"/>
+        <result column="emergencyContactNumber" property="emergencyContactNumber"/>
+        <result column="isAuth" property="isAuth"/>
+        <result column="name" property="name"/>
+        <result column="idCard" property="idCard"/>
+        <result column="idCardFront" property="idCardFront"/>
+        <result column="idCardReverse" property="idCardReverse"/>
+        <result column="consumption" property="consumption"/>
+        <result column="balance" property="balance"/>
+        <result column="integral" property="integral"/>
+        <result column="passWord" property="passWord"/>
+        <result column="openId" property="openId"/>
+        <result column="appletsOpenId" property="appletsOpenId"/>
+        <result column="unionid" property="unionid"/>
+        <result column="remark" property="remark"/>
+        <result column="state" property="state"/>
+        <result column="flag" property="flag"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="insertUser" property="insertUser"/>
+        <result column="updateTime" property="updateTime"/>
+        <result column="updateUser" property="updateUser"/>
+    </resultMap>
+
+
+    <select id="queryByPhone" resultType="UserInfo">
+        select
+        id as id,
+        registIp as registIp,
+        registAreaCode as registAreaCode,
+        phone as phone,
+        nickName as nickName,
+        avatar as avatar,
+        birthday as birthday,
+        sex as sex,
+        emergencyContact as emergencyContact,
+        emergencyContactNumber as emergencyContactNumber,
+        isAuth as isAuth,
+        name as name,
+        idCard as idCard,
+        idCardFront as idCardFront,
+        idCardReverse as idCardReverse,
+        consumption as consumption,
+        balance as balance,
+        integral as integral,
+        passWord as passWord,
+        openId as openId,
+        appletsOpenId as appletsOpenId,
+        unionid as unionid,
+        state as state,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_user where flag != 3 and phone = #{phone}
+    </select>
+
+
+
+    <select id="queryByOpenid" resultType="UserInfo">
+        select
+        id as id,
+        registIp as registIp,
+        registAreaCode as registAreaCode,
+        phone as phone,
+        nickName as nickName,
+        avatar as avatar,
+        birthday as birthday,
+        sex as sex,
+        emergencyContact as emergencyContact,
+        emergencyContactNumber as emergencyContactNumber,
+        isAuth as isAuth,
+        name as name,
+        idCard as idCard,
+        idCardFront as idCardFront,
+        idCardReverse as idCardReverse,
+        consumption as consumption,
+        balance as balance,
+        integral as integral,
+        passWord as passWord,
+        openId as openId,
+        appletsOpenId as appletsOpenId,
+        unionid as unionid,
+        state as state,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_user where flag != 3
+        <if test="null != openid">
+            and openId = #{openid}
+        </if>
+    </select>
+
+
+    <select id="queryByOpenid2" resultType="UserInfo">
+        select
+        id as id,
+        registIp as registIp,
+        registAreaCode as registAreaCode,
+        phone as phone,
+        nickName as nickName,
+        avatar as avatar,
+        birthday as birthday,
+        sex as sex,
+        emergencyContact as emergencyContact,
+        emergencyContactNumber as emergencyContactNumber,
+        isAuth as isAuth,
+        name as name,
+        idCard as idCard,
+        idCardFront as idCardFront,
+        idCardReverse as idCardReverse,
+        consumption as consumption,
+        balance as balance,
+        integral as integral,
+        passWord as passWord,
+        openId as openId,
+        appletsOpenId as appletsOpenId,
+        unionid as unionid,
+        state as state,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_user where flag != 3
+        <if test="null != openid">
+            and appletsOpenId = #{openid}
+        </if>
+    </select>
+
+
+    <select id="queryUserInfo" resultType="map">
+        select
+        a.id as id,
+        a.phone as phone,
+        a.nickName as nickName,
+        a.avatar as avatar,
+        DATE_FORMAT(a.birthday, '%Y-%m-%d') as birthday,
+        a.sex as sex,
+        a.isAuth as isAuth,
+        (select state from t_verified where userId = a.id order by insertTime desc limit 0,1) as verified,
+        a.name as name,
+        a.integral as integral,
+        a.emergencyContact as emergencyContact,
+        a.emergencyContactNumber as emergencyContactNumber,
+        a.balance as balance
+        from t_user a where 1 = 1
+        <if test="null != uid">
+            and a.id = #{uid}
+        </if>
+        <if test="null != phone">
+            and a.phone = #{phone}
+        </if>
+    </select>
+
+
+    <update id="setUrgentUser">
+        update t_user set emergencyContact = #{name}, emergencyContactNumber = #{phone} where id = #{uid}
+    </update>
+
+
+    <select id="queryRealName" resultType="map">
+        select
+        id as id,
+        userId as userId,
+        name as name,
+        idcode as idcode,
+        img1 as img1,
+        img2 as img2,
+        state as state
+        from t_verified where userId = #{uid} order by insertTime desc limit 0,1
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml
new file mode 100644
index 0000000..befd7d6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.User">
+		<id column="id" property="id" />
+		<result column="avatar" property="avatar" />
+		<result column="account" property="account" />
+		<result column="password" property="password" />
+		<result column="salt" property="salt" />
+		<result column="name" property="name" />
+		<result column="birthday" property="birthday" />
+		<result column="sex" property="sex" />
+		<result column="email" property="email" />
+		<result column="phone" property="phone" />
+		<result column="roleid" property="roleid" />
+		<result column="deptid" property="deptid" />
+		<result column="status" property="status" />
+		<result column="createtime" property="createtime" />
+		<result column="version" property="version" />
+	</resultMap>
+
+	<sql id="Base_Column_List">
+		id, account, name, birthday, sex, email, avatar,
+		phone, roleid,
+		deptid, status,
+		createtime, version
+	</sql>
+
+	<sql id="Base_Column_List_With_Pwd">
+		id, account, name, birthday,password, sex, email, avatar,
+		phone, roleid,salt,
+		deptid, status,
+		createtime, version
+	</sql>
+
+	<select id="selectUsers" resultType="map">
+		select
+		<include refid="Base_Column_List" />
+		from sys_user
+		where status != 3
+		<if test="name != null and name != ''">
+			and (phone like CONCAT('%',#{name},'%')
+			or account like CONCAT('%',#{name},'%')
+			or name like CONCAT('%',#{name},'%'))
+		</if>
+		<if test="deptid != null and deptid != 0">
+			and (deptid = #{deptid} or deptid in ( select id from sys_dept where pids like CONCAT('%[', #{deptid}, ']%') ))
+		</if>
+		<if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+			and (createTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+		</if>
+	</select>
+
+	<update id="setStatus">
+		update sys_user set status = #{status} where id =
+		#{userId}
+	</update>
+
+	<update id="changePwd">
+		update sys_user set password = #{pwd} where id =
+		#{userId}
+	</update>
+
+	<update id="setRoles">
+		update sys_user set roleid = #{roleIds} where id =
+		#{userId}
+	</update>
+
+	<select id="getByAccount" resultType="user">
+		select
+		<include refid="Base_Column_List_With_Pwd" />
+		from sys_user where account = #{account} and status != 3
+	</select>
+
+</mapper>
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserRedPacketRecordMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserRedPacketRecordMapper.xml
new file mode 100644
index 0000000..40cd667
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserRedPacketRecordMapper.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserRedPacketRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserRedPacketRecord">
+        <id column="id" property="id"/>
+        <result column="money" property="money"/>
+        <result column="expirationTime" property="expirationTime"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="companyId" property="companyId"/>
+        <result column="state" property="state"/>
+        <result column="endTime" property="endTime"/>
+        <result column="orderId" property="orderId"/>
+        <result column="orderType" property="orderType"/>
+        <result column="userId" property="userId"/>
+        <result column="redPacketActivityId" property="redPacketActivityId"/>
+    </resultMap>
+
+
+
+    <select id="query" resultType="UserRedPacketRecord">
+        select
+        id as id,
+        money as money,
+        expirationTime as expirationTime,
+        insertTime as insertTime,
+        companyId as companyId,
+        state as state,
+        orderId as orderId,
+        orderType as orderType,
+        userId as userId,
+        redPacketActivityId as redPacketActivityId
+        from t_user_red_packet_record where 1=1
+        <if test="null != uid">
+            and userId = #{uid}
+        </if>
+        <if test="null != companyId">
+            and companyId = #{companyId}
+        </if>
+        <if test="null != state">
+            and state = #{state}
+        </if>
+        <if test="null != orderType">
+            and orderType = #{orderType}
+        </if>
+        <if test="null != money">
+            and money &lt; #{money}
+        </if>
+        order by money desc limit 0, 1
+    </select>
+
+
+
+    <select id="query_" resultType="UserRedPacketRecord">
+        select
+        id as id,
+        money as money,
+        expirationTime as expirationTime,
+        insertTime as insertTime,
+        companyId as companyId,
+        state as state,
+        orderId as orderId,
+        orderType as orderType,
+        userId as userId,
+        redPacketActivityId as redPacketActivityId
+        from t_user_red_packet_record where 1=1
+        <if test="null != uid">
+            and userId = #{uid}
+        </if>
+        <if test="null != companyId">
+            and companyId = #{companyId}
+        </if>
+        <if test="null != state">
+            and state = #{state}
+        </if>
+        <if test="null != orderType">
+            and orderType = #{orderType}
+        </if>
+        <if test="null != money">
+            and money &lt; #{money}
+        </if>
+        order by insertTime desc limit 0, 1
+    </select>
+
+
+    <select id="queryMyRedEnvelope" resultType="map">
+        select
+        a.id as id,
+        a.money as money,
+        b.name as name
+        from t_user_red_packet_record a
+        left join t_company b on (a.companyId = b.id)
+        where a.state = 1
+        <if test="null != uid">
+            and a.userId = #{uid}
+        </if>
+        order by a.insertTime desc
+        <if test="null != pageNum and null != size">
+            limit #{pageNum}, #{size}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VerifiedMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VerifiedMapper.xml
new file mode 100644
index 0000000..be2b9e4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VerifiedMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.VerifiedMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Verified">
+        <id column="id" property="id"/>
+        <result column="userId" property="userId"/>
+        <result column="name" property="name"/>
+        <result column="idcode" property="idcode"/>
+        <result column="img1" property="img1"/>
+        <result column="img2" property="img2"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VersionManagementMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VersionManagementMapper.xml
new file mode 100644
index 0000000..b4e07a7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VersionManagementMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.VersionManagementMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.VersionManagement">
+        <id column="id" property="id"/>
+        <result column="url" property="url"/>
+        <result column="version" property="version"/>
+        <result column="content" property="content"/>
+        <result column="mandatory" property="mandatory"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="type" property="type"/>
+    </resultMap>
+
+
+    <select id="queryNewVersion" resultType="map">
+        select
+        id as id,
+        url as url,
+        content as content,
+        if(mandatory = 1, 1, 0) as mandatory,
+        version as version
+        from t_version_management where type = #{type} order by insertTime desc limit 0, 1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/WithdrawalMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/WithdrawalMapper.xml
new file mode 100644
index 0000000..69c8513
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/WithdrawalMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.WithdrawalMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Withdrawal">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="handleTime" property="handleTime" />
+        <result column="balance" property="balance" />
+        <result column="money" property="money" />
+        <result column="state" property="state" />
+        <result column="remark" property="remark" />
+        <result column="code" property="code" />
+        <result column="name" property="name" />
+        <result column="userType" property="userType" />
+        <result column="insertTime" property="insertTime" />
+        <result column="flag" property="flag" />
+        <result column="withdrawalType" property="withdrawalType" />
+        <result column="serialNo" property="serialNo" />
+    </resultMap>
+
+
+    <select id="queryWithdrawal" resultType="map">
+        select
+        id as id,
+        DATE_FORMAT(insertTime, '%Y.%m.%d') as insertTime,
+        money as money,
+        ('银行卡提现') as name,
+        remark as remark,
+        state as state
+        from t_pub_withdrawal where flag != 3 and userType = #{userType} and userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java
new file mode 100644
index 0000000..508b65d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java
@@ -0,0 +1,54 @@
+package com.stylefeng.guns.modular.system.factory;
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.transfer.UserDto;
+import org.springframework.beans.BeanUtils;
+
+/**
+ * 用户创建工厂
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 22:43
+ */
+public class UserFactory {
+
+    public static User createUser(UserDto userDto) {
+        if (userDto == null) {
+            return null;
+        } else {
+            User user = new User();
+            BeanUtils.copyProperties(userDto, user);
+            return user;
+        }
+    }
+
+    public static User editUser(UserDto newUser, User oldUser) {
+        if (newUser == null || oldUser == null) {
+            return oldUser;
+        } else {
+            if (ToolUtil.isNotEmpty(newUser.getAvatar())) {
+                oldUser.setAvatar(newUser.getAvatar());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getName())) {
+                oldUser.setName(newUser.getName());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getBirthday())) {
+                oldUser.setBirthday(newUser.getBirthday());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getDeptid())) {
+                oldUser.setDeptid(newUser.getDeptid());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getSex())) {
+                oldUser.setSex(newUser.getSex());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getEmail())) {
+                oldUser.setEmail(newUser.getEmail());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getPhone())) {
+                oldUser.setPhone(newUser.getPhone());
+            }
+            return oldUser;
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/KaiPiaoUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/KaiPiaoUtil.java
new file mode 100644
index 0000000..7e0adb9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/KaiPiaoUtil.java
@@ -0,0 +1,118 @@
+package com.stylefeng.guns.modular.system.kaipiao;
+
+import cn.hutool.json.JSONUtil;
+import com.stylefeng.guns.modular.system.kaipiao.email.KaiPiaoEmail;
+import com.stylefeng.guns.modular.system.kaipiao.entity.InvoiceData;
+import com.stylefeng.guns.modular.system.kaipiao.entity.InvoiceDetails;
+import com.stylefeng.guns.modular.system.kaipiao.entity.MaterialInfo;
+import com.stylefeng.guns.modular.system.kaipiao.entity.ReturnData;
+import com.stylefeng.guns.modular.system.kaipiao.util.Jisuan;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class KaiPiaoUtil {
+    public static void main(String[] args) {
+        String money = "1.00";
+
+        InvoiceData invoiceData  = new InvoiceData();
+        //设置纳税人识别号
+        invoiceData.setNsrsbh("91320682MADJQBFY3G");
+
+        InvoiceDetails invoiceDetails = new InvoiceDetails();
+        //设置订单号
+        invoiceDetails.setOrderNo("9d957b7229de4496ae487d1asdf15snwasc");
+        //设置发票种类 01专票 02普票
+//        invoiceDetails.setFppzDm("02");
+        //设置销售方税号
+//        invoiceDetails.setXsfnsrsbh("");
+        //设置销售方名称
+//        invoiceDetails.setXsfmc("");
+        //设置销售方地址
+//        invoiceDetails.setXsfdz("");
+        //设置销售方电话
+//        invoiceDetails.setXsflxdh("");
+        //设置销售方开户行
+//        invoiceDetails.setXsfkhh("");
+        //设置销售方银行账号
+//        invoiceDetails.setXsfyhzh("");
+        //设置购买方税号
+        invoiceDetails.setGmfnsrsbh("91110105101781969R");
+        //设置购买方名称
+        invoiceDetails.setGmfmc("北京市红牛维他命饮料有限责任公司");
+        //设置合计金额
+        invoiceDetails.setHjje(Jisuan.jszjToJe(money));
+        //设置合计税额
+        invoiceDetails.setHjse(Jisuan.jianfa(money,Jisuan.jszjToJe(money)));
+        //设置价税总计
+        invoiceDetails.setJshj(money);
+        //设置开票方纳税人识别号
+//        invoiceDetails.setKpfnsrsbh("");
+        //设置明细行数
+//        invoiceDetails.setSpsl("1");
+        //设置含税标识
+//        invoiceDetails.setHsbz("2");
+
+
+        //新建一个明细表
+        List<MaterialInfo> materialInfos = new ArrayList<>();
+        MaterialInfo materialInfo = new MaterialInfo();
+
+//        materialInfo.setXmmc("运输服务*客运服务费");
+//        materialInfo.setHwhyslwfwmc("运输服务*客运服务费");
+        //设置含税单价
+        materialInfo.setHsdj("1.00");
+        //设置不含税金额
+        materialInfo.setJe("0.97");
+        //设置含税金额
+        materialInfo.setHsje("1.00");
+        //设置税率
+        materialInfo.setSlv("0.03");
+        //设置税额
+        materialInfo.setSe(Jisuan.jianfa("1.00",Jisuan.jszjToJe("1.00")));
+        materialInfos.add(materialInfo);
+        invoiceDetails.setMxzbList(materialInfos);
+        invoiceData.setData(invoiceDetails);
+        System.err.println(JSONUtil.parse(invoiceData));
+        //开票
+
+
+//        String testData = "{\"nsrsbh\": \"91440400MA4WKU0K8A\", \"data\": {\"orderNo\": \"9d957b7229de4496ae487d1041415bbwasc\",\"fppzDm\": \"02\",\"tdyslxDm\":\"\",\"xsfnsrsbh\": \"91440400MA4WKU0K8A\",\"xsfmc\": \"广东欣档科技有限公司\",\"xsfdz\": \"珠海市高新区唐家湾镇大学路101号3栋102号\",\"xsflxdh\": \"13902872568\",\"xsfkhh\": \"中国建设银行股份有限公司珠海市分行营业部\",\"xsfyhzh\": \"22050164864700000347\",\"gmfnsrsbh\": \"91110105101781969R\",\"gmfmc\": \"北京市红牛维他命饮料有限责任公司\",\"gmfdz\": \"北京市朝阳区建国门外大街永安东里8号\",\"gmflxdh\": \"010-85288069\",\"gmfkhh\": \"中国工商银行北京商务中心区支行国贸大厦分理处\",\"gmfyhzh\": \"0200041609067021427\",\"kpr\": \"\",\"skr\": \"\",\"fhr\": \"\",\"hjje\": 69.29,\"hjse\": 9.01,\"jehj\": 0,\"jshj\": \"78.30\",\"kce\": 0,\"kpfnsrsbh\": \"91440400MA4WKU0K8A\",\"spsl\": 1,\"bz\": \"\",\"hsbz\": \"2\",\"sfzsgmfyhzh\": \"N\",\"sfzsxsfyhzh\": \"N\",\"mxzbList\": [{\"xh\": 1,\"fphxzDm\": \"0\",\"xmmc\": \"唯他可可椰子水/凤梨口味/330ML\",\"hwhyslwfwmc\": \"*软饮料*唯他可可椰子水/凤梨口味/330ML\",\"sphfwssflhbbm\": \"1030307020000000000\",\"spfwjc\": \"软饮料\",\"ggxh\": \"12瓶/箱\",\"dw\": \"箱\",\"spsl\": \"1\",\"dj\": 69.29,\"je\": 69.29,\"hsje\": 78.3,\"slv\": \"0.13\",\"se\": 9.01,\"kce\": \"\",\"hsdj\": 78.3,\"bhsdj\": 69.29,\"bhsje\": 69.29}]}}";
+        String testData = JSONUtil.toJsonStr(invoiceData);
+        SptBlueInvOpenDemo blueInvOpenDemo = new SptBlueInvOpenDemo();
+        System.err.println(invoiceData);
+        ReturnData returnData = blueInvOpenDemo.blueInvOpen(testData, "43b9ef0799534e298ca2b6b73a6cab48", "31s1m151s161");
+        System.out.println(returnData);
+
+        //拿文件地址
+//        String testData = "{\n" +
+//                "\t\"nsrsbh\": \"91440400MA4WKU0K8A\",\n" +
+//                "\t\"fphm\": \"24442000000000391916\",\n" +
+//                "\t\"kprq\": \"2024-05-29 11:52:25\"\n" +
+//                "}";
+//        SptBlueInvOpenDemo blueInvOpenDemo = new SptBlueInvOpenDemo();
+//        ReturnData returnData = blueInvOpenDemo.getUrl(testData, "43b9ef0799534e298ca2b6b73a6cab48", "31s1m151s161");
+//        System.out.println(returnData);
+
+//        发邮件
+//        String testData = "{\n" +
+//                "\t\"nsrsbh\": \"91440400MA4WKU0K8A\",\n" +
+//                "\t\"fphm\": \"24442000000000372439\",\n" +
+//                "\t\"sjyx\": \"2855143437@qq.com\"\n" +
+//                "}";
+//        SptBlueInvOpenDemo blueInvOpenDemo = new SptBlueInvOpenDemo();
+//        ReturnData returnData = blueInvOpenDemo.toEmail(testData, "43b9ef0799534e298ca2b6b73a6cab48", "31s1m151s161");
+//        System.out.println(returnData);
+
+//        查结果
+//        String testData = "{\n" +
+//                "\t\"nsrsbh\": \"91440400MA4WKU0K8A\",\n" +
+//                "\t\"jflsh\": \"3230867364023107584\"\n" +
+//                "}";
+//        SptBlueInvOpenDemo blueInvOpenDemo = new SptBlueInvOpenDemo();
+//        ReturnData returnData = blueInvOpenDemo.checkEamil(testData, "43b9ef0799534e298ca2b6b73a6cab48", "31s1m151s161");
+//        System.out.println(returnData);
+
+
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/SptBlueInvOpenDemo.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/SptBlueInvOpenDemo.java
new file mode 100644
index 0000000..675c071
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/SptBlueInvOpenDemo.java
@@ -0,0 +1,154 @@
+package com.stylefeng.guns.modular.system.kaipiao;
+
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.modular.system.kaipiao.entity.ReturnData;
+import com.stylefeng.guns.modular.system.kaipiao.util.CreatAndSendUtil;
+
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+public class SptBlueInvOpenDemo {
+
+    /**
+     * 调用数票通接口开具蓝字发票
+     * @param dataJson 需要开具发票的订单信息及明细组成的json字符串,具体字段见接口对接文档
+     * @param appSecret 企业密钥 由江苏航信分配获取
+     * @param appId 企业标识 由江苏航信分配获取
+     * @return ReturnData
+     */
+    public static ReturnData blueInvOpen(String dataJson, String appSecret, String appId){
+        /*
+           TODO
+            校验订单流水号(orderNo),不能为空且不能与已开票据的重复
+         */
+
+        //接口代码详见各业务接口说明 全电蓝字发票开具为:SALE.DZSJLZINVOPEN
+        String interfaceCode = "SALE.DZSJLZINVOPEN";
+
+        ReturnData returnData = CreatAndSendUtil.creatAndSend(dataJson, appSecret, appId, interfaceCode);
+
+        if (returnData != null){
+            if ("0000".equals(returnData.getReturn_info().getReturn_code())){
+                String data = returnData.getData();
+                byte[] decode = Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8));
+                returnData.setData(new String(decode));
+                JSONObject jsonObject = JSONObject.parseObject(new String(decode));
+//                System.out.println("发票号码:" + jsonObject.get("fphm"));
+//                System.out.println("开票日期:" + jsonObject.get("kprq"));
+            /*
+                TODO
+                 开票成功,改变数据库中的数据等操作
+             */
+            }else {
+            /*
+                 开票失败,return_message查看失败原因
+             */
+            }
+            return returnData;
+        }
+        return null;
+    }
+
+
+    public static ReturnData getUrl(String dataJson, String appSecret, String appId){
+        /*
+           TODO
+            校验订单流水号(orderNo),不能为空且不能与已开票据的重复
+         */
+
+        //接口代码详见各业务接口说明 全电蓝字发票开具为:SALE.DZSJLZINVOPEN
+        String interfaceCode = "SALE.QDINVDOWNURL";
+
+        ReturnData returnData = CreatAndSendUtil.creatAndSend(dataJson, appSecret, appId, interfaceCode);
+
+        if (returnData != null){
+            if ("0000".equals(returnData.getReturn_info().getReturn_code())){
+                String data = returnData.getData();
+                byte[] decode = Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8));
+                returnData.setData(new String(decode));
+                JSONObject jsonObject = JSONObject.parseObject(new String(decode));
+//                System.out.println("发票号码:" + jsonObject.get("fphm"));
+//                System.out.println("开票日期:" + jsonObject.get("kprq"));
+            /*
+                TODO
+                 开票成功,改变数据库中的数据等操作
+             */
+            }else {
+            /*
+                 开票失败,return_message查看失败原因
+             */
+            }
+            return returnData;
+        }
+        return null;
+    }
+
+    public static ReturnData toEmail(String dataJson, String appSecret, String appId){
+        /*
+           TODO
+            校验订单流水号(orderNo),不能为空且不能与已开票据的重复
+         */
+
+        //接口代码详见各业务接口说明 全电蓝字发票开具为:SALE.DZSJLZINVOPEN
+        String interfaceCode = "SALE.OWNEMAILDELIVERY";
+
+        ReturnData returnData = CreatAndSendUtil.creatAndSend(dataJson, appSecret, appId, interfaceCode);
+
+        if (returnData != null){
+            if ("0000".equals(returnData.getReturn_info().getReturn_code())){
+                String data = returnData.getData();
+                byte[] decode = Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8));
+                returnData.setData(new String(decode));
+                JSONObject jsonObject = JSONObject.parseObject(new String(decode));
+//                System.out.println("发票号码:" + jsonObject.get("fphm"));
+//                System.out.println("开票日期:" + jsonObject.get("kprq"));
+            /*
+                TODO
+                 开票成功,改变数据库中的数据等操作
+             */
+            }else {
+            /*
+                 开票失败,return_message查看失败原因
+             */
+            }
+            return returnData;
+        }
+        return null;
+    }
+
+    public static ReturnData checkEamil(String dataJson, String appSecret, String appId){
+        /*
+           TODO
+            校验订单流水号(orderNo),不能为空且不能与已开票据的重复
+         */
+
+        //接口代码详见各业务接口说明 全电蓝字发票开具为:SALE.DZSJLZINVOPEN
+        String interfaceCode = "SALE.OWNEMAILDELIVERYQUERY";
+
+        ReturnData returnData = CreatAndSendUtil.creatAndSend(dataJson, appSecret, appId, interfaceCode);
+
+        if (returnData != null){
+            if ("0000".equals(returnData.getReturn_info().getReturn_code())){
+                String data = returnData.getData();
+                byte[] decode = Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8));
+                returnData.setData(new String(decode));
+                JSONObject jsonObject = JSONObject.parseObject(new String(decode));
+//                System.out.println("发票号码:" + jsonObject.get("fphm"));
+//                System.out.println("开票日期:" + jsonObject.get("kprq"));
+            /*
+                TODO
+                 开票成功,改变数据库中的数据等操作
+             */
+            }else {
+            /*
+                 开票失败,return_message查看失败原因
+             */
+            }
+            return returnData;
+        }
+        return null;
+    }
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/email/KaiPiaoEmail.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/email/KaiPiaoEmail.java
new file mode 100644
index 0000000..fcb1500
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/email/KaiPiaoEmail.java
@@ -0,0 +1,86 @@
+package com.stylefeng.guns.modular.system.kaipiao.email;
+
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.modular.system.kaipiao.entity.GlobalInfo;
+import com.stylefeng.guns.modular.system.kaipiao.util.CreatAndSendUtil;
+import org.springframework.util.Base64Utils;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Base64;
+
+public class KaiPiaoEmail {
+    /** 带格式的正文内容 */
+    public static String emailContent(){
+        StringBuilder contentBuilder = new StringBuilder();
+        contentBuilder.append("<h2>尊敬的友商,您好!</h2>");
+        contentBuilder.append("<br/>");
+        contentBuilder.append("<br/>");
+        contentBuilder.append("购买方名称:某某某公司<br/>");
+        contentBuilder.append("发票号码 : 11223344<br/>");
+        contentBuilder.append("开具日期 : 2023-09-26<br/>");
+        contentBuilder.append("价税合计 : 100¥<br/>");
+        contentBuilder.append("<br/>");
+        contentBuilder.append("<br/>");
+        contentBuilder.append("<br/>");
+        contentBuilder.append("<hr>");
+        contentBuilder.append("您好!您已接收到全面数字化的电子发票。目前,全面数字化的电子发票在全国部分省(区、市)试点推广," +
+                "其法律效力、基本用途等与现有纸质发票相同。如您在办理涉及数电票业务的过程中遇到问题," +
+                "可以拨打当地12366纳税服务热线或到就近办税服务厅进行咨询或反馈意见建议,我们将竭诚帮助您解决相关问题。");
+        return contentBuilder.toString();
+    }
+    // 调用邮件代发接口时,需要的内层数据
+    public static String agentEmailData(){
+        JSONObject str = new JSONObject();
+        str.put("subject","由power项目代发qq邮箱,经由jxfw项目,到163邮箱的的邮件");
+        str.put("content",emailContent());
+        str.put("nsrsbh","91440400MA4WKU0K8A");
+        str.put("agentEmail","2855143437@qq.com");
+        str.put("targetEmail","420516635@qq.com");
+        str.put("host","smtp.qq.com");
+        str.put("port","587");
+//        str.put("fileBytes",fjBytes);
+//        str.put("fileName","通用蓝票.pdf");
+        str.put("agentPasscode","rzkoxcfzwtizddaj");
+// base64编码
+        String data = Base64Utils.encodeToString(str.toString().getBytes());
+        return data;
+    }
+    /**
+     * 构建通用请求信息体
+     * @param interfaceCode 接口code
+     * @param innerData 内部请求信息
+     *
+     * */
+    public static JSONObject createParam(String interfaceCode, String innerData){
+
+        // 对报名信息做签名认证操作
+
+        //生成报文globalInfo
+        GlobalInfo globalInfo = CreatAndSendUtil.createGlobalInfo(interfaceCode, "31s1m151s161");
+        //生成数据签名
+        String dataSign = CreatAndSendUtil.createDataSign(globalInfo.toString(), innerData, "43b9ef0799534e298ca2b6b73a6cab48");
+
+        JSONObject param = new JSONObject();
+        param.put("global_info",globalInfo);
+        // 具体接口需要的报文信息
+        param.put("data",innerData);
+        param.put("data_sign",dataSign);
+        return param;
+    }
+    public static JSONObject sendEmail() throws IOException {
+        RestTemplate restTemplate = new RestTemplate();
+// url换成真实地址,这里用的是本地地址
+        String url = "https://csfw.jsaisino.com/csapp/invincomeservice";
+// 附件文件经过一次编码,byte[]类型数据经过一次编码
+//        String enCodeData =  Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get("D:\\MyText\\正常蓝票.pdf")));
+// createParam()方法是构建post请求的方法,自由实现
+        JSONObject param = createParam("SALE.DZSJSENDEMAIL",agentEmailData());
+        String result = restTemplate.postForObject(url, param, String.class);
+        System.err.println(result);
+        JSONObject resultJsonObject = JSONObject.parseObject(result);
+        return resultJsonObject;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/ChargeInfo.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/ChargeInfo.java
new file mode 100644
index 0000000..978ad5e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/ChargeInfo.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.kaipiao.entity;
+
+import lombok.Data;
+
+@Data
+    public  class ChargeInfo {
+
+        private String xh;
+        private String pzlx;
+        private String fpdm;
+        private String fphm;
+        private String zzfphm;
+        private String pzhm;
+        private String kjrq;
+        private String hjje;
+        private String kce;
+        private String bz;
+        private String ly;
+        private String bckcje;
+        private String pzhjje;
+
+        // getters and setters
+
+
+        // ... similar getters and setters for other fields ...
+    }
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/GlobalInfo.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/GlobalInfo.java
new file mode 100644
index 0000000..9af7f64
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/GlobalInfo.java
@@ -0,0 +1,56 @@
+package com.stylefeng.guns.modular.system.kaipiao.entity;
+
+import lombok.Data;
+
+@Data
+public class GlobalInfo {
+
+    /**
+     * 应用代码
+     */
+    public String application_code;
+
+    /**
+     * 接口代码
+     */
+    public String interface_code;
+
+    /**
+     * 版本号
+     */
+    public String version;
+
+    /**
+     * 企业简称
+     */
+    public String app_abbr;
+
+    /**
+     * 企业标识
+     */
+    public String app_id;
+
+    /**
+     * 数据流水号
+     */
+    public String data_id;
+
+    /**
+     * 重写toString方法,用于签名
+     * @see Object#toString()
+     */
+    @Override
+    public String toString() {
+
+        String str = "{"
+                + "\"global_info\":{"
+                + "\"application_code\":\"" + this.application_code + "\","
+                + "\"interface_code\":\""  + this.interface_code + "\","
+                + "\"version\":\"" + this.version + "\","
+                + "\"app_abbr\":\"" + this.app_abbr + "\","
+                + "\"app_id\":\""  + this.app_id + "\","
+                + "\"data_id\":\"" + this.data_id + "\""
+                + "},";
+        return str;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/InvoiceData.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/InvoiceData.java
new file mode 100644
index 0000000..aaa54a9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/InvoiceData.java
@@ -0,0 +1,14 @@
+package com.stylefeng.guns.modular.system.kaipiao.entity;
+
+import lombok.Data;
+
+import java.util.List;
+@Data
+public class InvoiceData {
+
+    private String nsrsbh ="";
+    private InvoiceDetails data;
+
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/InvoiceDetails.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/InvoiceDetails.java
new file mode 100644
index 0000000..16db8b6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/InvoiceDetails.java
@@ -0,0 +1,56 @@
+package com.stylefeng.guns.modular.system.kaipiao.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+    public  class InvoiceDetails {
+
+        private String orderNo ="";
+        private String fppzDm ="02";
+        private String tdyslxDm ="09";
+//        private String cezslxDm ="";
+        //销售方税号
+        private String xsfnsrsbh = "91320682MADJQBFY3G";
+        //销售方名称
+        private String xsfmc ="江苏未来出行服务有限公司";
+        //设置销售方地址
+        private String xsfdz ="如皋市城南街道幸福河西路9号10幢三层3101室";
+        //设置销售方电话
+        private String xsflxdh ="13902872568";
+        //设置销售方开户行
+        private String xsfkhh = "中国银行如皋海阳中路支行";
+        //销售方银行账号
+        private String xsfyhzh = "466380715791";
+        private String gmfnsrsbh = "";
+        private String gmfmc = "";
+//        private String gmfdz = "";
+//        private String gmflxdh = "";
+//        private String gmfkhh ="";
+//        private String gmfyhzh = "";
+//        private String kpr = "";
+//        private String skr = "";
+//        private String fhr = "";
+        private String hjje = "";
+        private String hjse = "";
+//        private String jehj = "";
+        private String jshj = "";
+//        private String kce = "";
+        private String kpfnsrsbh = "91320682MADJQBFY3G";
+        private String spsl = "1";
+//        private String bz = "";
+        private String hsbz = "2";
+//        private String sfwzzfp ;
+//        private String zpFppzDm ;
+        private String fpdm = "";
+        private String zzfphm = "";
+//        private String kjly ;
+//        private String gmfZrrbs = "";
+        private String sfzsgmfyhzh = "";
+        private String sfzsxsfyhzh = "";
+        private List<MaterialInfo> mxzbList;
+//        private List<ChargeInfo> cepzmxList;
+
+
+    }
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/MaterialInfo.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/MaterialInfo.java
new file mode 100644
index 0000000..a404130
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/MaterialInfo.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.kaipiao.entity;
+
+import lombok.Data;
+
+@Data
+public  class MaterialInfo {
+
+        private String xh ="1";
+        private String fphxzDm = "0";
+        private String xmmc = "客运服务费";
+        private String spfwjc = "运输服务";
+        private String sphfwssflhbbm = "3010101020203000000";
+        private String hwhyslwfwmc = "运输服务*客运服务费";
+//        private String ggxh = "";
+//        private String dw = "";
+//        private String spsl = "";
+//        private String dj = "";
+        private String hsdj = "";
+        private String je = "";
+        private String hsje = "";
+        private String slv = "";
+        private String se = "";
+        private String kce = "";
+        private String lslbz = "";
+        private String xsyhzcbz = "";
+        private String ssyhzclxDm = "01";
+        private String tdzsfsDm = "05";
+        private String zzstsgl = "01";
+
+    }
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/ReturnData.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/ReturnData.java
new file mode 100644
index 0000000..473737e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/entity/ReturnData.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.kaipiao.entity;
+
+import lombok.Data;
+
+@Data
+public class ReturnData {
+
+    /**
+     * 返回结果
+     */
+    private ReturnInfo return_info;
+
+    /**
+     * 返回数据 业务接口响应报文的Base64编码
+     */
+    private String data;
+
+    @Data
+    public static class ReturnInfo {
+
+        /**
+         * 返回代码 0000:成功,其他:失败
+         */
+        private String return_code;
+
+        /**
+         * 返回信息
+         */
+        private String return_message;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/util/CreatAndSendUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/util/CreatAndSendUtil.java
new file mode 100644
index 0000000..7d1438e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/util/CreatAndSendUtil.java
@@ -0,0 +1,106 @@
+package com.stylefeng.guns.modular.system.kaipiao.util;
+
+
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.modular.system.kaipiao.entity.GlobalInfo;
+import com.stylefeng.guns.modular.system.kaipiao.entity.ReturnData;
+import org.springframework.util.Base64Utils;
+import cn.hutool.core.codec.Base64;
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Objects;
+
+public class CreatAndSendUtil {
+
+    /**
+     * 通用调用数票通接口
+     * @param dataJson 业务接口请求报文json,具体字段见接口对接文档
+     * @param appSecret 企业密钥 由江苏航信分配获取
+     * @param appId 企业标识 由江苏航信分配获取
+     * @param interfaceCode 接口代码 接口代码详见接口对接文档
+     * @return ReturnData
+     */
+    public static ReturnData creatAndSend(String dataJson, String appSecret, String appId, String interfaceCode){
+        ReturnData returnData = new ReturnData();
+        ReturnData.ReturnInfo returnInfo = new ReturnData.ReturnInfo();
+
+        //对json进行Base64编码
+        String dataBase64Str = Base64.encode(dataJson, "UTF-8");
+        //生成报文globalInfo
+        GlobalInfo globalInfo = CreatAndSendUtil.createGlobalInfo(interfaceCode, appId);
+        //生成数据签名
+        String dataSign = CreatAndSendUtil.createDataSign(globalInfo.toString(), dataBase64Str, appSecret);
+        //组装请求报文
+        JSONObject jsonObj = new JSONObject();
+        jsonObj.put("global_info", globalInfo);
+        jsonObj.put("data", dataBase64Str);
+        jsonObj.put("data_sign", dataSign);
+        String qqbw = JSONObject.toJSONString(jsonObj);
+        //System.out.println(qqbw);
+        //发送请求,数票通url见接口对接文档
+        String sptUrl = "https://csfw.jsaisino.com/csapp/invincomeservice";
+        String returnStr = "";
+        try {
+            returnStr = HttpUtil.post(sptUrl, qqbw);
+        } catch (Exception e) {
+            e.printStackTrace();
+            returnInfo.setReturn_code("9998");
+            returnInfo.setReturn_message("http接口请求异常:" + e.getMessage());
+            returnData.setReturn_info(returnInfo);
+            return returnData;
+        }
+        if (!Objects.equals(returnStr, "")){
+            //将调用返回的数据进行转换
+            JSONObject returnObj = JSONObject.parseObject(returnStr);
+            returnData = JSONObject.toJavaObject(returnObj, ReturnData.class);
+            return returnData;
+        }
+        return returnData;
+    }
+
+    /**
+     * 创建外层报文
+     * @param appId 企业标识 由江苏航信分配获取
+     * @param interfaceCode 接口代码 接口代码详见接口对接文档
+     * @return ReturnData
+     */
+    public static GlobalInfo createGlobalInfo(String interfaceCode, String appId){
+        GlobalInfo globalInfo = new GlobalInfo();
+        globalInfo.setApplication_code("JXFW");
+        globalInfo.setInterface_code(interfaceCode);
+        //版本 目前为1.0
+        globalInfo.setVersion("1.0");
+        globalInfo.setApp_abbr("");
+        //企业标识 由江苏航信分配获取
+        globalInfo.setApp_id(appId);
+        //数据流水号 企业标识+日期(yyyyMMdd)+序列号
+        globalInfo.setData_id("");
+        return globalInfo;
+    }
+
+    /**
+     * 对报文进行加密,生成数据签名
+     * @param globalInfoStr 外层报文Json
+     * @param data 数据 业务接口请求报文的Base64编码
+     * @param appSecret 企业密钥 由江苏航信分配获取
+     * @return String
+     */
+    public static String createDataSign(String globalInfoStr, String data, String appSecret){
+        String str = globalInfoStr + "\"data\":\"" + data + "\"," + "\"data_sign\":\"" + "\"" + "}";
+        byte[] byteKey = appSecret.getBytes(StandardCharsets.UTF_8);
+        SecretKeySpec secretKeySpec = new SecretKeySpec(byteKey, "HmacSHA512");
+        byte[] byteData = null;
+        try {
+            Mac mac = Mac.getInstance("HmacSHA512");
+            mac.init(secretKeySpec);
+            byteData = mac.doFinal(str.getBytes(StandardCharsets.UTF_8));
+        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
+            e.printStackTrace();
+        }
+        return Base64Utils.encodeToString(byteData);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/util/Jisuan.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/util/Jisuan.java
new file mode 100644
index 0000000..2224e3e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/kaipiao/util/Jisuan.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.kaipiao.util;
+
+import java.math.BigDecimal;
+
+public class Jisuan {
+    public static String jszjToJe(String inputStr) {
+        BigDecimal input = new BigDecimal(inputStr);
+        BigDecimal divisor = new BigDecimal("1.03");
+        BigDecimal result = input.divide(divisor, 2, BigDecimal.ROUND_HALF_DOWN);
+       return result.toPlainString();  // 输出:0.97
+    }
+
+    public static String jianfa(String num1Str,String num2Str) {
+        BigDecimal num1 = new BigDecimal(num1Str);
+        BigDecimal num2 = new BigDecimal(num2Str);
+        BigDecimal result = num1.subtract(num2);
+        result = result.setScale(2, BigDecimal.ROUND_HALF_DOWN);  // 保留两位小数并向下取整
+
+        return result.toPlainString();  // 输出:0.97
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Advertisement.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Advertisement.java
new file mode 100644
index 0000000..6f8145a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Advertisement.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableName;
+
+/**
+ * 广告
+ */
+@TableName("t_advertisement")
+public class Advertisement extends BaseBean {
+    /**
+     * 广告名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 图片路径
+     */
+    @TableField("imgUrl")
+    private String imgUrl;
+    /**
+     * 广告类型(1:弹窗,2:首页底部)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 是否跳转(1:是,2:否)
+     */
+    @TableField("isJump")
+    private Integer isJump;
+    /**
+     * 跳转类型(1:外部,2:内部)
+     */
+    @TableField("jumpType")
+    private Integer jumpType;
+    /**
+     * 跳转地址
+     */
+    @TableField("jumpUrl")
+    private String jumpUrl;
+    /**
+     * 文本内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 状态(1=已上线,2=已下线)
+     * @return
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 所属省id
+     * @return
+     */
+    @TableField("provinceId")
+    private Integer provinceId;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getIsJump() {
+        return isJump;
+    }
+
+    public void setIsJump(Integer isJump) {
+        this.isJump = isJump;
+    }
+
+    public Integer getJumpType() {
+        return jumpType;
+    }
+
+    public void setJumpType(Integer jumpType) {
+        this.jumpType = jumpType;
+    }
+
+    public String getJumpUrl() {
+        return jumpUrl;
+    }
+
+    public void setJumpUrl(String jumpUrl) {
+        this.jumpUrl = jumpUrl;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "Advertisement{" +
+                "name='" + name + '\'' +
+                ", imgUrl='" + imgUrl + '\'' +
+                ", type=" + type +
+                ", isJump=" + isJump +
+                ", jumpType=" + jumpType +
+                ", jumpUrl='" + jumpUrl + '\'' +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Agreement.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Agreement.java
new file mode 100644
index 0000000..0ed3c3c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Agreement.java
@@ -0,0 +1,59 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableName;
+
+/**
+ * 平台协议
+ */
+@TableName("t_agreement")
+public class Agreement extends BaseBean {
+    /**
+     * 使用范围(1=用户,2=司机)
+     */
+    @TableField("useType")
+    private Integer useType;
+    /**
+     * 协议内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 类型(1:隐私协议,2:用户协议,3:用户指南,4:法律条款,5:关于我们,6=注册协议,7=取消订单说明,8=充值领券规则设置,9=司机注册协议,10=改派说明,11=跨城出行乘车须知,12:常见问题,13:计价规则,14:包车协议,15:小件物流协议)
+     */
+    @TableField("type")
+    private Integer type;
+
+    public Integer getUseType() {
+        return useType;
+    }
+
+    public void setUseType(Integer useType) {
+        this.useType = useType;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return "Agreement{" +
+                "useType=" + useType +
+                ", content='" + content + '\'' +
+                ", type=" + type +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/AliSms.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/AliSms.java
new file mode 100644
index 0000000..a443998
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/AliSms.java
@@ -0,0 +1,8 @@
+package com.stylefeng.guns.modular.system.model;
+
+import lombok.Data;
+
+@Data
+public class AliSms {
+    private String code;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/BaseBean.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/BaseBean.java
new file mode 100644
index 0000000..a11c39e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/BaseBean.java
@@ -0,0 +1,107 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+public class BaseBean {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 1:正常,2:停用,3:删除
+     */
+    @TableField("flag")
+    private Integer flag;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 添加人员
+     */
+    @TableField("insertUser")
+    private Integer insertUser;
+    /**
+     * 修改时间
+     */
+    @TableField("updateTime")
+    private Date updateTime;
+    /**
+     * 修改人员
+     */
+    @TableField("updateUser")
+    private Integer updateUser;
+
+    public BaseBean() {
+        Date date = new Date();
+        this.flag = 1;
+        this.insertTime = date;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUser() {
+        return insertUser;
+    }
+
+    public void setInsertUser(Integer insertUser) {
+        this.insertUser = insertUser;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(Integer updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    @Override
+    public String toString() {
+        return "BaseBean{" +
+                "id=" + id +
+                ", flag=" + flag +
+                ", insertTime=" + insertTime +
+                ", insertUser=" + insertUser +
+                ", updateTime=" + updateTime +
+                ", updateUser=" + updateUser +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CancleOrder.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CancleOrder.java
new file mode 100644
index 0000000..d379e59
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CancleOrder.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 取消订单设置
+ */
+@TableName("t_sys_cancle_order")
+public class CancleOrder {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 时间(分钟)
+     */
+    @TableField("minuteNum")
+    private Integer minuteNum;
+    /**
+     * 金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 类型(1=取消,2=预约取消)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 订单类型(1=专车,2=出租车)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getMinuteNum() {
+        return minuteNum;
+    }
+
+    public void setMinuteNum(Integer minuteNum) {
+        this.minuteNum = minuteNum;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    @Override
+    public String toString() {
+        return "CancleOrder{" +
+                "id=" + id +
+                ", companyId=" + companyId +
+                ", minuteNum=" + minuteNum +
+                ", money=" + money +
+                ", type=" + type +
+                ", orderType=" + orderType +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Car.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Car.java
new file mode 100644
index 0000000..bdc49e1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Car.java
@@ -0,0 +1,272 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 车辆
+ */
+@TableName("t_car")
+public class Car {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 是否是平台车辆(1=是,2=否)
+     */
+    @TableField("isPlatCar")
+    private Integer isPlatCar;
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 加盟商id
+     */
+    @TableField("franchiseeId")
+    private Integer franchiseeId;
+    /**
+     * 车辆颜色
+     */
+    @TableField("carColor")
+    private String carColor;
+    /**
+     * 车型id
+     */
+    @TableField("carModelId")
+    private Integer carModelId;
+    /**
+     * 车辆品牌id
+     */
+    @TableField("carBrandId")
+    private Integer carBrandId;
+    /**
+     * 车牌号
+     */
+    @TableField("carLicensePlate")
+    private String carLicensePlate;
+    /**
+     * 车辆照片
+     */
+    @TableField("carPhoto")
+    private String carPhoto;
+    /**
+     * 行驶证号
+     */
+    @TableField("drivingLicenseNumber")
+    private String drivingLicenseNumber;
+    /**
+     * 行驶证照片
+     */
+    @TableField("drivingLicensePhoto")
+    private String drivingLicensePhoto;
+    /**
+     * 年检到期时间
+     */
+    @TableField("annualInspectionTime")
+    private Date annualInspectionTime;
+    /**
+     * 保险照片
+     */
+    @TableField("insurancePhoto")
+    private String insurancePhoto;
+    /**
+     * 商业保险到期时间
+     */
+    @TableField("commercialInsuranceTime")
+    private Date commercialInsuranceTime;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 状态(1=正常,2=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加来源(1=司机注册 2=平台添加 3=分公司添加 4=加盟商添加)
+     */
+    @TableField("addType")
+    private Integer addType;
+    /**
+     * 公司id
+     */
+    @TableField("addObjectId")
+    private Integer addObjectId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getIsPlatCar() {
+        return isPlatCar;
+    }
+
+    public void setIsPlatCar(Integer isPlatCar) {
+        this.isPlatCar = isPlatCar;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getFranchiseeId() {
+        return franchiseeId;
+    }
+
+    public void setFranchiseeId(Integer franchiseeId) {
+        this.franchiseeId = franchiseeId;
+    }
+
+    public String getCarColor() {
+        return carColor;
+    }
+
+    public void setCarColor(String carColor) {
+        this.carColor = carColor;
+    }
+
+    public Integer getCarModelId() {
+        return carModelId;
+    }
+
+    public void setCarModelId(Integer carModelId) {
+        this.carModelId = carModelId;
+    }
+
+    public Integer getCarBrandId() {
+        return carBrandId;
+    }
+
+    public void setCarBrandId(Integer carBrandId) {
+        this.carBrandId = carBrandId;
+    }
+
+    public String getCarLicensePlate() {
+        return carLicensePlate;
+    }
+
+    public void setCarLicensePlate(String carLicensePlate) {
+        this.carLicensePlate = carLicensePlate;
+    }
+
+    public String getCarPhoto() {
+        return carPhoto;
+    }
+
+    public void setCarPhoto(String carPhoto) {
+        this.carPhoto = carPhoto;
+    }
+
+    public String getDrivingLicenseNumber() {
+        return drivingLicenseNumber;
+    }
+
+    public void setDrivingLicenseNumber(String drivingLicenseNumber) {
+        this.drivingLicenseNumber = drivingLicenseNumber;
+    }
+
+    public String getDrivingLicensePhoto() {
+        return drivingLicensePhoto;
+    }
+
+    public void setDrivingLicensePhoto(String drivingLicensePhoto) {
+        this.drivingLicensePhoto = drivingLicensePhoto;
+    }
+
+    public Date getAnnualInspectionTime() {
+        return annualInspectionTime;
+    }
+
+    public void setAnnualInspectionTime(Date annualInspectionTime) {
+        this.annualInspectionTime = annualInspectionTime;
+    }
+
+    public String getInsurancePhoto() {
+        return insurancePhoto;
+    }
+
+    public void setInsurancePhoto(String insurancePhoto) {
+        this.insurancePhoto = insurancePhoto;
+    }
+
+    public Date getCommercialInsuranceTime() {
+        return commercialInsuranceTime;
+    }
+
+    public void setCommercialInsuranceTime(Date commercialInsuranceTime) {
+        this.commercialInsuranceTime = commercialInsuranceTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getAddType() {
+        return addType;
+    }
+
+    public void setAddType(Integer addType) {
+        this.addType = addType;
+    }
+
+    public Integer getAddObjectId() {
+        return addObjectId;
+    }
+
+    public void setAddObjectId(Integer addObjectId) {
+        this.addObjectId = addObjectId;
+    }
+
+    @Override
+    public String toString() {
+        return "Car{" +
+                "id=" + id +
+                ", isPlatCar=" + isPlatCar +
+                ", companyId=" + companyId +
+                ", carColor='" + carColor + '\'' +
+                ", carModelId=" + carModelId +
+                ", carBrandId=" + carBrandId +
+                ", carLicensePlate='" + carLicensePlate + '\'' +
+                ", carPhoto='" + carPhoto + '\'' +
+                ", drivingLicenseNumber='" + drivingLicenseNumber + '\'' +
+                ", drivingLicensePhoto='" + drivingLicensePhoto + '\'' +
+                ", annualInspectionTime=" + annualInspectionTime +
+                ", commercialInsuranceTime=" + commercialInsuranceTime +
+                ", insertTime=" + insertTime +
+                ", state=" + state +
+                ", addType=" + addType +
+                ", addObjectId=" + addObjectId +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarService.java
new file mode 100644
index 0000000..bd040d9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarService.java
@@ -0,0 +1,76 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 车辆服务
+ */
+@TableName("t_car_service")
+public class CarService {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 车辆id
+     */
+    @TableField("carId")
+    private Integer carId;
+    /**
+     * 服务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 服务车型id
+     */
+    @TableField("serverCarModelId")
+    private Integer serverCarModelId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    @Override
+    public String toString() {
+        return "CarService{" +
+                "id=" + id +
+                ", carId=" + carId +
+                ", type=" + type +
+                ", serverCarModelId=" + serverCarModelId +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Company.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Company.java
new file mode 100644
index 0000000..97e6ac8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Company.java
@@ -0,0 +1,704 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 企业信息
+ */
+@TableName("t_company")
+@Data
+public class Company {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 是否经营专车(1=是,2=否)
+     */
+    @TableField("isSpe")
+    private Integer isSpe;
+    /**
+     * 是否经营出租车(1=是,2=否)
+     */
+    @TableField("isTaxi")
+    private Integer isTaxi;
+    /**
+     * 是否经营跨城(1=是,2=否)
+     */
+    @TableField("isCross")
+    private Integer isCross;
+    /**
+     * 是否经营跨城物流(1=是,2=否)
+     */
+    @TableField("isCrossLogistics")
+    private Integer isCrossLogistics;
+    /**
+     * 是否经营同城物流(1=是,2=否)
+     */
+    @TableField("isSameLogistics")
+    private Integer isSameLogistics;
+    /**
+     * 是否经营包车(1=是,2=否)
+     */
+    @TableField("isCharter")
+    private Integer isCharter;
+    /**
+     * 专车提成方式(1=比例,2=固定)
+     */
+    @TableField("isSpeFixedOrProportional")
+    private Integer isSpeFixedOrProportional;
+    /**
+     * 出租车提成方式(1=比例,2=固定)
+     */
+    @TableField("isTaxiFixedOrProportional")
+    private Integer isTaxiFixedOrProportional;
+    /**
+     * 跨城物流提成方式(1=比例,2=固定)
+     */
+    @TableField("isCrossLogisticsFixedOrProportional")
+    private Integer isCrossLogisticsFixedOrProportional;
+    /**
+     * 同城物流提成方式(1=比例,2=固定)
+     */
+    @TableField("isSameLogisticsFixedOrProportional")
+    private Integer isSameLogisticsFixedOrProportional;
+    /**
+     * 专车提成数值
+     */
+    @TableField("speMoney")
+    private Double speMoney;
+    /**
+     * 出租车提成数值
+     */
+    @TableField("taxiMoney")
+    private Double taxiMoney;
+    /**
+     * 跨城物流提成数值
+     */
+    @TableField("crossLogisticsMoney")
+    private Double crossLogisticsMoney;
+    /**
+     * 同城物流
+     */
+    @TableField("sameLogisticsMoney")
+    private Double sameLogisticsMoney;
+    /**
+     * 是否需要摆渡车(1=是,2=否)
+     */
+    @TableField("isNeedFerry")
+    private Integer isNeedFerry;
+    /**
+     * 企业名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 企业类型(1=平台,2=分公司,3=加盟商)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 上级企业
+     */
+    @TableField("superiorId")
+    private Integer superiorId;
+    /**
+     * 负责人姓名
+     */
+    @TableField("principalName")
+    private String principalName;
+    /**
+     * 负责人电话
+     */
+    @TableField("principalPhone")
+    private String principalPhone;
+    /**
+     * 管理员姓名
+     */
+    @TableField("adminName")
+    private String adminName;
+    /**
+     * 管理员电话
+     */
+    @TableField("adminPhone")
+    private String adminPhone;
+    /**
+     * 紧急联系电话
+     */
+    @TableField("urgentPhoen")
+    private String urgentPhoen;
+    /**
+     * 服务机构设立时间
+     */
+    @TableField("setupTime")
+    private Date setupTime;
+    /**
+     * 社会统一信用代码
+     */
+    @TableField("identifier")
+    private String identifier;
+    /**
+     * 注册地行政区域代码
+     */
+    @TableField("addressCode")
+    private String addressCode;
+    /**
+     * 经营范围
+     */
+    @TableField("businessScope")
+    private String businessScope;
+    /**
+     * 通信地址
+     */
+    @TableField("contactAddress")
+    private String contactAddress;
+    /**
+     * 行政文书送达地址
+     */
+    @TableField("documentAddress")
+    private String documentAddress;
+    /**
+     * 经营业户经济类型
+     */
+    @TableField("economicType")
+    private String economicType;
+    /**
+     * 注册资本
+     */
+    @TableField("regCapital")
+    private String regCapital;
+    /**
+     * 法人代表姓名
+     */
+    @TableField("legalName")
+    private String legalName;
+    /**
+     * 法人代表身份证号码
+     */
+    @TableField("legalId")
+    private String legalId;
+    /**
+     * 法人代表电话
+     */
+    @TableField("legalPhone")
+    private String legalPhone;
+    /**
+     * 法人代表身份证图片地址
+     */
+    @TableField("legalPhotoUrl")
+    private String legalPhotoUrl;
+    /**
+     * 经营许可证发证机构
+     */
+    @TableField("licensingAgency")
+    private String licensingAgency;
+    /**
+     * 经营许可证初次发证日期
+     */
+    @TableField("licenseTime")
+    private Date licenseTime;
+    /**
+     * 镜经营许可证有效日期起
+     */
+    @TableField("licenseStartTime")
+    private Date licenseStartTime;
+    /**
+     * 经营许可证有效日期止
+     */
+    @TableField("licenseEndTime")
+    private Date licenseEndTime;
+    /**
+     * 网络预约车经营许可证号
+     */
+    @TableField("licenseNumber")
+    private String licenseNumber;
+    /**
+     * 注册网络预约车数量
+     */
+    @TableField("carNum")
+    private Integer carNum;
+    /**
+     * 注册网络预约车驾驶员数量
+     */
+    @TableField("driverNum")
+    private Integer driverNum;
+    /**
+     * 绑定mac地址
+     */
+    @TableField("mac")
+    private String mac;
+    /**
+     * 状态(1=正常,2=禁用)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 1=创建,2=修改,3=删除
+     */
+    @TableField("flag")
+    private Integer flag;
+    /**
+     * 上传标识(1:未上传,2:已上传)
+     */
+    @TableField("upload")
+    private Integer upload;
+    /**
+     * 创建日期
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    @TableField("isTransfer")
+    private Integer isTransfer;
+    @TableField("isTransferFixedOrProportional")
+    private Integer isTransferFixedOrProportional;
+    @TableField("transferMoney")
+    private Double transferMoney;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getIsSpe() {
+        return isSpe;
+    }
+
+    public void setIsSpe(Integer isSpe) {
+        this.isSpe = isSpe;
+    }
+
+    public Integer getIsTaxi() {
+        return isTaxi;
+    }
+
+    public void setIsTaxi(Integer isTaxi) {
+        this.isTaxi = isTaxi;
+    }
+
+    public Integer getIsCross() {
+        return isCross;
+    }
+
+    public void setIsCross(Integer isCross) {
+        this.isCross = isCross;
+    }
+
+    public Integer getIsCrossLogistics() {
+        return isCrossLogistics;
+    }
+
+    public void setIsCrossLogistics(Integer isCrossLogistics) {
+        this.isCrossLogistics = isCrossLogistics;
+    }
+
+    public Integer getIsSameLogistics() {
+        return isSameLogistics;
+    }
+
+    public void setIsSameLogistics(Integer isSameLogistics) {
+        this.isSameLogistics = isSameLogistics;
+    }
+
+    public Integer getIsCharter() {
+        return isCharter;
+    }
+
+    public void setIsCharter(Integer isCharter) {
+        this.isCharter = isCharter;
+    }
+
+    public Integer getIsSpeFixedOrProportional() {
+        return isSpeFixedOrProportional;
+    }
+
+    public void setIsSpeFixedOrProportional(Integer isSpeFixedOrProportional) {
+        this.isSpeFixedOrProportional = isSpeFixedOrProportional;
+    }
+
+    public Integer getIsTaxiFixedOrProportional() {
+        return isTaxiFixedOrProportional;
+    }
+
+    public void setIsTaxiFixedOrProportional(Integer isTaxiFixedOrProportional) {
+        this.isTaxiFixedOrProportional = isTaxiFixedOrProportional;
+    }
+
+    public Integer getIsCrossLogisticsFixedOrProportional() {
+        return isCrossLogisticsFixedOrProportional;
+    }
+
+    public void setIsCrossLogisticsFixedOrProportional(Integer isCrossLogisticsFixedOrProportional) {
+        this.isCrossLogisticsFixedOrProportional = isCrossLogisticsFixedOrProportional;
+    }
+
+    public Integer getIsSameLogisticsFixedOrProportional() {
+        return isSameLogisticsFixedOrProportional;
+    }
+
+    public void setIsSameLogisticsFixedOrProportional(Integer isSameLogisticsFixedOrProportional) {
+        this.isSameLogisticsFixedOrProportional = isSameLogisticsFixedOrProportional;
+    }
+
+    public Double getSpeMoney() {
+        return speMoney;
+    }
+
+    public void setSpeMoney(Double speMoney) {
+        this.speMoney = speMoney;
+    }
+
+    public Double getTaxiMoney() {
+        return taxiMoney;
+    }
+
+    public void setTaxiMoney(Double taxiMoney) {
+        this.taxiMoney = taxiMoney;
+    }
+
+    public Double getCrossLogisticsMoney() {
+        return crossLogisticsMoney;
+    }
+
+    public void setCrossLogisticsMoney(Double crossLogisticsMoney) {
+        this.crossLogisticsMoney = crossLogisticsMoney;
+    }
+
+    public Double getSameLogisticsMoney() {
+        return sameLogisticsMoney;
+    }
+
+    public void setSameLogisticsMoney(Double sameLogisticsMoney) {
+        this.sameLogisticsMoney = sameLogisticsMoney;
+    }
+
+    public Integer getIsNeedFerry() {
+        return isNeedFerry;
+    }
+
+    public void setIsNeedFerry(Integer isNeedFerry) {
+        this.isNeedFerry = isNeedFerry;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getSuperiorId() {
+        return superiorId;
+    }
+
+    public void setSuperiorId(Integer superiorId) {
+        this.superiorId = superiorId;
+    }
+
+    public String getPrincipalName() {
+        return principalName;
+    }
+
+    public void setPrincipalName(String principalName) {
+        this.principalName = principalName;
+    }
+
+    public String getPrincipalPhone() {
+        return principalPhone;
+    }
+
+    public void setPrincipalPhone(String principalPhone) {
+        this.principalPhone = principalPhone;
+    }
+
+    public String getAdminName() {
+        return adminName;
+    }
+
+    public void setAdminName(String adminName) {
+        this.adminName = adminName;
+    }
+
+    public String getAdminPhone() {
+        return adminPhone;
+    }
+
+    public void setAdminPhone(String adminPhone) {
+        this.adminPhone = adminPhone;
+    }
+
+    public String getUrgentPhoen() {
+        return urgentPhoen;
+    }
+
+    public void setUrgentPhoen(String urgentPhoen) {
+        this.urgentPhoen = urgentPhoen;
+    }
+
+    public Date getSetupTime() {
+        return setupTime;
+    }
+
+    public void setSetupTime(Date setupTime) {
+        this.setupTime = setupTime;
+    }
+
+    public String getIdentifier() {
+        return identifier;
+    }
+
+    public void setIdentifier(String identifier) {
+        this.identifier = identifier;
+    }
+
+    public String getAddressCode() {
+        return addressCode;
+    }
+
+    public void setAddressCode(String addressCode) {
+        this.addressCode = addressCode;
+    }
+
+    public String getBusinessScope() {
+        return businessScope;
+    }
+
+    public void setBusinessScope(String businessScope) {
+        this.businessScope = businessScope;
+    }
+
+    public String getContactAddress() {
+        return contactAddress;
+    }
+
+    public void setContactAddress(String contactAddress) {
+        this.contactAddress = contactAddress;
+    }
+
+    public String getDocumentAddress() {
+        return documentAddress;
+    }
+
+    public void setDocumentAddress(String documentAddress) {
+        this.documentAddress = documentAddress;
+    }
+
+    public String getEconomicType() {
+        return economicType;
+    }
+
+    public void setEconomicType(String economicType) {
+        this.economicType = economicType;
+    }
+
+    public String getRegCapital() {
+        return regCapital;
+    }
+
+    public void setRegCapital(String regCapital) {
+        this.regCapital = regCapital;
+    }
+
+    public String getLegalName() {
+        return legalName;
+    }
+
+    public void setLegalName(String legalName) {
+        this.legalName = legalName;
+    }
+
+    public String getLegalId() {
+        return legalId;
+    }
+
+    public void setLegalId(String legalId) {
+        this.legalId = legalId;
+    }
+
+    public String getLegalPhone() {
+        return legalPhone;
+    }
+
+    public void setLegalPhone(String legalPhone) {
+        this.legalPhone = legalPhone;
+    }
+
+    public String getLegalPhotoUrl() {
+        return legalPhotoUrl;
+    }
+
+    public void setLegalPhotoUrl(String legalPhotoUrl) {
+        this.legalPhotoUrl = legalPhotoUrl;
+    }
+
+    public String getLicensingAgency() {
+        return licensingAgency;
+    }
+
+    public void setLicensingAgency(String licensingAgency) {
+        this.licensingAgency = licensingAgency;
+    }
+
+    public Date getLicenseTime() {
+        return licenseTime;
+    }
+
+    public void setLicenseTime(Date licenseTime) {
+        this.licenseTime = licenseTime;
+    }
+
+    public Date getLicenseStartTime() {
+        return licenseStartTime;
+    }
+
+    public void setLicenseStartTime(Date licenseStartTime) {
+        this.licenseStartTime = licenseStartTime;
+    }
+
+    public Date getLicenseEndTime() {
+        return licenseEndTime;
+    }
+
+    public void setLicenseEndTime(Date licenseEndTime) {
+        this.licenseEndTime = licenseEndTime;
+    }
+
+    public String getLicenseNumber() {
+        return licenseNumber;
+    }
+
+    public void setLicenseNumber(String licenseNumber) {
+        this.licenseNumber = licenseNumber;
+    }
+
+    public Integer getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(Integer carNum) {
+        this.carNum = carNum;
+    }
+
+    public Integer getDriverNum() {
+        return driverNum;
+    }
+
+    public void setDriverNum(Integer driverNum) {
+        this.driverNum = driverNum;
+    }
+
+    public String getMac() {
+        return mac;
+    }
+
+    public void setMac(String mac) {
+        this.mac = mac;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+
+    public Integer getUpload() {
+        return upload;
+    }
+
+    public void setUpload(Integer upload) {
+        this.upload = upload;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "Company{" +
+                "id=" + id +
+                ", isSpe=" + isSpe +
+                ", isTaxi=" + isTaxi +
+                ", isCross=" + isCross +
+                ", isCrossLogistics=" + isCrossLogistics +
+                ", isSameLogistics=" + isSameLogistics +
+                ", isCharter=" + isCharter +
+                ", isSpeFixedOrProportional=" + isSpeFixedOrProportional +
+                ", isTaxiFixedOrProportional=" + isTaxiFixedOrProportional +
+                ", isCrossLogisticsFixedOrProportional=" + isCrossLogisticsFixedOrProportional +
+                ", isSameLogisticsFixedOrProportional=" + isSameLogisticsFixedOrProportional +
+                ", speMoney=" + speMoney +
+                ", taxiMoney=" + taxiMoney +
+                ", crossLogisticsMoney=" + crossLogisticsMoney +
+                ", sameLogisticsMoney=" + sameLogisticsMoney +
+                ", isNeedFerry=" + isNeedFerry +
+                ", name='" + name + '\'' +
+                ", type=" + type +
+                ", superiorId=" + superiorId +
+                ", principalName='" + principalName + '\'' +
+                ", principalPhone='" + principalPhone + '\'' +
+                ", adminName='" + adminName + '\'' +
+                ", adminPhone='" + adminPhone + '\'' +
+                ", urgentPhoen='" + urgentPhoen + '\'' +
+                ", setupTime=" + setupTime +
+                ", identifier='" + identifier + '\'' +
+                ", addressCode='" + addressCode + '\'' +
+                ", businessScope='" + businessScope + '\'' +
+                ", contactAddress='" + contactAddress + '\'' +
+                ", documentAddress='" + documentAddress + '\'' +
+                ", economicType='" + economicType + '\'' +
+                ", regCapital='" + regCapital + '\'' +
+                ", legalName='" + legalName + '\'' +
+                ", legalId='" + legalId + '\'' +
+                ", legalPhone='" + legalPhone + '\'' +
+                ", legalPhotoUrl='" + legalPhotoUrl + '\'' +
+                ", licensingAgency='" + licensingAgency + '\'' +
+                ", licenseTime=" + licenseTime +
+                ", licenseStartTime=" + licenseStartTime +
+                ", licenseEndTime=" + licenseEndTime +
+                ", licenseNumber='" + licenseNumber + '\'' +
+                ", carNum=" + carNum +
+                ", driverNum=" + driverNum +
+                ", mac='" + mac + '\'' +
+                ", state=" + state +
+                ", flag=" + flag +
+                ", upload=" + upload +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CompanyCity.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CompanyCity.java
new file mode 100644
index 0000000..ee81ae0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CompanyCity.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 企业经营范围
+ */
+@TableName("t_company_city")
+public class CompanyCity {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 省编号
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+    /**
+     * 市编号
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     * 区编号
+     */
+    @TableField("areaCode")
+    private String areaCode;
+    /**
+     * 状态(1=正常,2=删除)
+     */
+    @TableField("state")
+    private Integer state;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getProvinceCode() {
+        return provinceCode;
+    }
+
+    public void setProvinceCode(String provinceCode) {
+        this.provinceCode = provinceCode;
+    }
+
+    public String getCityCode() {
+        return cityCode;
+    }
+
+    public void setCityCode(String cityCode) {
+        this.cityCode = cityCode;
+    }
+
+    public String getAreaCode() {
+        return areaCode;
+    }
+
+    public void setAreaCode(String areaCode) {
+        this.areaCode = areaCode;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "CompanyCity{" +
+                "id=" + id +
+                ", companyId=" + companyId +
+                ", provinceCode='" + provinceCode + '\'' +
+                ", cityCode='" + cityCode + '\'' +
+                ", areaCode='" + areaCode + '\'' +
+                ", state=" + state +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Complaint.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Complaint.java
new file mode 100644
index 0000000..69681f2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Complaint.java
@@ -0,0 +1,148 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 投诉
+ */
+@TableName("t_complaint")
+public class Complaint {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 投诉原因
+     */
+    @TableField("reason")
+    private String reason;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 描述
+     */
+    @TableField("description")
+    private String description;
+    /**
+     * 处理状态(0=未处理,1=已处理)
+     */
+    @TableField("isHandle")
+    private Integer isHandle;
+    /**
+     * 添加时间
+     */
+    @TableField("insert_time")
+    private Date insertTime;
+    /**
+     * 处理结果
+     */
+    @TableField("handleResult")
+    private String handleResult;
+    /**
+     * 处理人id
+     */
+    @TableField("handleUserId")
+    private Integer handleUserId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Integer getIsHandle() {
+        return isHandle;
+    }
+
+    public void setIsHandle(Integer isHandle) {
+        this.isHandle = isHandle;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getHandleResult() {
+        return handleResult;
+    }
+
+    public void setHandleResult(String handleResult) {
+        this.handleResult = handleResult;
+    }
+
+    public Integer getHandleUserId() {
+        return handleUserId;
+    }
+
+    public void setHandleUserId(Integer handleUserId) {
+        this.handleUserId = handleUserId;
+    }
+
+    @Override
+    public String toString() {
+        return "Complaint{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", reason='" + reason + '\'' +
+                ", driverId=" + driverId +
+                ", description='" + description + '\'' +
+                ", isHandle=" + isHandle +
+                ", insertTime=" + insertTime +
+                ", handleResult='" + handleResult + '\'' +
+                ", handleUserId=" + handleUserId +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java
new file mode 100644
index 0000000..0790865
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java
@@ -0,0 +1,140 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 部门表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_dept")
+public class Dept extends Model<Dept> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 排序
+     */
+	private Integer num;
+    /**
+     * 父部门id
+     */
+	private Integer pid;
+    /**
+     * 父级ids
+     */
+	private String pids;
+    /**
+     * 简称
+     */
+	private String simplename;
+    /**
+     * 全称
+     */
+	private String fullname;
+    /**
+     * 提示
+     */
+	private String tips;
+    /**
+     * 版本(乐观锁保留字段)
+     */
+	private Integer version;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getNum() {
+		return num;
+	}
+
+	public void setNum(Integer num) {
+		this.num = num;
+	}
+
+	public Integer getPid() {
+		return pid;
+	}
+
+	public void setPid(Integer pid) {
+		this.pid = pid;
+	}
+
+	public String getPids() {
+		return pids;
+	}
+
+	public void setPids(String pids) {
+		this.pids = pids;
+	}
+
+	public String getSimplename() {
+		return simplename;
+	}
+
+	public void setSimplename(String simplename) {
+		this.simplename = simplename;
+	}
+
+	public String getFullname() {
+		return fullname;
+	}
+
+	public void setFullname(String fullname) {
+		this.fullname = fullname;
+	}
+
+	public String getTips() {
+		return tips;
+	}
+
+	public void setTips(String tips) {
+		this.tips = tips;
+	}
+
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "Dept{" +
+			"id=" + id +
+			", num=" + num +
+			", pid=" + pid +
+			", pids=" + pids +
+			", simplename=" + simplename +
+			", fullname=" + fullname +
+			", tips=" + tips +
+			", version=" + version +
+			"}";
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java
new file mode 100644
index 0000000..b021b4b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java
@@ -0,0 +1,116 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 字典表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_dict")
+public class Dict extends Model<Dict> {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键id
+	 */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+	/**
+	 * 排序
+	 */
+	private Integer num;
+	/**
+	 * 父级字典
+	 */
+	private Integer pid;
+	/**
+	 * 名称
+	 */
+	private String name;
+
+	/**
+	 * 编码
+	 */
+	private String code;
+	/**
+	 * 提示
+	 */
+	private String tips;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getNum() {
+		return num;
+	}
+
+	public void setNum(Integer num) {
+		this.num = num;
+	}
+
+	public Integer getPid() {
+		return pid;
+	}
+
+	public void setPid(Integer pid) {
+		this.pid = pid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getTips() {
+		return tips;
+	}
+
+	public void setTips(String tips) {
+		this.tips = tips;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	@Override
+	public String toString() {
+		return "Dict{" +
+				"id=" + id +
+				", num=" + num +
+				", pid=" + pid +
+				", name='" + name + '\'' +
+				", code='" + code + '\'' +
+				", tips='" + tips + '\'' +
+				'}';
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java
new file mode 100644
index 0000000..c5e3263
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java
@@ -0,0 +1,896 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 司机
+ */
+@TableName("t_driver")
+public class Driver extends BaseBean{
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 账号
+     */
+    @TableField("account")
+    private String account;
+    /**
+     * 工号
+     */
+    @TableField("jobNumber")
+    private String jobNumber;
+    /**
+     * 电话
+     */
+    @TableField("phone")
+    private String phone;
+    /**
+     * 登录密码
+     */
+    @TableField("password")
+    private String password;
+    /**
+     * 姓名
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 性别(1=男,2=女)
+     */
+    @TableField("sex")
+    private Integer sex;
+    /**
+     * 身份证号码
+     */
+    @TableField("idCard")
+    private String idCard;
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 加盟商id
+     */
+    @TableField("franchiseeId")
+    private Integer franchiseeId;
+    /**
+     * 头像图片
+     */
+    @TableField("headImgUrl")
+    private String headImgUrl;
+    /**
+     * 人脸识别照片
+     */
+    @TableField("faceImgUrl")
+    private String faceImgUrl;
+    /**
+     * 身份证正面照片
+     */
+    @TableField("idCardImgUrl1")
+    private String idCardImgUrl1;
+    /**
+     * 身份证背面照片
+     */
+    @TableField("idCardImgUrl2")
+    private String idCardImgUrl2;
+    /**
+     * 网约车注册地
+     */
+    @TableField("placeOfEmployment")
+    private String placeOfEmployment;
+    /**
+     * 生日
+     */
+    @TableField("birthday")
+    private Date birthday;
+    /**
+     * 银行卡号
+     */
+    @TableField("bankCardNumber")
+    private String bankCardNumber;
+    /**
+     * 国籍
+     */
+    @TableField("driverNationality")
+    private String driverNationality;
+    /**
+     * 民族
+     */
+    @TableField("driverNation")
+    private String driverNation;
+    /**
+     * 婚姻状况(1:未婚,2:已婚,3:离异)
+     */
+    @TableField("driverMaritalStatus")
+    private Integer driverMaritalStatus;
+    /**
+     * 外语能力
+     */
+    @TableField("driverLanguageLevel")
+    private String driverLanguageLevel;
+    /**
+     * 学历
+     */
+    @TableField("driverEducation")
+    private String driverEducation;
+    /**
+     * 户口登记机关名称
+     */
+    @TableField("driverCensus")
+    private String driverCensus;
+    /**
+     * 户口地址或常住地址
+     */
+    @TableField("driverAddress")
+    private String driverAddress;
+    /**
+     * 通信地址
+     */
+    @TableField("driverContactAddress")
+    private String driverContactAddress;
+    /**
+     * 驾龄
+     */
+    @TableField("driverAge")
+    private Integer driverAge;
+    /**
+     * 驾驶证号码
+     */
+    @TableField("driveCard")
+    private String driveCard;
+    /**
+     * 驾驶证照片
+     */
+    @TableField("driveCardImgUrl")
+    private String driveCardImgUrl;
+    /**
+     * 准驾车型
+     */
+    @TableField("driverType")
+    private String driverType;
+    /**
+     * 初次领取驾驶证日期
+     */
+    @TableField("getDriverLicenseDate")
+    private Date getDriverLicenseDate;
+    /**
+     * 驾驶证有效期限起
+     */
+    @TableField("driverLicenseOn")
+    private Date driverLicenseOn;
+    /**
+     * 驾驶证有效期限止
+     */
+    @TableField("driverLicenseOff")
+    private Date driverLicenseOff;
+    /**
+     * 是否巡游出租车驾驶员(0:否,1:是)
+     */
+    @TableField("taxiDriver")
+    private Integer taxiDriver;
+    /**
+     * 出租车资格证号
+     */
+    @TableField("taxiAptitudeCard")
+    private String taxiAptitudeCard;
+    /**
+     * 网约车资格证照片
+     */
+    @TableField("networkCarlssueImg")
+    private String networkCarlssueImg;
+    /**
+     * 网络预约出租车驾驶员证发证机构
+     */
+    @TableField("networkCarlssueOrganization")
+    private String networkCarlssueOrganization;
+    /**
+     * 资格证发证日期
+     */
+    @TableField("networkCarlssueDate")
+    private Date networkCarlssueDate;
+    /**
+     * 初次认领资格证日期
+     */
+    @TableField("getNetworkCarProofDate")
+    private Date getNetworkCarProofDate;
+    /**
+     * 资格证有效起始日期
+     */
+    @TableField("networkCarProofOn")
+    private Date networkCarProofOn;
+    /**
+     * 资格证有效截至日期
+     */
+    @TableField("networkCarProofOff")
+    private Date networkCarProofOff;
+    /**
+     * 报备日期
+     */
+    @TableField("registerDate")
+    private Date registerDate;
+    /**
+     * 是否专职驾驶员(0:否,1:是)
+     */
+    @TableField("fullTimeDriver")
+    private Integer fullTimeDriver;
+    /**
+     * 是否在驾驶员黑名单内(0:否,1:是)
+     */
+    @TableField("inDriverBlacklist")
+    private Integer inDriverBlacklist;
+    /**
+     * 服务类型(1:网络预约出租汽车,2:巡游出租汽车,3:私人小客车合乘)
+     */
+    @TableField("commercialType")
+    private Integer commercialType;
+    /**
+     * 驾驶员合同签署公司
+     */
+    @TableField("contractCompany")
+    private String contractCompany;
+    /**
+     * 合同有效期起
+     */
+    @TableField("contractOn")
+    private Date contractOn;
+    /**
+     * 合同有效期止
+     */
+    @TableField("contractOff")
+    private Date contractOff;
+    /**
+     * 紧急联系人
+     */
+    @TableField("emergencyContact")
+    private String emergencyContact;
+    /**
+     * 紧急联系电话
+     */
+    @TableField("emergencyContactPhone")
+    private String emergencyContactPhone;
+    /**
+     * 紧急联系地址
+     */
+    @TableField("emergencyContactAddress")
+    private String emergencyContactAddress;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 是否是平台车辆(1=是,2=否)
+     */
+    @TableField("isPlatCar")
+    private Integer isPlatCar;
+    /**
+     * 司机管理车辆id
+     */
+    @TableField("carId")
+    private Integer carId;
+    /**
+     * 审核状态(1=待审核,2=正常,3=冻结,4=拒绝)
+     */
+    @TableField("authState")
+    private Integer authState;
+    /**
+     * 司机状态(1=离线,2=空闲,3=服务中)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加方式(1=司机注册 2=平台添加 3=分公司添加 4=加盟商添加)
+     * @return
+     */
+    @TableField("addType")
+    private Integer addType;
+    /**
+     * 账户余额
+     * @return
+     */
+    @TableField("balance")
+    private Double balance;
+    /**
+     * 活动总收入
+     * @return
+     */
+    @TableField("activityMoney")
+    private Double activityMoney;
+    /**
+     * 剩余未提现活动总收入
+     * @return
+     */
+    @TableField("laveActivityMoney")
+    private Double laveActivityMoney;
+    /**
+     * 业务总收入
+     * @return
+     */
+    @TableField("businessMoney")
+    private Double businessMoney;
+    /**
+     * 剩余未提现业务总收入
+     * @return
+     */
+    @TableField("laveBusinessMoney")
+    private Double laveBusinessMoney;
+    /**
+     * 小程序openid
+     */
+    @TableField("appletsOpenId")
+    private String appletsOpenId;
+
+    @Override
+    public Integer getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getJobNumber() {
+        return jobNumber;
+    }
+
+    public void setJobNumber(String jobNumber) {
+        this.jobNumber = jobNumber;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public String getIdCard() {
+        return idCard;
+    }
+
+    public void setIdCard(String idCard) {
+        this.idCard = idCard;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getHeadImgUrl() {
+        return headImgUrl;
+    }
+
+    public void setHeadImgUrl(String headImgUrl) {
+        this.headImgUrl = headImgUrl;
+    }
+
+    public String getFaceImgUrl() {
+        return faceImgUrl;
+    }
+
+    public void setFaceImgUrl(String faceImgUrl) {
+        this.faceImgUrl = faceImgUrl;
+    }
+
+    public String getIdCardImgUrl1() {
+        return idCardImgUrl1;
+    }
+
+    public void setIdCardImgUrl1(String idCardImgUrl1) {
+        this.idCardImgUrl1 = idCardImgUrl1;
+    }
+
+    public String getIdCardImgUrl2() {
+        return idCardImgUrl2;
+    }
+
+    public void setIdCardImgUrl2(String idCardImgUrl2) {
+        this.idCardImgUrl2 = idCardImgUrl2;
+    }
+
+    public String getPlaceOfEmployment() {
+        return placeOfEmployment;
+    }
+
+    public void setPlaceOfEmployment(String placeOfEmployment) {
+        this.placeOfEmployment = placeOfEmployment;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getBankCardNumber() {
+        return bankCardNumber;
+    }
+
+    public void setBankCardNumber(String bankCardNumber) {
+        this.bankCardNumber = bankCardNumber;
+    }
+
+    public String getDriverNationality() {
+        return driverNationality;
+    }
+
+    public void setDriverNationality(String driverNationality) {
+        this.driverNationality = driverNationality;
+    }
+
+    public String getDriverNation() {
+        return driverNation;
+    }
+
+    public void setDriverNation(String driverNation) {
+        this.driverNation = driverNation;
+    }
+
+    public Integer getDriverMaritalStatus() {
+        return driverMaritalStatus;
+    }
+
+    public void setDriverMaritalStatus(Integer driverMaritalStatus) {
+        this.driverMaritalStatus = driverMaritalStatus;
+    }
+
+    public String getDriverLanguageLevel() {
+        return driverLanguageLevel;
+    }
+
+    public void setDriverLanguageLevel(String driverLanguageLevel) {
+        this.driverLanguageLevel = driverLanguageLevel;
+    }
+
+    public String getDriverEducation() {
+        return driverEducation;
+    }
+
+    public void setDriverEducation(String driverEducation) {
+        this.driverEducation = driverEducation;
+    }
+
+    public String getDriverCensus() {
+        return driverCensus;
+    }
+
+    public void setDriverCensus(String driverCensus) {
+        this.driverCensus = driverCensus;
+    }
+
+    public String getDriverAddress() {
+        return driverAddress;
+    }
+
+    public void setDriverAddress(String driverAddress) {
+        this.driverAddress = driverAddress;
+    }
+
+    public String getDriverContactAddress() {
+        return driverContactAddress;
+    }
+
+    public void setDriverContactAddress(String driverContactAddress) {
+        this.driverContactAddress = driverContactAddress;
+    }
+
+    public Integer getDriverAge() {
+        return driverAge;
+    }
+
+    public void setDriverAge(Integer driverAge) {
+        this.driverAge = driverAge;
+    }
+
+    public String getDriveCard() {
+        return driveCard;
+    }
+
+    public void setDriveCard(String driveCard) {
+        this.driveCard = driveCard;
+    }
+
+    public String getDriveCardImgUrl() {
+        return driveCardImgUrl;
+    }
+
+    public void setDriveCardImgUrl(String driveCardImgUrl) {
+        this.driveCardImgUrl = driveCardImgUrl;
+    }
+
+    public String getDriverType() {
+        return driverType;
+    }
+
+    public void setDriverType(String driverType) {
+        this.driverType = driverType;
+    }
+
+    public Date getGetDriverLicenseDate() {
+        return getDriverLicenseDate;
+    }
+
+    public void setGetDriverLicenseDate(Date getDriverLicenseDate) {
+        this.getDriverLicenseDate = getDriverLicenseDate;
+    }
+
+    public Date getDriverLicenseOn() {
+        return driverLicenseOn;
+    }
+
+    public void setDriverLicenseOn(Date driverLicenseOn) {
+        this.driverLicenseOn = driverLicenseOn;
+    }
+
+    public Date getDriverLicenseOff() {
+        return driverLicenseOff;
+    }
+
+    public void setDriverLicenseOff(Date driverLicenseOff) {
+        this.driverLicenseOff = driverLicenseOff;
+    }
+
+    public Integer getTaxiDriver() {
+        return taxiDriver;
+    }
+
+    public void setTaxiDriver(Integer taxiDriver) {
+        this.taxiDriver = taxiDriver;
+    }
+
+    public String getTaxiAptitudeCard() {
+        return taxiAptitudeCard;
+    }
+
+    public void setTaxiAptitudeCard(String taxiAptitudeCard) {
+        this.taxiAptitudeCard = taxiAptitudeCard;
+    }
+
+    public String getNetworkCarlssueOrganization() {
+        return networkCarlssueOrganization;
+    }
+
+    public void setNetworkCarlssueOrganization(String networkCarlssueOrganization) {
+        this.networkCarlssueOrganization = networkCarlssueOrganization;
+    }
+
+    public Date getNetworkCarlssueDate() {
+        return networkCarlssueDate;
+    }
+
+    public void setNetworkCarlssueDate(Date networkCarlssueDate) {
+        this.networkCarlssueDate = networkCarlssueDate;
+    }
+
+    public Date getGetNetworkCarProofDate() {
+        return getNetworkCarProofDate;
+    }
+
+    public void setGetNetworkCarProofDate(Date getNetworkCarProofDate) {
+        this.getNetworkCarProofDate = getNetworkCarProofDate;
+    }
+
+    public Date getNetworkCarProofOn() {
+        return networkCarProofOn;
+    }
+
+    public void setNetworkCarProofOn(Date networkCarProofOn) {
+        this.networkCarProofOn = networkCarProofOn;
+    }
+
+    public Date getNetworkCarProofOff() {
+        return networkCarProofOff;
+    }
+
+    public void setNetworkCarProofOff(Date networkCarProofOff) {
+        this.networkCarProofOff = networkCarProofOff;
+    }
+
+    public Date getRegisterDate() {
+        return registerDate;
+    }
+
+    public void setRegisterDate(Date registerDate) {
+        this.registerDate = registerDate;
+    }
+
+    public Integer getFullTimeDriver() {
+        return fullTimeDriver;
+    }
+
+    public void setFullTimeDriver(Integer fullTimeDriver) {
+        this.fullTimeDriver = fullTimeDriver;
+    }
+
+    public Integer getInDriverBlacklist() {
+        return inDriverBlacklist;
+    }
+
+    public void setInDriverBlacklist(Integer inDriverBlacklist) {
+        this.inDriverBlacklist = inDriverBlacklist;
+    }
+
+    public Integer getCommercialType() {
+        return commercialType;
+    }
+
+    public void setCommercialType(Integer commercialType) {
+        this.commercialType = commercialType;
+    }
+
+    public String getContractCompany() {
+        return contractCompany;
+    }
+
+    public void setContractCompany(String contractCompany) {
+        this.contractCompany = contractCompany;
+    }
+
+    public Date getContractOn() {
+        return contractOn;
+    }
+
+    public void setContractOn(Date contractOn) {
+        this.contractOn = contractOn;
+    }
+
+    public Date getContractOff() {
+        return contractOff;
+    }
+
+    public void setContractOff(Date contractOff) {
+        this.contractOff = contractOff;
+    }
+
+    public String getEmergencyContact() {
+        return emergencyContact;
+    }
+
+    public void setEmergencyContact(String emergencyContact) {
+        this.emergencyContact = emergencyContact;
+    }
+
+    public String getEmergencyContactPhone() {
+        return emergencyContactPhone;
+    }
+
+    public void setEmergencyContactPhone(String emergencyContactPhone) {
+        this.emergencyContactPhone = emergencyContactPhone;
+    }
+
+    public String getEmergencyContactAddress() {
+        return emergencyContactAddress;
+    }
+
+    public void setEmergencyContactAddress(String emergencyContactAddress) {
+        this.emergencyContactAddress = emergencyContactAddress;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getIsPlatCar() {
+        return isPlatCar;
+    }
+
+    public void setIsPlatCar(Integer isPlatCar) {
+        this.isPlatCar = isPlatCar;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public Integer getAuthState() {
+        return authState;
+    }
+
+    public void setAuthState(Integer authState) {
+        this.authState = authState;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getNetworkCarlssueImg() {
+        return networkCarlssueImg;
+    }
+
+    public void setNetworkCarlssueImg(String networkCarlssueImg) {
+        this.networkCarlssueImg = networkCarlssueImg;
+    }
+
+    public Integer getAddType() {
+        return addType;
+    }
+
+    public void setAddType(Integer addType) {
+        this.addType = addType;
+    }
+
+    public Double getBalance() {
+        return balance;
+    }
+
+    public void setBalance(Double balance) {
+        this.balance = balance;
+    }
+
+    public Double getActivityMoney() {
+        return activityMoney;
+    }
+
+    public void setActivityMoney(Double activityMoney) {
+        this.activityMoney = activityMoney;
+    }
+
+    public Double getLaveActivityMoney() {
+        return laveActivityMoney;
+    }
+
+    public void setLaveActivityMoney(Double laveActivityMoney) {
+        this.laveActivityMoney = laveActivityMoney;
+    }
+
+    public Double getBusinessMoney() {
+        return businessMoney;
+    }
+
+    public void setBusinessMoney(Double businessMoney) {
+        this.businessMoney = businessMoney;
+    }
+
+    public Double getLaveBusinessMoney() {
+        return laveBusinessMoney;
+    }
+
+    public void setLaveBusinessMoney(Double laveBusinessMoney) {
+        this.laveBusinessMoney = laveBusinessMoney;
+    }
+
+    public Integer getFranchiseeId() {
+        return franchiseeId;
+    }
+
+    public void setFranchiseeId(Integer franchiseeId) {
+        this.franchiseeId = franchiseeId;
+    }
+
+    public String getAppletsOpenId() {
+        return appletsOpenId;
+    }
+
+    public void setAppletsOpenId(String appletsOpenId) {
+        this.appletsOpenId = appletsOpenId;
+    }
+
+    @Override
+    public String toString() {
+        return "Driver{" +
+                "account='" + account + '\'' +
+                ", jobNumber='" + jobNumber + '\'' +
+                ", phone='" + phone + '\'' +
+                ", password='" + password + '\'' +
+                ", name='" + name + '\'' +
+                ", sex=" + sex +
+                ", idCard='" + idCard + '\'' +
+                ", companyId=" + companyId +
+                ", franchiseeId=" + franchiseeId +
+                ", headImgUrl='" + headImgUrl + '\'' +
+                ", faceImgUrl='" + faceImgUrl + '\'' +
+                ", idCardImgUrl1='" + idCardImgUrl1 + '\'' +
+                ", idCardImgUrl2='" + idCardImgUrl2 + '\'' +
+                ", placeOfEmployment='" + placeOfEmployment + '\'' +
+                ", birthday=" + birthday +
+                ", bankCardNumber='" + bankCardNumber + '\'' +
+                ", driverNationality='" + driverNationality + '\'' +
+                ", driverNation='" + driverNation + '\'' +
+                ", driverMaritalStatus=" + driverMaritalStatus +
+                ", driverLanguageLevel='" + driverLanguageLevel + '\'' +
+                ", driverEducation='" + driverEducation + '\'' +
+                ", driverCensus='" + driverCensus + '\'' +
+                ", driverAddress='" + driverAddress + '\'' +
+                ", driverContactAddress='" + driverContactAddress + '\'' +
+                ", driverAge=" + driverAge +
+                ", driveCard='" + driveCard + '\'' +
+                ", driveCardImgUrl='" + driveCardImgUrl + '\'' +
+                ", driverType='" + driverType + '\'' +
+                ", getDriverLicenseDate=" + getDriverLicenseDate +
+                ", driverLicenseOn=" + driverLicenseOn +
+                ", driverLicenseOff=" + driverLicenseOff +
+                ", taxiDriver=" + taxiDriver +
+                ", taxiAptitudeCard='" + taxiAptitudeCard + '\'' +
+                ", networkCarlssueImg='" + networkCarlssueImg + '\'' +
+                ", networkCarlssueOrganization='" + networkCarlssueOrganization + '\'' +
+                ", networkCarlssueDate=" + networkCarlssueDate +
+                ", getNetworkCarProofDate=" + getNetworkCarProofDate +
+                ", networkCarProofOn=" + networkCarProofOn +
+                ", networkCarProofOff=" + networkCarProofOff +
+                ", registerDate=" + registerDate +
+                ", fullTimeDriver=" + fullTimeDriver +
+                ", inDriverBlacklist=" + inDriverBlacklist +
+                ", commercialType=" + commercialType +
+                ", contractCompany='" + contractCompany + '\'' +
+                ", contractOn=" + contractOn +
+                ", contractOff=" + contractOff +
+                ", emergencyContact='" + emergencyContact + '\'' +
+                ", emergencyContactPhone='" + emergencyContactPhone + '\'' +
+                ", emergencyContactAddress='" + emergencyContactAddress + '\'' +
+                ", remark='" + remark + '\'' +
+                ", isPlatCar=" + isPlatCar +
+                ", carId=" + carId +
+                ", authState=" + authState +
+                ", state=" + state +
+                ", addType=" + addType +
+                ", balance=" + balance +
+                ", activityMoney=" + activityMoney +
+                ", laveActivityMoney=" + laveActivityMoney +
+                ", businessMoney=" + businessMoney +
+                ", laveBusinessMoney=" + laveBusinessMoney +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityHistory.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityHistory.java
new file mode 100644
index 0000000..5af1722
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityHistory.java
@@ -0,0 +1,145 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 司机每天活动数量
+ */
+@TableName("t_driver_activity_history")
+public class DriverActivityHistory {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 活动日期
+     */
+    @TableField("day")
+    private Date day;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 活动类型(1=邀请司机注册,2=邀请用户注册,3=累计在线,4=订单量)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 活动id
+     */
+    @TableField("activityId")
+    private Integer activityId;
+    /**
+     * 是否完成(1=否,2=完成)
+     */
+    @TableField("carryOut")
+    private Integer carryOut;
+    /**
+     * 奖励金额
+     */
+    @TableField("money")
+    private Double money;
+    //领取时间
+    @TableField("collectionTime")
+    private Date collectionTime;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getDay() {
+        return day;
+    }
+
+    public void setDay(Date day) {
+        this.day = day;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getCarryOut() {
+        return carryOut;
+    }
+
+    public void setCarryOut(Integer carryOut) {
+        this.carryOut = carryOut;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getCollectionTime() {
+        return collectionTime;
+    }
+
+    public void setCollectionTime(Date collectionTime) {
+        this.collectionTime = collectionTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverActivityHistory{" +
+                "id=" + id +
+                ", day=" + day +
+                ", driverId=" + driverId +
+                ", type=" + type +
+                ", activityId=" + activityId +
+                ", carryOut=" + carryOut +
+                ", money=" + money +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityRegistered.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityRegistered.java
new file mode 100644
index 0000000..20ed172
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityRegistered.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 司机注册活动相关
+ */
+@TableName("t_driver_activity_registered")
+public class DriverActivityRegistered {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 司机活动主表id
+     */
+    @TableField("driverActivityId")
+    private Integer driverActivityId;
+    /**
+     * 类型(1=邀请司机注册奖励,2=邀请用户注册奖励)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 奖励金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 开始时间
+     */
+    @TableField("startTime")
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverActivityId() {
+        return driverActivityId;
+    }
+
+    public void setDriverActivityId(Integer driverActivityId) {
+        this.driverActivityId = driverActivityId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverActivityRegistered{" +
+                "id=" + id +
+                ", companyId=" + companyId +
+                ", driverActivityId=" + driverActivityId +
+                ", type=" + type +
+                ", money=" + money +
+                ", startTime=" + startTime +
+                ", endTime=" + endTime +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverOrders.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverOrders.java
new file mode 100644
index 0000000..be80997
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverOrders.java
@@ -0,0 +1,62 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 司机接单设置
+ */
+@TableName("t_driver_orders")
+public class DriverOrders {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 允许接单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    @TableField("type")
+    private Integer type;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverOrders{" +
+                "id=" + id +
+                ", driverId=" + driverId +
+                ", type=" + type +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverService.java
new file mode 100644
index 0000000..7c58371
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverService.java
@@ -0,0 +1,62 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 司机可经营的业务类型
+ */
+@TableName("t_driver_service")
+public class DriverService {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    @TableField("type")
+    private Integer type;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverService{" +
+                "id=" + id +
+                ", driverId=" + driverId +
+                ", type=" + type +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverWork.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverWork.java
new file mode 100644
index 0000000..49bd976
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverWork.java
@@ -0,0 +1,105 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.sql.Date;
+
+/**
+ * 司机上下班记录
+ */
+@TableName("t_driver_work")
+public class DriverWork {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 上班时间
+     */
+    @TableField("startTime")
+    private Date startTime;
+    /**
+     * 下班时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    @TableField("type")
+    private String type;
+    /**
+     * 上下班状态(1=上班,2=下班)
+     */
+    @TableField("state")
+    private Integer state;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverWork{" +
+                "id=" + id +
+                ", driverId=" + driverId +
+                ", startTime=" + startTime +
+                ", endTime=" + endTime +
+                ", type=" + type +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Expense.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Expense.java
new file mode 100644
index 0000000..3a5b05e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Expense.java
@@ -0,0 +1,123 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 报销表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-12-05
+ */
+@TableName("sys_expense")
+public class Expense extends Model<Expense> {
+
+    private static final long serialVersionUID = 1L;
+
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 报销金额
+     */
+	private BigDecimal money;
+    /**
+     * 描述
+     */
+	private String desc;
+	private Date createtime;
+    /**
+     * 状态: 1.待提交  2:待审核   3.审核通过
+     */
+	private Integer state;
+    /**
+     * 用户id
+     */
+	private Integer userid;
+    /**
+     * 流程定义id
+     */
+	private String processId;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public BigDecimal getMoney() {
+		return money;
+	}
+
+	public void setMoney(BigDecimal money) {
+		this.money = money;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public Integer getState() {
+		return state;
+	}
+
+	public void setState(Integer state) {
+		this.state = state;
+	}
+
+	public Integer getUserid() {
+		return userid;
+	}
+
+	public void setUserid(Integer userid) {
+		this.userid = userid;
+	}
+
+	public String getProcessId() {
+		return processId;
+	}
+
+	public void setProcessId(String processId) {
+		this.processId = processId;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "Expense{" +
+			"id=" + id +
+			", money=" + money +
+			", desc=" + desc +
+			", createtime=" + createtime +
+			", state=" + state +
+			", userid=" + userid +
+			", processId=" + processId +
+			"}";
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Feedback.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Feedback.java
new file mode 100644
index 0000000..d490b7f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Feedback.java
@@ -0,0 +1,176 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 反馈
+ */
+@TableName("t_feedback")
+public class Feedback {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 反馈人id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 处理人id
+     */
+    @TableField("handleUserId")
+    private Integer handleUserId;
+    /**
+     * 反馈内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 反馈时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 图片地址
+     */
+    @TableField("imgUrl")
+    private String imgUrl;
+    /**
+     * 状态(1=正常,2=删除)
+     */
+    @TableField("flag")
+    private Integer flag;
+    /**
+     * 处理状态(1=未处理,2=已处理)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 处理时间
+     */
+    @TableField("cldate")
+    private Date cldate;
+    /**
+     * 处理备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 1=用户,2=司机
+     */
+    @TableField("type")
+    private Integer type;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getHandleUserId() {
+        return handleUserId;
+    }
+
+    public void setHandleUserId(Integer handleUserId) {
+        this.handleUserId = handleUserId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getCldate() {
+        return cldate;
+    }
+
+    public void setCldate(Date cldate) {
+        this.cldate = cldate;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return "Feedback{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", handleUserId=" + handleUserId +
+                ", content='" + content + '\'' +
+                ", insertTime=" + insertTime +
+                ", imgUrl='" + imgUrl + '\'' +
+                ", flag=" + flag +
+                ", state=" + state +
+                ", cldate=" + cldate +
+                ", remark='" + remark + '\'' +
+                ", type=" + type +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/FrequentPassengers.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/FrequentPassengers.java
new file mode 100644
index 0000000..57daf3f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/FrequentPassengers.java
@@ -0,0 +1,128 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * 常用乘车人
+ */
+@ApiModel
+@TableName("t_frequent_passengers")
+public class FrequentPassengers {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    @ApiModelProperty(value = "id", required = false, dataType = "int")
+    private Integer id;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 姓名
+     */
+    @TableField("name")
+    @ApiModelProperty(value = "姓名", required = true, dataType = "string")
+    private String name;
+    /**
+     * 性别(1=男,2=女)
+     */
+    @TableField("sex")
+    @ApiModelProperty(value = "性别(1=男,2=女)", required = true, dataType = "int")
+    private Integer sex;
+    /**
+     * 手机号
+     */
+    @TableField("phone")
+    @ApiModelProperty(value = "手机号", required = true, dataType = "string")
+    private String phone;
+    /**
+     * 身份证号码
+     */
+    @TableField("idcode")
+    @ApiModelProperty(value = "身份证号", required = true, dataType = "string")
+    private String idcode;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("status")
+    private Integer status;
+    /**
+     * 添加时间
+     */
+    @TableField("createTime")
+    private Date createTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getIdcode() {
+        return idcode;
+    }
+
+    public void setIdcode(String idcode) {
+        this.idcode = idcode;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java
new file mode 100644
index 0000000..123a6a7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java
@@ -0,0 +1,93 @@
+package com.stylefeng.guns.modular.system.model;
+
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 高德接口统计
+ */
+@TableName("t_gdinterface")
+public class GDInterface {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 接口名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 接口说明
+     */
+    @TableField("explanation")
+    private String explanation;
+    /**
+     * 调用次数
+     */
+    @TableField("num")
+    private Integer num;
+    /**
+     * 调用日期
+     */
+    @TableField("time")
+    private String time;
+
+    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 getExplanation() {
+        return explanation;
+    }
+
+    public void setExplanation(String explanation) {
+        this.explanation = explanation;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    @Override
+    public String toString() {
+        return "GDInterface{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", explanation='" + explanation + '\'' +
+                ", num=" + num +
+                ", time=" + time +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java
new file mode 100644
index 0000000..cae5522
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 收入明细
+ */
+@TableName("t_income")
+public class Income {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 收入方类型(1=公司,2=司机)
+     */
+    @TableField("userType")
+    private Integer userType;
+    /**
+     * 收入对象id
+     */
+    @TableField("objectId")
+    private Integer objectId;
+    /**
+     * 收入类型(1=活动,2=业务)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 收入类型id
+     */
+    @TableField("incomeId")
+    private Integer incomeId;
+    /**
+     * 订单类型
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 收入金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getObjectId() {
+        return objectId;
+    }
+
+    public void setObjectId(Integer objectId) {
+        this.objectId = objectId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getIncomeId() {
+        return incomeId;
+    }
+
+    public void setIncomeId(Integer incomeId) {
+        this.incomeId = incomeId;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    @Override
+    public String toString() {
+        return "Income{" +
+                "id=" + id +
+                ", userType=" + userType +
+                ", objectId=" + objectId +
+                ", type=" + type +
+                ", incomeId=" + incomeId +
+                ", orderType=" + orderType +
+                ", money=" + money +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/IntegralGoods.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/IntegralGoods.java
new file mode 100644
index 0000000..209e139
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/IntegralGoods.java
@@ -0,0 +1,148 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 积分兑换商品
+ */
+@TableName("t_integral_goods")
+public class IntegralGoods {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 商品名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 商品图片
+     */
+    @TableField("imgUrl")
+    private String imgUrl;
+    /**
+     * 兑换积分
+     */
+    @TableField("integral")
+    private Integer integral;
+    /**
+     * 商品说明
+     */
+    @TableField("instructions")
+    private String instructions;
+    /**
+     * 状态(1=正常,2=下架,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加用户id
+     */
+    @TableField("insertUserId")
+    private Integer insertUserId;
+    /**
+     * 添加用户角色
+     */
+    @TableField("insertUserRole")
+    private Integer insertUserRole;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    public String getInstructions() {
+        return instructions;
+    }
+
+    public void setInstructions(String instructions) {
+        this.instructions = instructions;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getInsertUserId() {
+        return insertUserId;
+    }
+
+    public void setInsertUserId(Integer insertUserId) {
+        this.insertUserId = insertUserId;
+    }
+
+    public Integer getInsertUserRole() {
+        return insertUserRole;
+    }
+
+    public void setInsertUserRole(Integer insertUserRole) {
+        this.insertUserRole = insertUserRole;
+    }
+
+    @Override
+    public String toString() {
+        return "IntegralGoods{" +
+                "id=" + id +
+                ", insertTime=" + insertTime +
+                ", name='" + name + '\'' +
+                ", imgUrl='" + imgUrl + '\'' +
+                ", integral=" + integral +
+                ", instructions='" + instructions + '\'' +
+                ", state=" + state +
+                ", insertUserId=" + insertUserId +
+                ", insertUserRole=" + insertUserRole +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/IntegralOrder.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/IntegralOrder.java
new file mode 100644
index 0000000..a007827
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/IntegralOrder.java
@@ -0,0 +1,175 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 积分兑换订单
+ */
+@TableName("t_integral_order")
+public class IntegralOrder {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 兑换时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 兑换用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 兑换商品id
+     */
+    @TableField("goodsId")
+    private Integer goodsId;
+    /**
+     * 兑换积分
+     */
+    @TableField("integral")
+    private Integer integral;
+    /**
+     * 兑换数量
+     */
+    @TableField("num")
+    private Integer num;
+    /**
+     * 收货人
+     */
+    @TableField("consigneeName")
+    private String consigneeName;
+    /**
+     * 收件人电话
+     */
+    @TableField("consigneePhone")
+    private String consigneePhone;
+    /**
+     * 收货地址
+     */
+    @TableField("consigneeAddress")
+    private String consigneeAddress;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 状态(1=未处理,2=已处理,3=已删除)
+     */
+    @TableField("state")
+    private Integer state;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getGoodsId() {
+        return goodsId;
+    }
+
+    public void setGoodsId(Integer goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getConsigneeName() {
+        return consigneeName;
+    }
+
+    public void setConsigneeName(String consigneeName) {
+        this.consigneeName = consigneeName;
+    }
+
+    public String getConsigneePhone() {
+        return consigneePhone;
+    }
+
+    public void setConsigneePhone(String consigneePhone) {
+        this.consigneePhone = consigneePhone;
+    }
+
+    public String getConsigneeAddress() {
+        return consigneeAddress;
+    }
+
+    public void setConsigneeAddress(String consigneeAddress) {
+        this.consigneeAddress = consigneeAddress;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "IntegralOrder{" +
+                "id=" + id +
+                ", insertTime=" + insertTime +
+                ", userId=" + userId +
+                ", goodsId=" + goodsId +
+                ", num=" + num +
+                ", consigneeName='" + consigneeName + '\'' +
+                ", consigneePhone='" + consigneePhone + '\'' +
+                ", consigneeAddress='" + consigneeAddress + '\'' +
+                ", remark='" + remark + '\'' +
+                ", state=" + state +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Invoice.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Invoice.java
new file mode 100644
index 0000000..e1a689b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Invoice.java
@@ -0,0 +1,218 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 发票
+ */
+@TableName("t_invoice")
+public class Invoice {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 开票金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 开票订单数量
+     */
+    @TableField("orderNum")
+    private Integer orderNum;
+    /**
+     * 开票类型(1=个人发票,2=单位发票)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 抬头名称(公司名字/个人姓名)
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 税号
+     */
+    @TableField("code")
+    private String code;
+    /**
+     * 发票内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 地址+电话
+     */
+    @TableField("address")
+    private String address;
+    /**
+     * 开户行+账号
+     */
+    @TableField("bank")
+    private String bank;
+    /**
+     * 邮箱地址
+     */
+    @TableField("email")
+    private String email;
+    /**
+     * 开票用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 状态(1=待开,2=成功,3=失败)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 申请时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getBank() {
+        return bank;
+    }
+
+    public void setBank(String bank) {
+        this.bank = bank;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "Invoice{" +
+                "id=" + id +
+                ", money=" + money +
+                ", orderNum=" + orderNum +
+                ", type=" + type +
+                ", name='" + name + '\'' +
+                ", code='" + code + '\'' +
+                ", content='" + content + '\'' +
+                ", remark='" + remark + '\'' +
+                ", address='" + address + '\'' +
+                ", bank='" + bank + '\'' +
+                ", email='" + email + '\'' +
+                ", userId=" + userId +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java
new file mode 100644
index 0000000..10135f8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java
@@ -0,0 +1,128 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 登录记录
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_login_log")
+public class LoginLog extends Model<LoginLog> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 日志名称
+     */
+	private String logname;
+    /**
+     * 管理员id
+     */
+	private Integer userid;
+    /**
+     * 创建时间
+     */
+	private Date createtime;
+    /**
+     * 是否执行成功
+     */
+	private String succeed;
+    /**
+     * 具体消息
+     */
+	private String message;
+    /**
+     * 登录ip
+     */
+	private String ip;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getLogname() {
+		return logname;
+	}
+
+	public void setLogname(String logname) {
+		this.logname = logname;
+	}
+
+	public Integer getUserid() {
+		return userid;
+	}
+
+	public void setUserid(Integer userid) {
+		this.userid = userid;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public String getSucceed() {
+		return succeed;
+	}
+
+	public void setSucceed(String succeed) {
+		this.succeed = succeed;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public String getIp() {
+		return ip;
+	}
+
+	public void setIp(String ip) {
+		this.ip = ip;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "LoginLog{" +
+			"id=" + id +
+			", logname=" + logname +
+			", userid=" + userid +
+			", createtime=" + createtime +
+			", succeed=" + succeed +
+			", message=" + message +
+			", ip=" + ip +
+			"}";
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java
new file mode 100644
index 0000000..6df6215
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java
@@ -0,0 +1,208 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import org.hibernate.validator.constraints.NotBlank;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 菜单表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_menu")
+public class Menu extends Model<Menu> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 菜单编号
+     */
+    private String code;
+    /**
+     * 菜单父编号
+     */
+    private String pcode;
+    /**
+     * 当前菜单的所有父菜单编号
+     */
+    private String pcodes;
+    /**
+     * 菜单名称
+     */
+    @NotBlank
+    private String name;
+    /**
+     * 菜单图标
+     */
+    private String icon;
+    /**
+     * url地址
+     */
+    @NotBlank
+    private String url;
+    /**
+     * 菜单排序号
+     */
+    private Integer num;
+    /**
+     * 菜单层级
+     */
+    private Integer levels;
+    /**
+     * 是否是菜单(1:是  0:不是)
+     */
+    private Integer ismenu;
+    /**
+     * 备注
+     */
+    private String tips;
+    /**
+     * 菜单状态 :  1:启用   0:不启用
+     */
+    private Integer status;
+    /**
+     * 是否打开:    1:打开   0:不打开
+     */
+    private Integer isopen;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getPcode() {
+        return pcode;
+    }
+
+    public void setPcode(String pcode) {
+        this.pcode = pcode;
+    }
+
+    public String getPcodes() {
+        return pcodes;
+    }
+
+    public void setPcodes(String pcodes) {
+        this.pcodes = pcodes;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Integer getLevels() {
+        return levels;
+    }
+
+    public void setLevels(Integer levels) {
+        this.levels = levels;
+    }
+
+    public Integer getIsmenu() {
+        return ismenu;
+    }
+
+    public void setIsmenu(Integer ismenu) {
+        this.ismenu = ismenu;
+    }
+
+    public String getTips() {
+        return tips;
+    }
+
+    public void setTips(String tips) {
+        this.tips = tips;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getIsopen() {
+        return isopen;
+    }
+
+    public void setIsopen(Integer isopen) {
+        this.isopen = isopen;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Menu{" +
+                "id=" + id +
+                ", code=" + code +
+                ", pcode=" + pcode +
+                ", pcodes=" + pcodes +
+                ", name=" + name +
+                ", icon=" + icon +
+                ", url=" + url +
+                ", num=" + num +
+                ", levels=" + levels +
+                ", ismenu=" + ismenu +
+                ", tips=" + tips +
+                ", status=" + status +
+                ", isopen=" + isopen +
+                "}";
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java
new file mode 100644
index 0000000..6967223
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java
@@ -0,0 +1,115 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 通知表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_notice")
+public class Notice extends Model<Notice> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 标题
+     */
+	private String title;
+    /**
+     * 类型
+     */
+	private Integer type;
+    /**
+     * 内容
+     */
+	private String content;
+    /**
+     * 创建时间
+     */
+	private Date createtime;
+    /**
+     * 创建人
+     */
+	private Integer creater;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public Integer getType() {
+		return type;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public Integer getCreater() {
+		return creater;
+	}
+
+	public void setCreater(Integer creater) {
+		this.creater = creater;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "Notice{" +
+			"id=" + id +
+			", title=" + title +
+			", type=" + type +
+			", content=" + content +
+			", createtime=" + createtime +
+			", creater=" + creater +
+			"}";
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OpenCity.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OpenCity.java
new file mode 100644
index 0000000..0cf1845
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OpenCity.java
@@ -0,0 +1,115 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableName;
+
+/**
+ * 开通城市
+ */
+@TableName("t_open_city")
+public class OpenCity extends BaseBean {
+    /**
+     * 城市编号(行政编号)
+     */
+    @TableField("code")
+    private String code;
+    /**
+     * 经度
+     */
+    @TableField("lon")
+    private Double lon;
+    /**
+     * 纬度
+     */
+    @TableField("lat")
+    private Double lat;
+    /**
+     * 是否需要网约车资格(1:是,2:否)
+     */
+    @TableField("isQualifications")
+    private Integer isQualifications;
+    /**
+     * 省名称
+     */
+    @TableField("areaName")
+    private String areaName;
+    /**
+     * 市名称
+     */
+    @TableField("cityName")
+    private String cityName;
+    /**
+     * 区县名称
+     */
+    @TableField("provinceName")
+    private String provinceName;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Integer getIsQualifications() {
+        return isQualifications;
+    }
+
+    public void setIsQualifications(Integer isQualifications) {
+        this.isQualifications = isQualifications;
+    }
+
+    public String getAreaName() {
+        return areaName;
+    }
+
+    public void setAreaName(String areaName) {
+        this.areaName = areaName;
+    }
+
+    public String getCityName() {
+        return cityName;
+    }
+
+    public void setCityName(String cityName) {
+        this.cityName = cityName;
+    }
+
+    public String getProvinceName() {
+        return provinceName;
+    }
+
+    public void setProvinceName(String provinceName) {
+        this.provinceName = provinceName;
+    }
+
+    public Double getLon() {
+        return lon;
+    }
+
+    public void setLon(Double lon) {
+        this.lon = lon;
+    }
+
+    public Double getLat() {
+        return lat;
+    }
+
+    public void setLat(Double lat) {
+        this.lat = lat;
+    }
+
+    @Override
+    public String toString() {
+        return "OpenCity{" +
+                "code='" + code + '\'' +
+                ", lon=" + lon +
+                ", lat=" + lat +
+                ", isQualifications=" + isQualifications +
+                ", areaName='" + areaName + '\'' +
+                ", cityName='" + cityName + '\'' +
+                ", provinceName='" + provinceName + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OpenCityBusiness.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OpenCityBusiness.java
new file mode 100644
index 0000000..c6a92d0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OpenCityBusiness.java
@@ -0,0 +1,45 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableName;
+
+/**
+ * 开通城市业务类型
+ */
+@TableName("t_open_city_business")
+public class OpenCityBusiness extends BaseBean {
+    /**
+     * 业务类型(1=专车,2=出租车,3=跨城出行,4=同城小件物流,5=跨城小件物流,6=包车)
+     */
+    @TableField("businessType")
+    private Integer businessType;
+    /**
+     * 排序
+     */
+    @TableField("sort")
+    private Integer sort;
+
+    public Integer getBusinessType() {
+        return businessType;
+    }
+
+    public void setBusinessType(Integer businessType) {
+        this.businessType = businessType;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    @Override
+    public String toString() {
+        return "OpenCityBusiness{" +
+                "businessType=" + businessType +
+                ", sort=" + sort +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java
new file mode 100644
index 0000000..7851475
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java
@@ -0,0 +1,154 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 操作日志
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_operation_log")
+public class OperationLog extends Model<OperationLog> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 日志类型
+     */
+	private String logtype;
+    /**
+     * 日志名称
+     */
+	private String logname;
+    /**
+     * 用户id
+     */
+	private Integer userid;
+    /**
+     * 类名称
+     */
+	private String classname;
+    /**
+     * 方法名称
+     */
+	private String method;
+    /**
+     * 创建时间
+     */
+	private Date createtime;
+    /**
+     * 是否成功
+     */
+	private String succeed;
+    /**
+     * 备注
+     */
+	private String message;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getLogtype() {
+		return logtype;
+	}
+
+	public void setLogtype(String logtype) {
+		this.logtype = logtype;
+	}
+
+	public String getLogname() {
+		return logname;
+	}
+
+	public void setLogname(String logname) {
+		this.logname = logname;
+	}
+
+	public Integer getUserid() {
+		return userid;
+	}
+
+	public void setUserid(Integer userid) {
+		this.userid = userid;
+	}
+
+	public String getClassname() {
+		return classname;
+	}
+
+	public void setClassname(String classname) {
+		this.classname = classname;
+	}
+
+	public String getMethod() {
+		return method;
+	}
+
+	public void setMethod(String method) {
+		this.method = method;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public String getSucceed() {
+		return succeed;
+	}
+
+	public void setSucceed(String succeed) {
+		this.succeed = succeed;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "OperationLog{" +
+			"id=" + id +
+			", logtype=" + logtype +
+			", logname=" + logname +
+			", userid=" + userid +
+			", classname=" + classname +
+			", method=" + method +
+			", createtime=" + createtime +
+			", succeed=" + succeed +
+			", message=" + message +
+			"}";
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java
new file mode 100644
index 0000000..84a7594
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java
@@ -0,0 +1,178 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 取消订单
+ */
+@TableName("t_order_cancel")
+public class OrderCancel {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 取消原因
+     */
+    @TableField("reason")
+    private String reason;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=余额)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 支付金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 状态(1=临时,2=正式)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     * @return
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 取消人员类型(1=用户,2=后台)
+     * @return
+     */
+    @TableField("userType")
+    private Integer userType;
+    /**
+     * 取消人id
+     * @return
+     */
+    @TableField("userId")
+    private Integer userId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderCancel{" +
+                "id=" + id +
+                ", orderId=" + orderId +
+                ", orderType=" + orderType +
+                ", reason='" + reason + '\'' +
+                ", remark='" + remark + '\'' +
+                ", payType=" + payType +
+                ", money=" + money +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                ", userType=" + userType +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderEvaluate.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderEvaluate.java
new file mode 100644
index 0000000..5b25f94
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderEvaluate.java
@@ -0,0 +1,136 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 订单评价
+ */
+@TableName("t_order_evaluate")
+public class OrderEvaluate {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 订单类型(1=专车,2=出租车,3=跨城出行,4=同城小件物流,5=跨城小件物流,6=包车)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 评分
+     */
+    @TableField("fraction")
+    private Integer fraction;
+    /**
+     * 评价内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 评价时间
+     * @return
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 评价用户id
+     * @return
+     */
+    @TableField("userId")
+    private Integer userId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getFraction() {
+        return fraction;
+    }
+
+    public void setFraction(Integer fraction) {
+        this.fraction = fraction;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderEvaluate{" +
+                "id=" + id +
+                ", orderId=" + orderId +
+                ", driverId=" + driverId +
+                ", orderType=" + orderType +
+                ", fraction=" + fraction +
+                ", content='" + content + '\'' +
+                ", insertTime=" + insertTime +
+                ", userId=" + userId +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderFrequentPassengers.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderFrequentPassengers.java
new file mode 100644
index 0000000..50961c9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderFrequentPassengers.java
@@ -0,0 +1,66 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 订单乘车人关系表
+ */
+@TableName("t_order_frequent_passengers")
+public class OrderFrequentPassengers {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单类型
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 乘车人id
+     */
+    @TableField("frequentPassengersId")
+    private Integer frequentPassengersId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getFrequentPassengersId() {
+        return frequentPassengersId;
+    }
+
+    public void setFrequentPassengersId(Integer frequentPassengersId) {
+        this.frequentPassengersId = frequentPassengersId;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPosition.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPosition.java
new file mode 100644
index 0000000..c29382f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPosition.java
@@ -0,0 +1,148 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 订单轨迹
+ */
+@TableName("t_order_position")
+public class OrderPosition {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单类型
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 经度
+     */
+    @TableField("lon")
+    private String lon;
+    /**
+     * 纬度
+     */
+    @TableField("lat")
+    private String lat;
+    /**
+     * 方向角
+     */
+    @TableField("directionAngle")
+    private String directionAngle;
+    /**
+     * 海拔
+     */
+    @TableField("altitude")
+    private String altitude;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getLon() {
+        return lon;
+    }
+
+    public void setLon(String lon) {
+        this.lon = lon;
+    }
+
+    public String getLat() {
+        return lat;
+    }
+
+    public void setLat(String lat) {
+        this.lat = lat;
+    }
+
+    public String getDirectionAngle() {
+        return directionAngle;
+    }
+
+    public void setDirectionAngle(String directionAngle) {
+        this.directionAngle = directionAngle;
+    }
+
+    public String getAltitude() {
+        return altitude;
+    }
+
+    public void setAltitude(String altitude) {
+        this.altitude = altitude;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderPosition{" +
+                "id=" + id +
+                ", orderType=" + orderType +
+                ", orderId=" + orderId +
+                ", driverId=" + driverId +
+                ", lon='" + lon + '\'' +
+                ", lat='" + lat + '\'' +
+                ", directionAngle='" + directionAngle + '\'' +
+                ", altitude='" + altitude + '\'' +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Phone.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Phone.java
new file mode 100644
index 0000000..7069fa4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Phone.java
@@ -0,0 +1,90 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 系统电话
+ */
+@TableName("t_phone")
+public class Phone {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 数据类型(1:报警电话,2:投诉电话)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 是否是平台数据(1=是,2=否)
+     */
+    @TableField("platform")
+    private Integer platform;
+    /**
+     * 电话
+     */
+    @TableField("phone")
+    private String phone;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(Integer platform) {
+        this.platform = platform;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    @Override
+    public String toString() {
+        return "Phone{" +
+                "id=" + id +
+                ", type=" + type +
+                ", platform=" + platform +
+                ", phone='" + phone + '\'' +
+                ", companyId=" + companyId +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Problem.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Problem.java
new file mode 100644
index 0000000..d5c02c6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Problem.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 在线客服
+ */
+@TableName("t_problem")
+public class Problem {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 提问内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 回答内容
+     */
+    @TableField("answer")
+    private String answer;
+    /**
+     * 处理人
+     */
+    @TableField("handleUserId")
+    private Integer handleUserId;
+    /**
+     * 处理时间
+     */
+    @TableField("handleTime")
+    private Date handleTime;
+    /**
+     * 提问时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 状态(1=待处理,2=已处理)
+     */
+    @TableField("state")
+    private Integer state;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public Integer getHandleUserId() {
+        return handleUserId;
+    }
+
+    public void setHandleUserId(Integer handleUserId) {
+        this.handleUserId = handleUserId;
+    }
+
+    public Date getHandleTime() {
+        return handleTime;
+    }
+
+    public void setHandleTime(Date handleTime) {
+        this.handleTime = handleTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "Problem{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", content='" + content + '\'' +
+                ", answer='" + answer + '\'' +
+                ", handleUserId=" + handleUserId +
+                ", handleTime=" + handleTime +
+                ", insertTime=" + insertTime +
+                ", state=" + state +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PushOrder.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PushOrder.java
new file mode 100644
index 0000000..64df32c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PushOrder.java
@@ -0,0 +1,118 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 推单设置
+ */
+@TableName("t_sys_push_order")
+public class PushOrder {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 推单距离(公里)
+     */
+    @TableField("pushDistance")
+    private Double pushDistance;
+    /**
+     * 推单时间(秒)
+     */
+    @TableField("pushTime")
+    private Integer pushTime;
+    /**
+     * 推单占所有司机百分比
+     */
+    @TableField("driverProportion")
+    private Double driverProportion;
+    /**
+     * 推单次数(1=第一轮,2=第二轮,3=第三轮)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 推单单据类型(1=专车,2=出租车)
+     */
+    @TableField("pushType")
+    private Integer pushType;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Double getPushDistance() {
+        return pushDistance;
+    }
+
+    public void setPushDistance(Double pushDistance) {
+        this.pushDistance = pushDistance;
+    }
+
+    public Integer getPushTime() {
+        return pushTime;
+    }
+
+    public void setPushTime(Integer pushTime) {
+        this.pushTime = pushTime;
+    }
+
+    public Double getDriverProportion() {
+        return driverProportion;
+    }
+
+    public void setDriverProportion(Double driverProportion) {
+        this.driverProportion = driverProportion;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getPushType() {
+        return pushType;
+    }
+
+    public void setPushType(Integer pushType) {
+        this.pushType = pushType;
+    }
+
+    @Override
+    public String toString() {
+        return "PushOrder{" +
+                "id=" + id +
+                ", companyId=" + companyId +
+                ", pushDistance=" + pushDistance +
+                ", pushTime=" + pushTime +
+                ", driverProportion=" + driverProportion +
+                ", type=" + type +
+                ", pushType=" + pushType +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/RedPacketRecord.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/RedPacketRecord.java
new file mode 100644
index 0000000..b30b494
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/RedPacketRecord.java
@@ -0,0 +1,162 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 系统红包设置
+ */
+@TableName("t_sys_red_packet_record")
+public class RedPacketRecord {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 添加时间
+     */
+    @TableField("insert_time")
+    private Date insertTime;
+    /**
+     * 发放企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 红包名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 红包类型(1=固定金额,2=随机金额)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 总金额
+     */
+    @TableField("totalMoney")
+    private Double totalMoney;
+    /**
+     * 剩余金额
+     */
+    @TableField("laveMoney")
+    private Double laveMoney;
+    /**
+     * 开始金额
+     */
+    @TableField("startMoney")
+    private Double startMoney;
+    /**
+     * 结束金额
+     */
+    @TableField("endMoney")
+    private Double endMoney;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Double getTotalMoney() {
+        return totalMoney;
+    }
+
+    public void setTotalMoney(Double totalMoney) {
+        this.totalMoney = totalMoney;
+    }
+
+    public Double getLaveMoney() {
+        return laveMoney;
+    }
+
+    public void setLaveMoney(Double laveMoney) {
+        this.laveMoney = laveMoney;
+    }
+
+    public Double getStartMoney() {
+        return startMoney;
+    }
+
+    public void setStartMoney(Double startMoney) {
+        this.startMoney = startMoney;
+    }
+
+    public Double getEndMoney() {
+        return endMoney;
+    }
+
+    public void setEndMoney(Double endMoney) {
+        this.endMoney = endMoney;
+    }
+
+    @Override
+    public String toString() {
+        return "RedPacketRecord{" +
+                "id=" + id +
+                ", money=" + money +
+                ", insertTime=" + insertTime +
+                ", companyId=" + companyId +
+                ", name='" + name + '\'' +
+                ", type=" + type +
+                ", totalMoney=" + totalMoney +
+                ", laveMoney=" + laveMoney +
+                ", startMoney=" + startMoney +
+                ", endMoney=" + endMoney +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java
new file mode 100644
index 0000000..a37c657
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 省市区
+ */
+@TableName("t_region")
+public class Region {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 城市名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 城市行政code
+     */
+    @TableField("code")
+    private String code;
+    /**
+     * 区号code
+     */
+    @TableField("citycode")
+    private String citycode;
+    /**
+     * 父级id
+     */
+    @TableField("parent_id")
+    private Integer parentId;
+    /**
+     * 英文
+     */
+    @TableField("english")
+    private String english;
+
+    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 getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getCitycode() {
+        return citycode;
+    }
+
+    public void setCitycode(String citycode) {
+        this.citycode = citycode;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getEnglish() {
+        return english;
+    }
+
+    public void setEnglish(String english) {
+        this.english = english;
+    }
+
+    @Override
+    public String toString() {
+        return "Region{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", code='" + code + '\'' +
+                ", citycode='" + citycode + '\'' +
+                ", parentId=" + parentId +
+                ", english='" + english + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java
new file mode 100644
index 0000000..48c2df6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java
@@ -0,0 +1,75 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 角色和菜单关联表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_relation")
+public class Relation extends Model<Relation> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 菜单id
+     */
+    private Long menuid;
+    /**
+     * 角色id
+     */
+    private Integer roleid;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Long getMenuid() {
+        return menuid;
+    }
+
+    public void setMenuid(Long menuid) {
+        this.menuid = menuid;
+    }
+
+    public Integer getRoleid() {
+        return roleid;
+    }
+
+    public void setRoleid(Integer roleid) {
+        this.roleid = roleid;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Relation{" +
+                "id=" + id +
+                ", menuid=" + menuid +
+                ", roleid=" + roleid +
+                "}";
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java
new file mode 100644
index 0000000..70ae563
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 角色表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_role")
+public class Role extends Model<Role> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 序号
+     */
+	private Integer num;
+    /**
+     * 父角色id
+     */
+	private Integer pid;
+    /**
+     * 角色名称
+     */
+	private String name;
+    /**
+     * 部门名称
+     */
+	private Integer deptid;
+    /**
+     * 提示
+     */
+	private String tips;
+    /**
+     * 保留字段(暂时没用)
+     */
+	private Integer version;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getNum() {
+		return num;
+	}
+
+	public void setNum(Integer num) {
+		this.num = num;
+	}
+
+	public Integer getPid() {
+		return pid;
+	}
+
+	public void setPid(Integer pid) {
+		this.pid = pid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Integer getDeptid() {
+		return deptid;
+	}
+
+	public void setDeptid(Integer deptid) {
+		this.deptid = deptid;
+	}
+
+	public String getTips() {
+		return tips;
+	}
+
+	public void setTips(String tips) {
+		this.tips = tips;
+	}
+
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "Role{" +
+			"id=" + id +
+			", num=" + num +
+			", pid=" + pid +
+			", name=" + name +
+			", deptid=" + deptid +
+			", tips=" + tips +
+			", version=" + version +
+			"}";
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SensitiveWords.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SensitiveWords.java
new file mode 100644
index 0000000..0091dc1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SensitiveWords.java
@@ -0,0 +1,64 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 敏感词
+ */
+@TableName("t_sys_sensitive_words")
+public class SensitiveWords {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 添加时间
+     */
+    @TableField("createTime")
+    private Date createTime;
+    /**
+     * 内容
+     */
+    @TableField("content")
+    private String content;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "SensitiveWords{" +
+                "id=" + id +
+                ", createTime=" + createTime +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/ServerCarModel.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/ServerCarModel.java
new file mode 100644
index 0000000..e12def7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/ServerCarModel.java
@@ -0,0 +1,120 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 服务车型设置
+ */
+@TableName("t_server_carmodel")
+public class ServerCarModel {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 业务类型(1=专车,2=城际,3=包车)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 车型名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 车型照片
+     */
+    @TableField("img")
+    private String img;
+    /**
+     * 包车价格(100-300)
+     */
+    @TableField("price")
+    private String price;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getPrice() {
+        return price;
+    }
+
+    public void setPrice(String price) {
+        this.price = price;
+    }
+
+    @Override
+    public String toString() {
+        return "ServerCarModel{" +
+                "id=" + id +
+                ", type=" + type +
+                ", name='" + name + '\'' +
+                ", img='" + img + '\'' +
+                ", price='" + price + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Smsrecord.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Smsrecord.java
new file mode 100644
index 0000000..b132a93
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Smsrecord.java
@@ -0,0 +1,106 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 短信记录
+ */
+@TableName("t_smsrecord")
+public class Smsrecord {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 短信类型(1=用户端注册/登录,2=用户端更换手机,3=用户端忘记密码,4=用户修改密码,5=司机注册,6=司机忘记密码,7=司机修改手机号,8=司机修改密码)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 发送电话
+     */
+    @TableField("phone")
+    private String phone;
+    /**
+     * 验证码
+     */
+    @TableField("code")
+    private String code;
+    /**
+     * 短信内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "Smsrecord{" +
+                "id=" + id +
+                ", type=" + type +
+                ", phone='" + phone + '\'' +
+                ", code='" + code + '\'' +
+                ", content='" + content + '\'' +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponRecord.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponRecord.java
new file mode 100644
index 0000000..d88df58
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponRecord.java
@@ -0,0 +1,162 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-优惠券记录
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-15
+ */
+@TableName("t_sys_coupon_record")
+public class SysCouponRecord extends Model<SysCouponRecord> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 金额
+     */
+    private BigDecimal money;
+    /**
+     * 满减金额
+     */
+    private BigDecimal fullMoney;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 优惠券使用类型(0=通用,1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    private Integer couponUseType;
+    /**
+     * 优惠券类型(1=抵扣,2=满减)
+     */
+    private Integer couponType;
+    /**
+     * 优惠券名称
+     */
+    private String name;
+    /**
+     * 有效天数
+     */
+    private Integer effective;
+    /**
+     * 1=平台 2=分公司 3=加盟商
+     */
+    private Integer companyType;
+
+    public Integer getCompanyType() {
+        return companyType;
+    }
+
+    public void setCompanyType(Integer companyType) {
+        this.companyType = companyType;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public BigDecimal getFullMoney() {
+        return fullMoney;
+    }
+
+    public void setFullMoney(BigDecimal fullMoney) {
+        this.fullMoney = fullMoney;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getCouponUseType() {
+        return couponUseType;
+    }
+
+    public void setCouponUseType(Integer couponUseType) {
+        this.couponUseType = couponUseType;
+    }
+
+    public Integer getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(Integer couponType) {
+        this.couponType = couponType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getEffective() {
+        return effective;
+    }
+
+    public void setEffective(Integer effective) {
+        this.effective = effective;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "SysCouponRecord{" +
+        "id=" + id +
+        ", money=" + money +
+        ", fullMoney=" + fullMoney +
+        ", insertTime=" + insertTime +
+        ", companyId=" + companyId +
+        ", couponUseType=" + couponUseType +
+        ", couponType=" + couponType +
+        ", name=" + name +
+        ", effective=" + effective +
+        "}";
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysIntegral.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysIntegral.java
new file mode 100644
index 0000000..0b46a6a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysIntegral.java
@@ -0,0 +1,62 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 系统积分设置
+ */
+@TableName("t_sys_integral")
+public class SysIntegral {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 积分
+     */
+    @TableField("integral")
+    private Integer integral;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    @Override
+    public String toString() {
+        return "SysIntegral{" +
+                "id=" + id +
+                ", companyId=" + companyId +
+                ", integral=" + integral +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysReformist.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysReformist.java
new file mode 100644
index 0000000..29efca5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysReformist.java
@@ -0,0 +1,102 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Data;
+
+/**
+ * 订单改派金额设置
+ */
+@TableName("t_sys_reformist")
+@Data
+public class SysReformist {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 专车是否允许改派(1=否,2=是)
+     * @return
+     */
+    @TableField("isSpecialCar")
+    private Integer isSpecialCar;
+    /**
+     * 出租车是否允许改派(1=否,2=是)
+     * @return
+     */
+    @TableField("isTaxiCar")
+    private Integer isTaxiCar;
+    /**
+     * 用户端客服二维码
+     */
+    private String userQrCode;
+    /**
+     * 司机端客服二维码
+     */
+    private String driverQrCode;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getIsSpecialCar() {
+        return isSpecialCar;
+    }
+
+    public void setIsSpecialCar(Integer isSpecialCar) {
+        this.isSpecialCar = isSpecialCar;
+    }
+
+    public Integer getIsTaxiCar() {
+        return isTaxiCar;
+    }
+
+    public void setIsTaxiCar(Integer isTaxiCar) {
+        this.isTaxiCar = isTaxiCar;
+    }
+
+    @Override
+    public String toString() {
+        return "SysReformist{" +
+                "id=" + id +
+                ", companyId=" + companyId +
+                ", money=" + money +
+                ", isSpecialCar=" + isSpecialCar +
+                ", isTaxiCar=" + isTaxiCar +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemNotice.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemNotice.java
new file mode 100644
index 0000000..d4d786b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemNotice.java
@@ -0,0 +1,147 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 系统通知
+ */
+@TableName("t_system_notice")
+public class SystemNotice {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 类型(1=公告,2=系统消息)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 系统消息类型(1=打车业务,2=优惠券)
+     */
+    @TableField("noticeType")
+    private Integer noticeType;
+    /**
+     * 用户类型(1=用户,2=司机)
+     */
+    @TableField("userType")
+    private Integer userType;
+    /**
+     * 公告id
+     */
+    @TableField("noticesId")
+    private Integer noticesId;
+    /**
+     * 消息内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 接收对象id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 阅读状态(1=未读,2=已读)
+     */
+    @TableField("read")
+    private Integer read;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getRead() {
+        return read;
+    }
+
+    public void setRead(Integer read) {
+        this.read = read;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getNoticesId() {
+        return noticesId;
+    }
+
+    public void setNoticesId(Integer noticesId) {
+        this.noticesId = noticesId;
+    }
+
+    public Integer getNoticeType() {
+        return noticeType;
+    }
+
+    public void setNoticeType(Integer noticeType) {
+        this.noticeType = noticeType;
+    }
+
+    @Override
+    public String toString() {
+        return "SystemNotice{" +
+                "id=" + id +
+                ", type=" + type +
+                ", userType=" + userType +
+                ", noticesId=" + noticesId +
+                ", content='" + content + '\'' +
+                ", userId=" + userId +
+                ", insertTime=" + insertTime +
+                ", read=" + read +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemPrice.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemPrice.java
new file mode 100644
index 0000000..5a88fa9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemPrice.java
@@ -0,0 +1,90 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 服务价格规则
+ */
+@TableName("t_system_price")
+public class SystemPrice {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 服务车型设置
+     */
+    @TableField("serverCarModelId")
+    private Integer serverCarModelId;
+    /**
+     * 价格规则,每个输入框为一个参数{"num1":1,"num2":2.3}
+     */
+    @TableField("content")
+    private String content;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    @Override
+    public String toString() {
+        return "SystemPrice{" +
+                "id=" + id +
+                ", type=" + type +
+                ", companyId=" + companyId +
+                ", serverCarModelId=" + serverCarModelId +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TActivityGeneralization.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TActivityGeneralization.java
new file mode 100644
index 0000000..8c8f5e8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TActivityGeneralization.java
@@ -0,0 +1,169 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.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 io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 推广活动设置
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_activity_generalization")
+@Data
+public class TActivityGeneralization extends Model<TActivityGeneralization> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    private Integer effective;
+
+    @ApiModelProperty(value = "活动名称")
+    @TableField(value = "activityName")
+    private String activityName;
+
+    @ApiModelProperty(value = "最多参与人数")
+    @TableField(value = "participateCount")
+    private Integer participateCount;
+
+    @ApiModelProperty(value = "开始时间")
+    @TableField(value = "startTime")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @TableField(value = "endTime")
+    private Date endTime;
+
+    @ApiModelProperty(value = "优惠券id")
+    @TableField(value = "couponId")
+    private Integer couponId;
+
+    @ApiModelProperty(value = "发放数量")
+    @TableField(value = "userGrantCount")
+    private Integer userGrantCount;
+
+    @ApiModelProperty(value = "每月使用数量")
+    @TableField(value = "monthUseCount")
+    private Integer monthUseCount;
+
+    @ApiModelProperty(value = "使用说明")
+    @TableField(value = "useExplain")
+    private String useExplain;
+
+    @ApiModelProperty(value = "是否删除  1=否 2=是")
+    @TableField(value = "isDelete")
+    private Integer isDelete;
+    private Integer state;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getActivityName() {
+        return activityName;
+    }
+
+    public void setActivityName(String activityName) {
+        this.activityName = activityName;
+    }
+
+    public Integer getParticipateCount() {
+        return participateCount;
+    }
+
+    public void setParticipateCount(Integer participateCount) {
+        this.participateCount = participateCount;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getUserGrantCount() {
+        return userGrantCount;
+    }
+
+    public void setUserGrantCount(Integer userGrantCount) {
+        this.userGrantCount = userGrantCount;
+    }
+
+    public Integer getMonthUseCount() {
+        return monthUseCount;
+    }
+
+    public void setMonthUseCount(Integer monthUseCount) {
+        this.monthUseCount = monthUseCount;
+    }
+
+    public String getUseExplain() {
+        return useExplain;
+    }
+
+    public void setUseExplain(String useExplain) {
+        this.useExplain = useExplain;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TActivityGeneralization{" +
+                "id=" + id +
+                ", activityName='" + activityName + '\'' +
+                ", participateCount=" + participateCount +
+                ", startTime=" + startTime +
+                ", endTime=" + endTime +
+                ", couponId=" + couponId +
+                ", userGrantCount=" + userGrantCount +
+                ", monthUseCount=" + monthUseCount +
+                ", useExplain='" + useExplain + '\'' +
+                ", isDelete=" + isDelete +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCharteredService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCharteredService.java
new file mode 100644
index 0000000..125c177
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCharteredService.java
@@ -0,0 +1,233 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.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.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 包车服务管理
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("t_chartered_service")
+@Data
+public class TCharteredService extends Model<TCharteredService> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 服务名称
+     */
+	private String serviceName;
+
+	/**
+	 * 封面图
+	 */
+	private String themePicture;
+
+	/**
+	 * 车型id
+	 */
+	private Integer serverCarModelId;
+
+	/**
+	 * 服务金额
+	 */
+	private BigDecimal serviceMoney;
+
+	/**
+	 * 车辆类型 1=自动 2=手动
+	 */
+	private Integer carType;
+
+	/**
+	 * 状态 1=启用 0=禁用
+	 */
+	private Integer status;
+
+	/**
+	 * 删除状态(1=否,2=是)
+	 */
+	private Integer isDelete;
+
+	/**
+	 * 添加时间
+	 */
+	private Date insertTime;
+
+	/**
+	 * 计价规则
+	 */
+	private String priceRule;
+	/**
+	 * 计价规则图片
+	 */
+	private String priceRulePicture;
+	/**
+	 * 取消规则
+	 */
+	private String cancelRule;
+	/**
+	 * 取消规则图片
+	 */
+	private String cancelRulePicture;
+	@TableField(exist = false)
+	private String carModelName;
+
+	/**
+	 * 取消规则图片
+	 */
+	@TableField(exist = false)
+	private String serverCarModelName;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getServiceName() {
+		return serviceName;
+	}
+
+	public void setServiceName(String serviceName) {
+		this.serviceName = serviceName;
+	}
+
+	public String getThemePicture() {
+		return themePicture;
+	}
+
+	public void setThemePicture(String themePicture) {
+		this.themePicture = themePicture;
+	}
+
+	public Integer getServerCarModelId() {
+		return serverCarModelId;
+	}
+
+	public void setServerCarModelId(Integer serverCarModelId) {
+		this.serverCarModelId = serverCarModelId;
+	}
+
+	public BigDecimal getServiceMoney() {
+		return serviceMoney;
+	}
+
+	public void setServiceMoney(BigDecimal serviceMoney) {
+		this.serviceMoney = serviceMoney;
+	}
+
+	public Integer getCarType() {
+		return carType;
+	}
+
+	public void setCarType(Integer carType) {
+		this.carType = carType;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public Integer getIsDelete() {
+		return isDelete;
+	}
+
+	public void setIsDelete(Integer isDelete) {
+		this.isDelete = isDelete;
+	}
+
+	public Date getInsertTime() {
+		return insertTime;
+	}
+
+	public void setInsertTime(Date insertTime) {
+		this.insertTime = insertTime;
+	}
+
+	public String getPriceRule() {
+		return priceRule;
+	}
+
+	public void setPriceRule(String priceRule) {
+		this.priceRule = priceRule;
+	}
+
+	public String getPriceRulePicture() {
+		return priceRulePicture;
+	}
+
+	public void setPriceRulePicture(String priceRulePicture) {
+		this.priceRulePicture = priceRulePicture;
+	}
+
+	public String getCancelRule() {
+		return cancelRule;
+	}
+
+	public void setCancelRule(String cancelRule) {
+		this.cancelRule = cancelRule;
+	}
+
+	public String getCancelRulePicture() {
+		return cancelRulePicture;
+	}
+
+	public void setCancelRulePicture(String cancelRulePicture) {
+		this.cancelRulePicture = cancelRulePicture;
+	}
+
+	public String getServerCarModelName() {
+		return serverCarModelName;
+	}
+
+	public void setServerCarModelName(String serverCarModelName) {
+		this.serverCarModelName = serverCarModelName;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "TCharteredService{" +
+				"id=" + id +
+				", serviceName='" + serviceName + '\'' +
+				", themePicture='" + themePicture + '\'' +
+				", serverCarModelId=" + serverCarModelId +
+				", serviceMoney=" + serviceMoney +
+				", carType=" + carType +
+				", status=" + status +
+				", isDelete=" + isDelete +
+				", insertTime=" + insertTime +
+				", priceRule='" + priceRule + '\'' +
+				", priceRulePicture='" + priceRulePicture + '\'' +
+				", cancelRule='" + cancelRule + '\'' +
+				", cancelRulePicture='" + cancelRulePicture + '\'' +
+				'}';
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TNotices.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TNotices.java
new file mode 100644
index 0000000..0be3c5b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TNotices.java
@@ -0,0 +1,160 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableName;
+
+/**
+ * 通知
+ */
+@TableName("t_notices")
+public class TNotices extends BaseBean {
+    /**
+     * 标题
+     */
+    @TableField("title")
+    private String title;
+    /**
+     * 内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 排序
+     */
+    @TableField("sort")
+    private Integer sort;
+    /**
+     * 是否显示/发布(1=是,2=否)
+     */
+    @TableField("isShow")
+    private Integer isShow;
+    /**
+     * 是否播报(1=是,2=否)
+     */
+    @TableField("isBroadcast")
+    private Integer isBroadcast;
+    /**
+     * 公告类型(1=滚动消息,2=公告)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 图片地址
+     */
+    @TableField("imgUrl")
+    private String imgUrl;
+    /**
+     * 是否删除(1=否,2=是)
+     * @return
+     */
+    @TableField("isDelete")
+    private Integer isDelete;
+    /**
+     * 是否发布用户(1=否,2=是)
+     * @return
+     */
+    @TableField("isUser")
+    private Integer isUser;
+    /**
+     * 是否发布司机(1=否,2=是)
+     * @return
+     */
+    @TableField("isDriver")
+    private Integer isDriver;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Integer getIsShow() {
+        return isShow;
+    }
+
+    public void setIsShow(Integer isShow) {
+        this.isShow = isShow;
+    }
+
+    public Integer getIsBroadcast() {
+        return isBroadcast;
+    }
+
+    public void setIsBroadcast(Integer isBroadcast) {
+        this.isBroadcast = isBroadcast;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getIsUser() {
+        return isUser;
+    }
+
+    public void setIsUser(Integer isUser) {
+        this.isUser = isUser;
+    }
+
+    public Integer getIsDriver() {
+        return isDriver;
+    }
+
+    public void setIsDriver(Integer isDriver) {
+        this.isDriver = isDriver;
+    }
+
+    @Override
+    public String toString() {
+        return "TNotices{" +
+                "title='" + title + '\'' +
+                ", content='" + content + '\'' +
+                ", sort=" + sort +
+                ", isShow=" + isShow +
+                ", isBroadcast=" + isBroadcast +
+                ", type=" + type +
+                ", imgUrl='" + imgUrl + '\'' +
+                ", isDelete=" + isDelete +
+                ", isUser=" + isUser +
+                ", isDriver=" + isDriver +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCitySite.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCitySite.java
new file mode 100644
index 0000000..63ccfa8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCitySite.java
@@ -0,0 +1,165 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.DataSource;
+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 io.swagger.models.auth.In;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 开通城市表
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+
+@TableName("t_open_city_site")
+@Data
+public class TOpenCitySite extends Model<TOpenCitySite> {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TOpenCitySite that = (TOpenCitySite) o;
+        return Objects.equals(id, that.id) && Objects.equals(lon, that.lon) && Objects.equals(lat, that.lat) && Objects.equals(name, that.name) && Objects.equals(insertTime, that.insertTime) && Objects.equals(openCityId, that.openCityId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, lon, lat, name, insertTime, openCityId);
+    }
+
+    public String getInsertTime1() {
+
+        return insertTime1;
+    }
+
+    public void setInsertTime1(String insertTime1) {
+        this.insertTime1 = insertTime1;
+    }
+
+    @Override
+    public String toString() {
+        return "TOpenCitySite{" +
+                "id=" + id +
+                ", lon='" + lon + '\'' +
+                ", lat='" + lat + '\'' +
+                ", name='" + name + '\'' +
+                ", insertTime=" + insertTime +
+                ", openCityId=" + openCityId +
+                '}';
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getLon() {
+        return lon;
+    }
+
+    public void setLon(String lon) {
+        this.lon = lon;
+    }
+
+    public String getLat() {
+        return lat;
+    }
+
+    public void setLat(String lat) {
+        this.lat = lat;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getOpenCityId() {
+        return openCityId;
+    }
+
+    public void setOpenCityId(Integer openCityId) {
+        this.openCityId = openCityId;
+    }
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 经度
+     */
+    private String lon;
+    /**
+     * 纬度
+     */
+    private String lat;
+
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+
+    private Integer flag;
+    /**
+     * 类型 1机场2站点
+     */
+    private Integer type;
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    /**
+     * 站点名称
+     */
+    private String name;
+    private Date insertTime;
+    @TableField(exist = false)
+    private String insertTime1;
+    @TableField(exist = false)
+    private String address;
+    private Integer openCityId;
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java
new file mode 100644
index 0000000..30a9617
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java
@@ -0,0 +1,232 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 管理员表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_user")
+public class User extends Model<User> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 头像
+     */
+	private String avatar;
+    /**
+     * 账号
+     */
+	private String account;
+    /**
+     * 密码
+     */
+	private String password;
+    /**
+     * md5密码盐
+     */
+	private String salt;
+    /**
+     * 名字
+     */
+	private String name;
+    /**
+     * 生日
+     */
+	private Date birthday;
+    /**
+     * 性别(1:男 2:女)
+     */
+	private Integer sex;
+    /**
+     * 电子邮件
+     */
+	private String email;
+    /**
+     * 电话
+     */
+	private String phone;
+    /**
+     * 角色id
+     */
+	private String roleid;
+    /**
+     * 部门id
+     */
+	private Integer deptid;
+    /**
+     * 状态(1:启用  2:冻结  3:删除)
+     */
+	private Integer status;
+    /**
+     * 创建时间
+     */
+	private Date createtime;
+    /**
+     * 保留字段
+     */
+	private Integer version;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getAvatar() {
+		return avatar;
+	}
+
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
+
+	public String getAccount() {
+		return account;
+	}
+
+	public void setAccount(String account) {
+		this.account = account;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getSalt() {
+		return salt;
+	}
+
+	public void setSalt(String salt) {
+		this.salt = salt;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Date getBirthday() {
+		return birthday;
+	}
+
+	public void setBirthday(Date birthday) {
+		this.birthday = birthday;
+	}
+
+	public Integer getSex() {
+		return sex;
+	}
+
+	public void setSex(Integer sex) {
+		this.sex = sex;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public String getRoleid() {
+		return roleid;
+	}
+
+	public void setRoleid(String roleid) {
+		this.roleid = roleid;
+	}
+
+	public Integer getDeptid() {
+		return deptid;
+	}
+
+	public void setDeptid(Integer deptid) {
+		this.deptid = deptid;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "User{" +
+			"id=" + id +
+			", avatar=" + avatar +
+			", account=" + account +
+			", password=" + password +
+			", salt=" + salt +
+			", name=" + name +
+			", birthday=" + birthday +
+			", sex=" + sex +
+			", email=" + email +
+			", phone=" + phone +
+			", roleid=" + roleid +
+			", deptid=" + deptid +
+			", status=" + status +
+			", createtime=" + createtime +
+			", version=" + version +
+			"}";
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityBalance.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityBalance.java
new file mode 100644
index 0000000..d461b73
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityBalance.java
@@ -0,0 +1,260 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 充值优惠券活动
+ */
+@TableName("t_user_activity_balance")
+public class UserActivityBalance {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 是否启用(1=不启用,2=启用)
+     */
+    @TableField("enable")
+    private Integer enable;
+    /**
+     * 活动主表id
+     */
+    @TableField("userActivityId")
+    private Integer userActivityId;
+    /**
+     * 充值金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 通用优惠券数量
+     */
+    @TableField("generalNum")
+    private Integer generalNum;
+    /**
+     * 通用优惠券id
+     */
+    @TableField("generalCouponId")
+    private Integer generalCouponId;
+    /**
+     * 专车优惠券数据
+     */
+    @TableField("specialNum")
+    private Integer specialNum;
+    /**
+     * 专车优惠券id
+     */
+    @TableField("specialCouponId")
+    private Integer specialCouponId;
+    /**
+     * 出租车优惠券数量
+     */
+    @TableField("taxiNum")
+    private Integer taxiNum;
+    /**
+     * 出租车优惠券id
+     */
+    @TableField("taxiCouponId")
+    private Integer taxiCouponId;
+    /**
+     * 跨城优惠券数量
+     */
+    @TableField("intercityNum")
+    private Integer intercityNum;
+    /**
+     * 跨城优惠券id
+     */
+    @TableField("intercityCouponId")
+    private Integer intercityCouponId;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 有效期开始时间
+     */
+    @TableField("startTime")
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 总金额上限
+     * @return
+     */
+    @TableField("totalPrice")
+    private Double totalPrice;
+    /**
+     * 剩余总金额上限
+     * @return
+     */
+    @TableField("lavePrice")
+    private Double lavePrice;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getGeneralNum() {
+        return generalNum;
+    }
+
+    public void setGeneralNum(Integer generalNum) {
+        this.generalNum = generalNum;
+    }
+
+    public Integer getGeneralCouponId() {
+        return generalCouponId;
+    }
+
+    public void setGeneralCouponId(Integer generalCouponId) {
+        this.generalCouponId = generalCouponId;
+    }
+
+    public Integer getSpecialNum() {
+        return specialNum;
+    }
+
+    public void setSpecialNum(Integer specialNum) {
+        this.specialNum = specialNum;
+    }
+
+    public Integer getSpecialCouponId() {
+        return specialCouponId;
+    }
+
+    public void setSpecialCouponId(Integer specialCouponId) {
+        this.specialCouponId = specialCouponId;
+    }
+
+    public Integer getTaxiNum() {
+        return taxiNum;
+    }
+
+    public void setTaxiNum(Integer taxiNum) {
+        this.taxiNum = taxiNum;
+    }
+
+    public Integer getTaxiCouponId() {
+        return taxiCouponId;
+    }
+
+    public void setTaxiCouponId(Integer taxiCouponId) {
+        this.taxiCouponId = taxiCouponId;
+    }
+
+    public Integer getIntercityNum() {
+        return intercityNum;
+    }
+
+    public void setIntercityNum(Integer intercityNum) {
+        this.intercityNum = intercityNum;
+    }
+
+    public Integer getIntercityCouponId() {
+        return intercityCouponId;
+    }
+
+    public void setIntercityCouponId(Integer intercityCouponId) {
+        this.intercityCouponId = intercityCouponId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Double getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(Double totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public Double getLavePrice() {
+        return lavePrice;
+    }
+
+    public void setLavePrice(Double lavePrice) {
+        this.lavePrice = lavePrice;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityBalance{" +
+                "id=" + id +
+                ", enable=" + enable +
+                ", userActivityId=" + userActivityId +
+                ", money=" + money +
+                ", generalNum=" + generalNum +
+                ", generalCouponId=" + generalCouponId +
+                ", specialNum=" + specialNum +
+                ", specialCouponId=" + specialCouponId +
+                ", taxiNum=" + taxiNum +
+                ", taxiCouponId=" + taxiCouponId +
+                ", intercityNum=" + intercityNum +
+                ", intercityCouponId=" + intercityCouponId +
+                ", insertTime=" + insertTime +
+                ", startTime=" + startTime +
+                ", endTime=" + endTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount1.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount1.java
new file mode 100644
index 0000000..bee8d78
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount1.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 用户折扣活动
+ */
+@TableName("t_user_activity_discount1")
+public class UserActivityDiscount1 {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 活动id
+     */
+    @TableField("userActivityId")
+    private Integer userActivityId;
+    /**
+     * 专车折扣
+     */
+    @TableField("special")
+    private Double special;
+    /**
+     * 出租车折扣
+     */
+    @TableField("taxi")
+    private Double taxi;
+    /**
+     * 小件物流折扣
+     */
+    @TableField("logistics")
+    private Double logistics;
+    /**
+     * 活动有效开始时间
+     */
+    @TableField("startTime")
+    private Date startTime;
+    /**
+     * 活动有效结束时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 是否启用(1=不启用,2=启用)
+     */
+    @TableField("enable")
+    private Integer enable;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Double getSpecial() {
+        return special;
+    }
+
+    public void setSpecial(Double special) {
+        this.special = special;
+    }
+
+    public Double getTaxi() {
+        return taxi;
+    }
+
+    public void setTaxi(Double taxi) {
+        this.taxi = taxi;
+    }
+
+    public Double getLogistics() {
+        return logistics;
+    }
+
+    public void setLogistics(Double logistics) {
+        this.logistics = logistics;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityDiscount1{" +
+                "id=" + id +
+                ", userActivityId=" + userActivityId +
+                ", special=" + special +
+                ", taxi=" + taxi +
+                ", logistics=" + logistics +
+                ", startTime=" + startTime +
+                ", endTime=" + endTime +
+                ", enable=" + enable +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityInvite.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityInvite.java
new file mode 100644
index 0000000..9df1a0f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityInvite.java
@@ -0,0 +1,162 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 用户邀请活动
+ */
+@TableName("t_user_activity_invite")
+public class UserActivityInvite {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 用户活动主表
+     */
+    @TableField("userActivityId")
+    private Integer userActivityId;
+    /**
+     * 优惠券id
+     */
+    @TableField("couponId")
+    private Integer couponId;
+    /**
+     * 优惠券数量
+     */
+    @TableField("totalNum")
+    private Integer totalNum;
+    /**
+     * 有效开始时间
+     */
+    @TableField("startTime")
+    private Date startTime;
+    /**
+     * 有效结束时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 是否启用(1=不启用,2=启用)
+     */
+    @TableField("enable")
+    private Integer enable;
+    /**
+     * 有效天数
+     */
+    @TableField("effective")
+    private Integer effective;
+    /**
+     * 总金额上限
+     * @return
+     */
+    @TableField("totalPrice")
+    private Double totalPrice;
+    /**
+     * 剩余总金额上限
+     * @return
+     */
+    @TableField("lavePrice")
+    private Double lavePrice;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(Integer totalNum) {
+        this.totalNum = totalNum;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    public Integer getEffective() {
+        return effective;
+    }
+
+    public void setEffective(Integer effective) {
+        this.effective = effective;
+    }
+
+    public Double getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(Double totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public Double getLavePrice() {
+        return lavePrice;
+    }
+
+    public void setLavePrice(Double lavePrice) {
+        this.lavePrice = lavePrice;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityInvite{" +
+                "id=" + id +
+                ", userActivityId=" + userActivityId +
+                ", couponId=" + couponId +
+                ", totalNum=" + totalNum +
+                ", startTime=" + startTime +
+                ", endTime=" + endTime +
+                ", enable=" + enable +
+                ", effective=" + effective +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRedenvelope.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRedenvelope.java
new file mode 100644
index 0000000..7acc740
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRedenvelope.java
@@ -0,0 +1,162 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 分享红包活动
+ */
+@TableName("t_user_activity_redenvelope")
+public class UserActivityRedenvelope {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 活动id
+     */
+    @TableField("userActivityId")
+    private Integer userActivityId;
+    /**
+     * 红包id
+     */
+    @TableField("redEnvelopeId")
+    private Integer redEnvelopeId;
+    /**
+     * 总金额
+     */
+    @TableField("totalMoney")
+    private Double totalMoney;
+    /**
+     * 剩余金额
+     */
+    @TableField("laveMoney")
+    private Double laveMoney;
+    /**
+     * 活动开始时间
+     */
+    @TableField("startTime")
+    private Date startTime;
+    /**
+     * 活动结束时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 是否启用
+     */
+    @TableField("enable")
+    private Integer enable;
+    /**
+     * 总金额上限
+     * @return
+     */
+    @TableField("totalPrice")
+    private Double totalPrice;
+    /**
+     * 剩余总金额上限
+     * @return
+     */
+    @TableField("lavePrice")
+    private Double lavePrice;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Integer getRedEnvelopeId() {
+        return redEnvelopeId;
+    }
+
+    public void setRedEnvelopeId(Integer redEnvelopeId) {
+        this.redEnvelopeId = redEnvelopeId;
+    }
+
+    public Double getTotalMoney() {
+        return totalMoney;
+    }
+
+    public void setTotalMoney(Double totalMoney) {
+        this.totalMoney = totalMoney;
+    }
+
+    public Double getLaveMoney() {
+        return laveMoney;
+    }
+
+    public void setLaveMoney(Double laveMoney) {
+        this.laveMoney = laveMoney;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    public Double getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(Double totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public Double getLavePrice() {
+        return lavePrice;
+    }
+
+    public void setLavePrice(Double lavePrice) {
+        this.lavePrice = lavePrice;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityRedenvelope{" +
+                "id=" + id +
+                ", userActivityId=" + userActivityId +
+                ", redEnvelopeId=" + redEnvelopeId +
+                ", totalMoney=" + totalMoney +
+                ", laveMoney=" + laveMoney +
+                ", startTime=" + startTime +
+                ", endTime=" + endTime +
+                ", enable=" + enable +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRegistered.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRegistered.java
new file mode 100644
index 0000000..572a0bf
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRegistered.java
@@ -0,0 +1,162 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 用户注册活动
+ */
+@TableName("t_user_activity_registered")
+public class UserActivityRegistered {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 用户活动id
+     */
+    @TableField("userActivityId")
+    private Integer userActivityId;
+    /**
+     * 优惠券id
+     */
+    @TableField("couponId")
+    private Integer couponId;
+    /**
+     * 优惠券总数量
+     */
+    @TableField("totalNum")
+    private Integer totalNum;
+    /**
+     * 优惠券剩余数量
+     */
+    @TableField("laveNum")
+    private Integer laveNum;
+    /**
+     * 开始时间
+     */
+    @TableField("startTime")
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 是否启用(1=不启用,2=启用)
+     */
+    @TableField("enable")
+    private Integer enable;
+    /**
+     * 总金额上限
+     * @return
+     */
+    @TableField("totalPrice")
+    private Double totalPrice;
+    /**
+     * 剩余总金额上限
+     * @return
+     */
+    @TableField("lavePrice")
+    private Double lavePrice;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(Integer totalNum) {
+        this.totalNum = totalNum;
+    }
+
+    public Integer getLaveNum() {
+        return laveNum;
+    }
+
+    public void setLaveNum(Integer laveNum) {
+        this.laveNum = laveNum;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    public Double getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(Double totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public Double getLavePrice() {
+        return lavePrice;
+    }
+
+    public void setLavePrice(Double lavePrice) {
+        this.lavePrice = lavePrice;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityRegistered{" +
+                "id=" + id +
+                ", userActivityId=" + userActivityId +
+                ", couponId=" + couponId +
+                ", totalNum=" + totalNum +
+                ", laveNum=" + laveNum +
+                ", startTime=" + startTime +
+                ", endTime=" + endTime +
+                ", enable=" + enable +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserCouponRecord.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserCouponRecord.java
new file mode 100644
index 0000000..57d85cf
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserCouponRecord.java
@@ -0,0 +1,234 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 用户优惠券记录
+ */
+@TableName("t_user_coupon_record")
+public class UserCouponRecord {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 满减的满金额
+     */
+    @TableField("fullMoney")
+    private Double fullMoney;
+    /**
+     * 过期时间
+     */
+    @TableField("expirationTime")
+    private Date expirationTime;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 状态(1=未使用,2=已使用,3=已过期)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 使用结束时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 优惠券使用类型(0=通用,1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    @TableField("couponUseType")
+    private Integer couponUseType;
+    /**
+     * 优惠券类型(1=抵扣券,2=满减券)
+     */
+    @TableField("couponType")
+    private Integer couponType;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 优惠券id
+     * @return
+     */
+    @TableField("couponId")
+    private Integer couponId;
+    /**
+     * 活动id
+     * @return
+     */
+    @TableField("couponActivityId")
+    private Integer couponActivityId;
+    /**
+     * 活动类型(1=赠送活动,2=注册,3=邀请,4=充值)
+     * @return
+     */
+    @TableField("activityType")
+    private Integer activityType;
+    /**
+     * 充值记录id
+     * @return
+     */
+    @TableField("paymentRecordId")
+    private Integer paymentRecordId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Double getFullMoney() {
+        return fullMoney;
+    }
+
+    public void setFullMoney(Double fullMoney) {
+        this.fullMoney = fullMoney;
+    }
+
+    public Date getExpirationTime() {
+        return expirationTime;
+    }
+
+    public void setExpirationTime(Date expirationTime) {
+        this.expirationTime = expirationTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getCouponUseType() {
+        return couponUseType;
+    }
+
+    public void setCouponUseType(Integer couponUseType) {
+        this.couponUseType = couponUseType;
+    }
+
+    public Integer getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(Integer couponType) {
+        this.couponType = couponType;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getCouponActivityId() {
+        return couponActivityId;
+    }
+
+    public void setCouponActivityId(Integer couponActivityId) {
+        this.couponActivityId = couponActivityId;
+    }
+
+    public Integer getActivityType() {
+        return activityType;
+    }
+
+    public void setActivityType(Integer activityType) {
+        this.activityType = activityType;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getPaymentRecordId() {
+        return paymentRecordId;
+    }
+
+    public void setPaymentRecordId(Integer paymentRecordId) {
+        this.paymentRecordId = paymentRecordId;
+    }
+
+    @Override
+    public String toString() {
+        return "UserCouponRecord{" +
+                "id=" + id +
+                ", money=" + money +
+                ", fullMoney=" + fullMoney +
+                ", expirationTime=" + expirationTime +
+                ", insertTime=" + insertTime +
+                ", companyId=" + companyId +
+                ", state=" + state +
+                ", couponUseType=" + couponUseType +
+                ", couponType=" + couponType +
+                ", userId=" + userId +
+                ", couponId=" + couponId +
+                ", couponActivityId=" + couponActivityId +
+                ", activityType=" + activityType +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java
new file mode 100644
index 0000000..273005e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java
@@ -0,0 +1,356 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableName;
+
+import java.util.Date;
+
+/**
+ * 用户
+ */
+@TableName("t_user")
+public class UserInfo extends BaseBean {
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 注册id
+     */
+    @TableField("registIp")
+    private String registIp;
+    /**
+     * 注册地区县行政编号
+     */
+    @TableField("registAreaCode")
+    private String registAreaCode;
+    /**
+     * 手机号
+     */
+    @TableField("phone")
+    private String phone;
+    /**
+     * 昵称
+     */
+    @TableField("nickName")
+    private String nickName;
+    /**
+     * 头像
+     */
+    @TableField("avatar")
+    private String avatar;
+    /**
+     * 生日
+     */
+    @TableField("birthday")
+    private Date birthday;
+    /**
+     * 性别(1=男,2=女)
+     */
+    @TableField("sex")
+    private Integer sex;
+    /**
+     * 紧急联系人
+     */
+    @TableField("emergencyContact")
+    private String emergencyContact;
+    /**
+     * 联系人电话
+     */
+    @TableField("emergencyContactNumber")
+    private String emergencyContactNumber;
+    /**
+     * 是否已实名(1:否,2:是)
+     */
+    @TableField("isAuth")
+    private Integer isAuth;
+    /**
+     * 真实姓名
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 身份证号码
+     */
+    @TableField("idCard")
+    private String idCard;
+    /**
+     * 身份证正面
+     */
+    @TableField("idCardFront")
+    private String idCardFront;
+    /**
+     * 身份证背面
+     */
+    @TableField("idCardReverse")
+    private String idCardReverse;
+    /**
+     * 历史消费总金额
+     */
+    @TableField("consumption")
+    private Double consumption;
+    /**
+     * 账户余额
+     */
+    @TableField("balance")
+    private Double balance;
+    /**
+     * 剩余积分
+     */
+    @TableField("integral")
+    private Integer integral;
+    /**
+     * 密码
+     */
+    @TableField("passWord")
+    private String passWord;
+    /**
+     * 微信openid
+     */
+    @TableField("openId")
+    private String openId;
+    /**
+     * 小程序openid
+     */
+    @TableField("appletsOpenId")
+    private String appletsOpenId;
+    /**
+     * 微信unionid
+     */
+    @TableField("unionid")
+    private String unionid;
+    /**
+     * 备注
+     * @return
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 状态(1=正常,2=冻结)
+     * @return
+     */
+    @TableField("state")
+    private Integer state;
+
+    public String getRegistIp() {
+        return registIp;
+    }
+
+    public void setRegistIp(String registIp) {
+        this.registIp = registIp;
+    }
+
+    public String getRegistAreaCode() {
+        return registAreaCode;
+    }
+
+    public void setRegistAreaCode(String registAreaCode) {
+        this.registAreaCode = registAreaCode;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getEmergencyContact() {
+        return emergencyContact;
+    }
+
+    public void setEmergencyContact(String emergencyContact) {
+        this.emergencyContact = emergencyContact;
+    }
+
+    public String getEmergencyContactNumber() {
+        return emergencyContactNumber;
+    }
+
+    public void setEmergencyContactNumber(String emergencyContactNumber) {
+        this.emergencyContactNumber = emergencyContactNumber;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public Integer getIsAuth() {
+        return isAuth;
+    }
+
+    public void setIsAuth(Integer isAuth) {
+        this.isAuth = isAuth;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIdCard() {
+        return idCard;
+    }
+
+    public void setIdCard(String idCard) {
+        this.idCard = idCard;
+    }
+
+    public String getIdCardFront() {
+        return idCardFront;
+    }
+
+    public void setIdCardFront(String idCardFront) {
+        this.idCardFront = idCardFront;
+    }
+
+    public String getIdCardReverse() {
+        return idCardReverse;
+    }
+
+    public void setIdCardReverse(String idCardReverse) {
+        this.idCardReverse = idCardReverse;
+    }
+
+    public Double getConsumption() {
+        return consumption;
+    }
+
+    public void setConsumption(Double consumption) {
+        this.consumption = consumption;
+    }
+
+    public Double getBalance() {
+        return balance;
+    }
+
+    public void setBalance(Double balance) {
+        this.balance = balance;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    public String getPassWord() {
+        return passWord;
+    }
+
+    public void setPassWord(String passWord) {
+        this.passWord = passWord;
+    }
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getAppletsOpenId() {
+        return appletsOpenId;
+    }
+
+    public void setAppletsOpenId(String appletsOpenId) {
+        this.appletsOpenId = appletsOpenId;
+    }
+
+    @Override
+    public String toString() {
+        return "UserInfo{" +
+                "companyId=" + companyId +
+                ", registIp='" + registIp + '\'' +
+                ", registAreaCode='" + registAreaCode + '\'' +
+                ", phone='" + phone + '\'' +
+                ", nickName='" + nickName + '\'' +
+                ", avatar='" + avatar + '\'' +
+                ", birthday=" + birthday +
+                ", sex=" + sex +
+                ", emergencyContact='" + emergencyContact + '\'' +
+                ", emergencyContactNumber='" + emergencyContactNumber + '\'' +
+                ", isAuth=" + isAuth +
+                ", name='" + name + '\'' +
+                ", idCard='" + idCard + '\'' +
+                ", idCardFront='" + idCardFront + '\'' +
+                ", idCardReverse='" + idCardReverse + '\'' +
+                ", consumption=" + consumption +
+                ", balance=" + balance +
+                ", integral=" + integral +
+                ", passWord='" + passWord + '\'' +
+                ", openId='" + openId + '\'' +
+                ", unionid='" + unionid + '\'' +
+                ", remark='" + remark + '\'' +
+                ", state=" + state +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserRedPacketRecord.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserRedPacketRecord.java
new file mode 100644
index 0000000..4d42ac0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserRedPacketRecord.java
@@ -0,0 +1,176 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 用户红包记录
+ */
+@TableName("t_user_red_packet_record")
+public class UserRedPacketRecord {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 过期时间
+     */
+    @TableField("expirationTime")
+    private Date expirationTime;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 状态(0=临时,1=未使用,2=已使用,3=已过期)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 使用结束时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 订单id(获取红包的订单)
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 活动id
+     * @return
+     */
+    @TableField("redPacketActivityId")
+    private Integer redPacketActivityId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getExpirationTime() {
+        return expirationTime;
+    }
+
+    public void setExpirationTime(Date expirationTime) {
+        this.expirationTime = expirationTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getRedPacketActivityId() {
+        return redPacketActivityId;
+    }
+
+    public void setRedPacketActivityId(Integer redPacketActivityId) {
+        this.redPacketActivityId = redPacketActivityId;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    @Override
+    public String toString() {
+        return "UserRedPacketRecord{" +
+                "id=" + id +
+                ", money=" + money +
+                ", expirationTime=" + expirationTime +
+                ", insertTime=" + insertTime +
+                ", companyId=" + companyId +
+                ", state=" + state +
+                ", orderId=" + orderId +
+                ", orderType=" + orderType +
+                ", userId=" + userId +
+                ", redPacketActivityId=" + redPacketActivityId +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Verified.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Verified.java
new file mode 100644
index 0000000..de61e73
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Verified.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 实名认证记录
+ */
+@TableName("t_verified")
+public class Verified {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 认证姓名
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 身份证号码
+     */
+    @TableField("idcode")
+    private String idcode;
+    /**
+     * 身份证正面照
+     */
+    @TableField("img1")
+    private String img1;
+    /**
+     * 身份证背面照
+     */
+    @TableField("img2")
+    private String img2;
+    /**
+     * 认证结果(1=待认证,2=认证通过,3=认证失败)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 请求时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIdcode() {
+        return idcode;
+    }
+
+    public void setIdcode(String idcode) {
+        this.idcode = idcode;
+    }
+
+    public String getImg1() {
+        return img1;
+    }
+
+    public void setImg1(String img1) {
+        this.img1 = img1;
+    }
+
+    public String getImg2() {
+        return img2;
+    }
+
+    public void setImg2(String img2) {
+        this.img2 = img2;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "Verified{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", name='" + name + '\'' +
+                ", idcode='" + idcode + '\'' +
+                ", img1='" + img1 + '\'' +
+                ", img2='" + img2 + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/VersionManagement.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/VersionManagement.java
new file mode 100644
index 0000000..eaf5b73
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/VersionManagement.java
@@ -0,0 +1,120 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 版本管理
+ */
+@TableName("t_version_management")
+public class VersionManagement {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 包路径
+     */
+    @TableField("url")
+    private String url;
+    /**
+     * 版本号
+     */
+    @TableField("version")
+    private String version;
+    /**
+     * 更新说明
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * 是否强制更新(0=否,1=是)
+     */
+    @TableField("mandatory")
+    private Integer mandatory;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 类型(1=用户端,2=司机端)
+     */
+    @TableField("type")
+    private Integer type;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getMandatory() {
+        return mandatory;
+    }
+
+    public void setMandatory(Integer mandatory) {
+        this.mandatory = mandatory;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return "VersionManagement{" +
+                "id=" + id +
+                ", url='" + url + '\'' +
+                ", version='" + version + '\'' +
+                ", content='" + content + '\'' +
+                ", mandatory=" + mandatory +
+                ", insertTime=" + insertTime +
+                ", type=" + type +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Withdrawal.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Withdrawal.java
new file mode 100644
index 0000000..6a1503c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Withdrawal.java
@@ -0,0 +1,220 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 提现记录
+ */
+@TableName("t_pub_withdrawal")
+public class Withdrawal {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 处理时间
+     */
+    @TableField("handleTime")
+    private Date handleTime;
+    /**
+     * 原钱包余额
+     */
+    @TableField("balance")
+    private Double balance;
+    /**
+     * 提现金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 状态(1=待处理,2=处理成功,3=处理失败)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 银行账户
+     */
+    @TableField("code")
+    private String code;
+    /**
+     * 银行卡持有人姓名
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 用户类型(1=用户,2=司机)
+     */
+    @TableField("userType")
+    private Integer userType;
+    /**
+     * 申请时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 1:创建,2:修改,3:删除
+     */
+    @TableField("flag")
+    private Integer flag;
+    /**
+     * 提现方式(1=银行卡,2=线下)
+     * @return
+     */
+    @TableField("withdrawalType")
+    private Integer withdrawalType;
+    /**
+     * 银行提交转账申请后的交易序列号,用于查询交易状态
+     * @return
+     */
+    @TableField("serialNo")
+    private String serialNo;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getHandleTime() {
+        return handleTime;
+    }
+
+    public void setHandleTime(Date handleTime) {
+        this.handleTime = handleTime;
+    }
+
+    public Double getBalance() {
+        return balance;
+    }
+
+    public void setBalance(Double balance) {
+        this.balance = balance;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+
+    public Integer getWithdrawalType() {
+        return withdrawalType;
+    }
+
+    public void setWithdrawalType(Integer withdrawalType) {
+        this.withdrawalType = withdrawalType;
+    }
+
+    public String getSerialNo() {
+        return serialNo;
+    }
+
+    public void setSerialNo(String serialNo) {
+        this.serialNo = serialNo;
+    }
+
+    @Override
+    public String toString() {
+        return "Withdrawal{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", handleTime=" + handleTime +
+                ", balance=" + balance +
+                ", money=" + money +
+                ", state=" + state +
+                ", remark='" + remark + '\'' +
+                ", code='" + code + '\'' +
+                ", name='" + name + '\'' +
+                ", userType=" + userType +
+                ", insertTime=" + insertTime +
+                ", flag=" + flag +
+                ", withdrawalType=" + withdrawalType +
+                ", serialNo='" + serialNo + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IAdvertisementService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IAdvertisementService.java
new file mode 100644
index 0000000..cb1a670
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IAdvertisementService.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Advertisement;
+import com.stylefeng.guns.modular.system.warpper.AdvertisementWarpper;
+
+import java.util.List;
+
+public interface IAdvertisementService extends IService<Advertisement> {
+
+
+    /**
+     * 获取广告
+     * @param type  广告类型(1:弹窗广告,2:底部广告)
+     * @return
+     * @throws Exception
+     */
+    List<AdvertisementWarpper> queryAdvertisement(String code, Integer type) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IAgreementService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IAgreementService.java
new file mode 100644
index 0000000..f9ae612
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IAgreementService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Agreement;
+
+public interface IAgreementService extends IService<Agreement> {
+
+
+    /**
+     * 获取协议内容
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    String queryByType(Integer type) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICancleOrderService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICancleOrderService.java
new file mode 100644
index 0000000..6c283b2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICancleOrderService.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.CancleOrder;
+
+
+public interface ICancleOrderService extends IService<CancleOrder> {
+
+
+    /**
+     * 获取取消订单设置
+     * @param type
+     * @param orderType
+     * @return
+     * @throws Exception
+     */
+    CancleOrder query(Integer type, Integer orderType, Integer companyId) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICompanyCityService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICompanyCityService.java
new file mode 100644
index 0000000..8719561
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICompanyCityService.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Company;
+import com.stylefeng.guns.modular.system.model.CompanyCity;
+
+public interface ICompanyCityService extends IService<CompanyCity> {
+
+
+    /**
+     * 根据经纬度获取所属企业
+     * @param lon
+     * @param lat
+     * @return
+     * @throws Exception
+     */
+    Company query(String lon, String lat) throws Exception;
+
+
+    /**
+     * 根据行政编号获取所有企业
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    Company query(String code) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICompanyService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICompanyService.java
new file mode 100644
index 0000000..396786d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICompanyService.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Company;
+
+public interface ICompanyService extends IService<Company> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IComplaintService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IComplaintService.java
new file mode 100644
index 0000000..7e49a25
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IComplaintService.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Complaint;
+
+public interface IComplaintService extends IService<Complaint> {
+
+
+    /**
+     * 添加投诉
+     * @param driverId      司机id
+     * @param reason        投诉原因
+     * @param description   描述
+     * @param uid           投诉人
+     * @throws Exception
+     */
+    void saveData(Integer driverId, String reason, String description, Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java
new file mode 100644
index 0000000..fb02331
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Dept;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 部门服务
+ *
+ * @author fengshuonan
+ * @date 2017-04-27 17:00
+ */
+public interface IDeptService extends IService<Dept> {
+
+    /**
+     * 删除部门
+     */
+    void deleteDept(Integer deptId);
+
+    /**
+     * 获取ztree的节点列表
+     */
+    List<ZTreeNode> tree();
+
+    /**
+     * 获取所有部门列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String condition);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java
new file mode 100644
index 0000000..6e3c3c4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Dict;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典服务
+ *
+ * @author fengshuonan
+ * @date 2017-04-27 17:00
+ */
+public interface IDictService extends IService<Dict> {
+
+    /**
+     * 添加字典
+     */
+    void addDict(String dictCode,String dictName,String dictTips, String dictValues);
+
+    /**
+     * 编辑字典
+     */
+    void editDict(Integer dictId,String dictCode, String dictName,String dictTips, String dicts);
+
+    /**
+     * 删除字典
+     */
+    void delteDict(Integer dictId);
+
+    /**
+     * 根据编码获取词典列表
+     */
+    List<Dict> selectByCode(@Param("code") String code);
+
+    /**
+     * 根据父类编码获取词典列表
+     */
+    List<Dict> selectByParentCode(@Param("code") String code);
+
+    /**
+     * 查询字典列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String conditiion);
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverOrdersService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverOrdersService.java
new file mode 100644
index 0000000..51b0526
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverOrdersService.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.DriverOrders;
+
+import java.util.List;
+
+public interface IDriverOrdersService extends IService<DriverOrders> {
+
+    /**
+     * 接单设置操作
+     * @param uid
+     * @param type
+     * @throws Exception
+     */
+    void updateOrders(Integer uid, Integer type) throws Exception;
+
+
+    /**
+     * 获取设置的推单规则
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Integer> queryOrders(Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java
new file mode 100644
index 0000000..9178d43
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java
@@ -0,0 +1,63 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IDriverService extends IService<Driver> {
+
+
+    /**
+     * 获取distance公里内空闲司机数量
+     * @param type
+     * @param lon
+     * @param lat
+     * @return
+     * @throws Exception
+     */
+    List<Driver> queryIdleDriver(Integer type, Double lon, Double lat, Double distance, Integer companyId) throws Exception;
+
+
+    /**
+     * 获取给定车型且空闲的司机
+     * @param type
+     * @param serverCarModelId
+     * @param lon
+     * @param lat
+     * @param distance
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    List<Driver> queryIdleDriver(Integer type, Integer serverCarModelId, Double lon, Double lat, Double distance, Integer companyId) throws Exception;
+
+
+    /**
+     * 根据订单id获取司机数据
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryOrderDriver(Integer orderId, Integer orderType) throws Exception;
+
+
+    /**
+     * 获取司机详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryDriverInfo(Integer id) throws Exception;
+
+
+    /**
+     * 获取司机的业务类型
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<BaseWarpper> queryBusiness(Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverServiceService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverServiceService.java
new file mode 100644
index 0000000..1119edb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverServiceService.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.DriverService;
+
+import java.util.List;
+
+public interface IDriverServiceService extends IService<DriverService> {
+
+
+    /**
+     * 获取司机服务业务
+     * @param driverId
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    List<DriverService> query(Integer driverId, Integer...type) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IFeedbackService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IFeedbackService.java
new file mode 100644
index 0000000..5eb3bea
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IFeedbackService.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Feedback;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+public interface IFeedbackService extends IService<Feedback> {
+
+
+    /**
+     * 反馈操作
+     * @param content
+     * @param uid
+     * @throws Exception
+     */
+    ResultUtil feedback(String content, Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IFrequentPassengersService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IFrequentPassengersService.java
new file mode 100644
index 0000000..1efb556
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IFrequentPassengersService.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.FrequentPassengers;
+
+public interface IFrequentPassengersService extends IService<FrequentPassengers> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java
new file mode 100644
index 0000000..e40f4c2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java
@@ -0,0 +1,10 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.GDInterface;
+
+public interface IGDInterfaceService extends IService<GDInterface> {
+
+
+    void saveData(String name, String explanation);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java
new file mode 100644
index 0000000..e1a2fd3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Income;
+
+public interface IIncomeService extends IService<Income> {
+
+
+    /**
+     * 添加数据
+     * @param userType
+     * @param objectId
+     * @param type
+     * @param incomeId
+     * @param money
+     * @throws Exception
+     */
+    void saveData(Integer userType, Integer objectId, Integer type, Integer incomeId, Integer orderType, Double money) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIntegralGoodsService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIntegralGoodsService.java
new file mode 100644
index 0000000..3c18397
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIntegralGoodsService.java
@@ -0,0 +1,21 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.IntegralGoods;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IIntegralGoodsService extends IService<IntegralGoods> {
+
+
+    /**
+     * 获取商品列表
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryGoods(Integer pageNum, Integer size) throws Exception;
+
+
+    Map<String, Object> queryGoodsInfo(Integer id) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIntegralOrderService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIntegralOrderService.java
new file mode 100644
index 0000000..69683ad
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIntegralOrderService.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.IntegralOrder;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IIntegralOrderService extends IService<IntegralOrder> {
+
+
+    /**
+     * 保存订单
+     * @param integralOrder
+     * @throws Exception
+     */
+    ResultUtil addIntegralOrder(IntegralOrder integralOrder, Integer uid) throws Exception;
+
+
+    /**
+     * 获取历史记录
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryConvertHistory(Integer pageNum, Integer size, Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IInvoiceService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IInvoiceService.java
new file mode 100644
index 0000000..cd527e6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IInvoiceService.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Invoice;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IInvoiceService extends IService<Invoice> {
+
+    /**
+     * 开票操作
+     * @param invoice
+     * @param order
+     * @throws Exception
+     */
+    void invoicing(Invoice invoice, String order, Integer uid) throws Exception;
+
+
+    /**
+     * 获取发票历史记录
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyInvoice(Integer pageNum, Integer size, Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java
new file mode 100644
index 0000000..d0f4290
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 登录记录 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface ILoginLogService extends IService<LoginLog> {
+
+    /**
+     * 获取登录日志列表
+     */
+    List<Map<String, Object>> getLoginLogs(Page<LoginLog> page, String beginTime, String endTime, String logName, String orderByField, boolean asc);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java
new file mode 100644
index 0000000..b976165
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java
@@ -0,0 +1,94 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.core.node.MenuNode;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Menu;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 菜单服务
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 22:19
+ */
+public interface IMenuService extends IService<Menu> {
+
+    /**
+     * 删除菜单
+     *
+     * @author stylefeng
+     * @Date 2017/5/5 22:20
+     */
+    void delMenu(Long menuId);
+
+    /**
+     * 删除菜单包含所有子菜单
+     *
+     * @author stylefeng
+     * @Date 2017/6/13 22:02
+     */
+    void delMenuContainSubMenus(Long menuId);
+
+    /**
+     * 根据条件查询菜单
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Map<String, Object>> selectMenus(@Param("condition") String condition, @Param("level") String level);
+
+    /**
+     * 根据条件查询菜单
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Long> getMenuIdsByRoleId(@Param("roleId") Integer roleId);
+
+    /**
+     * 获取菜单列表树
+     *
+     * @return
+     * @date 2017年2月19日 下午1:33:51
+     */
+    List<ZTreeNode> menuTreeList();
+
+    /**
+     * 获取菜单列表树
+     *
+     * @return
+     * @date 2017年2月19日 下午1:33:51
+     */
+    List<ZTreeNode> menuTreeListByMenuIds(List<Long> menuIds);
+
+    /**
+     * 删除menu关联的relation
+     *
+     * @param menuId
+     * @return
+     * @date 2017年2月19日 下午4:10:59
+     */
+    int deleteRelationByMenu(Long menuId);
+
+    /**
+     * 获取资源url通过角色id
+     *
+     * @param roleId
+     * @return
+     * @date 2017年2月19日 下午7:12:38
+     */
+    List<String> getResUrlsByRoleId(Integer roleId);
+
+    /**
+     * 根据角色获取菜单
+     *
+     * @param roleIds
+     * @return
+     * @date 2017年2月19日 下午10:35:40
+     */
+    List<MenuNode> getMenusByRoleIds(List<Integer> roleIds);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INettyService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INettyService.java
new file mode 100644
index 0000000..43a175b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INettyService.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderStatusWarpper;
+
+import java.util.List;
+
+public interface INettyService {
+
+
+    /**
+     * 获取下单推送完后没有司机下单的提醒
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<EndPushWarpper> queryEndPush(Integer orderId, Integer orderType, Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<OrderServerWarpper> queryOrderServer(Integer orderId, Integer orderType, Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java
new file mode 100644
index 0000000..ced40b4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Notice;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 通知表 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface INoticeService extends IService<Notice> {
+
+    /**
+     * 获取通知列表
+     */
+    List<Map<String, Object>> list(String condition);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOpenCityBusinessService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOpenCityBusinessService.java
new file mode 100644
index 0000000..cea641f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOpenCityBusinessService.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OpenCityBusiness;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+
+import java.util.List;
+
+public interface IOpenCityBusinessService extends IService<OpenCityBusiness> {
+
+
+    /**
+     * 获取业务类型
+     * @param province  省名
+     * @param city      市名称
+     * @param district  区县名称
+     * @return
+     * @throws Exception
+     */
+    List<BaseWarpper> queryBusiness(String province, String city, String district) throws Exception;
+
+
+    /**
+     * 根据选择的城市id获取业务类型
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    List<BaseWarpper> queryBusinessById(Integer id) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOpenCityService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOpenCityService.java
new file mode 100644
index 0000000..a0030a0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOpenCityService.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OpenCity;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+
+import java.util.List;
+
+public interface IOpenCityService extends IService<OpenCity> {
+
+
+    /**
+     * 获取开通城市列表
+     * @return
+     * @throws Exception
+     */
+    List<BaseWarpper> queryOpenCity() throws Exception;
+
+
+    /**
+     * 判断是否是开通城市
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    boolean openCity(String code) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java
new file mode 100644
index 0000000..9c37b6b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 操作日志 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface IOperationLogService extends IService<OperationLog> {
+
+    /**
+     * 获取操作日志列表
+     */
+    List<Map<String, Object>> getOperationLogs(Page<OperationLog> page, String beginTime, String endTime, String logName, String s, String orderByField, boolean asc);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCancelService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCancelService.java
new file mode 100644
index 0000000..7df13cd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCancelService.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OrderCancel;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderCancelService extends IService<OrderCancel> {
+
+
+    /**
+     * 添加数据
+     * @param orderId
+     * @param orderType
+     * @param reason
+     * @param remark
+     * @param payType
+     * @param money
+     * @param state
+     * @throws Exception
+     */
+    Integer saveData(Integer orderId, Integer orderType, String reason, String remark, Integer payType, Double money,
+                     Integer state, Integer userType, Integer uid) throws Exception;
+
+
+    /**
+     * 获取取消数据
+     * @param orderId
+     * @param orderType
+     * @param money
+     * @param payType
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    OrderCancel query(Integer orderId, Integer orderType, Double money, Integer payType, Integer state) throws Exception;
+
+
+
+    /**
+     * 获取用户取消记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryCancel(Integer uid, Integer isPay) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderEvaluateService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderEvaluateService.java
new file mode 100644
index 0000000..369797b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderEvaluateService.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OrderEvaluate;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderEvaluateService extends IService<OrderEvaluate> {
+
+
+    /**
+     * 添加评价数据
+     * @param orderId
+     * @param orderType
+     * @param fraction
+     * @param content
+     * @throws Exception
+     */
+    ResultUtil saveData(Integer orderId, Integer orderType, Integer fraction, String content) throws Exception;
+
+
+    /**
+     * 获取司机历史评价列表
+     * @param driverId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryOrderEvaluate(Integer driverId, Integer pageNum, Integer size) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderFrequentPassengersService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderFrequentPassengersService.java
new file mode 100644
index 0000000..bfa226d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderFrequentPassengersService.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OrderFrequentPassengers;
+
+public interface IOrderFrequentPassengersService extends IService<OrderFrequentPassengers> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPositionService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPositionService.java
new file mode 100644
index 0000000..a49a6d3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPositionService.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OrderPosition;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderPositionService extends IService<OrderPosition> {
+
+
+    /**
+     * 获取轨迹数据
+     * @param orderId
+     * @param orderType
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryTrack(Integer orderId, Integer orderType) throws Exception;
+
+
+    /**
+     * 获取订单所有坐标
+     * @param orderId
+     * @param orderType
+     * @return
+     * @throws Exception
+     */
+    List<OrderPosition> queryPosition(Integer orderId, Integer orderType) throws Exception;
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderService.java
new file mode 100644
index 0000000..fec2b45
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderService.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+
+public interface IOrderService {
+
+
+    /**
+     * 获取预计行驶时间
+     * @param slon  起点经度
+     * @param slat  起点纬度
+     * @param elon  终点经度
+     * @param elat  终点纬度
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> queryExpectedTime(Double slon, Double slat, Double elon, Double elat) throws Exception;
+
+
+    /**
+     * APP调用小程序完成微信支付
+     * @param orderId
+     * @param orderType
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    ResultUtil weChatPay(Integer orderId, Integer orderType, Integer type, Integer userType, Integer uid, String content) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPhoneService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPhoneService.java
new file mode 100644
index 0000000..f9204a5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPhoneService.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Phone;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IPhoneService extends IService<Phone> {
+
+    /**
+     * 获取所有的系统电话
+     * @return
+     * @throws Exception
+     */
+    List<Phone> queryPhones(String code) throws Exception;
+
+
+    /**
+     * 获取客服电话(个人中心)
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryCustomerPhone(String code) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IProblemService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IProblemService.java
new file mode 100644
index 0000000..8adc78b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IProblemService.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Problem;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IProblemService extends IService<Problem> {
+
+
+    /**
+     * 添加留言
+     * @param content
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil leaveMessage(String content, Integer uid) throws Exception;
+
+
+    /**
+     * 获取提交的留言列表
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryProblems(Integer pageNum, Integer size, Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPushOrderService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPushOrderService.java
new file mode 100644
index 0000000..aa1bfc8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPushOrderService.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.PushOrder;
+
+import java.util.List;
+
+public interface IPushOrderService extends IService<PushOrder> {
+
+
+    /**
+     * 获取推送配置数据
+     * @param type
+     * @param pushType
+     * @return
+     * @throws Exception
+     */
+    List<PushOrder> querys(Integer type, Integer pushType, Integer companyId) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRedPacketRecordService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRedPacketRecordService.java
new file mode 100644
index 0000000..f869b80
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRedPacketRecordService.java
@@ -0,0 +1,8 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.RedPacketRecord;
+
+public interface IRedPacketRecordService extends IService<RedPacketRecord> {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java
new file mode 100644
index 0000000..4214359
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Relation;
+
+/**
+ * <p>
+ * 角色和菜单关联表 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface IRelationService extends IService<Relation> {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java
new file mode 100644
index 0000000..cc7332d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java
@@ -0,0 +1,68 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Role;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 角色相关业务
+ *
+ * @author fengshuonan
+ * @Date 2017年1月10日 下午9:11:57
+ */
+public interface IRoleService extends IService<Role> {
+
+    /**
+     * 设置某个角色的权限
+     *
+     * @param roleId 角色id
+     * @param ids    权限的id
+     * @date 2017年2月13日 下午8:26:53
+     */
+    void setAuthority(Integer roleId, String ids);
+
+    /**
+     * 删除角色
+     *
+     * @author stylefeng
+     * @Date 2017/5/5 22:24
+     */
+    void delRoleById(Integer roleId);
+
+    /**
+     * 根据条件查询角色列表
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Map<String, Object>> selectRoles(@Param("condition") String condition);
+
+    /**
+     * 删除某个角色的所有权限
+     *
+     * @param roleId 角色id
+     * @return
+     * @date 2017年2月13日 下午7:57:51
+     */
+    int deleteRolesById(@Param("roleId") Integer roleId);
+
+    /**
+     * 获取角色列表树
+     *
+     * @return
+     * @date 2017年2月18日 上午10:32:04
+     */
+    List<ZTreeNode> roleTreeList();
+
+    /**
+     * 获取角色列表树
+     *
+     * @return
+     * @date 2017年2月18日 上午10:32:04
+     */
+    List<ZTreeNode> roleTreeListByRoleId(String[] roleId);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IServerCarModelService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IServerCarModelService.java
new file mode 100644
index 0000000..99372ab
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IServerCarModelService.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.ServerCarModel;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.ServerCarModelWarpper;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IServerCarModelService extends IService<ServerCarModel> {
+
+
+    /**
+     * 根据起点和终点获取车型和金额
+     * @param startLonLat
+     * @param endLonLat
+     * @param type          业务类型
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<List<ServerCarModelWarpper>> queryServerCarModel(String startLonLat, String endLonLat, Integer type) throws Exception;
+    ResultUtil<List<ServerCarModelWarpper>> queryServerCarModel1(String startLonLat, String endLonLat) throws Exception;
+
+
+    /**
+     * 获取业务类型对应的所有车型
+     * @param type
+     * @return
+     */
+    List<Map<String, Object>> queryServerCarModels(Integer type);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISmsrecordService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISmsrecordService.java
new file mode 100644
index 0000000..2503249
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISmsrecordService.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Smsrecord;
+
+public interface ISmsrecordService extends IService<Smsrecord> {
+
+    /**
+     * 添加数据
+     * @param type
+     * @param phone
+     * @param code
+     * @param content
+     * @throws Exception
+     */
+    void saveData(Integer type, String phone, String code, String content) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponRecordService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponRecordService.java
new file mode 100644
index 0000000..b1b65a7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponRecordService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.SysCouponRecord;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统设置-优惠券记录 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-15
+ */
+public interface ISysCouponRecordService extends IService<SysCouponRecord> {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISystemNoticeService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISystemNoticeService.java
new file mode 100644
index 0000000..6d7e663
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISystemNoticeService.java
@@ -0,0 +1,65 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.SystemNotice;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ISystemNoticeService extends IService<SystemNotice> {
+
+
+    /**
+     * 添加系统消息
+     * @param userType
+     * @param content
+     * @param userId
+     * @throws Exception
+     */
+    void addSystemNotice(Integer userType, String content, Integer userId, Integer noticeType) throws Exception;
+
+
+    /**
+     * 获取未阅读数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    int queryNoReadNoticeNum(Integer uid) throws Exception;
+
+    /**
+     * 获取消息列列表
+     * @param type
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryList(Integer type, Integer pageNum, Integer size, Integer uid);
+
+
+    /**
+     * 阅读操作
+     * @param id
+     * @param uid
+     * @throws Exception
+     */
+    void readSystemNotice(Integer id, Integer uid) throws Exception;
+
+
+    /**
+     * 删除公告或消息
+     * @param id
+     * @param uid
+     * @throws Exception
+     */
+    void delSystemNotice(Integer id, Integer uid) throws Exception;
+
+
+    /**
+     * 清空公告或消息
+     * @param uid
+     * @throws Exception
+     */
+    void clearSystemNotice(Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITActivityGeneralizationService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITActivityGeneralizationService.java
new file mode 100644
index 0000000..9b99fa2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITActivityGeneralizationService.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.TActivityGeneralization;
+
+
+/**
+ * <p>
+ * 推广活动 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITActivityGeneralizationService extends IService<TActivityGeneralization> {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCharteredServiceService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCharteredServiceService.java
new file mode 100644
index 0000000..66191c8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCharteredServiceService.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.TCharteredService;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 包车管理 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface ITCharteredServiceService extends IService<TCharteredService> {
+
+    /**
+     * 获取包车管理管理列表
+     * @param page
+     * @param beginTime
+     * @param endTime
+     * @param serviceName
+     * @param serverCarModelId
+     * @param startPrice
+     * @param endPrice
+     * @param status
+     * @return
+     */
+    List<Map<String, Object>> getCharteredServiceList(Page<Map<String, Object>> page, String beginTime, String endTime, String serviceName, Integer serverCarModelId, BigDecimal startPrice, BigDecimal endPrice, Integer status);
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITNoticesService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITNoticesService.java
new file mode 100644
index 0000000..2531177
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITNoticesService.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.TNotices;
+import com.stylefeng.guns.modular.system.warpper.TNoticeWarpper;
+
+import java.util.List;
+
+public interface ITNoticesService extends IService<TNotices> {
+
+
+    /**
+     * 获取公告列表
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    List<TNoticeWarpper> queryNotices(Integer type) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityBalanceService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityBalanceService.java
new file mode 100644
index 0000000..4946e5a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityBalanceService.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.UserActivityBalance;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IUserActivityBalanceService extends IService<UserActivityBalance> {
+
+
+    /**
+     * 获取满足条件的活动
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> query(Double money, Integer companyId) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRedenvelopeService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRedenvelopeService.java
new file mode 100644
index 0000000..83318b6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRedenvelopeService.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.UserActivityRedenvelope;
+
+import java.util.Date;
+import java.util.Map;
+
+public interface IUserActivityRedenvelopeService extends IService<UserActivityRedenvelope> {
+
+
+    /**
+     * 获取红包活动
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> query(Integer companyId, Date travelTime) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRegisteredService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRegisteredService.java
new file mode 100644
index 0000000..222d297
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRegisteredService.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.UserActivityRegistered;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IUserActivityRegisteredService extends IService<UserActivityRegistered> {
+
+
+    /**
+     * 获取当前有效的注册活动
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> query(Integer companyId) throws Exception;
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserCouponRecordService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserCouponRecordService.java
new file mode 100644
index 0000000..84636e8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserCouponRecordService.java
@@ -0,0 +1,69 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.UserCouponRecord;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IUserCouponRecordService extends IService<UserCouponRecord> {
+
+
+    /**
+     * 获取可用优惠券数量
+     * @param uid
+     * @param companyId
+     * @param state
+     * @param couponUseType
+     * @return
+     * @throws Exception
+     */
+    int queryAvailable(Integer uid, Integer companyId, Integer state, Integer couponUseType, Double money) throws Exception;
+
+
+    /**
+     * 获取优惠券列表
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryCoupon(Integer uid, Integer companyId, Integer state, Integer couponUseType, Double money, Integer pageNum, Integer size) throws Exception;
+
+
+    /**
+     * 获取优惠券列表
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyCoupons(Integer state, Integer pageNum, Integer size, Integer uid) throws Exception;
+
+
+    /**
+     * 删除优惠券
+     * @param id
+     * @param uid
+     * @throws Exception
+     */
+    ResultUtil delMyCoupon(Integer id, Integer uid) throws Exception;
+
+
+    /**
+     * 赠送优惠券
+     * @param id
+     * @param uid
+     * @param userId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil handselCoupon(Integer id, Integer uid, Integer userId) throws Exception;
+
+
+    /**
+     * 修改过期的优惠券状态
+     * @throws Exception
+     */
+    void updateTimeOut() throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserInfoService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserInfoService.java
new file mode 100644
index 0000000..4cebd23
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserInfoService.java
@@ -0,0 +1,228 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.Map;
+
+public interface IUserInfoService extends IService<UserInfo> {
+
+
+    /**
+     * 获取短信验证码
+     * @param phone
+     * @return
+     */
+    ResultUtil queryCaptcha(String phone, Integer type) throws Exception;
+
+
+    /**
+     * 校验短信验证码
+     * @param phone
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    boolean checkCaptcha(String phone, String code) throws Exception;
+
+
+    /**
+     * 手机验证码登录
+     * @param phone
+     * @param code
+     * @return
+     */
+    ResultUtil<LoginWarpper> captchaLogin(String phone, String code, String registIp, String registAreaCode,String loginType) throws Exception;
+    ResultUtil<LoginWarpper> captchaLogin1(String phone) throws Exception;
+
+    /**
+     * 手机一键登录
+     * @param accessToken
+     * @param registIp
+     * @param registAreaCode
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<LoginWarpper> oneClickLogin(String accessToken, String registIp, String registAreaCode,String loginType,String androidOrIos) throws Exception;
+
+
+
+    ResultUtil<LoginWarpper> captchaLogin(String phone, String code, Integer uid, Integer type, Integer userType,String loginType) throws Exception;
+
+
+    /**
+     * 手机号码查询用户
+     * @param phone
+     * @return
+     * @throws Exception
+     */
+    UserInfo queryByPhone(String phone) throws Exception;
+
+
+    /**
+     * 账号密码登录
+     * @param phone
+     * @param password
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<LoginWarpper> userLogin(String phone, String password,String loginType) throws Exception;
+
+
+    /**
+     * 微信授权登录
+     * @param type              登录端口(1:APP登录,2:小程序)
+     * @param openid            微信openid
+     * @param unionid           微信unionid
+     * @param jscode            小程序登录时的jscode临时凭证
+     * @param registIp          ip地址
+     * @param registAreaCode    当前定位区县行政编号(6位)
+     * @return
+     */
+    ResultUtil<LoginWarpper> wxLogin(Integer type, String openid, String unionid, String jscode, String registIp, String registAreaCode, Integer sex, String nickName, String avatar,String loginType) throws Exception;
+
+
+    /**
+     * 忘记密码的操作
+     * @param phone
+     * @param code
+     * @param password
+     * @return
+     * @throws Exception
+     */
+    ResultUtil forgetPassword(String phone, String code, String password) throws Exception;
+
+
+    /**
+     * 设置手机号码
+     * @param uid
+     * @param phone
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    ResultUtil bindingPhone(Integer uid, String phone, String code,String loginType) throws Exception;
+
+
+    /**
+     * 从redis中获取用户id
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    Integer getUserIdFormRedis(HttpServletRequest request) throws Exception;
+
+
+    /**
+     * 获取用户详情
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryUserInfo(Integer uid) throws Exception;
+
+
+    /**
+     * 电话号码查询用户
+     * @param phone
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryUser(String phone) throws Exception;
+
+
+    /**
+     * 设置紧急联系人
+     * @param name
+     * @param phone
+     * @param uid
+     * @throws Exception
+     */
+    void setUrgentUser(String name, String phone, Integer uid) throws Exception;
+
+
+    /**
+     * 充值余额
+     * @param payType
+     * @param money
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil depositBalance(Integer payType, Double money, Integer uid, Integer type) throws Exception;
+
+
+    /**
+     * 修改手机号码
+     * @param code
+     * @param phone
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil updatePhone(String code, String phone, Integer uid) throws Exception;
+
+
+    /**
+     * 修改密码
+     * @param password
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil updatePass(String password, Integer uid) throws Exception;
+
+
+    /**
+     * 修改个人信息
+     * @param avatar
+     * @param nickname
+     * @param sex
+     * @param birthday
+     * @param uid
+     * @throws Exception
+     */
+    void updateInfo(String avatar, String nickname, Integer sex, Date birthday, Integer uid) throws Exception;
+
+    /**
+     * 获取实名认证数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryRealName(Integer uid) throws Exception;
+
+
+    /**
+     * 充值余额完成支付后的处理
+     * @param id            用户id
+     * @param order_id      工行订单id
+     * @param paymentRecordId   预支付订单id
+     * @param type          支付类型(1=微信,2=支付宝)
+     * @throws Exception
+     */
+    void payCancelUserBalance(Integer id, String order_id, Integer paymentRecordId, Integer type) throws Exception;
+
+
+    /**
+     * H5接入道行龙城实现登录
+     * @param authCode
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<LoginWarpper> dxlcLogin(String authCode, String registAreaCode,String loginType) throws Exception;
+
+
+    /**
+     * 小程序中手机号码登录后绑定微信
+     * @param userId
+     * @param jscode
+     * @return
+     * @throws Exception
+     */
+    ResultUtil phoneLoginBindingWeChat(Integer userId, String jscode) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserRedPacketRecordService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserRedPacketRecordService.java
new file mode 100644
index 0000000..e378b4e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserRedPacketRecordService.java
@@ -0,0 +1,40 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.UserRedPacketRecord;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IUserRedPacketRecordService extends IService<UserRedPacketRecord> {
+
+
+    /**
+     * 获取不大于money值的红包数据
+     * @param uid
+     * @param companyId
+     * @param state
+     * @param orderType
+     * @param money
+     * @return
+     * @throws Exception
+     */
+    UserRedPacketRecord query(Integer uid, Integer companyId, Integer state, Integer orderType, Double money) throws Exception;
+
+
+
+    UserRedPacketRecord query_(Integer uid, Integer companyId, Integer state, Integer orderType, Double money) throws Exception;
+
+
+
+    /**
+     * 获取个人红包列表(未使用)
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyRedEnvelope(Integer pageNum, Integer size, Integer uid) throws Exception;
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java
new file mode 100644
index 0000000..3869242
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.core.datascope.DataScope;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 管理员表 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface IUserService extends IService<User> {
+
+    /**
+     * 修改用户状态
+     */
+    int setStatus(@Param("userId") Integer userId, @Param("status") int status);
+
+    /**
+     * 修改密码
+     */
+    int changePwd(@Param("userId") Integer userId, @Param("pwd") String pwd);
+
+    /**
+     * 根据条件查询用户列表
+     */
+    List<Map<String, Object>> selectUsers(@Param("dataScope") DataScope dataScope, @Param("name") String name, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("deptid") Integer deptid);
+
+    /**
+     * 设置用户的角色
+     */
+    int setRoles(@Param("userId") Integer userId, @Param("roleIds") String roleIds);
+
+    /**
+     * 通过账号获取用户
+     */
+    User getByAccount(@Param("account") String account);
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVerifiedService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVerifiedService.java
new file mode 100644
index 0000000..fb30c6f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVerifiedService.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Verified;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+public interface IVerifiedService extends IService<Verified> {
+
+    /**
+     * 实名认证操作
+     * @param verified
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil verified(Verified verified, Integer uid) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVersionManagementService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVersionManagementService.java
new file mode 100644
index 0000000..a8c921b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVersionManagementService.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.VersionManagement;
+
+import java.util.Map;
+
+public interface IVersionManagementService extends IService<VersionManagement> {
+
+
+    /**
+     * 获取最新版本数据
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryNewVersion() throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IWithdrawalService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IWithdrawalService.java
new file mode 100644
index 0000000..d7ad996
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IWithdrawalService.java
@@ -0,0 +1,41 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Withdrawal;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IWithdrawalService extends IService<Withdrawal> {
+
+
+    /**
+     * 提现操作
+     * @param money
+     * @param code
+     * @param name
+     * @param uid
+     * @throws Exception
+     */
+    ResultUtil withdrawal(Double money, String code, String name, Integer uid) throws Exception;
+
+
+    /**
+     * 获取历史提交数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryWithdrawal(Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+    /**
+     * 提现审核处理
+     * @param id
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    ResultUtil withdrawalAudit(Integer id, Integer state) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/AdvertisementServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/AdvertisementServiceImpl.java
new file mode 100644
index 0000000..d530784
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/AdvertisementServiceImpl.java
@@ -0,0 +1,40 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.AdvertisementMapper;
+import com.stylefeng.guns.modular.system.model.Advertisement;
+import com.stylefeng.guns.modular.system.service.IAdvertisementService;
+import com.stylefeng.guns.modular.system.warpper.AdvertisementWarpper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+@Service
+public class AdvertisementServiceImpl extends ServiceImpl<AdvertisementMapper, Advertisement> implements IAdvertisementService {
+
+    @Resource
+    private AdvertisementMapper advertisementMapper;
+
+
+    /**
+     * 获取广告
+     * @param type  广告类型(1:弹窗广告,2:底部广告)
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<AdvertisementWarpper> queryAdvertisement(String code, Integer type) throws Exception {
+        String province = code.substring(0, 2) + "0000";
+        String city = code.substring(0, 4) + "00";
+        List<AdvertisementWarpper> list = advertisementMapper.queryAdvertisement(code, type);
+        if(list.size() == 0){
+            list = advertisementMapper.queryAdvertisement(city, type);
+        }
+        if(list.size() == 0){
+            list = advertisementMapper.queryAdvertisement(province, type);
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/AgreementServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/AgreementServiceImpl.java
new file mode 100644
index 0000000..085a374
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/AgreementServiceImpl.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.AgreementMapper;
+import com.stylefeng.guns.modular.system.model.Agreement;
+import com.stylefeng.guns.modular.system.service.IAgreementService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+
+@Service
+public class AgreementServiceImpl extends ServiceImpl<AgreementMapper, Agreement> implements IAgreementService {
+
+    @Resource
+    private AgreementMapper agreementMapper;
+
+
+    /**
+     * 获取协议内容
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public String queryByType(Integer type) throws Exception {
+        String s = agreementMapper.queryByType(type, 1);
+        if(ToolUtil.isEmpty(s)){
+            s = agreementMapper.queryByType(type, null);
+        }
+        return s;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CancleOrderServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CancleOrderServiceImpl.java
new file mode 100644
index 0000000..e2ebe75
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CancleOrderServiceImpl.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.CancleOrderMapper;
+import com.stylefeng.guns.modular.system.model.CancleOrder;
+import com.stylefeng.guns.modular.system.service.ICancleOrderService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+
+@Service
+public class CancleOrderServiceImpl extends ServiceImpl<CancleOrderMapper, CancleOrder> implements ICancleOrderService {
+
+    @Resource
+    private CancleOrderMapper cancleOrderMapper;
+
+
+    /**
+     * 获取取消订单配置
+     * @param type
+     * @param orderType
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public CancleOrder query(Integer type, Integer orderType, Integer companyId) throws Exception {
+        return cancleOrderMapper.query(type, orderType, companyId);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyCityServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyCityServiceImpl.java
new file mode 100644
index 0000000..e67ec35
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyCityServiceImpl.java
@@ -0,0 +1,74 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.CompanyCityMapper;
+import com.stylefeng.guns.modular.system.dao.CompanyMapper;
+import com.stylefeng.guns.modular.system.model.Company;
+import com.stylefeng.guns.modular.system.model.CompanyCity;
+import com.stylefeng.guns.modular.system.service.ICompanyCityService;
+import com.stylefeng.guns.modular.system.util.GDMapGeocodingUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class CompanyCityServiceImpl extends ServiceImpl<CompanyCityMapper, CompanyCity> implements ICompanyCityService {
+
+    @Resource
+    private CompanyMapper companyMapper;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+
+    /**
+     * 根据经纬度获取所属企业
+     * @param lon
+     * @param lat
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Company query(String lon, String lat) throws Exception {
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(lon), String.valueOf(lat));
+        String districtCode = geocode.get("districtCode");
+        Company query = this.query(districtCode);
+        return query;
+    }
+
+
+    /**
+     * 根据行政编号获取所属企业
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Company query(String code) throws Exception {
+        if(ToolUtil.isEmpty(code)){
+            return null;
+        }
+        String province = code.substring(0, 2) + "0000";
+        String city = code.substring(0, 4) + "00";
+        List<Company> query = companyMapper.query(province, city, code);
+        if(query.size() == 0){
+            query = companyMapper.query(province, city, null);
+        }
+        if(query.size() == 0){
+            query = companyMapper.query(province, null, null);
+        }
+        for(int i = 3; i > 0; i--){
+            for(Company company : query){
+                if(company.getType() == i){
+                    return company;
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyServiceImpl.java
new file mode 100644
index 0000000..b305d08
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyServiceImpl.java
@@ -0,0 +1,12 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.CompanyMapper;
+import com.stylefeng.guns.modular.system.model.Company;
+import com.stylefeng.guns.modular.system.service.ICompanyService;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> implements ICompanyService {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ComplaintServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ComplaintServiceImpl.java
new file mode 100644
index 0000000..2e3495c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ComplaintServiceImpl.java
@@ -0,0 +1,57 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.ComplaintMapper;
+import com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper;
+import com.stylefeng.guns.modular.system.model.Complaint;
+import com.stylefeng.guns.modular.system.model.SensitiveWords;
+import com.stylefeng.guns.modular.system.service.IComplaintService;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class ComplaintServiceImpl extends ServiceImpl<ComplaintMapper, Complaint> implements IComplaintService {
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+
+
+    /**
+     * 添加投诉
+     * @param driverId      司机id
+     * @param reason        投诉原因
+     * @param description   描述
+     * @param uid           投诉人
+     * @throws Exception
+     */
+    @Override
+    public void saveData(Integer driverId, String reason, String description, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(description)){
+            List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+            for(SensitiveWords s : sensitiveWords){
+                description = description.replaceAll(s.getContent(), "***");
+            }
+        }
+        Complaint complaint = new Complaint();
+        complaint.setInsertTime(new Date());
+        complaint.setDriverId(driverId);
+        complaint.setReason(reason);
+        complaint.setDescription(description);
+        complaint.setUserId(uid);
+        complaint.setIsHandle(0);
+        this.insert(complaint);
+
+        systemNoticeService.addSystemNotice(1, "您的投诉已提交成功,我们会尽快处理!", uid, 1);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java
new file mode 100644
index 0000000..0463d01
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.dao.DeptMapper;
+import com.stylefeng.guns.modular.system.model.Dept;
+import com.stylefeng.guns.modular.system.service.IDeptService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Transactional
+public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements IDeptService {
+
+    @Resource
+    private DeptMapper deptMapper;
+
+    @Override
+    public void deleteDept(Integer deptId) {
+        Dept dept = deptMapper.selectById(deptId);
+
+        Wrapper<Dept> wrapper = new EntityWrapper<>();
+        wrapper = wrapper.like("pids", "%[" + dept.getId() + "]%");
+        List<Dept> subDepts = deptMapper.selectList(wrapper);
+        for (Dept temp : subDepts) {
+            temp.deleteById();
+        }
+
+        dept.deleteById();
+    }
+
+    @Override
+    public List<ZTreeNode> tree() {
+        return this.baseMapper.tree();
+    }
+
+    @Override
+    public List<Map<String, Object>> list(String condition) {
+        return this.baseMapper.list(condition);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java
new file mode 100644
index 0000000..6757882
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java
@@ -0,0 +1,101 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.modular.system.dao.DictMapper;
+import com.stylefeng.guns.modular.system.model.Dict;
+import com.stylefeng.guns.modular.system.service.IDictService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+import static com.stylefeng.guns.core.common.constant.factory.MutiStrFactory.*;
+
+@Service
+@Transactional
+public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements IDictService {
+
+    @Resource
+    private DictMapper dictMapper;
+
+    @Override
+    public void addDict(String dictCode,String dictName,String dictTips, String dictValues) {
+        //判断有没有该字典
+        List<Dict> dicts = dictMapper.selectList(new EntityWrapper<Dict>().eq("code", dictCode).and().eq("pid", 0));
+        if (dicts != null && dicts.size() > 0) {
+            throw new GunsException(BizExceptionEnum.DICT_EXISTED);
+        }
+
+        //解析dictValues
+        List<Map<String, String>> items = parseKeyValue(dictValues);
+
+        //添加字典
+        Dict dict = new Dict();
+        dict.setName(dictName);
+        dict.setCode(dictCode);
+        dict.setTips(dictTips);
+        dict.setNum(0);
+        dict.setPid(0);
+        this.dictMapper.insert(dict);
+
+        //添加字典条目
+        for (Map<String, String> item : items) {
+            String code = item.get(MUTI_STR_CODE);
+            String name = item.get(MUTI_STR_NAME);
+            String num = item.get(MUTI_STR_NUM);
+            Dict itemDict = new Dict();
+            itemDict.setPid(dict.getId());
+            itemDict.setCode(code);
+            itemDict.setName(name);
+
+            try {
+                itemDict.setNum(Integer.valueOf(num));
+            } catch (NumberFormatException e) {
+                throw new GunsException(BizExceptionEnum.DICT_MUST_BE_NUMBER);
+            }
+            this.dictMapper.insert(itemDict);
+        }
+    }
+
+    @Override
+    public void editDict(Integer dictId,String dictCode, String dictName,String dictTips, String dicts) {
+        //删除之前的字典
+        this.delteDict(dictId);
+
+        //重新添加新的字典
+        this.addDict(dictCode,dictName,dictTips, dicts);
+    }
+
+    @Override
+    public void delteDict(Integer dictId) {
+        //删除这个字典的子词典
+        Wrapper<Dict> dictEntityWrapper = new EntityWrapper<>();
+        dictEntityWrapper = dictEntityWrapper.eq("pid", dictId);
+        dictMapper.delete(dictEntityWrapper);
+
+        //删除这个词典
+        dictMapper.deleteById(dictId);
+    }
+
+    @Override
+    public List<Dict> selectByCode(String code) {
+        return this.baseMapper.selectByCode(code);
+    }
+
+    @Override
+    public List<Dict> selectByParentCode(String code) {
+        return this.baseMapper.selectByParentCode(code);
+    }
+
+
+    @Override
+    public List<Map<String, Object>> list(String conditiion) {
+        return this.baseMapper.list(conditiion);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOrdersServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOrdersServiceImpl.java
new file mode 100644
index 0000000..6468f6f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOrdersServiceImpl.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.DriverOrdersMapper;
+import com.stylefeng.guns.modular.system.model.DriverOrders;
+import com.stylefeng.guns.modular.system.service.IDriverOrdersService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+@Service
+public class DriverOrdersServiceImpl extends ServiceImpl<DriverOrdersMapper, DriverOrders> implements IDriverOrdersService {
+
+    @Resource
+    private DriverOrdersMapper driverOrdersMapper;
+
+
+    /**
+     * 接单设置
+     * @param uid
+     * @param type
+     * @throws Exception
+     */
+    @Override
+    public void updateOrders(Integer uid, Integer type) throws Exception {
+        DriverOrders query = driverOrdersMapper.query(uid, type);
+        if(null == query){
+            query = new DriverOrders();
+            query.setDriverId(uid);
+            query.setType(type);
+            this.insert(query);
+        }else{
+            this.deleteById(query.getId());
+        }
+    }
+
+
+    /**
+     * 获取推单设置
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Integer> queryOrders(Integer uid) throws Exception {
+        return driverOrdersMapper.queryOrders(uid);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
new file mode 100644
index 0000000..903f637
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -0,0 +1,180 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.system.dao.DriverMapper;
+import com.stylefeng.guns.modular.system.dao.DriverServiceMapper;
+import com.stylefeng.guns.modular.system.model.Company;
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.model.DriverService;
+import com.stylefeng.guns.modular.system.service.ICompanyCityService;
+import com.stylefeng.guns.modular.system.service.IDriverService;
+import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
+import com.stylefeng.guns.modular.system.util.GeodesyUtil;
+import com.stylefeng.guns.modular.system.util.RedisUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class DriverServiceImpl extends ServiceImpl<DriverMapper, Driver> implements IDriverService {
+
+    @Resource
+    private DriverMapper driverMapper;
+
+    @Resource
+    private DriverServiceMapper driverServiceMapper;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private ICompanyCityService companyCityService;
+
+    @Autowired
+    private GeodesyUtil geodesyUtil;
+
+
+
+    /**
+     * 获取distance公里内空闲司机数量
+     * @param type  业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     * @param lon
+     * @param lat
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Driver> queryIdleDriver(Integer type, Double lon, Double lat, Double distance, Integer companyId) throws Exception {
+        List<Driver> drivers = driverMapper.queryIdleDriver(type, companyId);
+        System.err.println("当前获取的司机:"+drivers);
+        List<Driver> list = new ArrayList<>();
+        for(Driver driver : drivers){
+            System.err.println("当前获取的司机:"+driver);
+            String value = redisUtil.getValue("DRIVER" + String.valueOf(driver.getId()));
+            if(null != value){
+                System.err.println("redis获取到值");
+//                Map<String, String> distance1 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, value, 0);//计算距离
+                Map<String, Double> distance1 = geodesyUtil.getDistance(lon + "," + lat, value);
+                double d = Double.valueOf(distance1.get("WGS84")).doubleValue();
+                if(d < (distance * 1000)){
+                    list.add(driver);
+                }
+            }
+        }
+        System.err.println("空闲司机"+list);
+        return list;
+    }
+
+    @Autowired
+    private IOrderCrossCityService crossCityService;
+
+    /**
+     * 获取给定车型且空闲的司机
+     * @param type
+     * @param serverCarModelId
+     * @param lon
+     * @param lat
+     * @param distance
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Driver> queryIdleDriver(Integer type, Integer serverCarModelId, Double lon, Double lat, Double distance, Integer companyId) throws Exception {
+        System.err.println("type"+type+"serverCarModelId"+serverCarModelId);
+        List<Driver> drivers = driverMapper.queryIdleDriver_(type, serverCarModelId, companyId);
+        System.err.println("当前获取的司机:"+drivers);
+
+        List<Driver> list = new ArrayList<>();
+        for(Driver driver : drivers){
+            List<OrderCrossCity> orderCrossCities = crossCityService.selectList(new EntityWrapper<OrderCrossCity>().eq("state", 2).eq("driverId", driver.getId()));
+            if (orderCrossCities!=null&& !orderCrossCities.isEmpty()){
+                continue;
+            }
+
+            String value = redisUtil.getValue("DRIVER" + String.valueOf(driver.getId()));
+            if(null != value){
+//                Map<String, String> distance1 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, value, 0);//计算距离
+                Map<String, Double> distance1 = geodesyUtil.getDistance(lon + "," + lat, value);
+                double d = Double.valueOf(distance1.get("WGS84")).doubleValue();
+                if(d < (distance * 1000)){
+                    list.add(driver);
+                }
+            }
+        }
+        System.err.println("符合距离的司机:"+list);
+        return list;
+    }
+
+
+    /**
+     * 根据订单id获取司机数据
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryOrderDriver(Integer orderId, Integer orderType) throws Exception {
+        return driverMapper.queryOrderDriver(orderId, orderType);
+    }
+
+
+    /**
+     * 获取司机详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryDriverInfo(Integer id) throws Exception {
+        Map<String, Object> map = driverMapper.queryDriverInfo(id);
+        return map;
+    }
+
+
+    /**
+     * 获取司机的业务类型
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<BaseWarpper> queryBusiness(Integer uid) throws Exception {
+        List<DriverService> list = driverServiceMapper.queryBusiness(uid, null);
+        List<BaseWarpper> maps = new ArrayList<>();
+        for (DriverService d : list){
+            if(d.getType() == 4 || d.getType() == 5 ||d.getType() == 6){
+                continue;
+            }
+            BaseWarpper baseWarpper = new BaseWarpper();
+            baseWarpper.setId(d.getType());
+            switch (d.getType()){
+                case 1:
+                    baseWarpper.setName("专车");
+                    break;
+                case 2:
+                    baseWarpper.setName("出租车");
+                    break;
+                case 3:
+                    baseWarpper.setName("跨城");
+                    break;
+                case 7:
+                    baseWarpper.setName("接送机");
+                    break;
+            }
+            maps.add(baseWarpper);
+        }
+        return maps;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceServiceImpl.java
new file mode 100644
index 0000000..d77a3af
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceServiceImpl.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.DriverServiceMapper;
+import com.stylefeng.guns.modular.system.model.DriverService;
+import com.stylefeng.guns.modular.system.service.IDriverServiceService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+@Service
+public class DriverServiceServiceImpl extends ServiceImpl<DriverServiceMapper, DriverService> implements IDriverServiceService {
+
+    @Resource
+    private DriverServiceMapper driverServiceMapper;
+
+
+    /**
+     * 获取司机服务业务
+     * @param driverId
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<DriverService> query(Integer driverId, Integer... type) throws Exception {
+        return driverServiceMapper.queryBusiness(driverId, type);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/FeedbackServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/FeedbackServiceImpl.java
new file mode 100644
index 0000000..8ac04d8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/FeedbackServiceImpl.java
@@ -0,0 +1,62 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.FeedbackMapper;
+import com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper;
+import com.stylefeng.guns.modular.system.model.Feedback;
+import com.stylefeng.guns.modular.system.model.SensitiveWords;
+import com.stylefeng.guns.modular.system.service.IFeedbackService;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class FeedbackServiceImpl extends ServiceImpl<FeedbackMapper, Feedback> implements IFeedbackService {
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+
+
+
+    /**
+     * 反馈操作
+     * @param content
+     * @param uid
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil feedback(String content, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(content)){
+            if(content.length() > 200){
+                return ResultUtil.error("反馈内容过长");
+            }
+            List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+            for(SensitiveWords s : sensitiveWords){
+                content = content.replaceAll(s.getContent(), "***");
+            }
+        }
+
+        Feedback feedback = new Feedback();
+        feedback.setContent(content);
+        feedback.setFlag(1);
+        feedback.setInsertTime(new Date());
+        feedback.setState(1);
+        feedback.setType(1);
+        feedback.setUserId(uid);
+        this.insert(feedback);
+
+        systemNoticeService.addSystemNotice(1, "您的反馈已提交成功,我们会尽快处理!", uid, 1);
+        return ResultUtil.success();
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/FrequentPassengersServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/FrequentPassengersServiceImpl.java
new file mode 100644
index 0000000..2c4b7f6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/FrequentPassengersServiceImpl.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.FrequentPassengersMapper;
+import com.stylefeng.guns.modular.system.model.FrequentPassengers;
+import com.stylefeng.guns.modular.system.service.IFrequentPassengersService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class FrequentPassengersServiceImpl extends ServiceImpl<FrequentPassengersMapper, FrequentPassengers> implements IFrequentPassengersService {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java
new file mode 100644
index 0000000..95e4438
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.GDInterfaceMapper;
+import com.stylefeng.guns.modular.system.model.GDInterface;
+import com.stylefeng.guns.modular.system.service.IGDInterfaceService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+@Service
+public class GDInterfaceServiceImpl extends ServiceImpl<GDInterfaceMapper, GDInterface> implements IGDInterfaceService {
+
+    @Resource
+    private GDInterfaceMapper gdInterfaceMapper;
+
+
+
+    @Override
+    public void saveData(String name, String explanation) {
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");
+        GDInterface query = gdInterfaceMapper.query(name, explanation, sdf.format(date));
+        if(null == query){
+            query = new GDInterface();
+            query.setName(name);
+            query.setExplanation(explanation);
+            query.setTime(sdf.format(date));
+            query.setNum(1);
+            this.insert(query);
+        }else{
+            query.setNum(query.getNum() + 1);
+            this.updateById(query);
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java
new file mode 100644
index 0000000..2fa2538
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.IncomeMapper;
+import com.stylefeng.guns.modular.system.model.Income;
+import com.stylefeng.guns.modular.system.service.IIncomeService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+
+@Service
+public class IncomeServiceImpl extends ServiceImpl<IncomeMapper, Income> implements IIncomeService {
+
+
+    /**
+     * 添加数据
+     * @param userType
+     * @param objectId
+     * @param type
+     * @param incomeId
+     * @param money
+     * @throws Exception
+     */
+    @Override
+    public void saveData(Integer userType, Integer objectId, Integer type, Integer incomeId, Integer orderType, Double money) throws Exception {
+        Income income = new Income();
+        income.setUserType(userType);
+        income.setObjectId(objectId);
+        income.setType(type);
+        income.setIncomeId(incomeId);
+        income.setOrderType(orderType);
+        income.setMoney(money);
+        income.setInsertTime(new Date());
+        this.insert(income);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IntegralGoodsServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IntegralGoodsServiceImpl.java
new file mode 100644
index 0000000..ec5ee5e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IntegralGoodsServiceImpl.java
@@ -0,0 +1,44 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.IntegralGoodsMapper;
+import com.stylefeng.guns.modular.system.model.IntegralGoods;
+import com.stylefeng.guns.modular.system.service.IIntegralGoodsService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class IntegralGoodsServiceImpl extends ServiceImpl<IntegralGoodsMapper, IntegralGoods> implements IIntegralGoodsService {
+
+    @Resource
+    private IntegralGoodsMapper integralGoodsMapper;
+
+
+
+    /**
+     * 获取商品列表
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryGoods(Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        return integralGoodsMapper.queryGoods(pageNum, size);
+    }
+
+    /**
+     * 获取详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryGoodsInfo(Integer id) throws Exception {
+        return integralGoodsMapper.queryGoodsInfo(id);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IntegralOrderServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IntegralOrderServiceImpl.java
new file mode 100644
index 0000000..18f793e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IntegralOrderServiceImpl.java
@@ -0,0 +1,84 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.IntegralOrderMapper;
+import com.stylefeng.guns.modular.system.model.IntegralGoods;
+import com.stylefeng.guns.modular.system.model.IntegralOrder;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.service.IIntegralGoodsService;
+import com.stylefeng.guns.modular.system.service.IIntegralOrderService;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class IntegralOrderServiceImpl extends ServiceImpl<IntegralOrderMapper, IntegralOrder> implements IIntegralOrderService {
+
+    @Resource
+    private IntegralOrderMapper integralOrderMapper;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IIntegralGoodsService integralGoodsService;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+
+    /**
+     * 保存订单
+     * @param integralOrder
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil addIntegralOrder(IntegralOrder integralOrder, Integer uid) throws Exception {
+        IntegralGoods integralGoods = integralGoodsService.selectById(integralOrder.getGoodsId());
+        UserInfo userInfo = userInfoService.selectById(uid);
+        if(integralGoods.getIntegral().compareTo(userInfo.getIntegral()) > 0){
+            return ResultUtil.error("兑换失败,积分不足!");
+        }
+        integralOrder.setInsertTime(new Date());
+        integralOrder.setIntegral(integralGoods.getIntegral());
+        integralOrder.setNum(1);
+        integralOrder.setState(1);
+        integralOrder.setUserId(uid);
+        this.insert(integralOrder);
+
+        userInfo.setIntegral(userInfo.getIntegral() - integralGoods.getIntegral());
+        userInfoService.updateById(userInfo);
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您使用" + integralGoods.getIntegral() + "积分成功兑换" + integralGoods.getName() + "商品!", uid, 1);
+        //添加交易明细
+        transactionDetailsService.saveData(uid, "积分兑换", integralGoods.getIntegral().doubleValue(), 2, 2, 1, 7, integralOrder.getId());
+        return ResultUtil.success();
+    }
+
+    /**
+     * 获取历史记录
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryConvertHistory(Integer pageNum, Integer size, Integer uid) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        return integralOrderMapper.queryConvertHistory(pageNum, size, uid);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java
new file mode 100644
index 0000000..f325467
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java
@@ -0,0 +1,113 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.CharteredCar.model.OrderCharteredCar;
+import com.stylefeng.guns.modular.CharteredCar.server.IOrderCharteredCarService;
+import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.dao.InvoiceMapper;
+import com.stylefeng.guns.modular.system.model.Invoice;
+import com.stylefeng.guns.modular.system.service.IInvoiceService;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class InvoiceServiceImpl extends ServiceImpl<InvoiceMapper, Invoice> implements IInvoiceService {
+
+    @Resource
+    private InvoiceMapper invoiceMapper;
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+    @Autowired
+    private IOrderCrossCityService crossCityService;
+    @Autowired
+    private IOrderCharteredCarService orderCharteredCarService;
+
+
+    /**
+     * 申请开票操作
+     * @param invoice
+     * @param order
+     * @throws Exception
+     */
+    @Override
+    public void invoicing(Invoice invoice, String order, Integer uid) throws Exception {
+        JSONArray jsonArray = JSON.parseArray(order);
+        BigDecimal sum = new BigDecimal(0);
+        for(int i = 0; i < jsonArray.size(); i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            Integer orderType = jsonObject.getIntValue("type");
+            Integer orderId = jsonObject.getIntValue("id");
+            switch (orderType){
+                case 1://专车
+                    OrderPrivateCar privateCar= orderPrivateCarService.selectById(orderId);
+                    sum.add(new BigDecimal(privateCar.getPayMoney()));
+                    break;
+                case 2://出租车
+                    OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
+                    sum.add(new BigDecimal(orderTaxi.getPayMoney()));
+                    break;
+                case 3://跨城出行
+                    OrderCrossCity orderCrossCity = crossCityService.selectById(orderId);
+                    sum.add(new BigDecimal(orderCrossCity.getPayMoney()));
+                    break;
+                case 4://同城小件物流
+                    break;
+                case 5://跨城小件物流
+                    break;
+//                    case 6://包车
+//                        OrderCharteredCar   orderCharteredCar = orderCharteredCarService.selectById(orderId);
+//                        sum.add(new BigDecimal(orderCharteredCar.getPayMoney()));
+//                    break;
+                case 7://接送机
+                    break;
+            }
+        }
+
+        invoice.setOrderNum(jsonArray.size());
+        invoice.setMoney(sum.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+        invoice.setUserId(uid);
+        invoice.setInsertTime(new Date());
+        invoice.setState(1);
+        this.insert(invoice);
+        // TODO: 2020/6/9 调用开发票第三方SDK
+        String.valueOf(invoice.getMoney());
+
+
+    }
+
+
+    /**
+     * 获取发票历史记录
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryMyInvoice(Integer pageNum, Integer size, Integer uid) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        return invoiceMapper.queryMyInvoice(pageNum, size, uid);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java
new file mode 100644
index 0000000..f4d7b6f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.LoginLogMapper;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import com.stylefeng.guns.modular.system.service.ILoginLogService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 登录记录 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class LoginLogServiceImpl extends ServiceImpl<LoginLogMapper, LoginLog> implements ILoginLogService {
+
+    @Override
+    public List<Map<String, Object>> getLoginLogs(Page<LoginLog> page, String beginTime, String endTime, String logName, String orderByField, boolean asc) {
+        return this.baseMapper.getLoginLogs(page, beginTime, endTime, logName, orderByField, asc);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java
new file mode 100644
index 0000000..fd40c3e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java
@@ -0,0 +1,90 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.node.MenuNode;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.dao.MenuMapper;
+import com.stylefeng.guns.modular.system.model.Menu;
+import com.stylefeng.guns.modular.system.service.IMenuService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 菜单服务
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 22:20
+ */
+@Service
+public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
+
+    @Resource
+    private MenuMapper menuMapper;
+
+    @Override
+    public void delMenu(Long menuId) {
+
+        //删除菜单
+        this.menuMapper.deleteById(menuId);
+
+        //删除关联的relation
+        this.menuMapper.deleteRelationByMenu(menuId);
+    }
+
+    @Override
+    public void delMenuContainSubMenus(Long menuId) {
+
+        Menu menu = menuMapper.selectById(menuId);
+
+        //删除当前菜单
+        delMenu(menuId);
+
+        //删除所有子菜单
+        Wrapper<Menu> wrapper = new EntityWrapper<>();
+        wrapper = wrapper.like("pcodes", "%[" + menu.getCode() + "]%");
+        List<Menu> menus = menuMapper.selectList(wrapper);
+        for (Menu temp : menus) {
+            delMenu(temp.getId());
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> selectMenus(String condition, String level) {
+        return this.baseMapper.selectMenus(condition, level);
+    }
+
+    @Override
+    public List<Long> getMenuIdsByRoleId(Integer roleId) {
+        return this.baseMapper.getMenuIdsByRoleId(roleId);
+    }
+
+    @Override
+    public List<ZTreeNode> menuTreeList() {
+        return this.baseMapper.menuTreeList();
+    }
+
+    @Override
+    public List<ZTreeNode> menuTreeListByMenuIds(List<Long> menuIds) {
+        return this.baseMapper.menuTreeListByMenuIds(menuIds);
+    }
+
+    @Override
+    public int deleteRelationByMenu(Long menuId) {
+        return this.baseMapper.deleteRelationByMenu(menuId);
+    }
+
+    @Override
+    public List<String> getResUrlsByRoleId(Integer roleId) {
+        return this.baseMapper.getResUrlsByRoleId(roleId);
+    }
+
+    @Override
+    public List<MenuNode> getMenusByRoleIds(List<Integer> roleIds) {
+        return this.baseMapper.getMenusByRoleIds(roleIds);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NettyServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NettyServiceImpl.java
new file mode 100644
index 0000000..00bc9a1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NettyServiceImpl.java
@@ -0,0 +1,86 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.service.INettyService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderStatusWarpper;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+import com.stylefeng.guns.modular.transfer.server.IOrderTransferService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Service
+public class NettyServiceImpl implements INettyService {
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IOrderTransferService orderTransferService;
+
+    /**
+     * 获取下单推送完后没有司机接单的提醒
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil<EndPushWarpper> queryEndPush(Integer orderId, Integer orderType, Integer uid) throws Exception {
+        EndPushWarpper endPushWarpper = null;
+        switch (orderType){
+            case 1:
+                endPushWarpper = orderPrivateCarService.queryEndPush(uid);
+                break;
+            case 2:
+                endPushWarpper = orderTaxiService.queryEndPush(uid);
+                break;
+            case 7:
+                endPushWarpper = orderTransferService.queryEndPush(uid);
+                break;
+        }
+        return ResultUtil.success(endPushWarpper);
+    }
+
+
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil<OrderServerWarpper> queryOrderServer(Integer orderId, Integer orderType, Integer uid) throws Exception {
+        OrderServerWarpper orderServerWarpper = null;
+        switch (orderType){
+            case 1:
+                orderServerWarpper = orderPrivateCarService.queryOrderServer(orderId, uid);//专车
+                break;
+            case 2:
+                orderServerWarpper = orderTaxiService.queryOrderServer(orderId, uid);//出租车
+                break;
+            case 3:
+                orderServerWarpper = orderCrossCityService.queryOrderServer(orderId, uid);//出租车
+                break;
+            case 7:
+                orderServerWarpper = orderTransferService.queryOrderServer(orderId, uid);//专车
+                break;
+        }
+        return ResultUtil.success(orderServerWarpper);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java
new file mode 100644
index 0000000..68b1b52
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.NoticeMapper;
+import com.stylefeng.guns.modular.system.model.Notice;
+import com.stylefeng.guns.modular.system.service.INoticeService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 通知表 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> implements INoticeService {
+
+    @Override
+    public List<Map<String, Object>> list(String condition) {
+        return this.baseMapper.list(condition);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OpenCityBusinessServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OpenCityBusinessServiceImpl.java
new file mode 100644
index 0000000..24dc5ea
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OpenCityBusinessServiceImpl.java
@@ -0,0 +1,120 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.OpenCityBusinessMapper;
+import com.stylefeng.guns.modular.system.model.OpenCityBusiness;
+import com.stylefeng.guns.modular.system.service.IOpenCityBusinessService;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Service
+public class OpenCityBusinessServiceImpl extends ServiceImpl<OpenCityBusinessMapper, OpenCityBusiness> implements IOpenCityBusinessService {
+
+    @Resource
+    private OpenCityBusinessMapper openCityBusinessMapper;
+
+
+    /**
+     * 获取业务类型
+     * @param province  省名
+     * @param city      市名称
+     * @param district  区县名称
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<BaseWarpper> queryBusiness(String province, String city, String district) throws Exception {
+        List<OpenCityBusiness> openCityBusinesses = openCityBusinessMapper.queryBusiness(province, city, district);
+        if(openCityBusinesses.size() == 0){
+            openCityBusinesses = openCityBusinessMapper.queryBusiness(province, city, null);
+        }
+        if(openCityBusinesses.size() == 0){
+            openCityBusinesses = openCityBusinessMapper.queryBusiness(province, null, null);
+        }
+        List<BaseWarpper> list = new ArrayList<>();
+        for(OpenCityBusiness b : openCityBusinesses){
+            BaseWarpper baseWarpper = new BaseWarpper();
+            switch (b.getBusinessType()){
+                case 1:
+                    baseWarpper.setName("出租车");
+                    baseWarpper.setId(1);
+                    break;
+                case 2:
+//                    baseWarpper.setName("出租车");
+//                    baseWarpper.setId(2);
+                    break;
+                case 3:
+                    baseWarpper.setName("定制班线");
+                    baseWarpper.setId(3);
+                    break;
+                case 4:
+                    baseWarpper.setName("同城小件物流");
+                    baseWarpper.setId(4);
+                    break;
+                case 5:
+                    baseWarpper.setName("跨城小件物流");
+                    baseWarpper.setId(5);
+                    break;
+                case 6:
+//                    baseWarpper.setName("包车");
+//                    baseWarpper.setId(6);
+                    break;
+                    case 7:
+//                    baseWarpper.setName("接送机/站");
+//                    baseWarpper.setId(7);
+                    break;
+            }
+            list.add(baseWarpper);
+        }
+        return list;
+    }
+
+
+    /**
+     * 根据开通的城市id获取业务类型
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<BaseWarpper> queryBusinessById(Integer id) throws Exception {
+        List<OpenCityBusiness> openCityBusinesses = openCityBusinessMapper.queryBusinessById(id);
+        List<BaseWarpper> list = new ArrayList<>();
+        for(OpenCityBusiness b : openCityBusinesses){
+            BaseWarpper baseWarpper = new BaseWarpper();
+            switch (b.getBusinessType()){
+                case 1:
+                    baseWarpper.setName("专车");
+                    baseWarpper.setId(1);
+                    break;
+                case 2:
+                    baseWarpper.setName("出租车");
+                    baseWarpper.setId(2);
+                    break;
+                case 3:
+                    baseWarpper.setName("跨城");
+                    baseWarpper.setId(3);
+                    break;
+                case 4:
+                    baseWarpper.setName("同城小件物流");
+                    baseWarpper.setId(4);
+                    break;
+                case 5:
+                    baseWarpper.setName("跨城小件物流");
+                    baseWarpper.setId(5);
+                    break;
+                case 6:
+                    baseWarpper.setName("包车");
+                    baseWarpper.setId(6);
+                    break;
+            }
+            list.add(baseWarpper);
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OpenCityServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OpenCityServiceImpl.java
new file mode 100644
index 0000000..b72717c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OpenCityServiceImpl.java
@@ -0,0 +1,69 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.OpenCityMapper;
+import com.stylefeng.guns.modular.system.model.OpenCity;
+import com.stylefeng.guns.modular.system.service.IOpenCityService;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Service
+public class OpenCityServiceImpl extends ServiceImpl<OpenCityMapper, OpenCity> implements IOpenCityService {
+
+    @Resource
+    private OpenCityMapper openCityMapper;
+
+
+    /**
+     * 获取开通城市列表
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<BaseWarpper> queryOpenCity() throws Exception {
+        List<OpenCity> openCities = openCityMapper.queryOpenCity();
+        List<BaseWarpper> list = new ArrayList<>();
+        for(OpenCity c : openCities){
+            BaseWarpper baseWarpper = new BaseWarpper();
+            baseWarpper.setId(c.getId());
+            baseWarpper.setName(ToolUtil.isEmpty(c.getProvinceName())  ?
+                    (ToolUtil.isEmpty(c.getCityName()) ? (ToolUtil.isEmpty(c.getAreaName()) ? "" : c.getAreaName()) : c.getCityName()) : c.getProvinceName());
+            baseWarpper.setLon(null != c.getLon() ? c.getLon() : 0);
+            baseWarpper.setLat(null != c.getLat() ? c.getLat() : 0);
+            baseWarpper.setContent(c.getCode());
+            baseWarpper.setName(baseWarpper.getName().replaceAll("市辖区", ""));
+            list.add(baseWarpper);
+        }
+        return list;
+    }
+
+
+    /**
+     * 判断是否是开通城市
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean openCity(String code) throws Exception {
+        String province = code.substring(0, 2) + "0000";
+        String city = code.substring(0, 4) + "00";
+        List<OpenCity> openCities = openCityMapper.queryByCode(code);
+        if(openCities.size() == 0){
+            openCities = openCityMapper.queryByCode(city);
+        }
+        if(openCities.size() == 0){
+            openCities = openCityMapper.queryByCode(province);
+        }
+        if(openCities.size() == 0){
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java
new file mode 100644
index 0000000..8b58018
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.OperationLogMapper;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+import com.stylefeng.guns.modular.system.service.IOperationLogService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 操作日志 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, OperationLog> implements IOperationLogService {
+
+    @Override
+    public List<Map<String, Object>> getOperationLogs(Page<OperationLog> page, String beginTime, String endTime, String logName, String s, String orderByField, boolean asc) {
+        return this.baseMapper.getOperationLogs(page, beginTime, endTime, logName, s, orderByField, asc);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCancelServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCancelServiceImpl.java
new file mode 100644
index 0000000..f5abbcd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCancelServiceImpl.java
@@ -0,0 +1,84 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
+import com.stylefeng.guns.modular.system.model.OrderCancel;
+import com.stylefeng.guns.modular.system.service.IOrderCancelService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+@Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+public class OrderCancelServiceImpl extends ServiceImpl<OrderCancelMapper, OrderCancel> implements IOrderCancelService {
+
+    @Resource
+    private OrderCancelMapper orderCancelMapper;
+
+
+
+    /**
+     * 添加数据
+     * @param orderId
+     * @param orderType
+     * @param reason
+     * @param remark
+     * @param payType
+     * @param money
+     * @param state
+     * @throws Exception
+     */
+    @Override
+    public Integer saveData(Integer orderId, Integer orderType, String reason, String remark, Integer payType,
+                            Double money, Integer state, Integer userType, Integer uid) throws Exception {
+        OrderCancel orderCancel = new OrderCancel();
+        orderCancel.setOrderId(orderId);
+        orderCancel.setOrderType(orderType);
+        orderCancel.setReason(reason);
+        orderCancel.setRemark(remark);
+        orderCancel.setPayType(payType);
+        orderCancel.setMoney(money);
+        orderCancel.setState(state);
+        orderCancel.setInsertTime(new Date());
+        orderCancel.setUserType(userType);
+        orderCancel.setUserId(uid);
+        this.insert(orderCancel);
+        return orderCancel.getId();
+    }
+
+
+    /**
+     * 获取取消数据
+     * @param orderId
+     * @param orderType
+     * @param money
+     * @param payType
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public OrderCancel query(Integer orderId, Integer orderType, Double money, Integer payType, Integer state) throws Exception {
+        return orderCancelMapper.query(orderId, orderType, money, payType, state);
+    }
+
+
+    /**
+     * 获取用户取消记录
+     * @param uid
+     * @param isPay
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryCancel(Integer uid, Integer isPay) throws Exception {
+        return orderCancelMapper.queryCancel(uid, isPay);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderEvaluateServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderEvaluateServiceImpl.java
new file mode 100644
index 0000000..e2ce349
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderEvaluateServiceImpl.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.dao.OrderEvaluateMapper;
+import com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper;
+import com.stylefeng.guns.modular.system.model.OrderEvaluate;
+import com.stylefeng.guns.modular.system.model.SensitiveWords;
+import com.stylefeng.guns.modular.system.service.IOrderEvaluateService;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.transfer.dao.OrderTransferMapper;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+import com.stylefeng.guns.modular.transfer.server.IOrderTransferService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class OrderEvaluateServiceImpl extends ServiceImpl<OrderEvaluateMapper, OrderEvaluate> implements IOrderEvaluateService {
+
+    @Resource
+    private OrderEvaluateMapper orderEvaluateMapper;
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IOrderTransferService orderTransferService;
+
+
+
+
+    /**
+     * 添加评价数据
+     * @param orderId
+     * @param orderType
+     * @param fraction
+     * @param content
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil saveData(Integer orderId, Integer orderType, Integer fraction, String content) throws Exception {
+        if(ToolUtil.isNotEmpty(content)){
+            if(null != content && content.length() > 500){
+                return ResultUtil.error("评价内容过长");
+            }
+            List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+            for(SensitiveWords s : sensitiveWords){
+                content = content.replaceAll(s.getContent(), "***");
+            }
+        }
+        OrderEvaluate orderEvaluate = new OrderEvaluate();
+        Integer driverId = null;
+        Integer uid = null;
+        switch (orderType){
+            case 1:
+                OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+                driverId = orderPrivateCar.getDriverId();
+                uid = orderPrivateCar.getUserId();
+                break;
+            case 2:
+                OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
+                driverId = orderTaxi.getDriverId();
+                uid = orderTaxi.getUserId();
+                break;
+            case 3:
+                OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
+                driverId = orderCrossCity.getDriverId();
+                uid = orderCrossCity.getUserId();
+                break;
+            case 7:
+                OrderTransferCar orderTransferCar = orderTransferService.selectById(orderId);
+                driverId = orderTransferCar.getDriverId();
+                uid = orderTransferCar.getUserId();
+                break;
+        }
+
+        orderEvaluate.setOrderId(orderId);
+        orderEvaluate.setDriverId(driverId);
+        orderEvaluate.setOrderType(orderType);
+        orderEvaluate.setFraction(fraction);
+        orderEvaluate.setContent(content);
+        orderEvaluate.setInsertTime(new Date());
+        orderEvaluate.setUserId(uid);
+        this.insert(orderEvaluate);
+
+        systemNoticeService.addSystemNotice(1, "您已成功添加订单评价,谢谢使用!", uid, 1);
+        return ResultUtil.success(orderEvaluate.getId());
+    }
+
+
+    /**
+     * 获取司机的历史评价数据
+     * @param driverId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryOrderEvaluate(Integer driverId, Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        return orderEvaluateMapper.queryOrderEvaluate(driverId, pageNum, size);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderFrequentPassengersServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderFrequentPassengersServiceImpl.java
new file mode 100644
index 0000000..50efc44
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderFrequentPassengersServiceImpl.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.OrderFrequentPassengersMapper;
+import com.stylefeng.guns.modular.system.model.OrderFrequentPassengers;
+import com.stylefeng.guns.modular.system.service.IOrderFrequentPassengersService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class OrderFrequentPassengersServiceImpl extends ServiceImpl<OrderFrequentPassengersMapper, OrderFrequentPassengers> implements IOrderFrequentPassengersService {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java
new file mode 100644
index 0000000..7ee14e8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java
@@ -0,0 +1,98 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.OrderPositionMapper;
+import com.stylefeng.guns.modular.system.model.OrderPosition;
+import com.stylefeng.guns.modular.system.service.IOrderPositionService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class OrderPositionServiceImpl extends ServiceImpl<OrderPositionMapper, OrderPosition> implements IOrderPositionService {
+
+    @Resource
+    private OrderPositionMapper orderPositionMapper;
+
+    @Value("${filePath}")
+    private String filePath;
+
+
+    /**
+     * 获取轨迹数据
+     * @param orderId
+     * @param orderType
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryTrack(Integer orderId, Integer orderType) throws Exception {
+//        return orderPositionMapper.queryTrack(orderId, orderType);
+        //将数据存储到文件中
+        File file = new File(filePath + orderId + "_" + orderType + ".txt");
+        if(!file.exists()){
+            return new ArrayList<>();
+        }
+        //读取文件(字符流)
+        BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
+        //循环取出数据
+        String str = null;
+        StringBuffer sb = new StringBuffer();
+        while ((str = in.readLine()) != null) {
+            sb.append(str);
+        }
+        List<OrderPosition> list = JSONArray.parseArray(sb.toString(), OrderPosition.class);
+        List<Map<String, Object>> lonlat = new ArrayList<>();
+        for(OrderPosition orderPosition : list){
+            Map<String, Object> map = new HashMap<>();
+            map.put("lon", orderPosition.getLon());
+            map.put("lat", orderPosition.getLat());
+            lonlat.add(map);
+        }
+        return lonlat;
+    }
+
+
+
+    /**
+     * 获取坐标文件中的坐标数据
+     * @param orderId
+     * @param orderType
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<OrderPosition> queryPosition(Integer orderId, Integer orderType) throws Exception{
+        //将数据存储到文件中
+        File file = new File(filePath + orderId + "_" + orderType + ".txt");
+        if(!file.exists()){
+            return new ArrayList<>();
+        }
+        //读取文件(字符流)
+        BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
+        //循环取出数据
+        String str = null;
+        StringBuffer sb = new StringBuffer();
+        while ((str = in.readLine()) != null) {
+            sb.append(str);
+        }
+        List<OrderPosition> list = new ArrayList<>();
+        if(ToolUtil.isNotEmpty(sb.toString())){
+            list = JSONArray.parseArray(sb.toString(), OrderPosition.class);
+        }
+        System.err.println("坐标:" + sb);
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java
new file mode 100644
index 0000000..64525d5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java
@@ -0,0 +1,143 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.service.IOrderService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.ChinaMobileUtil;
+import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+import com.stylefeng.guns.modular.transfer.server.IOrderTransferService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Map;
+
+
+@Service
+public class OrderServiceImpl implements IOrderService {
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private RestTemplate internalRestTemplate;
+
+    @Autowired
+    private ChinaMobileUtil chinaMobileUtil;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IOrderLogisticsService orderLogisticsService;
+
+    @Autowired
+    private IOrderTransferService orderTransferService;
+
+
+    /**
+     * 获取预计行驶时间
+     * @param slon  起点经度
+     * @param slat  起点纬度
+     * @param elon  终点经度
+     * @param elat  终点纬度
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil<BaseWarpper> queryExpectedTime(Double slon, Double slat, Double elon, Double elat) throws Exception {
+        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(slon + "," + slat, elon + "," + elat, 1);
+        int duration = Integer.valueOf(distance.get("duration")) / 60;
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setMinute(duration);
+        return ResultUtil.success(baseWarpper);
+    }
+
+    /**
+     * APP调用微信小程序完成支付
+     * @param orderId
+     * @param orderType
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil weChatPay(Integer orderId, Integer orderType, Integer type, Integer userType, Integer uid, String content) throws Exception {
+        JSONObject jsonObject = JSON.parseObject(content);
+        switch (type){
+            case 1://订单完成支付
+                switch (orderType){
+                    case 1:
+                        return orderPrivateCarService.payPrivateCarOrder(1, orderId, (null == jsonObject ? null : jsonObject.getIntValue("couponId")), 3);
+                    case 2:
+                        return orderTaxiService.payTaxiOrder(1, orderId, (null == jsonObject ? null : jsonObject.getIntValue("couponId")), 3);
+                    case 3:
+                        return orderCrossCityService.payCrossCityOrder(1, orderId, (null == jsonObject ? null : jsonObject.getIntValue("couponId")), 3);
+                    case 4:
+                        return orderLogisticsService.payLogisticsOrder(1, orderId, 3);
+                    case 5:
+                        return orderLogisticsService.payLogisticsOrder(1, orderId, 3);
+                    case 7:
+                        return orderTransferService.payPrivateCarOrder(1, orderId, (null == jsonObject ? null : jsonObject.getIntValue("couponId")), 3);
+                }
+            case 2://订单取消支付
+                switch (orderType){
+                    case 1:
+                        return orderPrivateCarService.cancleOrderPrivateCar(orderId, 1, null == jsonObject ? null : jsonObject.getIntValue("cancelId"), 3);
+                    case 2:
+                        return orderTaxiService.cancleOrderTaxi(orderId, 1, null == jsonObject ? null : jsonObject.getIntValue("cancelId"), 3);
+                    case 3:
+                        return orderCrossCityService.cancleOrderCrossCity(orderId, 1, null == jsonObject ? null : jsonObject.getIntValue("cancelId"), 3);
+                }
+
+            case 3://司机端改派支付
+                HttpHeaders headers = new HttpHeaders();
+                // 以表单的方式提交
+                headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+                //将请求头部和参数合成一个请求
+                MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+                params.add("orderId", orderId.toString());
+                params.add("orderType", orderType.toString());
+                params.add("payType", "1");
+                params.add("reason", null == jsonObject ? "" : jsonObject.getString("reason"));
+                params.add("remark", null == jsonObject ? "" : jsonObject.getString("remark"));
+                params.add("uid", jsonObject.getString("uid"));
+                HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+                String s = internalRestTemplate.postForObject("http://driver-server/base/order/reassign_", requestEntity, String.class);
+                JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
+                return ResultUtil.success(jsonObject1.getString("msg"), jsonObject1.getString("data"));
+            case 4://余额充值
+                if(userType == 1){
+                    return userInfoService.depositBalance(1, jsonObject.getDoubleValue("money"), uid, 3);
+                }
+                if(userType == 2){
+
+                }
+            case 5://小件物流补差价
+                return orderLogisticsService.payLogisticsOrder_(1, orderId, 3);
+        }
+        return ResultUtil.success();
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PhoneServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PhoneServiceImpl.java
new file mode 100644
index 0000000..39015d3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PhoneServiceImpl.java
@@ -0,0 +1,92 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.PhoneMapper;
+import com.stylefeng.guns.modular.system.dao.SysReformistMapper;
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.model.Phone;
+import com.stylefeng.guns.modular.system.model.SysReformist;
+import com.stylefeng.guns.modular.system.service.IPhoneService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class PhoneServiceImpl extends ServiceImpl<PhoneMapper, Phone> implements IPhoneService {
+
+    @Resource
+    private PhoneMapper phoneMapper;
+    @Autowired
+    private SysReformistMapper sysReformistMapper;
+
+    /**
+     * 获取所有系统电话
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Phone> queryPhones(String code) throws Exception {
+        if(ToolUtil.isEmpty(code)){
+            return new ArrayList<>();
+        }
+        String province = code.substring(0, 2) + "0000";
+        String city = code.substring(0, 4) + "00";
+
+        List<Phone> list = phoneMapper.queryPhones(province, city, code);
+        if(list.size() == 0){
+            list = phoneMapper.queryPhones(province, city, null);
+        }
+        if(list.size() == 0){
+            list = phoneMapper.queryPhones(province, null, null);
+        }
+        return list;
+    }
+
+
+    /**
+     * 获取客服电话(个人中心)
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryCustomerPhone(String code) throws Exception {
+        String province = code.substring(0, 2) + "0000";
+        String city = code.substring(0, 4) + "00";
+
+        Map<String, Object> map = new HashMap<>();
+        //平台电话
+        Phone query = phoneMapper.query(2, 1, null, null, null);
+        map.put("platform", null != query ? query.getPhone() : "");
+
+        //公司
+        query = phoneMapper.query(2, 2, province, city, code);
+        if(query == null){
+            query = phoneMapper.query(2, 2, province, city, null);
+        }
+        if(query == null){
+            query = phoneMapper.query(2, 2, province, null, null);
+        }
+        map.put("company", null != query ? query.getPhone() : "");
+        try {
+            String wechat = "";
+            List<SysReformist> companyId = sysReformistMapper.selectList(new EntityWrapper<SysReformist>().eq("companyId", query==null?1:query.getCompanyId()));
+            for (SysReformist sysReformist : companyId) {
+                wechat = sysReformist.getUserQrCode();
+            }
+            map.put("wechatUrl",wechat);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        return map;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ProblemServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ProblemServiceImpl.java
new file mode 100644
index 0000000..1441b80
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ProblemServiceImpl.java
@@ -0,0 +1,72 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.ProblemMapper;
+import com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper;
+import com.stylefeng.guns.modular.system.model.Problem;
+import com.stylefeng.guns.modular.system.model.SensitiveWords;
+import com.stylefeng.guns.modular.system.service.IProblemService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> implements IProblemService {
+
+    @Resource
+    private ProblemMapper problemMapper;
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+
+
+    /**
+     * 添加留言
+     * @param content
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil leaveMessage(String content, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(content)){
+            if(content.length() > 200){
+                return ResultUtil.error("留言内容过长");
+            }
+            List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+            for(SensitiveWords s : sensitiveWords){
+                content = content.replaceAll(s.getContent(), "***");
+            }
+        }
+
+        Problem problem = new Problem();
+        problem.setContent(content);
+        problem.setUserId(uid);
+        problem.setInsertTime(new Date());
+        problem.setState(1);
+        this.insert(problem);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取提交的留言
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryProblems(Integer pageNum, Integer size, Integer uid) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        return problemMapper.queryProblems(pageNum, size, uid);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PushOrderServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PushOrderServiceImpl.java
new file mode 100644
index 0000000..6256d0a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PushOrderServiceImpl.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.PushOrderMapper;
+import com.stylefeng.guns.modular.system.model.PushOrder;
+import com.stylefeng.guns.modular.system.service.IPushOrderService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+@Service
+public class PushOrderServiceImpl extends ServiceImpl<PushOrderMapper, PushOrder> implements IPushOrderService {
+
+    @Resource
+    private PushOrderMapper pushOrderMapper;
+
+
+    /**
+     * 获取推送配置
+     * @param type
+     * @param pushType
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<PushOrder> querys(Integer type, Integer pushType, Integer companyId) throws Exception {
+        return pushOrderMapper.querys(type, pushType, companyId);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RedPacketRecordServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RedPacketRecordServiceImpl.java
new file mode 100644
index 0000000..658ab11
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RedPacketRecordServiceImpl.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.RedPacketRecordMapper;
+import com.stylefeng.guns.modular.system.model.RedPacketRecord;
+import com.stylefeng.guns.modular.system.service.IRedPacketRecordService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Random;
+
+@Service
+public class RedPacketRecordServiceImpl extends ServiceImpl<RedPacketRecordMapper, RedPacketRecord> implements IRedPacketRecordService {
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java
new file mode 100644
index 0000000..4b72cc4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.RelationMapper;
+import com.stylefeng.guns.modular.system.model.Relation;
+import com.stylefeng.guns.modular.system.service.IRelationService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 角色和菜单关联表 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class RelationServiceImpl extends ServiceImpl<RelationMapper, Relation> implements IRelationService {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java
new file mode 100644
index 0000000..d8d9d37
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java
@@ -0,0 +1,73 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.core.util.Convert;
+import com.stylefeng.guns.modular.system.dao.RelationMapper;
+import com.stylefeng.guns.modular.system.dao.RoleMapper;
+import com.stylefeng.guns.modular.system.model.Relation;
+import com.stylefeng.guns.modular.system.model.Role;
+import com.stylefeng.guns.modular.system.service.IRoleService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {
+
+    @Resource
+    private RoleMapper roleMapper;
+
+    @Resource
+    private RelationMapper relationMapper;
+
+    @Override
+    @Transactional(readOnly = false)
+    public void setAuthority(Integer roleId, String ids) {
+
+        // 删除该角色所有的权限
+        this.roleMapper.deleteRolesById(roleId);
+
+        // 添加新的权限
+        for (Long id : Convert.toLongArray(true, Convert.toStrArray(",", ids))) {
+            Relation relation = new Relation();
+            relation.setRoleid(roleId);
+            relation.setMenuid(id);
+            this.relationMapper.insert(relation);
+        }
+    }
+
+    @Override
+    @Transactional(readOnly = false)
+    public void delRoleById(Integer roleId) {
+        //删除角色
+        this.roleMapper.deleteById(roleId);
+
+        // 删除该角色所有的权限
+        this.roleMapper.deleteRolesById(roleId);
+    }
+
+    @Override
+    public List<Map<String, Object>> selectRoles(String condition) {
+        return this.baseMapper.selectRoles(condition);
+    }
+
+    @Override
+    public int deleteRolesById(Integer roleId) {
+        return this.baseMapper.deleteRolesById(roleId);
+    }
+
+    @Override
+    public List<ZTreeNode> roleTreeList() {
+        return this.baseMapper.roleTreeList();
+    }
+
+    @Override
+    public List<ZTreeNode> roleTreeListByRoleId(String[] roleId) {
+        return this.baseMapper.roleTreeListByRoleId(roleId);
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ServerCarModelServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ServerCarModelServiceImpl.java
new file mode 100644
index 0000000..97ffcd1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ServerCarModelServiceImpl.java
@@ -0,0 +1,419 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.ServerCarModelMapper;
+import com.stylefeng.guns.modular.system.dao.SystemPriceMapper;
+import com.stylefeng.guns.modular.system.model.Company;
+import com.stylefeng.guns.modular.system.model.ServerCarModel;
+import com.stylefeng.guns.modular.system.service.ICompanyCityService;
+import com.stylefeng.guns.modular.system.service.IServerCarModelService;
+import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
+import com.stylefeng.guns.modular.system.util.GDMapGeocodingUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.ServerCarModelWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+
+
+@Service
+public class ServerCarModelServiceImpl extends ServiceImpl<ServerCarModelMapper, ServerCarModel> implements IServerCarModelService {
+
+    @Resource
+    private ServerCarModelMapper serverCarModelMapper;
+
+    @Resource
+    private SystemPriceMapper systemPriceMapper;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private ICompanyCityService companyCityService;
+
+
+
+
+
+
+    /**
+     * 根据起点和终点获取车型
+     * @param startLonLat
+     * @param endLonLat
+     * @param type          业务类型
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil<List<ServerCarModelWarpper>> queryServerCarModel(String startLonLat, String endLonLat, Integer type) throws Exception {
+        //查找与起点匹配的企业(经营范围)
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(startLonLat.split(",")[0], startLonLat.split(",")[1]);
+        Company query = companyCityService.query(geocode.get("districtCode"));
+        if(null == query){
+            return ResultUtil.error("起点暂无企业提供服务", new ArrayList<>());
+        }
+        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLonLat, endLonLat, 1);
+        if(null == distance){
+            return ResultUtil.error("获取预估距离出错", new ArrayList<>());
+        }
+        String distance1 = distance.get("distance");//距离(米)
+        double distance1_ = Double.valueOf(distance1).doubleValue();
+        String duration = distance.get("duration");//时间(秒)
+        long duration_ = Long.valueOf(duration).longValue();
+
+        List<ServerCarModelWarpper> price = this.getPrice(query.getId(), distance1_, duration_, 0, 1);
+        if(price.size() == 0){
+            return ResultUtil.error("未获取到可服务的车型", new ArrayList<>());
+        }
+        return ResultUtil.success(price);
+    }
+
+    @Override
+    public ResultUtil<List<ServerCarModelWarpper>> queryServerCarModel1(String startLonLat, String endLonLat) throws Exception {
+        //查找与起点匹配的企业(经营范围)
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(startLonLat.split(",")[0], startLonLat.split(",")[1]);
+        Company query = companyCityService.query(geocode.get("districtCode"));
+        if(null == query){
+            return ResultUtil.error("起点暂无企业提供服务", new ArrayList<>());
+        }
+        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLonLat, endLonLat, 1);
+        if(null == distance){
+            return ResultUtil.error("获取预估距离出错", new ArrayList<>());
+        }
+        String distance1 = distance.get("distance");//距离(米)
+        double distance1_ = Double.valueOf(distance1).doubleValue();
+        String duration = distance.get("duration");//时间(秒)
+        long duration_ = Long.valueOf(duration).longValue();
+
+        List<ServerCarModelWarpper> price = this.getPrice1(query.getId(), distance1_, duration_, 0, 7);
+        if(price.size() == 0){
+            return ResultUtil.error("未获取到可服务的车型", new ArrayList<>());
+        }
+        return ResultUtil.success(price);
+    }
+
+
+    /**
+     * 获取业务类型对应的所有服务车型
+     * @param type
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryServerCarModels(Integer type) {
+        return serverCarModelMapper.queryServerCarModel(type);
+    }
+
+
+    /**
+     * 计算价格
+     * @param companyId
+     * @param distance
+     * @param duration
+     * @param wait
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    public List<ServerCarModelWarpper> getPrice(Integer companyId, double distance, long duration, long wait, Integer type) throws Exception {
+        List<Map<String, Object>> list = serverCarModelMapper.queryServerCarModel(type);
+        List<ServerCarModelWarpper> data = new ArrayList<>();
+        for(Map<String, Object> map : list){
+            Map<String, Object> query1 = systemPriceMapper.query(companyId, type, Integer.valueOf(map.get("id").toString()));
+            if(null == query1){//排除没有设置价格的车型
+                continue;
+            }
+            //开始根据不同的方式计算金额
+            double amount = 0;
+            if(type == 1){//专车
+                JSONObject jsonObject = JSON.parseObject(query1.get("content").toString());
+                Double num1 = jsonObject.getDouble("num1");//起步价(元)
+                Double num2 = jsonObject.getDouble("num2");//起步公里(公里)
+                Double num3 = jsonObject.getDouble("num3");//起步时间(分钟)
+                Double num4 = jsonObject.getDouble("num4");//里程费(元)
+                Double num5 = jsonObject.getDouble("num5");//时长费(分钟)
+                Double num6 = jsonObject.getDouble("num6");//等待费(分钟)
+                Double num7 = jsonObject.getDouble("num7");//等待费(元)
+                Double num8 = jsonObject.getDouble("num8");//远途费(公里)
+                Double num9 = jsonObject.getDouble("num9");//远途费(公里)
+                Double num10 = jsonObject.getDouble("num10");//远途费(元)
+                Double num11 = jsonObject.getDouble("num11");//远途费(公里)
+                Double num12 = jsonObject.getDouble("num12");//远途费(公里)
+                Double num13 = jsonObject.getDouble("num13");//远途费(元)
+                Double num14 = jsonObject.getDouble("num14");//远途费(公里)
+                Double num15 = jsonObject.getDouble("num15");//远途费(元)
+                String num16 = jsonObject.getString("num16");//夜间费(开始时间)
+                Double num17 = jsonObject.getDouble("num17");//夜间费(元)
+                Double num18 = jsonObject.getDouble("num18");//夜间费(元)
+                Double num19 = jsonObject.getDouble("num19");//夜间费(元)
+                Double num20 = jsonObject.getDouble("num20");//夜间费(元)
+                Double num21 = jsonObject.getDouble("num21");//夜间费(元)
+                Double num22 = jsonObject.getDouble("num22");//夜间费(元)
+                String num23 = jsonObject.getString("num23");//高峰费(开始时间)
+                String num24 = jsonObject.getString("num24");//高峰费(开始时间)
+                Double num25 = jsonObject.getDouble("num25");//高峰费(元)
+                Double num26 = jsonObject.getDouble("num26");//高峰费(元)
+                Double num27 = jsonObject.getDouble("num27");//高峰费(元)
+                Double num28 = jsonObject.getDouble("num28");//高峰费(元)
+                Double num29 = jsonObject.getDouble("num29");//高峰费(元)
+                Double num30 = jsonObject.getDouble("num30");//高峰费(元)
+
+                Date date = new Date();
+                double d = distance / 1000;//实际公里
+                double t = duration / 60;//实际时间
+
+                double d1 = (d - num2) < 0 ? 0 : d - num2;//超出起步里程的公里
+                double t1 = (t - num3) < 0 ? 0 : t - num3;//超过起步分钟数的时间
+                double yt1 = 0;//远途1段
+                double yt2 = 0;//远途2段
+                double yt3 = 0;//远途3段
+
+
+                //夜间服务处理逻辑
+                Calendar s = Calendar.getInstance();
+                s.setTime(date);
+                s.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num16.split(" - ")[0].split(":")[0]));
+                s.set(Calendar.MINUTE, Integer.valueOf(num16.split(" - ")[0].split(":")[1]));
+
+                Calendar e = Calendar.getInstance();
+                e.setTime(date);
+                e.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num16.split(" - ")[1].split(":")[0]));
+                e.set(Calendar.MINUTE, Integer.valueOf(num16.split(" - ")[1].split(":")[1]));
+
+                if(date.getTime() > s.getTimeInMillis() && date.getTime() < e.getTimeInMillis()){
+                    if(d > num8.doubleValue()){
+                        yt1 = num20 * (num9 - num8);
+                    }
+                    if(d > num11.doubleValue()){
+                        yt2 = num21 * (num12 - num11);
+                    }
+                    if(d > num14.doubleValue()){
+                        yt3 = num22 * (d - num14);
+                    }
+                    amount = num17 + (d1 * num18) + (t1 * num19) + (wait * num7) + yt1 + yt2 + yt3;
+                    ServerCarModelWarpper serverCarModelWarpper = ServerCarModelWarpper.getServerCarModelWarpper(map);
+                    serverCarModelWarpper.setAmount(new BigDecimal(amount).setScale(BigDecimal.ROUND_HALF_EVEN, 2).doubleValue());
+                    serverCarModelWarpper.setMileage(d);
+                    serverCarModelWarpper.setDuration(t);
+                    data.add(serverCarModelWarpper);
+                    continue;
+                }
+
+
+                //高峰时段处理逻辑
+                Calendar s1 = Calendar.getInstance();
+                s1.setTime(date);
+                s1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num23.split(" - ")[0].split(":")[0]));
+                s1.set(Calendar.MINUTE, Integer.valueOf(num23.split(" - ")[0].split(":")[1]));
+
+                Calendar e1 = Calendar.getInstance();
+                e1.setTime(date);
+                e1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num23.split(" - ")[1].split(":")[0]));
+                e1.set(Calendar.MINUTE, Integer.valueOf(num23.split(" - ")[1].split(":")[1]));
+
+                Calendar s2 = Calendar.getInstance();
+                s2.setTime(date);
+                s2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num24.split(" - ")[0].split(":")[0]));
+                s2.set(Calendar.MINUTE, Integer.valueOf(num24.split(" - ")[0].split(":")[1]));
+
+                Calendar e2 = Calendar.getInstance();
+                e2.setTime(date);
+                e2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num24.split(" - ")[1].split(":")[0]));
+                e2.set(Calendar.MINUTE, Integer.valueOf(num24.split(" - ")[1].split(":")[1]));
+
+                if((date.getTime() > s1.getTimeInMillis() && date.getTime() < e1.getTimeInMillis()) || (date.getTime() > s2.getTimeInMillis() && date.getTime() < e2.getTimeInMillis())){
+                    if(d > num8.doubleValue()){
+                        yt1 = num28 * (num9 - num8);
+                    }
+                    if(d > num11.doubleValue()){
+                        yt2 = num29 * (num12 - num11);
+                    }
+                    if(d > num14.doubleValue()){
+                        yt3 = num30 * (d - num14);
+                    }
+                    amount = num25 + (d1 * num26) + (t1 * num27) + (wait * num7) + yt1 + yt2 + yt3;
+                    ServerCarModelWarpper serverCarModelWarpper = ServerCarModelWarpper.getServerCarModelWarpper(map);
+                    serverCarModelWarpper.setAmount(new BigDecimal(amount).setScale(BigDecimal.ROUND_HALF_EVEN, 2).doubleValue());
+                    serverCarModelWarpper.setMileage(d);
+                    serverCarModelWarpper.setDuration(t);
+                    data.add(serverCarModelWarpper);
+                    continue;
+                }
+
+                //其他时间段的计算
+                if(d > num8.doubleValue()){
+                    yt1 = num10 * (num9 - num8);
+                }
+                if(d > num11.doubleValue()){
+                    yt2 = num13 * (num12 - num11);
+                }
+                if(d > num14.doubleValue()){
+                    yt3 = num15 * (d - num14);
+                }
+                amount = num1 + (d1 * num4) + (t1 * num5) + (wait * num7) + yt1 + yt2 + yt3;
+                ServerCarModelWarpper serverCarModelWarpper = ServerCarModelWarpper.getServerCarModelWarpper(map);
+                serverCarModelWarpper.setAmount(new BigDecimal(amount).setScale(BigDecimal.ROUND_HALF_EVEN, 2).doubleValue());
+                serverCarModelWarpper.setMileage(d);
+                serverCarModelWarpper.setDuration(t);
+                data.add(serverCarModelWarpper);
+                continue;
+            }
+        }
+        return data;
+    }
+
+    public List<ServerCarModelWarpper> getPrice1(Integer companyId, double distance, long duration, long wait, Integer type) throws Exception {
+        List<Map<String, Object>> list = serverCarModelMapper.queryServerCarModel(type);
+        List<ServerCarModelWarpper> data = new ArrayList<>();
+        for(Map<String, Object> map : list){
+            Map<String, Object> query1 = systemPriceMapper.query(companyId, type, Integer.valueOf(map.get("id").toString()));
+            if(null == query1){//排除没有设置价格的车型
+                continue;
+            }
+            //开始根据不同的方式计算金额
+            double amount = 0;
+            if(type == 7){//专车
+                JSONObject jsonObject = JSON.parseObject(query1.get("content").toString());
+                Double num1 = jsonObject.getDouble("num1");//起步价(元)
+                Double num2 = jsonObject.getDouble("num2");//起步公里(公里)
+                Double num3 = jsonObject.getDouble("num3");//起步时间(分钟)
+                Double num4 = jsonObject.getDouble("num4");//里程费(元)
+                Double num5 = jsonObject.getDouble("num5");//时长费(分钟)
+                Double num6 = jsonObject.getDouble("num6");//等待费(分钟)
+                Double num7 = jsonObject.getDouble("num7");//等待费(元)
+                Double num8 = jsonObject.getDouble("num8");//远途费(公里)
+                Double num9 = jsonObject.getDouble("num9");//远途费(公里)
+                Double num10 = jsonObject.getDouble("num10");//远途费(元)
+                Double num11 = jsonObject.getDouble("num11");//远途费(公里)
+                Double num12 = jsonObject.getDouble("num12");//远途费(公里)
+                Double num13 = jsonObject.getDouble("num13");//远途费(元)
+                Double num14 = jsonObject.getDouble("num14");//远途费(公里)
+                Double num15 = jsonObject.getDouble("num15");//远途费(元)
+                String num16 = jsonObject.getString("num16");//夜间费(开始时间)
+                Double num17 = jsonObject.getDouble("num17");//夜间费(元)
+                Double num18 = jsonObject.getDouble("num18");//夜间费(元)
+                Double num19 = jsonObject.getDouble("num19");//夜间费(元)
+                Double num20 = jsonObject.getDouble("num20");//夜间费(元)
+                Double num21 = jsonObject.getDouble("num21");//夜间费(元)
+                Double num22 = jsonObject.getDouble("num22");//夜间费(元)
+                String num23 = jsonObject.getString("num23");//高峰费(开始时间)
+                String num24 = jsonObject.getString("num24");//高峰费(开始时间)
+                Double num25 = jsonObject.getDouble("num25");//高峰费(元)
+                Double num26 = jsonObject.getDouble("num26");//高峰费(元)
+                Double num27 = jsonObject.getDouble("num27");//高峰费(元)
+                Double num28 = jsonObject.getDouble("num28");//高峰费(元)
+                Double num29 = jsonObject.getDouble("num29");//高峰费(元)
+                Double num30 = jsonObject.getDouble("num30");//高峰费(元)
+
+                Date date = new Date();
+                double d = distance / 1000;//实际公里
+                double t = duration / 60;//实际时间
+
+                double d1 = (d - num2) < 0 ? 0 : d - num2;//超出起步里程的公里
+                double t1 = (t - num3) < 0 ? 0 : t - num3;//超过起步分钟数的时间
+                double yt1 = 0;//远途1段
+                double yt2 = 0;//远途2段
+                double yt3 = 0;//远途3段
+
+
+                //夜间服务处理逻辑
+                Calendar s = Calendar.getInstance();
+                s.setTime(date);
+                s.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num16.split(" - ")[0].split(":")[0]));
+                s.set(Calendar.MINUTE, Integer.valueOf(num16.split(" - ")[0].split(":")[1]));
+
+                Calendar e = Calendar.getInstance();
+                e.setTime(date);
+                e.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num16.split(" - ")[1].split(":")[0]));
+                e.set(Calendar.MINUTE, Integer.valueOf(num16.split(" - ")[1].split(":")[1]));
+
+                if(date.getTime() > s.getTimeInMillis() && date.getTime() < e.getTimeInMillis()){
+                    if(d > num8.doubleValue()){
+                        yt1 = num20 * (num9 - num8);
+                    }
+                    if(d > num11.doubleValue()){
+                        yt2 = num21 * (num12 - num11);
+                    }
+                    if(d > num14.doubleValue()){
+                        yt3 = num22 * (d - num14);
+                    }
+                    amount = num17 + (d1 * num18) + (t1 * num19) + (wait * num7) + yt1 + yt2 + yt3;
+                    ServerCarModelWarpper serverCarModelWarpper = ServerCarModelWarpper.getServerCarModelWarpper(map);
+                    serverCarModelWarpper.setAmount(new BigDecimal(amount).setScale(BigDecimal.ROUND_HALF_EVEN, 2).doubleValue());
+                    serverCarModelWarpper.setMileage(d);
+                    serverCarModelWarpper.setDuration(t);
+                    data.add(serverCarModelWarpper);
+                    continue;
+                }
+
+
+                //高峰时段处理逻辑
+                Calendar s1 = Calendar.getInstance();
+                s1.setTime(date);
+                s1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num23.split(" - ")[0].split(":")[0]));
+                s1.set(Calendar.MINUTE, Integer.valueOf(num23.split(" - ")[0].split(":")[1]));
+
+                Calendar e1 = Calendar.getInstance();
+                e1.setTime(date);
+                e1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num23.split(" - ")[1].split(":")[0]));
+                e1.set(Calendar.MINUTE, Integer.valueOf(num23.split(" - ")[1].split(":")[1]));
+
+                Calendar s2 = Calendar.getInstance();
+                s2.setTime(date);
+                s2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num24.split(" - ")[0].split(":")[0]));
+                s2.set(Calendar.MINUTE, Integer.valueOf(num24.split(" - ")[0].split(":")[1]));
+
+                Calendar e2 = Calendar.getInstance();
+                e2.setTime(date);
+                e2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num24.split(" - ")[1].split(":")[0]));
+                e2.set(Calendar.MINUTE, Integer.valueOf(num24.split(" - ")[1].split(":")[1]));
+
+                if((date.getTime() > s1.getTimeInMillis() && date.getTime() < e1.getTimeInMillis()) || (date.getTime() > s2.getTimeInMillis() && date.getTime() < e2.getTimeInMillis())){
+                    if(d > num8.doubleValue()){
+                        yt1 = num28 * (num9 - num8);
+                    }
+                    if(d > num11.doubleValue()){
+                        yt2 = num29 * (num12 - num11);
+                    }
+                    if(d > num14.doubleValue()){
+                        yt3 = num30 * (d - num14);
+                    }
+                    amount = num25 + (d1 * num26) + (t1 * num27) + (wait * num7) + yt1 + yt2 + yt3;
+                    ServerCarModelWarpper serverCarModelWarpper = ServerCarModelWarpper.getServerCarModelWarpper(map);
+                    serverCarModelWarpper.setAmount(new BigDecimal(amount).setScale(BigDecimal.ROUND_HALF_EVEN, 2).doubleValue());
+                    serverCarModelWarpper.setMileage(d);
+                    serverCarModelWarpper.setDuration(t);
+                    data.add(serverCarModelWarpper);
+                    continue;
+                }
+
+                //其他时间段的计算
+                if(d > num8.doubleValue()){
+                    yt1 = num10 * (num9 - num8);
+                }
+                if(d > num11.doubleValue()){
+                    yt2 = num13 * (num12 - num11);
+                }
+                if(d > num14.doubleValue()){
+                    yt3 = num15 * (d - num14);
+                }
+                amount = num1 + (d1 * num4) + (t1 * num5) + (wait * num7) + yt1 + yt2 + yt3;
+                ServerCarModelWarpper serverCarModelWarpper = ServerCarModelWarpper.getServerCarModelWarpper(map);
+                serverCarModelWarpper.setAmount(new BigDecimal(amount).setScale(BigDecimal.ROUND_HALF_EVEN, 2).doubleValue());
+                serverCarModelWarpper.setMileage(d);
+                serverCarModelWarpper.setDuration(t);
+                data.add(serverCarModelWarpper);
+                continue;
+            }
+        }
+        return data;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SmsrecordServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SmsrecordServiceImpl.java
new file mode 100644
index 0000000..3e44b15
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SmsrecordServiceImpl.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.SmsrecordMapper;
+import com.stylefeng.guns.modular.system.model.Smsrecord;
+import com.stylefeng.guns.modular.system.service.ISmsrecordService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+
+@Service
+public class SmsrecordServiceImpl extends ServiceImpl<SmsrecordMapper, Smsrecord> implements ISmsrecordService {
+
+
+    /**
+     * 添加数据
+     * @param type
+     * @param phone
+     * @param code
+     * @param content
+     * @throws Exception
+     */
+    @Override
+    public void saveData(Integer type, String phone, String code, String content) throws Exception {
+        Smsrecord smsrecord = new Smsrecord();
+        smsrecord.setType(type);
+        smsrecord.setPhone(phone);
+        smsrecord.setCode(code);
+        smsrecord.setContent(content);
+        smsrecord.setInsertTime(new Date());
+        this.insert(smsrecord);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponRecordServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponRecordServiceImpl.java
new file mode 100644
index 0000000..03599d8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.SysCouponRecord;
+import com.stylefeng.guns.modular.system.dao.SysCouponRecordMapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.service.ISysCouponRecordService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-优惠券记录 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-15
+ */
+@Service
+public class SysCouponRecordServiceImpl extends ServiceImpl<SysCouponRecordMapper, SysCouponRecord> implements ISysCouponRecordService {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SystemNoticeServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SystemNoticeServiceImpl.java
new file mode 100644
index 0000000..509814b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SystemNoticeServiceImpl.java
@@ -0,0 +1,115 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.SystemNoticeMapper;
+import com.stylefeng.guns.modular.system.dao.TNoticesMapper;
+import com.stylefeng.guns.modular.system.model.SystemNotice;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class SystemNoticeServiceImpl extends ServiceImpl<SystemNoticeMapper, SystemNotice> implements ISystemNoticeService {
+
+    @Resource
+    private SystemNoticeMapper systemNoticeMapper;
+
+    @Resource
+    private TNoticesMapper tNoticesMapper;
+
+
+    /**
+     * 添加系统消息
+     * @param userType
+     * @param content
+     * @param userId
+     * @throws Exception
+     */
+    @Override
+    public void addSystemNotice(Integer userType, String content, Integer userId, Integer noticeType) throws Exception {
+        SystemNotice systemNotice = new SystemNotice();
+        systemNotice.setContent(content);
+        systemNotice.setInsertTime(new Date());
+        systemNotice.setRead(1);
+        systemNotice.setType(2);
+        systemNotice.setNoticeType(noticeType);
+        systemNotice.setUserId(userId);
+        systemNotice.setUserType(userType);
+        this.insert(systemNotice);
+    }
+
+    /**
+     * 获取未阅读数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public int queryNoReadNoticeNum(Integer uid) throws Exception {
+        return systemNoticeMapper.queryNoReadNoticeNum(uid);
+    }
+
+    /**
+     * 获取消息列表
+     * @param type
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryList(Integer type, Integer pageNum, Integer size, Integer uid) {
+        pageNum = (pageNum - 1) * size;
+        List<Map<String, Object>> list = null;
+        if(type == 1){//系统公告
+            list = tNoticesMapper.queryList(pageNum, size, uid);
+        }
+        if(type == 2){//系统消息
+            list = systemNoticeMapper.queryList(type, pageNum, size, uid);
+            for(Map<String, Object> map : list){
+                systemNoticeMapper.readSystemNotice(Integer.valueOf(String.valueOf(map.get("id"))), uid);
+            }
+        }
+        return list;
+    }
+
+
+    /**
+     * 阅读操作
+     * @param id
+     * @param uid
+     * @throws Exception
+     */
+    @Override
+    public void readSystemNotice(Integer id, Integer uid) throws Exception {
+        systemNoticeMapper.readSystemNotice(id, uid);
+    }
+
+
+    /**
+     * 删除公告或消息
+     * @param id
+     * @param uid
+     * @throws Exception
+     */
+    @Override
+    public void delSystemNotice(Integer id, Integer uid) throws Exception {
+        systemNoticeMapper.delSystemNotice(id, uid);
+    }
+
+
+    /**
+     * 清空消息或公告
+     * @param uid
+     * @throws Exception
+     */
+    @Override
+    public void clearSystemNotice(Integer uid) throws Exception {
+        systemNoticeMapper.delSystemNotice(null, uid);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TActivityGeneralizationServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TActivityGeneralizationServiceImpl.java
new file mode 100644
index 0000000..12364f6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TActivityGeneralizationServiceImpl.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.TActivityGeneralizationMapper;
+
+import com.stylefeng.guns.modular.system.model.TActivityGeneralization;
+
+import com.stylefeng.guns.modular.system.service.ITActivityGeneralizationService;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 推广活动 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TActivityGeneralizationServiceImpl extends ServiceImpl<TActivityGeneralizationMapper, TActivityGeneralization> implements ITActivityGeneralizationService {
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCharteredServiceServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCharteredServiceServiceImpl.java
new file mode 100644
index 0000000..8de1b9c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCharteredServiceServiceImpl.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.CharteredCar.dao.TCharteredServiceMapper;
+import com.stylefeng.guns.modular.system.model.TCharteredService;
+import com.stylefeng.guns.modular.system.service.ITCharteredServiceService;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 包车管理 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@Service
+public class TCharteredServiceServiceImpl extends ServiceImpl<TCharteredServiceMapper, TCharteredService> implements ITCharteredServiceService {
+
+    @Override
+    public List<Map<String, Object>> getCharteredServiceList(Page<Map<String, Object>> page, String beginTime, String endTime, String serviceName, Integer serverCarModelId, BigDecimal startPrice, BigDecimal endPrice, Integer status) {
+        return this.baseMapper.getCharteredServiceList(page, beginTime, endTime, serviceName, serverCarModelId, startPrice, endPrice, status);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TNoticesServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TNoticesServiceImpl.java
new file mode 100644
index 0000000..91943cc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TNoticesServiceImpl.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.TNoticesMapper;
+import com.stylefeng.guns.modular.system.model.TNotices;
+import com.stylefeng.guns.modular.system.service.ITNoticesService;
+import com.stylefeng.guns.modular.system.warpper.TNoticeWarpper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+public class TNoticesServiceImpl extends ServiceImpl<TNoticesMapper, TNotices> implements ITNoticesService {
+
+    @Resource
+    private TNoticesMapper tNoticesMapper;
+
+
+
+    /**
+     * 获取滚动消息
+     * @param type  1=滚动消息,2=公告
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<TNoticeWarpper> queryNotices(Integer type) throws Exception {
+        List<TNotices> notices = tNoticesMapper.queryNotices(type);
+        return TNoticeWarpper.getTNoticeWarppers(notices);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityBalanceServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityBalanceServiceImpl.java
new file mode 100644
index 0000000..5828cfa
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityBalanceServiceImpl.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.UserActivityBalanceMapper;
+import com.stylefeng.guns.modular.system.model.UserActivityBalance;
+import com.stylefeng.guns.modular.system.service.IUserActivityBalanceService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class UserActivityBalanceServiceImpl extends ServiceImpl<UserActivityBalanceMapper, UserActivityBalance> implements IUserActivityBalanceService {
+
+    @Resource
+    private UserActivityBalanceMapper userActivityBalanceMapper;
+
+
+
+
+
+    /**
+     * 获取满足条件的活动
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> query(Double money, Integer companyId) throws Exception {
+        return userActivityBalanceMapper.query(money, companyId);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRedenvelopeServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRedenvelopeServiceImpl.java
new file mode 100644
index 0000000..ca9275b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRedenvelopeServiceImpl.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.UserActivityRedenvelopeMapper;
+import com.stylefeng.guns.modular.system.model.UserActivityRedenvelope;
+import com.stylefeng.guns.modular.system.service.IUserActivityRedenvelopeService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Map;
+
+
+@Service
+public class UserActivityRedenvelopeServiceImpl extends ServiceImpl<UserActivityRedenvelopeMapper, UserActivityRedenvelope> implements IUserActivityRedenvelopeService {
+
+    @Resource
+    private UserActivityRedenvelopeMapper userActivityRedenvelopeMapper;
+
+
+
+    /**
+     * 获取红包活动
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> query(Integer companyId, Date travelTime) throws Exception {
+        return userActivityRedenvelopeMapper.query(companyId, travelTime);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRegisteredServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRegisteredServiceImpl.java
new file mode 100644
index 0000000..ccc707a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRegisteredServiceImpl.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.UserActivityRegisteredMapper;
+import com.stylefeng.guns.modular.system.model.UserActivityRegistered;
+import com.stylefeng.guns.modular.system.service.IUserActivityRegisteredService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class UserActivityRegisteredServiceImpl extends ServiceImpl<UserActivityRegisteredMapper, UserActivityRegistered> implements IUserActivityRegisteredService {
+
+    @Resource
+    private UserActivityRegisteredMapper userActivityRegisteredMapper;
+
+
+
+
+
+    /**
+     * 获取当前有效的注册活动
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> query(Integer companyId) throws Exception {
+        return userActivityRegisteredMapper.query(companyId);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserCouponRecordServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserCouponRecordServiceImpl.java
new file mode 100644
index 0000000..d89b29e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserCouponRecordServiceImpl.java
@@ -0,0 +1,112 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.UserCouponRecordMapper;
+import com.stylefeng.guns.modular.system.model.UserCouponRecord;
+import com.stylefeng.guns.modular.system.service.IUserCouponRecordService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class UserCouponRecordServiceImpl extends ServiceImpl<UserCouponRecordMapper, UserCouponRecord> implements IUserCouponRecordService {
+
+    @Resource
+    private UserCouponRecordMapper userCouponRecordMapper;
+
+
+    /**
+     * 获取可用优惠券数量
+     * @param uid
+     * @param companyId
+     * @param state
+     * @param couponUseType
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public int queryAvailable(Integer uid, Integer companyId, Integer state, Integer couponUseType, Double money) throws Exception {
+        return userCouponRecordMapper.queryAvailable(uid, companyId, state, couponUseType, money);
+    }
+
+
+    /**
+     * 获取优惠券列表
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryCoupon(Integer uid, Integer companyId, Integer state, Integer couponUseType, Double money, Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        return userCouponRecordMapper.queryCoupon(uid, companyId, state, couponUseType, money, pageNum, size);
+    }
+
+
+    /**
+     * 获取优惠券列表
+     * @param state
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryMyCoupons(Integer state, Integer pageNum, Integer size, Integer uid) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        return userCouponRecordMapper.queryMyCoupons(state, pageNum, size, uid);
+    }
+
+    /**
+     * 删除优惠券
+     * @param id
+     * @param uid
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil delMyCoupon(Integer id, Integer uid) throws Exception {
+        UserCouponRecord userCouponRecord = userCouponRecordMapper.selectById(id);
+        if(userCouponRecord.getUserId() != uid){
+            return ResultUtil.error("您不能删除此优惠券");
+        }
+        userCouponRecordMapper.deleteById(id);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 赠送优惠券
+     * @param id
+     * @param uid
+     * @param userId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil handselCoupon(Integer id, Integer uid, Integer userId) throws Exception {
+        UserCouponRecord userCouponRecord = userCouponRecordMapper.selectById(id);
+        if(userCouponRecord.getUserId().compareTo(uid) != 0){
+            return ResultUtil.error("您不能赠送此优惠券");
+        }
+        if(userCouponRecord.getState() != 1){
+            return ResultUtil.error("优惠券已无法使用");
+        }
+        userCouponRecord.setUserId(userId);
+        userCouponRecordMapper.updateById(userCouponRecord);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 修改过期优惠券状态
+     * @throws Exception
+     */
+    @Override
+    public void updateTimeOut() throws Exception {
+        userCouponRecordMapper.updateTimeOut();
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java
new file mode 100644
index 0000000..716ec92
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java
@@ -0,0 +1,1383 @@
+package com.stylefeng.guns.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.stylefeng.guns.core.common.constant.JwtConstants;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.GetMobile;
+import com.stylefeng.guns.core.util.JwtTokenUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.*;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.shiro.util.ByteSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.*;
+
+
+@Service
+public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {
+
+    @Resource
+    private UserInfoMapper userInfoMapper;
+
+    @Resource
+    private UserActivityInviteMapper userActivityInviteMapper;
+
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private ALiSendSms aLiSendSms;
+
+    @Autowired
+    private WeChatUtil weChatUtil;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+    @Autowired
+    private ICompanyCityService companyCityService;
+
+    @Autowired
+    private IUserActivityRegisteredService userActivityRegisteredService;
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    @Autowired
+    private ISmsrecordService smsrecordService;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IUserActivityBalanceService userActivityBalanceService;
+
+//    @Autowired
+//    private ICBCPayUtil icbcPayUtil;
+
+    @Resource
+    private DriverMapper driverMapper;
+
+    @Resource
+    private DriverActivityRegisteredMapper driverActivityRegisteredMapper;
+
+    @Resource
+    private DriverActivityHistoryMapper driverActivityHistoryMapper;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Autowired
+    private HttpClientUtil httpClientUtil;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+    @Value("${callbackPath}")
+    private String callbackPath;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+    private String salt = "&a.s";
+
+    private Map<String, Long> loginTime = new HashMap<>();//登录时间
+
+    private Map<String, Integer> loginFailures = new HashMap<>();//登录失败次数
+
+
+    /**
+     * 获取短信验证码
+     * @param phone
+     * @return
+     */
+    @Override
+    public ResultUtil queryCaptcha(String phone, Integer type) throws Exception {
+        Random random = new Random();
+        StringBuffer sb = new StringBuffer();
+        for(int i = 0; i < 4; i++){
+            sb.append((int) (random.nextDouble() * 10));
+        }
+        String authCode = sb.toString();
+        String sms = "短信验证码【" + authCode + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!";
+
+        //发送验证码短信
+        redisUtil.setStrValue(phone, authCode, 5 * 60);//设置五分钟过期
+        String templateCode = "";
+        switch (type){
+            case 1:
+                templateCode = "8212979ba98f4918823986481ae2e104";//身份验证
+                break;
+            case 2:
+                templateCode = "08b2c59bdce945549c0ee6bbe46252f8";//登录确认
+                break;
+            case 3:
+                templateCode = "c39681463441496aaa4d96a642ff4227";//用户注册
+                break;
+            case 4:
+                templateCode = "c230a6b92504473c97c17741e1cc0b9d";//修改密码
+                break;
+        }
+        aLiSendSms.sendSms(phone, "SMS_467580138", "{\"code\":\"" + authCode + "\"}");
+//        HuaWeiSMSUtil.sendSms("[\"" + authCode + "\"]", phone, "8822061324669", templateCode);
+//        String sData = aLiSendSms.sendSms(phone, templateCode, "{\"code\":\"" + authCode + "\"}");
+////        JSONObject jsonObject = JSON.parseObject(sData);
+////        String message = jsonObject.getString("Message");
+////        if(!"OK".equals(message)){
+////            System.err.println(message);
+////            return ResultUtil.error(message);
+////        }
+        System.out.println(sms);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 校验短信验证码
+     * @param phone
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean checkCaptcha(String phone, String code) throws Exception {
+        Object value = redisUtil.getValue(phone);
+        if("1234".equals(code)){
+            return true;
+        }
+
+        if(null != value && code.equals(String.valueOf(value))){
+            return true;
+        }else{
+            return false;
+        }
+    }
+
+    /**
+     * 手机验证码登录
+     * @param phone
+     * @param code
+     * @return
+     */
+    @Override
+    public ResultUtil<LoginWarpper> captchaLogin(String phone, String code, String registIp, String registAreaCode,String loginType) throws Exception {
+        Integer frequency = loginFailures.get(phone);
+        Long time = loginTime.get(phone);
+        if(null != time && System.currentTimeMillis() < (time + 300000) && null != frequency && frequency >= 5){
+            return ResultUtil.error("暂时无法登录,请5分钟后重试!");
+        }
+        if(null != time && System.currentTimeMillis() >= (time + 300000)){
+            frequency = 0;
+            loginFailures.put(phone, frequency);
+        }
+        boolean b = this.checkCaptcha(phone, code);
+        if(!b){
+            frequency = (null == frequency ? 0 : frequency) + 1;
+            loginFailures.put(phone, frequency);
+            if(frequency == 1){
+                loginTime.put(phone, System.currentTimeMillis());
+            }
+            return ResultUtil.error("验证码无效");
+        }
+
+        UserInfo userInfo = userInfoMapper.queryByPhone(phone);
+        if(null == userInfo){
+            userInfo = new UserInfo();
+            userInfo.setPhone(phone);
+            userInfo.setPassWord(ShiroKit.md5("", salt));
+            userInfo.setNickName(this.getDefaultName());
+            userInfo.setRegistIp(registIp);
+            userInfo.setIsAuth(1);
+            userInfo.setConsumption(0D);
+            userInfo.setBalance(0D);
+            userInfo.setState(1);
+            userInfo.setAvatar("http://bao-weiqing.oss-cn-hangzhou.aliyuncs.com/img/ad02d59ae74342359270f62a024fa9c6.png");
+
+            //用户所属企业
+            if(null != registAreaCode){
+                Company query = companyCityService.query(registAreaCode);
+                userInfo.setCompanyId(null != query ? query.getId() : null);
+                userInfo.setRegistAreaCode(registAreaCode);
+            }
+            this.insert(userInfo);
+
+            addnewCoupoun(phone,userInfo);
+
+
+            this.addCoupon(userInfo);//添加优惠券
+
+            UserInfo finalUserInfo = userInfo;
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){
+                        //上传数据
+                        pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId());
+                    }
+                }
+            }).start();
+
+        }
+        if(userInfo.getState() == 2){
+            return ResultUtil.error("账号被冻结");
+        }
+
+        //调用单点登录的逻辑
+        this.singlePointLogin(userInfo.getId(),loginType);
+
+        String token = this.getToken(userInfo, "",loginType);
+        LoginWarpper loginWarpper = new LoginWarpper();
+        loginWarpper.setId(userInfo.getId());
+        loginWarpper.setToken(token);
+        loginWarpper.setAppid(UUIDUtil.getRandomCode());
+        loginWarpper.setEmergencyContact(userInfo.getEmergencyContact());
+        loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber());
+
+        smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
+        return ResultUtil.success(loginWarpper);
+    }
+
+
+    @Override
+    public ResultUtil<LoginWarpper> captchaLogin1(String phone) throws Exception {
+        Integer frequency = loginFailures.get(phone);
+        Long time = loginTime.get(phone);
+        if(null != time && System.currentTimeMillis() < (time + 300000) && null != frequency && frequency >= 5){
+            return ResultUtil.error("暂时无法登录,请5分钟后重试!");
+        }
+        if(null != time && System.currentTimeMillis() >= (time + 300000)){
+            frequency = 0;
+            loginFailures.put(phone, frequency);
+        }
+
+        UserInfo userInfo = userInfoMapper.queryByPhone(phone);
+        if(null == userInfo){
+            userInfo = new UserInfo();
+            userInfo.setPhone(phone);
+            userInfo.setPassWord(ShiroKit.md5("", salt));
+            userInfo.setNickName(this.getDefaultName());
+            userInfo.setIsAuth(1);
+            userInfo.setConsumption(0D);
+            userInfo.setBalance(0D);
+            userInfo.setState(1);
+            userInfo.setAvatar("http://bao-weiqing.oss-cn-hangzhou.aliyuncs.com/img/ad02d59ae74342359270f62a024fa9c6.png");
+
+
+            this.insert(userInfo);
+
+            addnewCoupoun(phone,userInfo);
+
+
+            this.addCoupon(userInfo);//添加优惠券
+
+            UserInfo finalUserInfo = userInfo;
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){
+                        //上传数据
+                        pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId());
+                    }
+                }
+            }).start();
+
+        }
+        if(userInfo.getState() == 2){
+            return ResultUtil.error("账号被冻结");
+        }
+
+        //调用单点登录的逻辑
+        this.singlePointLogin(userInfo.getId(),"Applets");
+
+        String token = this.getToken(userInfo, "","Applets");
+        LoginWarpper loginWarpper = new LoginWarpper();
+        loginWarpper.setId(userInfo.getId());
+        loginWarpper.setToken(token);
+        loginWarpper.setAppid(UUIDUtil.getRandomCode());
+        loginWarpper.setEmergencyContact(userInfo.getEmergencyContact());
+        loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber());
+
+        return ResultUtil.success(loginWarpper);
+    }
+
+    @Autowired
+    private ITActivityGeneralizationService activityGeneralizationService;
+
+
+
+    @Autowired
+    private ISysCouponRecordService sysCouponRecordService;
+    public void addnewCoupoun(String phone,UserInfo userInfo){
+        if (redisUtil.getValue("counpon:" + phone)==null){
+            return;
+        }
+        String acIds = redisUtil.getValue("counpon:" + phone);
+
+        String[] split = acIds.split(",");
+        for (String acId : split) {
+
+        TActivityGeneralization tActivityGeneralization = activityGeneralizationService.selectById(acId);
+        if (tActivityGeneralization==null){
+            continue;
+        }
+        SysCouponRecord sysCouponRecord = sysCouponRecordService.selectById(tActivityGeneralization.getCouponId());
+        Date date = new Date();
+        UserCouponRecord userCouponRecord = new UserCouponRecord();
+        userCouponRecord.setActivityType(5);
+        userCouponRecord.setCouponActivityId(Integer.valueOf(acId));
+        userCouponRecord.setCouponId(tActivityGeneralization.getCouponId());
+        userCouponRecord.setState(1);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + tActivityGeneralization.getEffective());
+        userCouponRecord.setExpirationTime(calendar.getTime());
+        userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(sysCouponRecord.getCouponType())));
+        userCouponRecord.setCouponUseType(sysCouponRecord.getCouponUseType());
+        userCouponRecord.setInsertTime(date);
+        userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(sysCouponRecord.getFullMoney()==null?0:sysCouponRecord.getFullMoney())));
+        userCouponRecord.setMoney(Double.valueOf(String.valueOf(sysCouponRecord.getMoney())));
+        userCouponRecord.setCompanyId(sysCouponRecord.getCompanyId());
+        userCouponRecord.setUserId(userInfo.getId());
+        Integer userGrantCount = tActivityGeneralization.getUserGrantCount();
+//            userCouponRecordService.insert(userCouponRecord);
+        if (userGrantCount != null && userGrantCount > 0) {
+            for (int i = 0; i < userGrantCount; i++) {// ...
+                userCouponRecordService.insert(userCouponRecord);
+            }
+        }
+        }
+
+    }
+
+    /**
+     * 手机验证码登录
+     * @param accessToken
+     * @return
+     */
+    @Override
+    public ResultUtil<LoginWarpper> oneClickLogin(String accessToken, String registIp, String registAreaCode,String loginType,String androidOrIos) throws Exception {
+        String response = GetMobile.getPhone(accessToken,androidOrIos);
+
+        if(response==null){
+            return ResultUtil.error("登录失败");
+        }
+        System.out.println( response);
+        JSONObject json = JSONObject.parseObject(response);
+        if(!json.getBoolean("success")){
+            return ResultUtil.error("登录失败");
+        }
+        String phone = json.getJSONObject("data").getString("mobile");
+        UserInfo userInfo = userInfoMapper.queryByPhone(phone);
+        if(null == userInfo){
+            userInfo = new UserInfo();
+            userInfo.setPhone(phone);
+            userInfo.setPassWord(ShiroKit.md5("", salt));
+            userInfo.setNickName(this.getDefaultName());
+            userInfo.setRegistIp(registIp);
+            userInfo.setIsAuth(1);
+            userInfo.setConsumption(0D);
+            userInfo.setBalance(0D);
+            userInfo.setState(1);
+            userInfo.setAvatar("http://bao-weiqing.oss-cn-hangzhou.aliyuncs.com/img/ad02d59ae74342359270f62a024fa9c6.png");
+
+            //用户所属企业
+            if(null != registAreaCode){
+                Company query = companyCityService.query(registAreaCode);
+                userInfo.setCompanyId(null != query ? query.getId() : null);
+                userInfo.setRegistAreaCode(registAreaCode);
+            }
+            this.insert(userInfo);
+
+            this.addCoupon(userInfo);//添加优惠券
+
+            UserInfo finalUserInfo = userInfo;
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){
+                        //上传数据
+                        pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId());
+                    }
+                }
+            }).start();
+
+        }
+        if(userInfo.getState() == 2){
+            return ResultUtil.error("账号被冻结");
+        }
+
+        //调用单点登录的逻辑
+        this.singlePointLogin(userInfo.getId(),loginType);
+
+        String token = this.getToken(userInfo, "",loginType);
+        LoginWarpper loginWarpper = new LoginWarpper();
+        loginWarpper.setId(userInfo.getId());
+        loginWarpper.setToken(token);
+        loginWarpper.setAppid(UUIDUtil.getRandomCode());
+        loginWarpper.setEmergencyContact(userInfo.getEmergencyContact());
+        loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber());
+        loginWarpper.setPhone(2);
+
+        //smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
+        return ResultUtil.success(loginWarpper);
+    }
+    @Override
+    public synchronized ResultUtil<LoginWarpper> captchaLogin(String phone, String code, Integer uid, Integer type, Integer userType,String loginType) throws Exception {
+        ResultUtil<LoginWarpper> resultUtil = this.captchaLogin(phone, code, null, null,loginType);
+        if(resultUtil.getCode() == 200 && null != uid){
+            if(type == 2){//司机分享
+                Driver driver = driverMapper.selectById(uid);
+                List<Map<String, Object>> query = driverActivityRegisteredMapper.query(userType, driver.getCompanyId());
+                BigDecimal bigDecimal = new BigDecimal("0");
+                for(Map<String, Object> map : query){
+                    if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(0D) > 0){
+                        bigDecimal = bigDecimal.add(new BigDecimal(String.valueOf(null != map.get("money") ? map.get("money") : "0")));
+                        incomeService.saveData(2, driver.getId(), 1, Integer.valueOf(String.valueOf(map.get("id"))), null, Double.valueOf(String.valueOf(map.get("money"))));
+                    }
+                }
+                driver.setActivityMoney(bigDecimal.add(new BigDecimal(null != driver.getActivityMoney() ? driver.getActivityMoney() : 0)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                driver.setLaveActivityMoney(bigDecimal.add(new BigDecimal(null != driver.getLaveActivityMoney() ? driver.getLaveActivityMoney() : 0)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                driver.setBalance(bigDecimal.add(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                driverMapper.updateById(driver);
+
+                Map<String, Date> date = dateUtil.getStartAndEndDate(new Date());
+                //邀请用户注册
+                List<DriverActivityHistory> list = driverActivityHistoryMapper.queryList(uid, 2, 1, date.get("startTime"), date.get("endTime"));
+                for(DriverActivityHistory dah : list){
+                    dah.setCarryOut(2);
+                    dah.setCollectionTime(new Date());
+                    driverActivityHistoryMapper.updateById(dah);
+                }
+            }
+            if(type == 1){//用户分享
+                UserInfo userInfo = userInfoMapper.selectById(uid);
+                List<Map<String, Object>> query = userActivityInviteMapper.query(userInfo.getCompanyId());
+                Date date = new Date();
+                for(Map<String, Object> map : query){
+                    Double lavePrice = Double.valueOf(map.get("lavePrice").toString());
+                    for(int i = Integer.valueOf(String.valueOf(map.get("totalNum"))); i > 0; i--){
+                        //判断当前优惠券金额是否大于可发放剩余总金额
+                        if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(lavePrice) > 0){
+                            break;
+                        }
+                        UserCouponRecord userCouponRecord = new UserCouponRecord();
+                        userCouponRecord.setActivityType(3);
+                        userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id"))));
+                        userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("couponId"))));
+                        userCouponRecord.setState(1);
+                        Calendar calendar = Calendar.getInstance();
+                        calendar.setTime(date);
+                        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("effective"))));
+                        userCouponRecord.setExpirationTime(calendar.getTime());
+                        userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("couponType"))));
+                        userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("couponUseType"))));
+                        userCouponRecord.setInsertTime(date);
+                        userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("fullMoney"))));
+                        userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("money"))));
+                        userCouponRecord.setCompanyId(userInfo.getCompanyId());
+                        userCouponRecord.setUserId(uid);
+                        userCouponRecordService.insert(userCouponRecord);
+                        //修改剩余可发放总金额
+                        lavePrice -= Double.valueOf(String.valueOf(map.get("money")));
+                    }
+                    UserActivityInvite uai = userActivityInviteMapper.selectById(Integer.valueOf(map.get("id").toString()));
+                    uai.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                    userActivityInviteMapper.updateById(uai);
+                }
+            }
+        }
+        return resultUtil;
+    }
+
+
+    /**
+     * 手机号码查询用户
+     * @param phone
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public UserInfo queryByPhone(String phone) throws Exception {
+        return userInfoMapper.queryByPhone(phone);
+    }
+
+
+    /**
+     * 账号密码登录
+     * @param phone
+     * @param password
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil<LoginWarpper> userLogin(String phone, String password,String loginType) throws Exception {
+        Integer frequency = loginFailures.get(phone);
+        Long time = loginTime.get(phone);
+        if(null != time && System.currentTimeMillis() < (time + 1800000) && null != frequency && frequency >= 5){
+            return ResultUtil.error("暂时无法登录,请30分钟后重试!");
+        }
+        if(null != time && System.currentTimeMillis() >= (time + 1800000)){
+            frequency = 0;
+            loginFailures.put(phone, frequency);
+        }
+        UserInfo userInfo = this.queryByPhone(phone);
+        if(null == userInfo){
+            return ResultUtil.error("账号无效");
+        }
+        if(userInfo.getState() == 2){
+            return ResultUtil.error("账号被冻结");
+        }
+        if(!ShiroKit.md5(password, salt).equals(userInfo.getPassWord())){
+            frequency = (null == frequency ? 0 : frequency) + 1;
+            loginFailures.put(phone, frequency);
+            if(frequency == 1){
+                loginTime.put(phone, System.currentTimeMillis());
+            }
+            return ResultUtil.error("密码错误");
+        }
+
+        //调用单点登录的逻辑
+        this.singlePointLogin(userInfo.getId(),loginType);
+
+        String token = this.getToken(userInfo, password,loginType);
+        LoginWarpper loginWarpper = new LoginWarpper();
+        loginWarpper.setId(userInfo.getId());
+        loginWarpper.setToken(token);
+        loginWarpper.setAppid(UUIDUtil.getRandomCode());
+        loginWarpper.setEmergencyContact(userInfo.getEmergencyContact());
+        loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber());
+        return ResultUtil.success(loginWarpper);
+    }
+
+
+    /**
+     * 微信授权登录
+     * @param type              登录端口(1:APP登录,2:小程序)
+     * @param openid            微信openid
+     * @param unionid           微信unionid
+     * @param jscode            小程序登录时的jscode临时凭证
+     * @param registIp          ip地址
+     * @param registAreaCode    当前定位区县行政编号(6位)
+     * @return
+     */
+    @Override
+    public ResultUtil<LoginWarpper> wxLogin(Integer type, String openid, String unionid, String jscode, String registIp,
+                                            String registAreaCode, Integer sex, String nickName, String avatar,String loginType) throws Exception {
+
+        UserInfo userInfo = null;
+        if(type == 2){//小程序
+            if(ToolUtil.isEmpty(jscode)){
+                return ResultUtil.error("微信登录请求失败,请重试");
+            }
+            Map<String, String> map = weChatUtil.code2Session(jscode);
+            openid = map.get("openid");
+            unionid = map.get("unionid");
+            userInfo = userInfoMapper.queryByOpenid2(openid);
+
+        }else{//APP
+            userInfo = userInfoMapper.queryByOpenid(openid);
+        }
+        if(null == userInfo){
+            userInfo = new UserInfo();
+            userInfo.setPassWord(ShiroKit.md5("", salt));
+            userInfo.setRegistIp(registIp);
+            userInfo.setSex(sex);
+            userInfo.setNickName(ToolUtil.isNotEmpty(nickName) ? nickName : this.getDefaultName());
+            userInfo.setAvatar(avatar);
+
+           if(type == 2){
+               userInfo.setAppletsOpenId(openid);
+           }else{
+               userInfo.setOpenId(openid);
+           }
+            userInfo.setUnionid(unionid);
+            userInfo.setIsAuth(1);
+            userInfo.setConsumption(0D);
+            userInfo.setBalance(0D);
+            userInfo.setState(1);
+            //用户所属企业
+            if(null != registAreaCode){
+                Company query = companyCityService.query(registAreaCode);
+                userInfo.setCompanyId(null != query ? query.getId() : null);
+                userInfo.setRegistAreaCode(registAreaCode);
+            }
+            this.insert(userInfo);
+
+            this.addCoupon(userInfo);//添加优惠券
+
+            UserInfo finalUserInfo = userInfo;
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){
+                        //上传数据
+                        pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId());
+                    }
+                }
+            }).start();
+        }
+        if(userInfo.getState() == 2){
+            return ResultUtil.error("账号被冻结");
+        }
+        Integer frequency = loginFailures.get(userInfo.getPhone());
+        Long time = loginTime.get(userInfo.getPhone());
+        if(null != time && System.currentTimeMillis() < (time + 1800000) && null != frequency && frequency >= 5){
+            return ResultUtil.error("暂时无法登录,请30分钟后重试!");
+        }
+        if(null != time && System.currentTimeMillis() >= (time + 1800000)){
+            frequency = 0;
+            loginFailures.put(userInfo.getPhone(), frequency);
+        }
+        if(type == 2){//小程序登录
+            String value = redisUtil.getValue("appletOpenId");
+            JSONObject jsonObject = null;
+            if(ToolUtil.isNotEmpty(value)){
+                jsonObject = JSON.parseObject(value);
+            }else{
+                jsonObject = new JSONObject();
+            }
+            jsonObject.put(userInfo.getId().toString(), userInfo.getAppletsOpenId());
+            redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
+        }
+
+        //调用单点登录的逻辑
+        this.singlePointLogin(userInfo.getId(),loginType);
+
+        String token = this.getToken(userInfo, "",loginType);
+        LoginWarpper loginWarpper = new LoginWarpper();
+        loginWarpper.setId(userInfo.getId());
+        loginWarpper.setToken(token);
+        loginWarpper.setAppid(UUIDUtil.getRandomCode());
+        loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1);
+        loginWarpper.setEmergencyContact(userInfo.getEmergencyContact());
+        loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber());
+        return ResultUtil.success(loginWarpper);
+    }
+
+
+    /**
+     * 忘记密码操作
+     * @param phone
+     * @param code
+     * @param password
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil forgetPassword(String phone, String code, String password) throws Exception {
+        boolean b = this.checkCaptcha(phone, code);
+        if(!b){
+            return ResultUtil.error("验证码无效");
+        }
+        UserInfo userInfo = this.queryByPhone(phone);
+        if(null == userInfo){
+            return ResultUtil.error("手机号码未注册");
+        }
+        if(userInfo.getState() == 2){
+            return ResultUtil.error("账号已被冻结");
+        }
+        userInfo.setPassWord(ShiroKit.md5(password, salt));
+        userInfo.setUpdateUser(userInfo.getId());
+        userInfo.setUpdateTime(new Date());
+        this.updateById(userInfo);
+
+        smsrecordService.saveData(3, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 设置手机号码操作
+     * @param uid
+     * @param phone
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil bindingPhone(Integer uid, String phone, String code,String loginType) throws Exception {
+        boolean b = this.checkCaptcha(phone, code);
+        if(!b){
+            return ResultUtil.error("验证码无效");
+        }
+        UserInfo userInfo = this.selectById(uid);
+        UserInfo userInfo1 = userInfoMapper.queryByPhone(phone);
+        if(null != userInfo1){
+            userInfo1.setOpenId(userInfo.getOpenId());
+            userInfo1.setUnionid(userInfo.getUnionid());
+            userInfo1.setAppletsOpenId(userInfo.getAppletsOpenId());
+            userInfo1.setAvatar(userInfo.getAvatar());
+            userInfo1.setSex(userInfo.getSex());
+            userInfo1.setNickName(userInfo.getNickName());
+            this.updateById(userInfo1);
+
+            if(loginType.equals("Applets")){//小程序登录后绑定手机号码
+                String value = redisUtil.getValue("appletOpenId");
+                JSONObject jsonObject = null;
+                if(ToolUtil.isNotEmpty(value)){
+                    jsonObject = JSON.parseObject(value);
+                    jsonObject.remove(userInfo.getId().toString());//删除原有账号缓存的数据
+                }else{
+                    jsonObject = new JSONObject();
+                }
+                jsonObject.put(userInfo1.getId().toString(), userInfo.getAppletsOpenId());
+                redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
+            }
+
+
+
+            this.deleteById(userInfo.getId());//删除原有数据
+            //还原之前账号领取的注册优惠券
+            List<UserCouponRecord> list = userCouponRecordService.selectList(new EntityWrapper<UserCouponRecord>().eq("userId", userInfo.getId()));
+            for(UserCouponRecord ucr : list){
+                if(ucr.getActivityType() == 1){//赠送
+
+                }
+                if(ucr.getActivityType() == 2){//注册
+                    UserActivityRegistered userActivityRegistered = userActivityRegisteredService.selectById(ucr.getCouponActivityId());
+                    userActivityRegistered.setLaveNum(userActivityRegistered.getLaveNum() + 1);
+                    userActivityRegistered.setLavePrice(userActivityRegistered.getLavePrice() + ucr.getMoney());
+                    userActivityRegisteredService.updateById(userActivityRegistered);
+                }
+                if(ucr.getActivityType() == 3){//邀请
+
+                }
+                if(ucr.getActivityType() == 4){//充值
+
+                }
+                userCouponRecordService.deleteById(ucr.getId());
+            }
+
+
+            //获取新的token等数据
+            String token = this.getToken(userInfo1, "",loginType);
+            LoginWarpper loginWarpper = new LoginWarpper();
+            loginWarpper.setId(userInfo1.getId());
+            loginWarpper.setToken(token);
+            loginWarpper.setAppid(UUIDUtil.getRandomCode());
+            loginWarpper.setPhone(2);
+            return ResultUtil.success(loginWarpper);
+        }
+
+        userInfo.setPhone(phone);
+        userInfo.setUpdateTime(new Date());
+        userInfo.setUpdateUser(userInfo.getId());
+        this.updateById(userInfo);
+
+        smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
+        return ResultUtil.success(new LoginWarpper());
+    }
+
+
+    /**
+     * 从redis中获取数据
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Integer getUserIdFormRedis(HttpServletRequest request) throws Exception {
+        String requestHeader = request.getHeader(JwtConstants.AUTH_HEADER);
+        if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
+            requestHeader = requestHeader.substring(requestHeader.indexOf(" ") + 1);
+            String key = null;
+            int length = requestHeader.length();
+            if(length > 32){
+                key = requestHeader.substring(length - 32);
+            }else{
+                key = requestHeader;
+            }
+            String value = redisUtil.getValue(key);
+            return null != value ? Integer.valueOf(value) : null;
+        }else{
+            return null;
+        }
+    }
+
+
+    /**
+     * 获取用户详情
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryUserInfo(Integer uid) throws Exception {
+        return userInfoMapper.queryUserInfo(uid, null);
+    }
+
+
+    /**
+     * 电话号码查询用户
+     * @param phone
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryUser(String phone) throws Exception {
+        return userInfoMapper.queryUserInfo(null, phone);
+    }
+
+
+    /**
+     * 设置紧急联系人
+     * @param name
+     * @param phone
+     * @param uid
+     * @throws Exception
+     */
+    @Override
+    public void setUrgentUser(String name, String phone, Integer uid) throws Exception {
+        userInfoMapper.setUrgentUser(name, phone, uid);
+    }
+
+
+    /**
+     * 充值余额
+     * @param payType
+     * @param money
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil depositBalance(Integer payType, Double money, Integer uid, Integer type) throws Exception {
+        UserInfo userInfo = userInfoMapper.selectById(uid);
+        if(money.compareTo(0D) <= 0){
+            return ResultUtil.error("支付金额必须大于0元");
+        }
+        if(payType == 1){//微信支付
+//            String value = redisUtil.getValue("appletOpenId");
+//            String appletsOpenId = null;
+//            if(ToolUtil.isNotEmpty(value)){
+//                JSONObject jsonObject = JSON.parseObject(value);
+//                appletsOpenId = jsonObject.getString(uid.toString());
+//            }else{
+//                appletsOpenId = userInfo.getAppletsOpenId();
+//            }
+            Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 1, money, "", 1);//添加预支付数据
+            String app = (type == 1 ? "APP" : "JSAPI");
+            System.err.println(app);
+            return payMoneyUtil.weixinpay("余额充值", uid.toString(), integer.toString(), money.toString(), "/base/wxCancelUserBalance", app, userInfo.getAppletsOpenId());
+
+//            String value = redisUtil.getValue("appletOpenId");
+//            String appletsOpenId = null;
+//            if(ToolUtil.isNotEmpty(value)){
+//                JSONObject jsonObject = JSON.parseObject(value);
+//                appletsOpenId = jsonObject.getString(uid.toString());
+//            }else{
+//                appletsOpenId = userInfo.getAppletsOpenId();
+//            }
+//            Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 1, money, "", 1);//添加预支付数据
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(integer.toString(), 9, 5, uid.toString(), "余额充值", money, callbackPath + "/base/wxCancelUserBalance", uid.toString(), type, appletsOpenId);
+//            if(map.get("code").equals("200")){
+//                PaymentRecord paymentRecord = paymentRecordService.selectById(integer);
+//                paymentRecord.setCode(map.get("order_id"));
+//                paymentRecordService.updateById(paymentRecord);
+//                return ResultUtil.success(map.get("data"));
+//            }else{
+//                return ResultUtil.error(map.get("msg"), "");
+//            }
+        }
+        if(payType == 2){//支付宝支付
+            Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 2, money, "", 1);//添加预支付数据
+
+            return payMoneyUtil.alipay("余额充值", "余额充值", uid.toString(), integer.toString(), money.toString(), "/base/aliCancelUserBalance");
+//            Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 2, money, "", 1);//添加预支付数据
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(integer.toString(), 10, 5, uid.toString(), "余额充值", money, callbackPath + "/base/aliCancelUserBalance", uid.toString(), type, null);
+//            if(map.get("code").equals("200")){
+//                PaymentRecord paymentRecord = paymentRecordService.selectById(integer);
+//                paymentRecord.setCode(map.get("order_id"));
+//                paymentRecordService.updateById(paymentRecord);
+//                return ResultUtil.success(map.get("data"));
+//            }else{
+//                return ResultUtil.error(map.get("msg"), "");
+//            }
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 修改手机号码
+     * @param code
+     * @param phone
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil updatePhone(String code, String phone, Integer uid) throws Exception {
+        boolean b = this.checkCaptcha(phone, code);
+        if(!b){
+            return ResultUtil.error("验证码无效");
+        }
+        UserInfo userInfo = this.selectById(uid);
+        UserInfo userInfo1 = userInfoMapper.queryByPhone(phone);
+        if(null != userInfo1){
+            return ResultUtil.error("手机号已被注册");
+        }
+        userInfo.setPhone(phone);
+        this.updateById(userInfo);
+
+//        smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 修改密码
+     * @param password
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil updatePass(String password, Integer uid) throws Exception {
+        UserInfo userInfo = this.selectById(uid);
+        userInfo.setPassWord(ShiroKit.md5(password, salt));
+        this.updateById(userInfo);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 修改个人信息
+     * @param avatar
+     * @param nickname
+     * @param sex
+     * @param birthday
+     * @param uid
+     * @throws Exception
+     */
+    @Override
+    public void updateInfo(String avatar, String nickname, Integer sex, Date birthday, Integer uid) throws Exception {
+        UserInfo userInfo = this.selectById(uid);
+        if(ToolUtil.isNotEmpty(avatar)){
+            userInfo.setAvatar(avatar);
+        }
+        if(ToolUtil.isNotEmpty(nickname)){
+            userInfo.setNickName(nickname);
+        }
+        if(null != sex){
+            userInfo.setSex(sex);
+        }
+        if(null != birthday){
+            userInfo.setBirthday(birthday);
+        }
+        this.updateById(userInfo);
+    }
+
+
+    /**
+     * 获取实名认证数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryRealName(Integer uid) throws Exception {
+        return userInfoMapper.queryRealName(uid);
+    }
+
+
+    /**
+     * 完成余额充值后的处理
+     * @param id            用户id
+     * @param order_id      工行订单id
+     * @param type          支付类型(1=微信,2=支付宝)
+     * @throws Exception
+     */
+    @Override
+    public void payCancelUserBalance(Integer id, String order_id, Integer paymentRecordId, Integer type) throws Exception {
+        UserInfo userInfo = this.selectById(id);
+        PaymentRecord query = paymentRecordService.selectById(paymentRecordId);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(Integer.valueOf(id), "余额充值", query.getAmount(), 2, 1, 1, 5, null);
+            double v = new BigDecimal(userInfo.getBalance()).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+            userInfo.setBalance(v);
+            this.updateById(userInfo);
+
+            query.setCode(order_id);
+            query.setState(2);
+            paymentRecordService.updateById(query);
+
+            this.addCoupon(userInfo.getId(), query.getAmount(), userInfo.getCompanyId(), query.getId());//添加优惠券
+
+        }else{
+            System.err.println("预支付数据异常(userId = "  + id + ")");
+        }
+
+    }
+
+
+    /**
+     * H5接入道行龙城实现登录
+     * @param authCode
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil<LoginWarpper> dxlcLogin(String authCode, String registAreaCode,String loginType) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        //生成环境
+        String path = "https://open.brightcns.com";
+        map.put("clientId", "4821416759766550929");
+        map.put("clientSecret", "yuDyNoOuFeknuLGbLSsWZoaLtHGQaelobgmMlbpgquyAacyBXomwDDSgErKWtDwy");
+        //测试环境
+//        String path = "https://open.test.brightcns.cn";
+//        map.put("clientId", "4818328904840251536");
+//        map.put("clientSecret", "JZrYSBvtVlIRbnsnoJuaqheRWAEHcEJVgeAeIHAUojwUwZIAVzSpAWxgozhfPbcq");
+        map.put("grantType", "authorization_code");
+        map.put("authCode", authCode);
+        String get = httpClientUtil.pushHttpRequset("GET", path + "/api/oauth/accessToken", map, null, "");
+        System.err.print("获取accessToken:" + get);
+        JSONObject jsonObject = JSON.parseObject(get);
+        Boolean success = jsonObject.getBoolean("success");
+        String code = jsonObject.getString("code");
+        if(success && "SUCCESS".equals(code)){
+            JSONObject data = jsonObject.getJSONObject("data");
+            String accessToken = data.getString("accessToken");
+            String userId = data.getString("userId");
+            String refreshToken = data.getString("refreshToken");
+            Map<String, String> userInfo = this.getUserInfo(accessToken);
+            if(null == userInfo){
+                return ResultUtil.error("获取用户信息失败");
+            }
+            return this.captchaLogin(userInfo.get("phone"), "1234", null, registAreaCode, loginType);
+        }else{
+            return ResultUtil.error(jsonObject.getString("msg"));
+        }
+    }
+
+    /**
+     * 小程序使用手机号登录绑定微信
+     * @param userId
+     * @param jscode
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil phoneLoginBindingWeChat(Integer userId, String jscode) throws Exception {
+        Map<String, String> map = weChatUtil.code2Session(jscode);
+        String openid = map.get("openid");
+        String unionid = map.get("unionid");
+        //将当前小程序openid存储到缓存中用后面的支付时使用
+        String value = redisUtil.getValue("appletOpenId");
+        JSONObject jsonObject = null;
+        if(ToolUtil.isNotEmpty(value)){
+            jsonObject = JSON.parseObject(value);
+        }else{
+            jsonObject = new JSONObject();
+        }
+        jsonObject.put(userId.toString(), openid);
+        redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
+        return ResultUtil.success();
+    }
+
+    public Map<String, String> getUserInfo(String accessToken){
+        String path = "https://open.brightcns.com";//生产环境
+//        String path = "https://open.test.brightcns.cn";//测试环境
+        Map<String, Object> map = new HashMap<>();
+        map.put("accessToken", accessToken);
+        String get = httpClientUtil.pushHttpRequset("GET", path + "/api/userinfo", map, null, "");
+        System.err.print("获取用户信息:" + get);
+        JSONObject jsonObject = JSON.parseObject(get);
+        Boolean success = jsonObject.getBoolean("success");
+        String code = jsonObject.getString("code");
+        if(success && "SUCCESS".equals(code)){
+            Map<String, String> map1 = new HashMap<>();
+            JSONObject data = jsonObject.getJSONObject("data");
+            map1.put("userId", data.getString("userId"));
+            map1.put("phone", data.getString("phone"));
+            map1.put("userName", data.getString("userName"));
+            return map1;
+        }
+        return null;
+    }
+
+
+
+    /**
+     * 添加充值活动优惠券
+     * @param userId
+     * @param money
+     * @param companyId
+     * @throws Exception
+     */
+    public synchronized void addCoupon(Integer userId, Double money, Integer companyId, Integer paymentRecordId) throws Exception{
+        List<Map<String, Object>> query = userActivityBalanceService.query(money, companyId);
+        List<UserCouponRecord> list = new ArrayList<>();
+        for(Map<String, Object> map : query){
+            //添加通用优惠券
+            Double lavePrice = Double.valueOf(String.valueOf(map.get("lavePrice")));
+            if(null != map.get("bcompanyId")){
+                for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("generalNum"))); i++){
+                    //判断当前发放的优惠券是否大于剩余总发放金额
+                    if(Double.valueOf(String.valueOf(map.get("bmoney"))).compareTo(lavePrice) > 0){
+                        break;
+                    }
+                    UserCouponRecord userCouponRecord = new UserCouponRecord();
+                    userCouponRecord.setUserId(userId);
+                    userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("bcompanyId"))));
+                    userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("bmoney"))));
+                    userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("bfullMoney"))));
+                    userCouponRecord.setInsertTime(new Date());
+                    userCouponRecord.setState(1);
+                    userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("bcouponUseType"))));
+                    userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("bcouponType"))));
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(new Date());
+                    calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("beffective"))));
+                    userCouponRecord.setExpirationTime(calendar.getTime());
+                    userCouponRecord.setPaymentRecordId(paymentRecordId);
+                    userCouponRecord.setActivityType(4);
+                    userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id"))));
+                    userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("bId"))));
+                    list.add(userCouponRecord);
+                    //开始修改剩余总发放金额
+                    lavePrice -= Double.valueOf(String.valueOf(map.get("bmoney")));
+                }
+            }
+
+            //专车优惠券
+            if(null != map.get("ccompanyId")){
+                for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("specialNum"))); i++){
+                    //判断当前发放的优惠券是否大于剩余总发放金额
+                    if(Double.valueOf(String.valueOf(map.get("cmoney"))).compareTo(lavePrice) > 0){
+                        break;
+                    }
+                    UserCouponRecord userCouponRecord = new UserCouponRecord();
+                    userCouponRecord.setUserId(userId);
+                    userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("ccompanyId"))));
+                    userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("cmoney"))));
+                    userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("cfullMoney"))));
+                    userCouponRecord.setInsertTime(new Date());
+                    userCouponRecord.setState(1);
+                    userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("ccouponUseType"))));
+                    userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("ccouponType"))));
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(new Date());
+                    calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("ceffective"))));
+                    userCouponRecord.setExpirationTime(calendar.getTime());
+                    userCouponRecord.setPaymentRecordId(paymentRecordId);
+                    userCouponRecord.setActivityType(4);
+                    userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id"))));
+                    userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("cId"))));
+                    list.add(userCouponRecord);
+                    //开始修改剩余总发放金额
+                    lavePrice -= Double.valueOf(String.valueOf(map.get("cmoney")));
+                }
+            }
+
+            //出租车优惠券
+            if(null != map.get("dcompanyId")){
+                for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("taxiNum"))); i++){
+                    //判断当前发放的优惠券是否大于剩余总发放金额
+                    if(Double.valueOf(String.valueOf(map.get("dmoney"))).compareTo(lavePrice) > 0){
+                        break;
+                    }
+                    UserCouponRecord userCouponRecord = new UserCouponRecord();
+                    userCouponRecord.setUserId(userId);
+                    userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("dcompanyId"))));
+                    userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("dmoney"))));
+                    userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("dfullMoney"))));
+                    userCouponRecord.setInsertTime(new Date());
+                    userCouponRecord.setState(1);
+                    userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("dcouponUseType"))));
+                    userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("dcouponType"))));
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(new Date());
+                    calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("deffective"))));
+                    userCouponRecord.setExpirationTime(calendar.getTime());
+                    userCouponRecord.setPaymentRecordId(paymentRecordId);
+                    userCouponRecord.setActivityType(4);
+                    userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id"))));
+                    userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("dId"))));
+                    list.add(userCouponRecord);
+                    //开始修改剩余总发放金额
+                    lavePrice -= Double.valueOf(String.valueOf(map.get("dmoney")));
+                }
+            }
+
+            //跨城优惠券
+            if(null != map.get("ecompanyId")){
+                for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("intercityNum"))); i++){
+                    //判断当前发放的优惠券是否大于剩余总发放金额
+                    if(Double.valueOf(String.valueOf(map.get("emoney"))).compareTo(lavePrice) > 0){
+                        break;
+                    }
+                    UserCouponRecord userCouponRecord = new UserCouponRecord();
+                    userCouponRecord.setUserId(userId);
+                    userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("ecompanyId"))));
+                    userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("emoney"))));
+                    userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("efullMoney"))));
+                    userCouponRecord.setInsertTime(new Date());
+                    userCouponRecord.setState(1);
+                    userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("ecouponUseType"))));
+                    userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("ecouponType"))));
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(new Date());
+                    calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("eeffective"))));
+                    userCouponRecord.setExpirationTime(calendar.getTime());
+                    userCouponRecord.setPaymentRecordId(paymentRecordId);
+                    userCouponRecord.setActivityType(4);
+                    userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id"))));
+                    userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("eId"))));
+                    list.add(userCouponRecord);
+                    //开始修改剩余总发放金额
+                    lavePrice -= Double.valueOf(String.valueOf(map.get("emoney")));
+                }
+            }
+            UserActivityBalance uab = userActivityBalanceService.selectById(Integer.valueOf(map.get("id").toString()));
+            uab.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            userActivityBalanceService.updateById(uab);
+
+            if(list.size() > 0){
+                userCouponRecordService.insertBatch(list);
+            }
+        }
+    }
+
+
+
+    /**
+     * 获取默认名称
+     * @return
+     */
+    public String getDefaultName(){
+        int num = this.selectCount(new EntityWrapper<UserInfo>().ne("flag", 3)) + 1000001;
+        return "HQ" + String.valueOf(num).substring(1);
+    }
+
+
+    /**
+     * 获取token
+     * @param userInfo
+     * @param password
+     * @return
+     */
+    private String getToken(UserInfo userInfo, String password,String type) throws Exception{
+        if(ToolUtil.isEmpty(type))type="APP";
+        //封装请求账号密码为shiro可验证的token
+        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userInfo.getPhone(), password.toCharArray());
+        String credentials = userInfo.getPassWord();
+        ByteSource credentialsSalt = new Md5Hash(salt);
+        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
+                new ShiroUser(), credentials, credentialsSalt, "");
+
+        //校验用户账号密码
+        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
+        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
+        md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
+        boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
+                usernamePasswordToken, simpleAuthenticationInfo);
+        String s = JwtTokenUtil.generateToken(String.valueOf(userInfo.getId()));
+        redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(userInfo.getId()), 180 * 24 * 60 * 60);
+        redisUtil.setStrValue("USER_"+type+"_" + userInfo.getPhone(), s.substring(s.length() - 32));
+        redisUtil.setStrValue("USER_"+type +"_"+ userInfo.getId(), s);
+        return s;
+    }
+
+
+    /**
+     * 注册时查询活动添加优惠券
+     * @param userInfo
+     * @throws Exception
+     */
+    private synchronized void addCoupon(UserInfo userInfo) throws Exception{
+        //添加优惠券
+        List<Map<String, Object>> list = userActivityRegisteredService.query(userInfo.getCompanyId());
+        int num = 0;
+        for(Map<String, Object> map : list){
+            if(null != map){
+                Integer totalNum = Integer.valueOf(String.valueOf(map.get("totalNum")));
+                Double lavePrice = Double.valueOf(String.valueOf(map.get("lavePrice")));
+                for(int i = totalNum; i > 0; i--){
+                    //判断当前发放的优惠券是否大于剩余可发送总金额
+                    if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(lavePrice) > 0){
+                        break;
+                    }
+                    UserCouponRecord userCouponRecord = new UserCouponRecord();
+                    userCouponRecord.setUserId(userInfo.getId());
+                    userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("companyId"))));
+                    userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("money"))));
+                    userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("fullMoney")==null?"0":map.get("fullMoney"))));
+                    userCouponRecord.setInsertTime(new Date());
+                    userCouponRecord.setState(1);
+                    userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("couponUseType"))));
+                    userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("couponType"))));
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(new Date());
+                    Integer integer = Integer.valueOf(String.valueOf(null != map.get("effective") ? map.get("effective") : "0"));
+                    calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + integer);
+                    userCouponRecord.setExpirationTime(calendar.getTime());
+                    userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("couponId"))));
+                    userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id"))));
+                    userCouponRecord.setActivityType(2);
+                    userCouponRecordService.insert(userCouponRecord);
+                    //修改剩余可发放总金额
+                    lavePrice -= Double.valueOf(String.valueOf(map.get("money")));
+                    num++;
+                }
+                UserActivityRegistered uar = userActivityRegisteredService.selectById(Integer.valueOf(map.get("id").toString()));
+                uar.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                userActivityRegisteredService.updateById(uar);
+            }
+        }
+        //添加系统消息
+        systemNoticeService.addSystemNotice(1, "您已获得" + num + "张优惠券,点击查看", userInfo.getId(), 2);
+    }
+
+
+    /**
+     * 单点登录
+     * @param id
+     */
+    private void singlePointLogin(Integer id,String type) throws Exception{
+        if(ToolUtil.isEmpty(type))type="APP";
+        //开始验证当前账号是否在别处登录
+        String value = redisUtil.getValue("USER_"+type+"_" + id);
+        if(ToolUtil.isNotEmpty(value)){//将另外设备上的强迫下线
+            //开始清除redis中无效的数据
+            UserInfo userInfo = userInfoMapper.selectById(id);
+            String key = redisUtil.getValue("USER_"+type+"_" + userInfo.getPhone());
+            redisUtil.remove(key);//删除个人信息数据
+            redisUtil.remove("USER_"+type+"_" + userInfo.getPhone());//删除后台冻结相关缓存
+            redisUtil.remove("USER_"+type+"_" + id);//清除存储的token
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserRedPacketRecordServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserRedPacketRecordServiceImpl.java
new file mode 100644
index 0000000..a8baff1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserRedPacketRecordServiceImpl.java
@@ -0,0 +1,59 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.UserRedPacketRecordMapper;
+import com.stylefeng.guns.modular.system.model.UserRedPacketRecord;
+import com.stylefeng.guns.modular.system.service.IUserRedPacketRecordService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class UserRedPacketRecordServiceImpl extends ServiceImpl<UserRedPacketRecordMapper, UserRedPacketRecord> implements IUserRedPacketRecordService {
+
+    @Resource
+    private UserRedPacketRecordMapper userRedPacketRecordMapper;
+
+
+
+
+    /**
+     * 获取不大于money值的红包数据
+     * @param uid
+     * @param companyId
+     * @param state
+     * @param orderType
+     * @param money
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public UserRedPacketRecord query(Integer uid, Integer companyId, Integer state, Integer orderType, Double money) throws Exception {
+        return userRedPacketRecordMapper.query(uid, companyId, state, orderType, money);
+    }
+
+
+    @Override
+    public UserRedPacketRecord query_(Integer uid, Integer companyId, Integer state, Integer orderType, Double money) throws Exception {
+        return userRedPacketRecordMapper.query_(uid, companyId, state, orderType, money);
+    }
+
+
+
+    /**
+     * 获取个人红包列表(未使用)
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryMyRedEnvelope(Integer pageNum, Integer size, Integer uid) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        return userRedPacketRecordMapper.queryMyRedEnvelope(pageNum, size, uid);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..d958f91
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.datascope.DataScope;
+import com.stylefeng.guns.modular.system.dao.UserMapper;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 管理员表 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
+
+    @Override
+    public int setStatus(Integer userId, int status) {
+        return this.baseMapper.setStatus(userId, status);
+    }
+
+    @Override
+    public int changePwd(Integer userId, String pwd) {
+        return this.baseMapper.changePwd(userId, pwd);
+    }
+
+    @Override
+    public List<Map<String, Object>> selectUsers(DataScope dataScope, String name, String beginTime, String endTime, Integer deptid) {
+        return this.baseMapper.selectUsers(dataScope, name, beginTime, endTime, deptid);
+    }
+
+    @Override
+    public int setRoles(Integer userId, String roleIds) {
+        return this.baseMapper.setRoles(userId, roleIds);
+    }
+
+    @Override
+    public User getByAccount(String account) {
+        return this.baseMapper.getByAccount(account);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VerifiedServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VerifiedServiceImpl.java
new file mode 100644
index 0000000..3b557bf
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VerifiedServiceImpl.java
@@ -0,0 +1,60 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.VerifiedMapper;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.model.Verified;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.service.IVerifiedService;
+import com.stylefeng.guns.modular.system.util.ALiApiUtil;
+import com.stylefeng.guns.modular.system.util.JuHeUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+
+@Service
+public class VerifiedServiceImpl extends ServiceImpl<VerifiedMapper, Verified> implements IVerifiedService {
+
+    @Autowired
+    private JuHeUtil juHeUtil;
+
+    @Autowired
+    private ALiApiUtil aLiApiUtil;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+    /**
+     * 实名操作
+     * @param verified
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil verified(Verified verified, Integer uid) throws Exception {
+        boolean b = juHeUtil.idcard(verified.getName(), verified.getIdcode());
+        verified.setState(b ? 2 : 3);
+        verified.setUserId(uid);
+        verified.setInsertTime(new Date());
+        this.insert(verified);
+
+        //修改个人信息
+        UserInfo userInfo = userInfoService.selectById(uid);
+        if(b){
+            userInfo.setIsAuth(2);
+            userInfo.setName(verified.getName());
+            userInfo.setIdCard(verified.getIdcode());
+            userInfo.setIdCardFront(verified.getImg1());
+            userInfo.setIdCardReverse(verified.getImg2());
+        }else{
+            userInfo.setIsAuth(1);
+        }
+        userInfoService.updateById(userInfo);
+        return b ? ResultUtil.success() : ResultUtil.error("认证失败");
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VersionManagementServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VersionManagementServiceImpl.java
new file mode 100644
index 0000000..6f8ec70
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VersionManagementServiceImpl.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.VersionManagementMapper;
+import com.stylefeng.guns.modular.system.model.VersionManagement;
+import com.stylefeng.guns.modular.system.service.IVersionManagementService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@Service
+public class VersionManagementServiceImpl extends ServiceImpl<VersionManagementMapper, VersionManagement> implements IVersionManagementService {
+
+    @Resource
+    private VersionManagementMapper versionManagementMapper;
+
+
+
+
+    /**
+     * 获取最新版本
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryNewVersion() throws Exception {
+        return versionManagementMapper.queryNewVersion(1);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WithdrawalServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WithdrawalServiceImpl.java
new file mode 100644
index 0000000..8143155
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WithdrawalServiceImpl.java
@@ -0,0 +1,159 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.WithdrawalMapper;
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.model.Withdrawal;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.service.IWithdrawalService;
+//import com.stylefeng.guns.modular.system.util.ICBCPayUtil;
+import com.stylefeng.guns.modular.system.util.PayMoneyUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+
+
+@Service
+@Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+public class WithdrawalServiceImpl extends ServiceImpl<WithdrawalMapper, Withdrawal> implements IWithdrawalService {
+
+    @Resource
+    private WithdrawalMapper withdrawalMapper;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+//    @Autowired
+//    private ICBCPayUtil icbcPayUtil;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+    private Map<String, Timer> timerMap = new HashMap<>();
+
+
+
+
+    /**
+     * 提现操作
+     * @param money
+     * @param code
+     * @param name
+     * @param uid
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil withdrawal(Double money, String code, String name, Integer uid) throws Exception {
+        if(money.compareTo(0D) <= 0){
+            return ResultUtil.error("提现金额必须大于0");
+        }
+        UserInfo userInfo = userInfoService.selectById(uid);
+        if(null == userInfo.getBalance()){
+            return ResultUtil.error("账户没有余额,不能提现");
+        }
+        if(userInfo.getBalance().compareTo(money) < 0){
+            return ResultUtil.error("提现金额必须小于账户余额");
+        }
+
+        Withdrawal withdrawal = new Withdrawal();
+        withdrawal.setBalance(userInfo.getBalance());
+        withdrawal.setCode(code);
+        withdrawal.setFlag(1);
+        withdrawal.setInsertTime(new Date());
+        withdrawal.setMoney(money);
+        withdrawal.setName(name);
+        withdrawal.setState(1);
+        withdrawal.setUserId(uid);
+        withdrawal.setUserType(1);
+
+//        ResultUtil<String> transfer = icbcPayUtil.transfer(Double.valueOf(withdrawal.getMoney() * 100).longValue(), withdrawal.getCode(), withdrawal.getName());
+//        if(transfer.getCode() != 200){
+//            return transfer;
+//        }
+//        withdrawal.setSerialNo(transfer.getData());
+        this.insert(withdrawal);
+
+        double v = new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        userInfo.setBalance(v);
+        userInfoService.updateById(userInfo);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取历史提交数
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryWithdrawal(Integer uid, Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        return withdrawalMapper.queryWithdrawal(uid, 1, pageNum, size);
+    }
+
+
+    /**
+     * 提现审核处理
+     * @param id
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil withdrawalAudit(Integer id, Integer state) throws Exception {
+        Withdrawal withdrawal = this.selectById(id);
+//        if(withdrawal.getState() == 2){
+//            return ResultUtil.error("申请已审核通过,不能重复提交");
+//        }
+//        if(withdrawal.getState() == 3){
+//            return ResultUtil.error("申请已审核拒绝,不能重复提交");
+//        }
+        if(state == 1){//审核通过
+            TimerTask timerTask = new TimerTask() {
+                @Override
+                public void run() {
+                    try {
+                        Map<String, String> map = payMoneyUtil.wxPayBank("用户提现", withdrawal.getMoney().toString(), withdrawal.getId().toString(), withdrawal.getCode(), withdrawal.getName(), "");
+                        if("SUCCESS".equals(map.get("return_code"))){
+                            withdrawal.setSerialNo(map.get("payment_no"));
+                            withdrawal.setState(2);
+                            WithdrawalServiceImpl.this.updateById(withdrawal);
+                            Timer timer = timerMap.get(withdrawal.getSerialNo());
+                            timer.cancel();
+                        }else{
+                            UserInfo userInfo = userInfoService.selectById(withdrawal.getUserId());
+                            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).add(new BigDecimal(withdrawal.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                            userInfoService.updateById(userInfo);
+                            withdrawal.setState(3);
+                            WithdrawalServiceImpl.this.updateById(withdrawal);
+
+                            Timer timer = timerMap.get(withdrawal.getSerialNo());
+                            timer.cancel();
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                }
+            };
+            Timer timer = new Timer();
+            timer.schedule(timerTask, 1000, 10000);//1秒钟后间隔10秒钟查询交易结果
+            timerMap.put(withdrawal.getSerialNo(), timer);
+        }
+        if(state == 2){//审核拒绝
+            withdrawal.setState(3);
+            this.updateById(withdrawal);
+        }
+        return ResultUtil.success();
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java
new file mode 100644
index 0000000..0e16e16
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java
@@ -0,0 +1,97 @@
+package com.stylefeng.guns.modular.system.transfer;
+
+import java.util.Date;
+
+/**
+ * 管理员的信息封装
+ *
+ * @author fengshuonan
+ * @Date 2017年1月11日 下午7:46:53
+ */
+public class ManagerUser {
+
+    private String userId;
+
+    /* 用户账号 */
+    private String userNo;
+
+    /* 用户姓名 */
+    private String userName;
+
+    private String userPhone;
+
+    //1:超级管理员  2:管理员
+    private String userRole;
+
+    /* 1:登录状态 2:退出状态 3:停用状态 */
+    private Integer userStatus;
+
+    private Date createTime;
+
+    private Date loginTime;
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserNo() {
+        return userNo;
+    }
+
+    public void setUserNo(String userNo) {
+        this.userNo = userNo;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserPhone() {
+        return userPhone;
+    }
+
+    public void setUserPhone(String userPhone) {
+        this.userPhone = userPhone;
+    }
+
+    public String getUserRole() {
+        return userRole;
+    }
+
+    public void setUserRole(String userRole) {
+        this.userRole = userRole;
+    }
+
+    public Integer getUserStatus() {
+        return userStatus;
+    }
+
+    public void setUserStatus(Integer userStatus) {
+        this.userStatus = userStatus;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Date loginTime) {
+        this.loginTime = loginTime;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java
new file mode 100644
index 0000000..6e28801
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java
@@ -0,0 +1,76 @@
+package com.stylefeng.guns.modular.system.transfer;
+
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 添加管理员的请求bean
+ *
+ * @author fengshuonan
+ * @Date 2017年1月12日 下午6:46:24
+ */
+public class ReqAddManager {
+
+    // 用户姓名
+    @NotNull
+    private String userName;
+
+    // 用户账号
+    @NotNull
+    private String userNo;
+
+    // 手机号
+    @NotNull
+    @Length(min = 11, max = 11)
+    private String userPhone;
+
+    // 1:超级管理员 2:管理员
+    @NotNull
+    private String userRole;
+
+    // 密码
+    @NotNull
+    private String userPassword;
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserNo() {
+        return userNo;
+    }
+
+    public void setUserNo(String userNo) {
+        this.userNo = userNo;
+    }
+
+    public String getUserPhone() {
+        return userPhone;
+    }
+
+    public void setUserPhone(String userPhone) {
+        this.userPhone = userPhone;
+    }
+
+    public String getUserRole() {
+        return userRole;
+    }
+
+    public void setUserRole(String userRole) {
+        this.userRole = userRole;
+    }
+
+    public String getUserPassword() {
+        return userPassword;
+    }
+
+    public void setUserPassword(String userPassword) {
+        this.userPassword = userPassword;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java
new file mode 100644
index 0000000..394d4b4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java
@@ -0,0 +1,60 @@
+package com.stylefeng.guns.modular.system.transfer;
+
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 编辑管理员的请求
+ *
+ * @author fengshuonan
+ * @Date 2017年1月15日 下午10:29:16
+ */
+public class ReqEditManager {
+
+    @NotNull
+    private String userId;
+
+    /* 用户姓名 */
+    @NotNull
+    private String userName;
+
+    private String userPassword;
+
+    @NotNull
+    @Length(min = 11, max = 11)
+    private String userPhone;
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserPassword() {
+        return userPassword;
+    }
+
+    public void setUserPassword(String userPassword) {
+        this.userPassword = userPassword;
+    }
+
+    public String getUserPhone() {
+        return userPhone;
+    }
+
+    public void setUserPhone(String userPhone) {
+        this.userPhone = userPhone;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java
new file mode 100644
index 0000000..d45f320
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java
@@ -0,0 +1,153 @@
+package com.stylefeng.guns.modular.system.transfer;
+
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 用户传输bean
+ * 
+ * @author stylefeng
+ * @Date 2017/5/5 22:40
+ */
+public class UserDto{
+
+	private Integer id;
+	private String account;
+	private String password;
+	private String salt;
+	private String name;
+
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date birthday;
+	private Integer sex;
+	private String email;
+	private String phone;
+	private String roleid;
+	private Integer deptid;
+	private Integer status;
+	private Date createtime;
+	private Integer version;
+	private String avatar;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getAccount() {
+		return account;
+	}
+
+	public void setAccount(String account) {
+		this.account = account;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getSalt() {
+		return salt;
+	}
+
+	public void setSalt(String salt) {
+		this.salt = salt;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Date getBirthday() {
+		return birthday;
+	}
+
+	public void setBirthday(Date birthday) {
+		this.birthday = birthday;
+	}
+
+	public Integer getSex() {
+		return sex;
+	}
+
+	public void setSex(Integer sex) {
+		this.sex = sex;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public String getRoleid() {
+		return roleid;
+	}
+
+	public void setRoleid(String roleid) {
+		this.roleid = roleid;
+	}
+
+	public Integer getDeptid() {
+		return deptid;
+	}
+
+	public void setDeptid(Integer deptid) {
+		this.deptid = deptid;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	public String getAvatar() {
+		return avatar;
+	}
+
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiApiUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiApiUtil.java
new file mode 100644
index 0000000..157f7d5
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiApiUtil.java
@@ -0,0 +1,51 @@
+package com.stylefeng.guns.modular.system.util;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 阿里云API接口工具类
+ */
+@Component
+public class ALiApiUtil {
+
+    @Autowired
+    private HttpClientUtil httpClientUtil;
+
+
+    /**
+     * 身份认证接口
+     * @param name  姓名
+     * @param code  身份证号
+     * @return
+     */
+    public boolean authentication(String name, String code){
+        String url = "https://safrvcert.market.alicloudapi.com/safrv_2meta_id_name/";
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", "APPCODE b7d32437d08149099457dcb50fb57df2");
+        Map<String, Object> param = new HashMap<>();
+        param.put("__userId", "1732960796168165");
+        param.put("verifyKey", "IVO4js5kValcdt");
+        param.put("userName", name);
+        param.put("identifyNum", code);
+        String get = httpClientUtil.pushHttpRequset("GET", url, param, header, "form");
+        JSONObject jsonObject = JSON.parseObject(get);
+        if(jsonObject.getIntValue("code") == 200){
+            JSONObject value = jsonObject.getJSONObject("value");
+            if(value.getString("bizCode").equals("0")){
+                return true;
+            }else{
+                return false;
+            }
+        }else{
+            System.err.println(jsonObject.getString("message"));
+        }
+        return false;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiSendSms.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiSendSms.java
new file mode 100644
index 0000000..58202d0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiSendSms.java
@@ -0,0 +1,123 @@
+package com.stylefeng.guns.modular.system.util;
+
+
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.google.gson.Gson;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 阿里云短信工具类
+ */
+@Component
+public class ALiSendSms {
+
+    // 设置鉴权参数,初始化客户端
+    private DefaultProfile profile = DefaultProfile.getProfile(
+            "cn-hangzhou",// 地域ID
+            "LTAI5tR4whv88Y5CUucCJEu6",// 您的AccessKey ID
+            "2fObO6LE6U2OzrUfXw9YBlQWHohFvg");// 您的AccessKey Secret
+    private IAcsClient client = new DefaultAcsClient(profile);
+
+    private static void log_print(String functionName, Object result) {
+        Gson gson = new Gson();
+        System.out.println("-------------------------------" + functionName + "-------------------------------");
+        System.out.println(gson.toJson(result));
+    }
+
+    /**
+     * 添加短信模板
+     */
+    public String addSmsTemplate() throws ClientException {
+        CommonRequest addSmsTemplateRequest = new CommonRequest();
+        addSmsTemplateRequest.setSysDomain("dysmsapi.aliyuncs.com");
+        addSmsTemplateRequest.setSysAction("AddSmsTemplate");
+        addSmsTemplateRequest.setSysVersion("2017-05-25");
+        // 短信类型。0:验证码;1:短信通知;2:推广短信;3:国际/港澳台消息
+        addSmsTemplateRequest.putQueryParameter("TemplateType", "0");
+        // 模板名称,长度为1~30个字符
+        addSmsTemplateRequest.putQueryParameter("TemplateName", "测试短信模板");
+        // 模板内容,长度为1~500个字符
+        addSmsTemplateRequest.putQueryParameter("TemplateContent", "您正在申请手机注册,验证码为:${code},5分钟内有效!");
+        // 短信模板申请说明
+        addSmsTemplateRequest.putQueryParameter("Remark", "测试");
+        CommonResponse addSmsTemplateResponse = client.getCommonResponse(addSmsTemplateRequest);
+        String data = addSmsTemplateResponse.getData();
+        // 消除返回文本中的反转义字符
+        String sData = data.replaceAll("'\'", "");
+        log_print("addSmsTemplate", sData);
+        Gson gson = new Gson();
+        // 将字符串转换为Map类型,取TemplateCode字段值
+        Map map = gson.fromJson(sData, Map.class);
+        Object templateCode = map.get("TemplateCode");
+        return templateCode.toString();
+    }
+
+    /**
+     * 发送短信
+     */
+    public String sendSms(String phone, String templateCode, String json) throws ClientException {
+        CommonRequest request = new CommonRequest();
+        request.setSysDomain("dysmsapi.aliyuncs.com");
+        request.setSysVersion("2017-05-25");
+        request.setSysAction("SendSms");
+        // 接收短信的手机号码
+        request.putQueryParameter("PhoneNumbers", phone);
+        // 短信签名名称。请在控制台签名管理页面签名名称一列查看(必须是已添加、并通过审核的短信签名)。
+        request.putQueryParameter("SignName", "未来出行");
+        // 短信模板ID
+        request.putQueryParameter("TemplateCode", templateCode);
+        // 短信模板变量对应的实际值,JSON格式。
+        request.putQueryParameter("TemplateParam", json);
+        CommonResponse commonResponse = client.getCommonResponse(request);
+        String data = commonResponse.getData();
+        String sData = data.replaceAll("'\'", "");
+        log_print("sendSms", sData);
+        return sData;
+    }
+
+    /**
+     * 查询发送详情
+     */
+    private void querySendDetails(String bizId) throws ClientException {
+        CommonRequest request = new CommonRequest();
+        request.setSysDomain("dysmsapi.aliyuncs.com");
+        request.setSysVersion("2017-05-25");
+        request.setSysAction("QuerySendDetails");
+        // 接收短信的手机号码
+        request.putQueryParameter("PhoneNumber", "156xxxxxxxx");
+        // 短信发送日期,支持查询最近30天的记录。格式为yyyyMMdd,例如20191010。
+        request.putQueryParameter("SendDate", "20191010");
+        // 分页记录数量
+        request.putQueryParameter("PageSize", "10");
+        // 分页当前页码
+        request.putQueryParameter("CurrentPage", "1");
+        // 发送回执ID,即发送流水号。
+        request.putQueryParameter("BizId", bizId);
+        CommonResponse response = client.getCommonResponse(request);
+        log_print("querySendDetails", response.getData());
+    }
+
+    public static void main(String[] args) {
+        ALiSendSms sendSmsDemo = new ALiSendSms();
+        try {
+            // 创建短信模板
+//            String templateCode = sendSmsDemo.addSmsTemplate();
+            // 使用刚创建的短信模板发送短信
+            String sData = sendSmsDemo.sendSms("19522115070", "SMS_467580138", "{\"code\":\"8888\"}");
+            Gson gson = new Gson();
+            Map map = gson.fromJson(sData, Map.class);
+            String bizId = map.get("BizId").toString();
+            // 根据短信发送流水号查询短信发送情况
+            sendSmsDemo.querySendDetails(bizId);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AmapGeocoding.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AmapGeocoding.java
new file mode 100644
index 0000000..896cc76
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AmapGeocoding.java
@@ -0,0 +1,111 @@
+package com.stylefeng.guns.modular.system.util;
+
+import org.codehaus.jettison.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+
+public class AmapGeocoding {
+
+    private static final String AMAP_GEOCODING_API = "https://restapi.amap.com/v3/geocode/regeo";
+    private static final String AMAP_KEY = "116e73b6d14f7da0292daa6037955749"; // 替换为你的高德地图API Key
+
+    public static String getCityCode(double latitude, double longitude) throws Exception {
+        String url = AMAP_GEOCODING_API + "?location=" + longitude + "," + latitude
+                + "&output=json&key=" + AMAP_KEY + "&radius=1000&extensions=all";
+
+        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+        connection.setRequestMethod("GET");
+        connection.connect();
+
+        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+        StringBuilder response = new StringBuilder();
+        String line;
+        while ((line = reader.readLine()) != null) {
+            response.append(line);
+        }
+        reader.close();
+        connection.disconnect();
+
+        JSONObject jsonObject = new JSONObject(response.toString());
+        if ("1".equals(jsonObject.getString("status"))) {
+            JSONObject regeocode = jsonObject.getJSONObject("regeocode");
+            JSONObject addressComponent = regeocode.getJSONObject("addressComponent");
+            String cityCode = addressComponent.getString("adcode"); // adcode即为citycode
+            return cityCode;
+        } else {
+            throw new RuntimeException("Failed to fetch city code. Error message: " + jsonObject.getString("info"));
+        }
+    }
+
+    public static String getCityName(double latitude, double longitude) throws Exception {
+        String url = AMAP_GEOCODING_API + "?location=" + longitude + "," + latitude
+                + "&output=json&key=" + AMAP_KEY + "&radius=1000&extensions=all";
+
+        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+        connection.setRequestMethod("GET");
+        connection.connect();
+
+        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+        StringBuilder response = new StringBuilder();
+        String line;
+        while ((line = reader.readLine()) != null) {
+            response.append(line);
+        }
+        reader.close();
+        connection.disconnect();
+
+        JSONObject jsonObject = new JSONObject(response.toString());
+        if ("1".equals(jsonObject.getString("status"))) {
+            JSONObject regeocode = jsonObject.getJSONObject("regeocode");
+            String regeocodesss = regeocode.getString("formatted_address");
+            JSONObject addressComponent = regeocode.getJSONObject("addressComponent");
+            String cityName = addressComponent.getString("city"); // 这里改为了获取城市名称
+            return cityName;
+        } else {
+            throw new RuntimeException("Failed to fetch city name. Error message: " + jsonObject.getString("info"));
+        }
+    }
+
+
+
+    public static String getAddress(double latitude, double longitude) throws Exception {
+        String url = AMAP_GEOCODING_API + "?location=" + longitude + "," + latitude
+                + "&output=json&key=" + AMAP_KEY + "&radius=1000&extensions=all";
+
+        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+        connection.setRequestMethod("GET");
+        connection.connect();
+
+        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+        StringBuilder response = new StringBuilder();
+        String line;
+        while ((line = reader.readLine()) != null) {
+            response.append(line);
+        }
+        reader.close();
+        connection.disconnect();
+
+        JSONObject jsonObject = new JSONObject(response.toString());
+        if ("1".equals(jsonObject.getString("status"))) {
+            JSONObject regeocode = jsonObject.getJSONObject("regeocode");
+            String regeocodesss = regeocode.getString("formatted_address");
+            JSONObject addressComponent = regeocode.getJSONObject("addressComponent");
+            String cityName = addressComponent.getString("city"); // 这里改为了获取城市名称
+            return regeocodesss;
+        } else {
+            throw new RuntimeException("Failed to fetch city name. Error message: " + jsonObject.getString("info"));
+        }
+    }
+
+
+
+    public static void main(String[] args) throws Exception {
+        double lat = 116.3913; // 纬度
+        double lng = 39.90539; // 经度
+        System.out.println("City Code: " + getCityCode(lat, lng));
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ApplicationRunnerUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ApplicationRunnerUtil.java
new file mode 100644
index 0000000..03f1171
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ApplicationRunnerUtil.java
@@ -0,0 +1,99 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper;
+import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
+import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.model.OrderCancel;
+import com.stylefeng.guns.modular.system.service.IDriverService;
+import com.stylefeng.guns.modular.system.service.IOrderCancelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * 项目启动执行类
+ */
+@Component
+public class ApplicationRunnerUtil implements ApplicationRunner {
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Resource
+    private LineShiftDriverMapper lineShiftDriverMapper;
+
+    @Resource
+    private OrderCrossCityMapper orderCrossCityMapper;
+
+    @Autowired
+    private IDriverService driverService;
+
+
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        this.taskOrderCrossCity();
+    }
+
+
+    /**
+     * 创建定时任务定时取消订单
+     */
+    private void taskOrderCrossCity(){
+        List<OrderCrossCity> orderCrossCities = orderCrossCityService.selectList(new EntityWrapper<OrderCrossCity>().eq("state", 7).eq("isDelete", 1));
+        for(OrderCrossCity orderCrossCity : orderCrossCities){
+            long time = System.currentTimeMillis() - orderCrossCity.getInsertTime().getTime();
+            TimerTask timerTask = new TimerTask() {
+                @Override
+                public void run() {
+                    OrderCrossCity orderCrossCity1 = orderCrossCityService.selectById(orderCrossCity.getId());
+                    if(orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null){
+                        orderCrossCity1.setState(10);
+                        orderCrossCityService.updateById(orderCrossCity1);
+
+                        OrderCancel orderCancel = new OrderCancel();
+                        orderCancel.setOrderId(orderCrossCity.getId());
+                        orderCancel.setOrderType(3);
+                        orderCancel.setReason("用户未及时付款,系统自动取消订单");
+                        orderCancel.setRemark("用户未及时付款,系统自动取消订单");
+                        orderCancel.setState(2);
+                        orderCancel.setInsertTime(new Date());
+                        orderCancel.setUserType(2);
+                        orderCancelService.insert(orderCancel);
+
+                        //修改司机座位
+                        LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
+                        lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
+                        lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber());
+                        lineShiftDriverMapper.updateById(lineShiftDriver);
+
+                        //修改司机为空闲
+                        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
+                        if(orderCrossCities.size() == 0){
+                            Driver driver = driverService.selectById(orderCrossCity.getDriverId());
+                            driver.setState(2);
+                            driverService.updateById(driver);
+                        }
+                    }
+                }
+            };
+            Timer timer = new Timer();
+            timer.schedule(timerTask, time < 0 ? 0 : time);
+        }
+        System.err.println("【创建自动取消定时任务成功】");
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ChinaMobileUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ChinaMobileUtil.java
new file mode 100644
index 0000000..5ef83bd
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ChinaMobileUtil.java
@@ -0,0 +1,128 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.util.MD5Util;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 中国移动工具类
+ */
+@Component
+public class ChinaMobileUtil {
+
+    private String APIKey = "zj42494b1bdd416b9762229af6b5cbbd";
+
+    private String SecretKey = "30323561316534653735613230316339";
+
+    @Autowired
+    private HttpClientUtil httpClientUtil;
+
+
+    /**
+     * 绑定小号
+     * @param phoneA
+     * @param phoneB
+     * @param areaCode
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> midAxbBindSend(String phoneA, String phoneB, Integer areaCode) throws Exception{
+        //组装请求对象-具体描述见开发文档-订单小号-AXB接口规范部分内容
+        Map<String, Object> request = new HashMap<>();
+        request.put("APPID", APIKey);
+        request.put("bindtype", "AXB");
+        request.put("requestId", UUIDUtil.getRandomCode(16));
+        request.put("record", "0");
+        //用户号码,必填,格式遵循国际电信联盟定义的E.164标准
+        request.put("telA", "86" + phoneA);
+        //用户号码B,必填,格式遵循国际电信联盟定义的E.164标准
+        request.put("telB", "86" + phoneB);
+        //需要选择的小号所属区号,当telX不写时必填,例如:杭州(571)
+        request.put("areaCode", 571);
+        //订单小号,非必填,当指定小号绑定时填写,格式遵循国际电信联盟定义的E.164标准
+//        request.setTelX("8618867110000");
+        //绑定关系过期失效时间,秒,取值必须大于0且最大值不超过4294967296
+        request.put("expiration", Integer.valueOf(7 * 24 * 60 * 60));
+
+        Map<String, String> header = new HashMap<String, String>(3);
+        header.put("Authorization", "Basic " + new String(Base64.encodeBase64((APIKey + ":" + SecretKey).getBytes())));
+        header.put("Content-Type", "application/json;charset=utf-8");
+        String post = httpClientUtil.pushHttpRequset("POST", "https://ct.open.10086.cn/ordernumber/v1/binding", request, header, "json");
+        Map<String, String> map1 = new HashMap<>();
+        if(post.indexOf("0000") != -1){
+            JSONObject jsonObject = JSONObject.parseObject(post);
+            if(jsonObject.getString("code").equals("0000")){
+                map1.put("code", "200");
+                map1.put("msg", jsonObject.getString("message"));
+                map1.put("telX", jsonObject.getString("x_no").substring(2));
+                map1.put("bindId", jsonObject.getString("bindId"));
+            }else{
+                map1.put("code", jsonObject.getString("code"));
+                map1.put("msg", jsonObject.getString("message"));
+            }
+        }else{
+            map1.put("code", "-1");
+            map1.put("msg", post);
+        }
+
+        return map1;
+    }
+
+
+    /**
+     * 解绑小号关系
+     * @param bindId    绑定关系id
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> midAxbUnBindSend(String bindId) throws Exception{
+        //组装请求对象-具体描述见开发文档-订单小号-AXB接口规范部分内容
+        Map<String, Object> request = new HashMap<>();
+        //绑定关系ID
+        request.put("APPID", APIKey);
+        request.put("bindId", bindId);
+
+        Map<String, String> header = new HashMap<String, String>(3);
+        header.put("Authorization", "Basic " + new String(Base64.encodeBase64((APIKey + ":" + SecretKey).getBytes())));
+        header.put("Content-Type", "application/json;charset=utf-8");
+        String post = httpClientUtil.pushHttpRequset("POST", "https://ct.open.10086.cn/ordernumber/v1/unbinding", request, header, "json");
+        JSONObject jsonObject = JSONObject.parseObject(post);
+        Map<String, String> map1 = new HashMap<>();
+        if(jsonObject.getString("code").equals("0000")){
+            map1.put("code", "200");
+            map1.put("msg", jsonObject.getString("message"));
+        }else{
+            map1.put("code", jsonObject.getString("code"));
+            map1.put("msg", jsonObject.getString("message"));
+        }
+        return map1;
+    }
+
+
+
+
+    public Map<String, String> HeaderUtils(String APIKey, String SecretKey) throws Exception{
+        Map<String, String> header = new HashMap<>();
+        long time = System.currentTimeMillis();
+        String signStr = MD5Util.encrypt(APIKey + SecretKey + time);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("apiKey", APIKey);
+        jsonObject.put("time", time);
+        jsonObject.put("sign", signStr);
+        Base64 base64 = new Base64();
+        String s = base64.encodeToString(jsonObject.toJSONString().getBytes("UTF-8"));
+        header.put("header", s);
+
+        jsonObject = new JSONObject();
+        jsonObject.put("platformId", "");
+        jsonObject.put("secret", "");
+        s = base64.encodeToString(jsonObject.toJSONString().getBytes("UTF-8"));
+        header.put("accessCode", s);
+        return header;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java
new file mode 100644
index 0000000..9519160
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java
@@ -0,0 +1,133 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 日期处理工具类
+ */
+@Component
+public class DateUtil {
+
+
+    /**
+     * 获取给定日期天的开始时间点或结束时间点
+     * @param time  日期
+     * @param type  时间点类型start一天的开始时间点,end一天的结束时间点
+     * @return
+     */
+    public Date getStartOrEndDate(Date time, String type){
+        if(ToolUtil.isEmpty(time) || ToolUtil.isEmpty(type)){
+            return null;
+        }
+        int hourOfDay = "start".equals(type) ? 0 : 23;
+        int minute = "start".equals(type) ? 0 : 59;
+        int second = "start".equals(type) ? 0 : 59;
+        Calendar s = Calendar.getInstance();
+        s.setTime(time);
+        s.set(s.get(Calendar.YEAR), s.get(Calendar.MONTH), s.get(Calendar.DAY_OF_MONTH), hourOfDay, minute, second);
+        return s.getTime();
+    }
+
+
+
+
+    /**
+     * 获取给定日期天的起始时间和结束时间
+     * @param time
+     * @return
+     */
+    public Map<String, Date> getStartAndEndDate(Date time){
+        if(ToolUtil.isEmpty(time)){
+            return null;
+        }
+        Map<String, Date> map = new HashMap<>();
+        map.put("startTime", getStartOrEndDate(time, "start"));
+        map.put("endTime", getStartOrEndDate(time, "end"));
+        return map;
+    }
+
+
+
+
+    /**
+     * 获取格式化的字符串日期返回日期天的起始时间和结束时间
+     * @param time  yyyy-MM-dd DD:mm:ss/yyyy-MM-dd
+     * @return
+     */
+    public Map<String, Date> getStartAndEndDate(String time){
+        if(ToolUtil.isEmpty(time)){
+            return null;
+        }
+        int index = time.indexOf(" ");
+        String pattern = "yyyy-MM-dd DD:mm:ss";
+        if(index == -1){
+            pattern = "yyyy-MM-dd";
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        Date date = null;
+        try {
+            date = sdf.parse(time);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return getStartAndEndDate(date);
+    }
+
+
+    /**
+     * 获取格式化的字符串区间日期返回区间日期天的起始时间和结束时间
+     * @param time      yyyy-MM-dd DD:mm:ss - yyyy-MM-dd DD:mm:ss/yyyy-MM-dd - yyyy-MM-dd
+     * @param split     区间时间的分隔符
+     * @return
+     */
+    public List<Date> getStartAndEndDate(String time, String split){
+        if(ToolUtil.isEmpty(time) || ToolUtil.isEmpty(split)){
+            return null;
+        }
+        List<Date> list = new ArrayList<>();
+        String[] split1 = time.split(split);
+        int index = split1[0].indexOf(" ");
+        String pattern = "yyyy-MM-dd DD:mm:ss";
+        if(index == -1){
+            pattern = "yyyy-MM-dd";
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        Date date1 = null;
+        Date date2 = null;
+        try {
+            date1 = sdf.parse(split1[0]);
+            date2 = sdf.parse(split1[1]);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        list.add(getStartOrEndDate(date1, "start"));
+        list.add(getStartOrEndDate(date2, "end"));
+        return list;
+    }
+
+
+    /**
+     * 获取月初和月末日期
+     * @param date
+     * @return
+     */
+    public Map<String, Date> getMonthStartAndEnd(Date date){
+        Calendar s = Calendar.getInstance();
+        s.setTime(date);
+        s.set(Calendar.DAY_OF_MONTH, 1);
+        Calendar e = Calendar.getInstance();
+        e.setTime(date);
+        e.set(Calendar.DAY_OF_MONTH, e.getActualMaximum(Calendar.DAY_OF_MONTH));
+        Date start = this.getStartOrEndDate(s.getTime(), "start");
+        Date end = this.getStartOrEndDate(e.getTime(), "end");
+        Map<String, Date> map = new HashMap<>();
+        map.put("startTime", start);
+        map.put("endTime", end);
+        return map;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDFalconUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDFalconUtil.java
new file mode 100644
index 0000000..75710d3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDFalconUtil.java
@@ -0,0 +1,224 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+
+/**
+ * 高德猎鹰服务
+ */
+@Component
+public class GDFalconUtil implements ApplicationRunner {
+
+    private String key = "9386659d9ec781a782d1c8c49a8f182f";
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    private static String serverId = null;
+
+
+    public String getServerId() {
+        return serverId;
+    }
+
+    /**
+     * 服务启动后执行的代码
+     * @param args
+     * @throws Exception
+     */
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        this.init();
+    }
+
+
+
+    /**
+     * 初始化创建服务
+     */
+    public void init(){
+        if(serverId == null){
+            JSONArray jsonArray = this.selectServer();
+            if(null == jsonArray){
+                serverId = this.createServer("server");
+            }else{
+                serverId = jsonArray.getJSONObject(0).getString("sid");
+            }
+        }
+
+    }
+
+
+    /**
+     * 创建新的服务
+     * @return
+     */
+    public String createServer(String name){
+        String url = "https://tsapi.amap.com/v1/track/service/add";
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("key", key);
+        params.add("name", name);
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = restTemplate.postForObject(url, requestEntity , String.class);
+        JSONObject jsonObject = JSON.parseObject(s);
+        if(jsonObject.getIntValue("errcode") == 10000){
+            JSONObject data = jsonObject.getJSONObject("data");
+            if(null != data){
+                return data.getString("sid");
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 查询服务
+     * @return
+     */
+    private JSONArray selectServer(){
+        String url = "https://tsapi.amap.com/v1/track/service/list?key=" + key;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        if(jsonObject.getIntValue("errcode") == 10000){
+            JSONObject data = jsonObject.getJSONObject("data");
+            if(null != data){
+                return data.getJSONArray("results");
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 创建终端数据
+     * @param name
+     * @return
+     */
+    public String createTerminal(String name){
+        String tid = this.selectTerminal(name);
+        if(tid != null){
+            return tid;
+        }
+        String url = "https://tsapi.amap.com/v1/track/terminal/add";
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("key", key);
+        params.add("sid", serverId);
+        params.add("name", name);
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = restTemplate.postForObject(url, requestEntity , String.class);
+        JSONObject jsonObject = JSON.parseObject(s);
+        if(jsonObject.getIntValue("errcode") == 10000){
+            JSONObject data = jsonObject.getJSONObject("data");
+            return data.getString("tid");
+        }
+        System.err.println(jsonObject.getString("errmsg"));
+        return null;
+    }
+
+
+    /**
+     * 查询终端
+     * @param name
+     * @return
+     */
+    public String selectTerminal(String name){
+        String url = "https://tsapi.amap.com/v1/track/terminal/list?key=" + key + "&name=" + name;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        if(jsonObject.getIntValue("errcode") == 10000){
+            JSONObject data = jsonObject.getJSONObject("data");
+            int count = 0;
+            if(null != data){
+                count = data.getIntValue("count");
+            }
+            if(count > 0){
+                JSONObject results = data.getJSONArray("results").getJSONObject(0);
+                return results.getString("tid");
+            }else{
+                return this.createTerminal(name);
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 创建轨迹
+     * @param tid   终端id
+     * @return
+     */
+    public String createTrack(String tid){
+        String url = "https://tsapi.amap.com/v1/track/trace/add";
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("key", key);
+        params.add("sid", serverId);
+        params.add("tid", tid);
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = restTemplate.postForObject(url, requestEntity , String.class);
+        JSONObject jsonObject = JSON.parseObject(s);
+        if(jsonObject.getIntValue("errcode") == 10000){
+            return jsonObject.getString("data");
+        }
+        System.err.println(jsonObject.getString("errmsg"));
+        return null;
+    }
+
+
+    /**
+     * 删除轨迹
+     * @param tid       终端id
+     * @param trid      轨迹id
+     */
+    public void deleteTrack(String tid, String trid){
+        String url = "https://tsapi.amap.com/v1/track/trace/delete";
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("key", key);
+        params.add("sid", serverId);
+        params.add("tid", tid);
+        params.add("trid", trid);
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = restTemplate.postForObject(url, requestEntity , String.class);
+        JSONObject jsonObject = JSON.parseObject(s);
+        if(jsonObject.getIntValue("errcode") != 10000){
+            System.err.println(jsonObject.getString("errmsg"));
+        }
+    }
+
+
+//
+//    public Map<String, Object> queryTrsearch(){
+//
+//    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java
new file mode 100644
index 0000000..bba0388
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java
@@ -0,0 +1,405 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.util.ToolUtil;
+//import com.stylefeng.guns.modular.system.model.GDFence;
+//import com.stylefeng.guns.modular.system.service.IGDFenceService;
+import com.stylefeng.guns.modular.system.service.IGDInterfaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 电子围栏工具类
+ */
+@Component
+public class GDMapElectricFenceUtil {
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private IGDInterfaceService gdInterfaceService;
+
+    private String key = "9386659d9ec781a782d1c8c49a8f182f";
+
+    private JSONArray jsonArray = new JSONArray();
+
+
+    @Bean
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
+//       SimpleClientHttpRequestFactory factory=new SimpleClientHttpRequestFactory();
+//      上一行被注释掉的是Spring自己的实现,下面是依赖了httpclient包后的实现
+        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
+        factory.setConnectTimeout(5000);
+        factory.setReadTimeout(5000);
+        return factory;
+    }
+
+    /**
+     * 创建电子围栏
+     * @param id
+     * @param points
+     * @return
+     */
+    public List<String> createFence(String id, String points){
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        String format = simpleDateFormat.format(calendar.getTime());
+
+
+        //开始调用高德接口创建围栏
+        String[] s = points.split("_");
+        List<String> resoult = new ArrayList<>();
+        for(int i = 0; i < s.length; i++){
+            String[] split = s[i].split(";");
+            JSONObject json = new JSONObject();
+            json.put("name", id);
+            if(split.length == 2){
+                json.put("center", split[0]);
+                json.put("radius", split[1]);
+            }else{
+                json.put("points", s[i]);
+            }
+            json.put("enable", "true");
+            json.put("valid_time", format);
+            json.put("repeat", "Mon,Tues,Wed,Thur,Fri,Sat,Sun");
+            json.put("alert_condition", "enter;leave");
+            json.put("desc", id);
+
+            HttpHeaders headers = new HttpHeaders();
+            MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+            headers.setContentType(type);
+            headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+            HttpEntity<String> formEntity = new HttpEntity<>(json.toString(), headers);
+
+            String url = "https://restapi.amap.com/v4/geofence/meta?key=" + key;
+            String js = restTemplate.postForObject(url, formEntity, String.class);
+            JSONObject jsonObject = JSON.parseObject(js);
+            JSONObject data = jsonObject.getJSONObject("data");
+            String status = data.getString("status");
+
+//            gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "创建电子围栏");
+
+//            if(status.equals("0")){//创建成功
+//                GDFence gdFence = new GDFence();
+//                gdFence.setGdfenceId(UUIDUtil.getRandomCode());
+//                gdFence.setGid(data.getString("gid"));
+//                gdFence.setPoints(s[i]);
+//                gdFence.setLineElectricfenceIds(id);
+//                gdFenceService.insert(gdFence);
+//            }
+//
+//            if(status.equals("106")){//创建点电子围栏已经存在(只有坐标完全相同的电子围栏才会报重复)
+//                try {
+//                    GDFence data1 = gdFenceService.getData(s[i]);
+//                    int index = data1.getLineElectricfenceIds().indexOf(id);
+//                    if(index < 0){
+//                        data1.setLineElectricfenceIds(data1.getLineElectricfenceIds() + "," + id);
+//                        gdFenceService.updateById(data1);
+//                    }
+//                } catch (Exception e) {
+//                    e.printStackTrace();
+//                }
+//            }
+//            resoult.add(js);
+        }
+        return resoult;
+    }
+
+
+
+
+    /**
+     * 创建电子围栏
+     * @param id        围栏名称----绘制的数据id值
+     * @param points    多边形围栏坐标
+     */
+    public List<String> createElectricFenc(String id, String points){
+        List<String> fence = this.createFence(id, points);
+        List<String> gids = new ArrayList<>();
+        for(String f : fence){
+            JSONObject jsonObject = JSON.parseObject(f);
+            JSONObject data = jsonObject.getJSONObject("data");
+            String status = data.getString("status");
+            if(status.equals("0")){
+                gids.add(data.getString("gid"));
+            }
+        }
+        return gids;
+    }
+
+
+    /**
+     * 查询以创建的所有电子围栏
+     */
+    public String findElectricFenc(String center, String radius, String points){
+        String url = "https://restapi.amap.com/v4/geofence/meta?key=" + key;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        JSONObject data = jsonObject.getJSONObject("data");
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏");
+
+        if(ToolUtil.isNotEmpty(center)){//圆形电子围栏
+            JSONArray rs_list = data.getJSONArray("rs_list");
+            for(int i = 0; i < rs_list.size(); i++){
+                String c = rs_list.getJSONObject(i).getString("center");
+                Double r = rs_list.getJSONObject(i).getDouble("radius");
+                if(c.equals(center) && radius.equals(String.valueOf(r))){
+                    return rs_list.getJSONObject(i).getString("gid");
+                }
+            }
+        }else{
+            JSONArray rs_list = data.getJSONArray("rs_list");
+            for(int i = 0; i < rs_list.size(); i++){
+                String p = rs_list.getJSONObject(i).getString("points");
+                if(points.equals(p)){
+                    return rs_list.getJSONObject(i).getString("gid");
+                }
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 查询所有绘制好的电子围栏
+     * @return
+     */
+    public JSONArray findAllElectricFenc(int page){
+        if(page == 1){
+            jsonArray = new JSONArray();
+        }
+        String url = "https://restapi.amap.com/v4/geofence/meta?key=" + key + "&page_no=" + page + "&page_size=" + 30;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        JSONObject data = jsonObject.getJSONObject("data");
+        JSONArray rs_list = data.getJSONArray("rs_list");
+        jsonArray.addAll(rs_list);
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏");
+
+        //判断是否有分页
+        int total_record = data.getIntValue("total_record");
+        if(total_record > jsonArray.size()){
+            //有分页,递归调用自己
+            page++;
+            this.findAllElectricFenc(page);
+        }
+        return jsonArray;
+    }
+
+
+    /**
+     * 批量更新电子围栏(失效的数据)
+     * @param jsonArray
+     * @throws ParseException
+     */
+    public void updateElectricFenc(JSONArray jsonArray) throws ParseException{
+        //批量更新查询出的失效的电子围栏,围栏失效日期在当前日期之后的数据
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        for(int i = 0; i < jsonArray.size(); i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(new Date());
+            calendar.set(Calendar.HOUR_OF_DAY, 8);
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.SECOND, 0);
+            calendar.set(Calendar.MILLISECOND, 0);
+            long timeInMillis1 = calendar.getTimeInMillis();
+
+            String valid_time = jsonObject.getString("valid_time");
+            Date parse = sdf.parse(valid_time);
+            Calendar cale = Calendar.getInstance();
+            cale.setTime(parse);
+            cale.set(Calendar.HOUR_OF_DAY, 8);
+            cale.set(Calendar.MINUTE, 0);
+            cale.set(Calendar.SECOND, 0);
+            cale.set(Calendar.MILLISECOND, 0);
+            long timeInMillis = cale.getTimeInMillis();
+            if(timeInMillis1 >= timeInMillis){
+                String gid = jsonObject.getString("gid");
+                String id = jsonObject.getString("name");
+                String center = jsonObject.getString("center");
+                String radius = jsonObject.getString("radius");
+                String points = jsonObject.getString("points");
+                this.updateElectricFenc(gid, id, center, radius, points);
+            }
+
+        }
+    }
+
+
+
+    /**
+     * 更新电子围栏
+     * @param gid
+     * @param id
+     * @param center
+     * @param radius
+     * @param points
+     */
+    public void updateElectricFenc(String gid, String id, String center, String radius, String points) throws ParseException {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        String format = simpleDateFormat.format(calendar.getTime());
+
+        //开始调用高德接口创建围栏
+        JSONObject json = new JSONObject();
+        json.put("name", id);
+        if(ToolUtil.isNotEmpty(center)){
+            json.put("center", center);
+            json.put("radius", radius);
+        }else{
+            json.put("points", points);
+        }
+        json.put("valid_time", format);
+        json.put("repeat", "Mon,Tues,Wed,Thur,Fri,Sat,Sun");
+        json.put("alert_condition", "enter;leave");
+        json.put("desc", id + "围栏更新描述");
+
+        HttpHeaders headers = new HttpHeaders();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        HttpEntity<String> formEntity = new HttpEntity<>(json.toString(), headers);
+
+        String url = "https://restapi.amap.com/v4/geofence/meta?key=" + key + "&gid=" + gid;
+        String s = restTemplate.patchForObject(url, formEntity, String.class);
+        System.out.println(s);
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "更新电子围栏");
+    }
+
+
+    /**
+     * 电子围栏监控
+     * @param diu       设备唯一标识符,作为记录依据,不影响判断结果。Android设备一般使用imei号码,iOS一般使用idfv号,其余设备可根据业务自定义。
+     * @param locations 数据为坐标数据和坐标产生的时间戳数据,至少包含一个坐标对和时间戳。
+     *                  1、传入1个点时,直接判断交互关系。
+     *                  2、当传入多个点时,可以通过前后时间判断动态交互关系。
+     *                  格式: x1,y1,unix_ts1;x2,y2,unix_ts2
+     *                  动态交互判断方法:第一个点作为当前时间的点,然后从其余点中选出在当前点之前10s~1小时范围内的最早点,用这两个时间点的位置判断设备与围栏的动态交互关系。若数据无效交互关系默认返回leave。
+     * @return
+     */
+    public List<String> monitorElectricFenc(String diu, String locations){
+        if(ToolUtil.isEmpty(diu)){
+            diu = "B78F99DD-2496-4A43-843B-172CDA2D9798";
+        }
+        locations = locations + "," + (new Date().getTime() / 1000);
+        String url = "https://restapi.amap.com/v4/geofence/status?key=" + key + "&diu=" + diu + "&locations=" + locations;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        List<String> ids = new ArrayList<>();
+        JSONObject data = jsonObject.getJSONObject("data");
+        int status = data.getIntValue("status");
+        if(0 == status){
+            JSONArray fencingEventList = data.getJSONArray("fencing_event_list");
+            for(int i = 0; i < fencingEventList.size(); i++){
+                String clientStatus = fencingEventList.getJSONObject(i).getString("client_status");
+                if(clientStatus.equals("in")){//包含给定坐标的电子围栏
+                    JSONObject fence_info = fencingEventList.getJSONObject(i).getJSONObject("fence_info");//获取电子围栏信息
+                    String gid = fence_info.getString("fence_gid");
+                    ids.add(gid);
+                }
+            }
+        }
+        System.out.println("检测:" + forObject);
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/status", "电子围栏监控");
+        return ids;
+    }
+
+
+    /**
+     * 删除电子围栏
+     * @param gid
+     * @return
+     */
+    public boolean deleteElectricFenc(String gid){
+        restTemplate.delete("https://restapi.amap.com/v4/geofence/meta?key={1}&gid={2}", key, gid);
+        System.out.println("删除:" );
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "删除电子围栏");
+
+        return true;
+    }
+
+
+    /**
+     * 获取两点的距离
+     * @param origins       起点坐标
+     * @param destination   终点坐标
+     * @param type          计算类型:0:直线距离 1:驾车导航距离(仅支持国内坐标)。
+     * @return
+     */
+    public Map<String, String> getDistance(String origins, String destination, Integer type){
+        String url = "https://restapi.amap.com/v3/distance?key=" + key + "&origins=" + origins + "&destination=" + destination +
+                "&type=" + type;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        String status = jsonObject.getString("status");
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v3/distance", "查询两点间的距离");
+
+        if(status.equals("1")){
+            JSONArray results = jsonObject.getJSONArray("results");
+            JSONObject jsonObject1 = results.getJSONObject(0);
+            Map<String, String> map = new HashMap<>();
+            map.put("distance", jsonObject1.getString("distance"));//距离(米)
+            map.put("duration", jsonObject1.getString("duration"));//预计时间(秒)
+            return map;
+        }else{
+            System.err.println(forObject);
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取路径规划
+     * @param origins       起点坐标
+     * @param destination   终点坐标
+     * @param waypoints     途经点
+     * @return
+     */
+    public Map<String, String> getDriving(String origins, String destination, String waypoints){
+        String url = "https://restapi.amap.com/v3/direction/driving?key=" + key + "&origin=" + origins + "&destination=" + destination +
+                "&waypoints=" + waypoints + "&extensions=base&strategy=0";
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        String status = jsonObject.getString("status");
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v3/direction/driving", "获取路径规划");
+
+        if(status.equals("1")){
+            JSONObject route = jsonObject.getJSONObject("route");
+            JSONArray results = route.getJSONArray("paths");
+            JSONObject jsonObject1 = results.getJSONObject(0);
+            Map<String, String> map = new HashMap<>();
+            map.put("distance", jsonObject1.getString("distance"));//距离(米)
+            map.put("duration", jsonObject1.getString("duration"));//预计时间(秒)
+            return map;
+        }
+        return null;
+    }
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java
new file mode 100644
index 0000000..38ab6e3
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java
@@ -0,0 +1,138 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.service.IGDInterfaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 高德地图的地理编码工具类
+ */
+@Component
+public class GDMapGeocodingUtil {
+
+    private String key = "9386659d9ec781a782d1c8c49a8f182f";
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private IGDInterfaceService gdInterfaceService;
+
+
+    /**
+     * 将行政区域名称转化为坐标
+     * @param province
+     * @param city
+     * @param county
+     * @param address
+     * @return
+     */
+    public Map<String, Object> geocoding(String province, String city, String county, String address){
+        Map<String, Object> map = new HashMap<>();
+        if(ToolUtil.isEmpty(province)){
+            map.put("status", -1);
+            map.put("data", "省不能为空");
+            return map;
+        }
+        if((ToolUtil.isEmpty(city) && ToolUtil.isNotEmpty(county)) || (ToolUtil.isEmpty(city) && ToolUtil.isNotEmpty(address))){
+            map.put("status", -1);
+            map.put("data", "市不能为空");
+            return map;
+        }
+        if((ToolUtil.isEmpty(county) && ToolUtil.isNotEmpty(address))){
+            map.put("status", -1);
+            map.put("data", "县/区不能为空");
+            return map;
+        }
+
+        String url = "https://restapi.amap.com/v3/geocode/geo?key=" + key + "&output=JSON";
+        url += "&address=" + province + (ToolUtil.isNotEmpty(city) ? city : "") + (ToolUtil.isNotEmpty(county) ? county : "") + (ToolUtil.isNotEmpty(address) ? address : "");
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        String status = jsonObject.getString("status");
+        List<String> list = new ArrayList<>();
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度");
+
+        if(status.equals("1")){
+            JSONArray geocodes = jsonObject.getJSONArray("geocodes");
+            for(int i = 0; i < geocodes.size(); i++){
+                String location = geocodes.getJSONObject(i).getString("location");
+                list.add(location);
+            }
+        }
+        map.put("status", 0);
+        map.put("data", list);
+        return map;
+    }
+
+
+
+    public Map<String, Object> geocoding(String address){
+        Map<String, Object> map = new HashMap<>();
+        String url = "https://restapi.amap.com/v3/geocode/geo?key=" + key + "&output=JSON&address=" + address;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        String status = jsonObject.getString("status");
+        List<String> list = new ArrayList<>();
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度");
+
+        if(status.equals("1")){
+            JSONArray geocodes = jsonObject.getJSONArray("geocodes");
+            for(int i = 0; i < geocodes.size(); i++){
+                String location = geocodes.getJSONObject(i).getString("location");
+                list.add(location);
+            }
+        }
+        map.put("status", 0);
+        map.put("data", list);
+        return map;
+    }
+
+
+
+    /**
+     * 根据经纬度获取行政区域信息
+     * @param lon
+     * @param lan
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> geocode(String lon, String lan) throws Exception{
+        String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + key + "&location=" + lon + "," + lan;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        Map<String, String> map = new HashMap<>();
+
+//        gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/regeo", "经纬度转行政区域");
+
+        if(jsonObject.getString("status").equals("1")){
+            JSONObject regeocode = jsonObject.getJSONObject("regeocode");
+            JSONObject addressComponent = regeocode.getJSONObject("addressComponent");
+            String address = regeocode.getString("formatted_address");
+            map.put("address", address);
+            String code = addressComponent.getString("adcode");
+            String province = addressComponent.getString("province");
+            String city = addressComponent.getString("city");
+            String district = addressComponent.getString("district");
+            map.put("province", province);
+            map.put("provinceCode", code.substring(0, 2) + "0000");
+            map.put("city", city);
+            map.put("cityCode", code.substring(0, 4) + "00");
+            map.put("district", district);
+            map.put("districtCode", code);
+        }
+        return map;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GeodesyUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GeodesyUtil.java
new file mode 100644
index 0000000..f3eecf9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GeodesyUtil.java
@@ -0,0 +1,71 @@
+package com.stylefeng.guns.modular.system.util;
+
+import org.gavaghan.geodesy.Ellipsoid;
+import org.gavaghan.geodesy.GeodeticCalculator;
+import org.gavaghan.geodesy.GeodeticCurve;
+import org.gavaghan.geodesy.GlobalCoordinates;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 计算两个金纬度坐标之间的直线距离
+ */
+@Component
+public class GeodesyUtil {
+
+
+    /**
+     * 获取直线距离
+     * @param fromLonLat
+     * @param toLonLat
+     * @return
+     */
+    public Map<String, Double> getDistance(String fromLonLat, String toLonLat){
+        String[] from = fromLonLat.split(",");
+        String[] to = toLonLat.split(",");
+        GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0]));
+        GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(to[1]), Double.valueOf(to[0]));
+        double Sphere = getDistanceMeter(source, target, Ellipsoid.Sphere);
+        double WGS84 = getDistanceMeter(source, target, Ellipsoid.WGS84);
+        double GRS80 = getDistanceMeter(source, target, Ellipsoid.GRS80);
+        double GRS67 = getDistanceMeter(source, target, Ellipsoid.GRS67);
+        double ANS = getDistanceMeter(source, target, Ellipsoid.ANS);
+        double WGS72 = getDistanceMeter(source, target, Ellipsoid.WGS72);
+        double Clarke1858 = getDistanceMeter(source, target, Ellipsoid.Clarke1858);
+        double Clarke1880 = getDistanceMeter(source, target, Ellipsoid.Clarke1880);
+//        System.out.println("Sphere坐标系计算结果:"+Sphere + "米");
+//        System.out.println("WGS84坐标系计算结果:"+WGS84 + "米");
+//        System.out.println("GRS80坐标系计算结果:"+GRS80 + "米");
+//        System.out.println("GRS67坐标系计算结果:"+GRS67 + "米");
+//        System.out.println("ANS坐标系计算结果:"+ANS + "米");
+//        System.out.println("WGS72坐标系计算结果:"+WGS72 + "米");
+//        System.out.println("Clarke1858坐标系计算结果:"+Clarke1858 + "米");
+//        System.out.println("Clarke1880坐标系计算结果:"+Clarke1880 + "米");
+        Map<String, Double> map = new HashMap<>();
+        map.put("Sphere", Sphere);
+        map.put("WGS84", WGS84);
+        map.put("GRS80", GRS80);
+        map.put("GRS67", GRS67);
+        map.put("ANS", ANS);
+        map.put("WGS72", WGS72);
+        map.put("Clarke1858", Clarke1858);
+        map.put("Clarke1880", Clarke1880);
+        return map;
+    }
+
+
+    private double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){
+        //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
+        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);
+        return geoCurve.getEllipsoidalDistance();
+    }
+
+
+
+    public static void main(String[] ages){
+        GeodesyUtil geodesyUtil = new GeodesyUtil();
+        geodesyUtil.getDistance("115.481028,39.989643", "114.465302,40.004717");
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpClientUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpClientUtil.java
new file mode 100644
index 0000000..0ca4de6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpClientUtil.java
@@ -0,0 +1,346 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.util.EntityUtils;
+import org.springframework.stereotype.Component;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.security.KeyStore;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * http工具类
+ */
+@Component
+public class HttpClientUtil {
+
+    private CloseableHttpClient httpClient;
+
+    private CloseableHttpResponse httpResponse;
+
+    private RequestConfig requestConfig;
+
+
+    /**
+     * 创建一个httpClient对象
+     */
+    private void getHttpCline(){
+        //1.创建连接池管理器
+        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(60000,
+                TimeUnit.MILLISECONDS);
+        connectionManager.setMaxTotal(1000);
+        connectionManager.setDefaultMaxPerRoute(50);
+
+        //2.创建httpclient对象
+        this.httpClient = HttpClients.custom()
+                .setConnectionManager(connectionManager)
+                .disableAutomaticRetries()
+                .build();
+    }
+
+    private RequestConfig getRequestConfig(){
+        return RequestConfig.custom()
+                .setConnectTimeout(60000)
+                .setSocketTimeout(60000)
+                .build();
+    }
+
+
+
+    /**
+     * 创建一个POST请求实例
+     * @param url       请求地址
+     * @param params    请求参数
+     */
+    private void setPostHttpRequset(String url, Map<String, Object> params, Map<String, String> header, String contentType){
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setConfig(this.getRequestConfig());
+        if(null != header){
+            for(String key : header.keySet()){
+                httpPost.setHeader(key, header.get(key));
+            }
+        }
+        List<NameValuePair> list = new ArrayList<>();
+        if(null != params){
+            Set<String> keys = params.keySet();
+            for(String key : keys){
+                list.add(new BasicNameValuePair(key, params.get(key).toString()));
+            }
+        }
+        try {
+            switch (contentType){
+                case "form":
+                    httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
+                    break;
+                case "json":
+                    ObjectMapper objectMapper = new ObjectMapper();
+                    String s =objectMapper.writeValueAsString(params);
+                    System.err.println(s);
+                    httpPost.setEntity(new StringEntity(s, Charset.forName("UTF-8")));
+                    break;
+            }
+            this.getHttpCline();
+            if(null == this.httpClient){
+                this.getHttpCline();
+            }
+            httpResponse = this.httpClient.execute(httpPost);
+        } catch (IOException e) {
+            e.printStackTrace();
+            this.close();
+        }
+    }
+
+
+    /**
+     * 获取get请求实例
+     * @param url       请求地址
+     * @param params    请求参数
+     */
+    private void setGetHttpRequset(String url, Map<String, Object> params, Map<String, String> header){
+        StringBuffer sb = new StringBuffer();
+        String p = "";
+        if(null != params){
+            Set<String> keys = params.keySet();
+            for(String key : keys){
+                sb.append(key + "=" + params.get(key) + "&");
+            }
+            p = "?" + sb.substring(0, sb.length() - 1);
+        }
+        HttpGet httpGet = new HttpGet(url + p);
+        if(null != header){
+            for(String key : header.keySet()){
+                httpGet.setHeader(key, header.get(key));
+            }
+        }
+        this.getHttpCline();
+        if(null == this.httpClient){
+            this.getHttpCline();
+        }
+        try {
+            httpResponse = this.httpClient.execute(httpGet);
+        } catch (IOException e) {
+            e.printStackTrace();
+            this.close();
+        }
+    }
+
+
+    /**
+     * 发送http请求
+     * @param mothed        "GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS"
+     * @param url           请求地址
+     * @param params        请求参数
+     * @param header        请求头
+     * @param contentType   参数请求方式form/json
+     * @return
+     */
+    public String pushHttpRequset(String mothed, String url, Map<String, Object> params, Map<String, String> header, String contentType){
+        String content = null;
+        switch (mothed){
+            case "GET":
+                this.setGetHttpRequset(url, params, header);
+                break;
+            case "POST":
+                this.setPostHttpRequset(url, params, header, contentType);
+                break;
+        }
+        if(httpResponse.getStatusLine().getStatusCode() == 200){
+            try {
+                content = EntityUtils.toString(httpResponse.getEntity());
+                this.close();
+                return content;
+            } catch (IOException e) {
+                e.printStackTrace();
+                this.close();
+            }
+        }
+        if(httpResponse.getStatusLine().getStatusCode() == 201){
+            content = "{\"status\":201}";
+            this.close();
+            return content;
+        }else{
+            try {
+                System.err.println("返回状态码:" + httpResponse.getStatusLine() + "。");
+                content = EntityUtils.toString(httpResponse.getEntity());
+                this.close();
+                return content;
+            } catch (IOException e) {
+                e.printStackTrace();
+                this.close();
+            }
+        }
+        this.close();
+        return content;
+    }
+
+
+    /**
+     * 发送XML请求
+     * @param url       请求地址
+     * @param xml       XML数据
+     * @param header    自定义请求头
+     * @return
+     */
+    public String pushHttpRequsetXml(String url, String xml, Map<String, String> header){
+        HttpPost httpPost = new HttpPost(url);
+        for(String key : header.keySet()){
+            httpPost.setHeader(key, header.get(key));
+        }
+        httpPost.setHeader("Content-Type", "application/xml");
+        try {
+            httpPost.setEntity(new StringEntity(xml, "UTF-8"));
+            this.getHttpCline();
+            if(null == this.httpClient){
+                this.getHttpCline();
+            }
+            httpResponse = this.httpClient.execute(httpPost);
+            String content = null;
+            if(httpResponse.getStatusLine().getStatusCode() == 200){
+                try {
+                    content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
+                    this.close();
+                    return content;
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    this.close();
+                }
+            }else{
+                try {
+                    content = "返回状态码:" + httpResponse.getStatusLine() + "。" + EntityUtils.toString(httpResponse.getEntity());
+                    this.close();
+                    return content;
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    this.close();
+                }
+            }
+            this.close();
+            return content;
+        } catch (IOException e) {
+            e.printStackTrace();
+            this.close();
+        }
+        return null;
+    }
+
+
+
+    /**
+     * 请求https发送XML请求
+     * @param url           接口路径
+     * @param xml           内容
+     * @param header        请求头
+     * @param certPassword      证书密码
+     * @param certPath      证书路径
+     * @param certType      证书类型
+     * @return
+     * @throws Exception
+     */
+    public String pushHttpsRequsetXml(String url, String xml, Map<String, String> header, String certPassword, String certPath, String certType) throws Exception{
+        HttpPost httpPost = new HttpPost(url);
+        for(String key : header.keySet()){
+            httpPost.setHeader(key, header.get(key));
+        }
+        httpPost.setHeader("Content-Type", "application/xml");
+        try {
+            httpPost.setEntity(new StringEntity(xml, "UTF-8"));
+            this.getHttpCline();
+            this.initCert(certPassword, certPath, certType);
+            httpResponse = this.httpClient.execute(httpPost);
+            String content = null;
+            if(httpResponse.getStatusLine().getStatusCode() == 200){
+                try {
+                    content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    this.close();
+                }
+            }else{
+                try {
+                    content = "返回状态码:" + httpResponse.getStatusLine() + "。" + EntityUtils.toString(httpResponse.getEntity());
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    this.close();
+                }
+            }
+            this.close();
+            return content;
+        } catch (IOException e) {
+            e.printStackTrace();
+            this.close();
+        }
+        return null;
+    }
+
+
+    /**
+     * 初始化https对象(带证书)
+     * @param key       证书密码
+     * @param certPath  证书路径
+     * @param certType  证书类型
+     * @throws Exception
+     */
+    private void initCert(String key, String certPath, String certType) throws Exception {
+        KeyStore keyStore = KeyStore.getInstance(certType);
+//        ClassPathResource cp = new ClassPathResource(certPath);
+        InputStream inputStream = new FileInputStream(new File(certPath));
+//        InputStream instream = cp.getInputStream();
+        try {
+            keyStore.load(inputStream, key.toCharArray());
+        } finally {
+            inputStream.close();
+        }
+        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build();
+        SSLConnectionSocketFactory sslsf =
+                new SSLConnectionSocketFactory(sslcontext, null, null,
+                        SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+        this.httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
+    }
+
+
+    /**
+     * 关闭资源
+     */
+    private void close(){
+        try {
+            if(null != httpClient){
+                httpClient.close();
+            }
+            if(null != httpResponse){
+                httpResponse.close();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            try {
+                if(null != httpClient){
+                    httpClient.close();
+                }
+                if(null != httpResponse){
+                    httpResponse.close();
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HuaWeiSMSUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HuaWeiSMSUtil.java
new file mode 100644
index 0000000..88b9753
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HuaWeiSMSUtil.java
@@ -0,0 +1,170 @@
+package com.stylefeng.guns.modular.system.util;
+
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.http.HttpHeaders;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.methods.RequestBuilder;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+
+import java.nio.charset.Charset;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+//如果JDK版本是1.8,可使用原生Base64类
+public class HuaWeiSMSUtil {
+
+    //无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值
+    private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"";
+    //无需修改,用于格式化鉴权头域,给"Authorization"参数赋值
+    private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\"";
+
+
+
+    /**
+     * 调用短信
+     * @param code  入参
+     * @param phone 接收短信手机号
+     * @param sender 国内短信签名通道号或国际/港澳台短信通道号
+     * @param templateId  模板ID
+     * @throws Exception
+     */
+    public static void sendSms(String code,String phone,String sender,String templateId) throws Exception{
+        //必填,请参考"开发准备"获取如下数据,替换为实际值
+        String url = "https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1"; //APP接入地址+接口访问URI
+        String appKey = "7TK0Mo5YEF220G1pNF6fOwH6uEql"; //APP_Key
+        String appSecret = "HTqSmIR0buStzPwSQrhfFNE7psCm"; //APP_Secret
+
+        //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
+        //国际/港澳台短信不用关注该参数
+        String signature = "未来出行"; //签名名称
+
+        //必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔
+        String receiver = "+86" + phone; //短信接收人号码
+
+        //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
+        String statusCallBack = "";
+
+        /**
+         * 选填,使用无变量模板时请赋空值 String templateParas = "";
+         * 单变量模板示例:模板内容为"您的验证码是${NUM_6}"时,templateParas可填写为"[\"369751\"]"
+         * 双变量模板示例:模板内容为"您有${NUM_2}件快递请到${TXT_20}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]"
+         * ${DATE}${TIME}变量不允许取值为空,${TXT_20}变量可以使用英文空格或点号替代空值,${NUM_6}变量可以使用0替代空值
+         * 查看更多模板和变量规范:产品介绍>模板和变量规范
+         */
+        String templateParas = code; //模板变量
+
+        //请求Body,不携带签名名称时,signature请填null
+        String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature);
+        if (null == body || body.isEmpty()) {
+            System.out.println("body is null.");
+            return;
+        }
+
+        //请求Headers中的X-WSSE参数值
+        String wsseHeader = buildWsseHeader(appKey, appSecret);
+        if (null == wsseHeader || wsseHeader.isEmpty()) {
+            System.out.println("wsse header is null.");
+            return;
+        }
+
+        //如果JDK版本低于1.8,可使用如下代码
+        //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
+        //CloseableHttpClient client = HttpClients.custom()
+        //        .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+        //            @Override
+        //            public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+        //                return true;
+        //            }
+        //        }).build()).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();
+
+        //如果JDK版本是1.8,可使用如下代码
+        //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
+        CloseableHttpClient client = HttpClients.custom()
+                .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null,
+                        (x509CertChain, authType) -> true).build())
+                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
+                .build();
+
+        HttpResponse response = client.execute(RequestBuilder.create("POST")//请求方法POST
+                .setUri(url)
+                .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded")
+                .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE)
+                .addHeader("X-WSSE", wsseHeader)
+                .setEntity(new StringEntity(body)).build());
+
+        System.out.println(response.toString()); //打印响应头域信息
+        System.out.println(EntityUtils.toString(response.getEntity())); //打印响应消息实体
+    }
+
+    /**
+     * 构造请求Body体
+     * @param sender
+     * @param receiver
+     * @param templateId
+     * @param templateParas
+     * @param statusCallbackUrl
+     * @param signature | 签名名称,使用国内短信通用模板时填写
+     * @return
+     */
+    static String buildRequestBody(String sender, String receiver, String templateId, String templateParas,
+                                   String statusCallbackUrl, String signature) {
+        if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty()
+                || templateId.isEmpty()) {
+            System.out.println("buildRequestBody(): sender, receiver or templateId is null.");
+            return null;
+        }
+        List<NameValuePair> keyValues = new ArrayList<NameValuePair>();
+
+        keyValues.add(new BasicNameValuePair("from", sender));
+        keyValues.add(new BasicNameValuePair("to", receiver));
+        keyValues.add(new BasicNameValuePair("templateId", templateId));
+        if (null != templateParas && !templateParas.isEmpty()) {
+            keyValues.add(new BasicNameValuePair("templateParas", templateParas));
+        }
+        if (null != statusCallbackUrl && !statusCallbackUrl.isEmpty()) {
+            keyValues.add(new BasicNameValuePair("statusCallback", statusCallbackUrl));
+        }
+        if (null != signature && !signature.isEmpty()) {
+            keyValues.add(new BasicNameValuePair("signature", signature));
+        }
+
+        return URLEncodedUtils.format(keyValues, Charset.forName("UTF-8"));
+    }
+
+    /**
+     * 构造X-WSSE参数值
+     * @param appKey
+     * @param appSecret
+     * @return
+     */
+    static String buildWsseHeader(String appKey, String appSecret) {
+        if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) {
+            System.out.println("buildWsseHeader(): appKey or appSecret is null.");
+            return null;
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+        String time = sdf.format(new Date()); //Created
+        String nonce = UUID.randomUUID().toString().replace("-", ""); //Nonce
+
+        byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret);
+        String hexDigest = Hex.encodeHexString(passwordDigest);
+
+        //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码
+        String passwordDigestBase64Str = Base64.getEncoder().encodeToString(hexDigest.getBytes()); //PasswordDigest
+        //如果JDK版本低于1.8,请加载三方库提供Base64类,并使用如下代码
+        //String passwordDigestBase64Str = Base64.encodeBase64String(hexDigest.getBytes(Charset.forName("utf-8"))); //PasswordDigest
+        //若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正
+        //passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", "");
+
+        return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ICBCPayUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ICBCPayUtil.java
new file mode 100644
index 0000000..0c1ccb7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ICBCPayUtil.java
@@ -0,0 +1,673 @@
+//package com.stylefeng.guns.modular.system.util;
+//
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import com.icbc.api.DefaultIcbcClient;
+//import com.icbc.api.IcbcApiException;
+//import com.icbc.api.IcbcConstants;
+//import com.icbc.api.request.*;
+//import com.icbc.api.response.*;
+//import com.icbc.api.utils.IcbcSignature;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//import org.springframework.web.client.RestTemplate;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//import java.io.PrintWriter;
+//import java.math.BigDecimal;
+//import java.net.Inet4Address;
+//import java.net.InetAddress;
+//import java.net.UnknownHostException;
+//import java.text.SimpleDateFormat;
+//import java.util.*;
+//
+///**
+// * 工商银行支付工具类
+// */
+//@Component
+//public class ICBCPayUtil {
+//
+//    private String app_id = "10000000000003159405";
+//
+//    private String privateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCBnf5bNOMF106sxlN6reQKs4wvUpnvRxXxFCzm13Bz70V6Oldx0EF4mFw/LCXMxwftGEanzjXOwDdk9apVeIYjedb8jsBjgwlREVLmpe3kFo65DedEao3MykpoXrm9kt8FPuxLAkTbfFuqim9f+nruXP1DA7cLt3N4PEzsfDA/WG4wXJgqWkHJaDbzcJOEX7pNZXWtTjoMznKufELsUEf3sdX+9/anIyObmq2+kv2w8H5RcRxBY+2M4K8Hd3Zf9u2Ffvr/phOsUB14XLrjfdXeWbZzHtHfGlfIQf5EK9HySEcaQHMHluEQSkriHdW7dlanIzzLY9M0lH+2Ok9j3Yp5AgMBAAECggEAVnHEfZecAP1DXz811Y+7kteEGtuABnDmVU4bVClCuk9NiuL2BtXZlFAo1Yjf/N6QjrOuC6Qfhq/zQcYFv9MNwwMzOmUKMlPmFsby/xiSu5e/v/Nh1eMqhvYzAcCLJ7+YNattc+kjey5JBEgnV196NRaXYeZMYegLfpjYxK9ejh+85kxp9ElXxZsSwrgzvICtyZ0Bl2ZD28kXr9/89dNIQX5sWRBN/dpxj99Ctz3JtlaMhxdnZ3cZKLeIAIAYFtqw5lSqeL7/7a6LPGpNa0kA+8KvHNEAnkpcEFg427k7h7nerFl2PQV/y5LuRLbUMZkdaIoo25Sh90xhtwfGCTAkcQKBgQC71mNkQL5HPYJbRirG3CjbLRAubztzlqtTSE/RZnPNiIinwACWZVHQ7Ob2+WLaIEOqIq6h1zWyYFO+peFNfCbcdZTfQHxiYfmzrY7ZlBtRJM3ez20RQ85TJvej08HjTM4vVKXt9DDqlBu4IATcmNlJqgBKeNXsDYORTNqTZlrocwKBgQCwpxdmd2yhRIrWXx9K4lZYfpGEUUMKrCI2SGX0bdiNtgn2p2HK3cDVO/gh8Iz6tKLI53HS3OTTsVZq1xoUm3M+27sPUk6KiUBQqOsDmYVayKjOY2IciwU0SmS/9C9ptYpchUrZSR7mejKvk7QKBkH3utBUnfYCQmqhyAnjHBhCYwKBgHBVxNc+CQ3d8UnY6thG7oA1sQm0KB/2qbuC8YlP9k2jK+b24uMO8SE7rN1jRAUjapQjbcEITerBxROtbNLEPxF1mHTzwe+snIMidt4Uv0mF80EfWCENJiWAlnV5vOjNFDomK53lfiOsM++n5oBvQPPXIZloLrefVWHeTpH8kr2VAoGAbB+JqhT0r2yVkgqcy6fnc7jcdmGKqFCdjB4aEVbekjZWuNrQd2vtaFaRVKy4jYbckB1hRNAhWxUTMMfB1dUj39h8ES+ulQrXC8eoOQbRYbSp5dFcrt3EbLIQIpFiJ9CPBHwtSPuBZ05qEZ9VNkGIRQnaE8CvX8ipHaajrpd2ncMCgYAdjW2LFmc+K9tai8idbhEu1uzez+HPT8PgE5iy6ZE8gxQvzUdHaqgO+OgNhWEY+QJOEyM0YJuidaN9qiTiWJHs04/03qAy1wCZCYhvHuRMh1mPvqdA9ybUmG/K0bMqkqS9B2GxKQPtlnmeUG/pXjQ12U8WrS2ayjDoHBtimuxkIQ==";
+//
+//    private String icbcPulicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMpjaWjngB4E3ATh+G1DVAmQnIpiPEFAEDqRfNGAVvvH35yDetqewKi0l7OEceTMN1C6NPym3zStvSoQayjYV+eIcZERkx31KhtFu9clZKgRTyPjdKMIth/wBtPKjL/5+PYalLdomM4ONthrPgnkN4x4R0+D4+EBpXo8gNiAFsNwIDAQAB";
+//
+//    private String mer_id = "210541210043";//商户编号
+//
+//    private String mer_id1 = "210541210044";//商户编号
+//
+//    private String mer_prtcl_no = "2105412100430201";//收单产品协议编号
+//
+//    private String mer_acct = "2105402019300157124";//商户账号,商户入账账号,只能交易时指定。(商户付给银行手续费的账户,可以在开户的时候指定,也可以用交易指定方式;用交易指定方式则使用此商户账号)目前暂不支持
+//
+//    private String wx_appid_user = "wx0071ebcb539570f8";
+//
+//    private String wx_appid_driver = "wx65d2c03f04352f90";
+//
+//    private String wx_appid_user1 = "wx7608ef3dae49b691";//小程序
+//
+//    private String ali_appid_user = "2016120203722668";
+//
+//    private String ali_appid_driver = "2021001165630930";
+//
+//    private String payer_account = "2105455809300020994";//银行账户
+//
+//    private String payer_cnname = "广西云森科技有限公司";//账户名称
+//
+//    @Autowired
+//    private JuHeUtil juHeUtil;
+//
+//    @Autowired
+//    private HttpClientUtil httpClientUtil;
+//
+//    @Autowired
+//    private RestTemplate restTemplate;
+//
+//    private String bank = "{\"CDB\":\"国家开发银行\",\"ICBC\":\"中国工商银行\",\"ABC\":\"中国农业银行\",\"BOC\":\"中国银行\",\"CCB\":\"中国建设银行\",\"PSBC\":\"中国邮政储蓄银行\",\"COMM\":\"交通银行\",\"CMB\":\"招商银行\",\"SPDB\":\"上海浦东发展银行\",\"CIB\":\"兴业银行\",\"HXBANK\":\"华夏银行\",\"GDB\":\"广东发展银行\",\"CMBC\":\"中国民生银行\",\"CITIC\":\"中信银行\",\"CEB\":\"中国光大银行\",\"EGBANK\":\"恒丰银行\",\"CZBANK\":\"浙商银行\",\"BOHAIB\":\"渤海银行\",\"SPABANK\":\"平安银行\",\"SHRCB\":\"上海农村商业银行\",\"YXCCB\":\"玉溪市商业银行\",\"YDRCB\":\"尧都农商行\",\"BJBANK\":\"北京银行\",\"SHBANK\":\"上海银行\",\"JSBANK\":\"江苏银行\",\"HZCB\":\"杭州银行\",\"NJCB\":\"南京银行\",\"NBBANK\":\"宁波银行\",\"HSBANK\":\"徽商银行\",\"CSCB\":\"长沙银行\",\"CDCB\":\"成都银行\",\"CQBANK\":\"重庆银行\",\"DLB\":\"大连银行\",\"NCB\":\"南昌银行\",\"FJHXBC\":\"福建海峡银行\",\"HKB\":\"汉口银行\",\"WZCB\":\"温州银行\",\"QDCCB\":\"青岛银行\",\"TZCB\":\"台州银行\",\"JXBANK\":\"嘉兴银行\",\"CSRCB\":\"常熟农村商业银行\",\"NHB\":\"南海农村信用联社\",\"CZRCB\":\"常州农村信用联社\",\"H3CB\":\"内蒙古银行\",\"SXCB\":\"绍兴银行\",\"SDEB\":\"顺德农商银行\",\"WJRCB\":\"吴江农商银行\",\"ZBCB\":\"齐商银行\",\"GYCB\":\"贵阳市商业银行\",\"ZYCBANK\":\"遵义市商业银行\",\"HZCCB\":\"湖州市商业银行\",\"DAQINGB\":\"龙江银行\",\"JINCHB\":\"晋城银行JCBANK\",\"ZJTLCB\":\"浙江泰隆商业银行\",\"GDRCC\":\"广东省农村信用社联合社\",\"DRCBCL\":\"东莞农村商业银行\",\"MTBANK\":\"浙江民泰商业银行\",\"GCB\":\"广州银行\",\"LYCB\":\"辽阳市商业银行\",\"JSRCU\":\"江苏省农村信用联合社\",\"LANGFB\":\"廊坊银行\",\"CZCB\":\"浙江稠州商业银行\",\"DYCB\":\"德阳商业银行\",\"JZBANK\":\"晋中市商业银行\",\"BOSZ\":\"苏州银行\",\"GLBANK\":\"桂林银行\",\"URMQCCB\":\"乌鲁木齐市商业银行\",\"CDRCB\":\"成都农商银行\",\"ZRCBANK\":\"张家港农村商业银行\",\"BOD\":\"东莞银行\",\"LSBANK\":\"莱商银行\",\"BJRCB\":\"北京农村商业银行\",\"TRCB\":\"天津农商银行\",\"SRBANK\":\"上饶银行\",\"FDB\":\"富滇银行\",\"CRCBANK\":\"重庆农村商业银行\",\"ASCB\":\"鞍山银行\",\"NXBANK\":\"宁夏银行\",\"BHB\":\"河北银行\",\"HRXJB\":\"华融湘江银行\",\"ZGCCB\":\"自贡市商业银行\",\"YNRCC\":\"云南省农村信用社\",\"JLBANK\":\"吉林银行\",\"DYCCB\":\"东营市商业银行\",\"KLB\":\"昆仑银行\",\"ORBANK\":\"鄂尔多斯银行\",\"XTB\":\"邢台银行\",\"JSB\":\"晋商银行\",\"TCCB\":\"天津银行\",\"BOYK\":\"营口银行\",\"JLRCU\":\"吉林农信\",\"SDRCU\":\"山东农信\",\"XABANK\":\"西安银行\",\"HBRCU\":\"河北省农村信用社\",\"NXRCU\":\"宁夏黄河农村商业银行\",\"GZRCU\":\"贵州省农村信用社\",\"FXCB\":\"阜新银行\",\"HBHSBANK\":\"湖北银行黄石分行\",\"ZJNX\":\"浙江省农村信用社联合社\",\"XXBANK\":\"新乡银行\",\"HBYCBANK\":\"湖北银行宜昌分行\",\"LSCCB\":\"乐山市商业银行\",\"TCRCB\":\"江苏太仓农村商业银行\",\"BZMD\":\"驻马店银行\",\"GZB\":\"赣州银行\",\"WRCB\":\"无锡农村商业银行\",\"BGB\":\"广西北部湾银行\",\"GRCB\":\"广州农商银行\",\"JRCB\":\"江苏江阴农村商业银行\",\"BOP\":\"平顶山银行\",\"TACCB\":\"泰安市商业银行\",\"CGNB\":\"南充市商业银行\",\"CCQTGB\":\"重庆三峡银行\",\"XLBANK\":\"中山小榄村镇银行\",\"HDBANK\":\"邯郸银行\",\"KORLABANK\":\"库尔勒市商业银行\",\"BOJZ\":\"锦州银行\",\"QLBANK\":\"齐鲁银行\",\"BOQH\":\"青海银行\",\"YQCCB\":\"阳泉银行\",\"SJBANK\":\"盛京银行\",\"FSCB\":\"抚顺银行\",\"ZZBANK\":\"郑州银行\",\"SRCB\":\"深圳农村商业银行\",\"BANKWF\":\"潍坊银行\",\"JJBANK\":\"九江银行\",\"JXRCU\":\"江西省农村信用\",\"HNRCU\":\"河南省农村信用\",\"GSRCU\":\"甘肃省农村信用\",\"SCRCU\":\"四川省农村信用\",\"GXRCU\":\"广西省农村信用\",\"SXRCCU\":\"陕西信合\",\"WHRCB\":\"武汉农村商业银行\",\"YBCCB\":\"宜宾市商业银行\",\"KSRB\":\"昆山农村商业银行\",\"SZSBK\":\"石嘴山银行\",\"HSBK\":\"衡水银行\",\"XYBANK\":\"信阳银行\",\"NBYZ\":\"鄞州银行\",\"ZJKCCB\":\"张家口市商业银行\",\"XCYH\":\"许昌银行\",\"JNBANK\":\"济宁银行\",\"CBKF\":\"开封市商业银行\",\"WHCCB\":\"威海市商业银行\",\"HBC\":\"湖北银行\",\"BOCD\":\"承德银行\",\"BODD\":\"丹东银行\",\"JHBANK\":\"金华银行\",\"BOCY\":\"朝阳银行\",\"LSBC\":\"临商银行\",\"BSB\":\"包商银行\",\"LZYH\":\"兰州银行\",\"BOZK\":\"周口银行\",\"DZBANK\":\"德州银行\",\"SCCB\":\"三门峡银行\",\"AYCB\":\"安阳银行\",\"ARCU\":\"安徽省农村信用社\",\"HURCB\":\"湖北省农村信用社\",\"HNRCC\":\"湖南省农村信用社\",\"NYNB\":\"广东南粤银行\",\"LYBANK\":\"洛阳银行\",\"NHQS\":\"农信银清算中心\",\"CBBQS\":\"城市商业银行资金清算中心\"}";
+//
+//
+//
+//    /**
+//     * 统一下单接口
+//     * @param out_trade_no      商户订单号
+//     * @param pay_mode          支付方式,9-微信,10-支付宝
+//     * @param access_type       收单接入方式,5-APP,7-微信公众号,8-支付宝生活号,9-微信小程序
+//     * @param deciveInfo        设备号(设备唯一编号)
+//     * @param body
+//     * @param total_fee
+//     * @param mer_url           回调地址(完整地址)
+//     * @param attach            附加信息
+//     * @param type              支付端类型(1:用户端,2:司机端,3:小程序)
+//     * @throws UnknownHostException
+//     */
+//    public Map<String, String> placeAnOrder(String out_trade_no, Integer pay_mode, Integer access_type, String deciveInfo, String body, Double total_fee, String mer_url, String attach, Integer type, String openId) throws Exception {
+//        //签名类型为RSA时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA,其他参数使用缺省值
+//        DefaultIcbcClient client = new DefaultIcbcClient(app_id, IcbcConstants.SIGN_TYPE_RSA2, privateKey, icbcPulicKey);
+//        CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1 request = new
+//                CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1();
+//        //根据测试环境和生产环境替换相应ip和端口
+//        request.setServiceUrl("https://gw.open.icbc.com.cn/api/cardbusiness/aggregatepay/b2c/online/consumepurchase/V1");
+//        CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1Biz bizContent = new CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1Biz();
+//        request.setBizContent(bizContent);
+//        //请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+//        String format = sdf.format(new Date());
+//        bizContent.setMer_id(mer_id);
+//        bizContent.setOut_trade_no(out_trade_no);
+//        bizContent.setPay_mode(pay_mode.toString());
+//        bizContent.setAccess_type(access_type.toString());
+//        bizContent.setMer_prtcl_no(mer_prtcl_no);
+//        bizContent.setOrig_date_time(format);
+//        bizContent.setDecive_info(deciveInfo);
+//        bizContent.setBody("OK出行-" + body);
+//        bizContent.setFee_type("001");
+//        InetAddress ip4 = Inet4Address.getLocalHost();
+//        bizContent.setSpbill_create_ip(ip4.getHostAddress());
+//        bizContent.setTotal_fee(Double.valueOf(total_fee * 100).intValue() + "");
+//        bizContent.setMer_url(mer_url);
+//        bizContent.setOpen_id("");
+//        bizContent.setShop_appid("");
+//        bizContent.setUnion_id("");
+//        bizContent.setIcbc_appid(app_id);
+//        if(pay_mode == 9){
+//            switch (type){
+//                case 1://用户端
+//                    bizContent.setShop_appid(wx_appid_user);
+//                    break;
+//                case 2://司机端
+//                    bizContent.setShop_appid(wx_appid_driver);
+//                    break;
+//                case 3://小程序
+//                    bizContent.setShop_appid(wx_appid_user1);
+//                    bizContent.setAccess_type("9");
+//                    bizContent.setOpen_id(openId);
+//                    break;
+//            }
+//        }
+//        if(pay_mode == 10){
+//            switch (type){
+//                case 1://用户端
+//                    bizContent.setUnion_id(ali_appid_user);
+//                    break;
+//                case 2://司机端
+//                    bizContent.setUnion_id(ali_appid_driver);
+//                    break;
+//            }
+//        }
+//        bizContent.setMer_acct(mer_acct);
+//        bizContent.setExpire_time("120");
+//        bizContent.setAttach(attach);
+//        bizContent.setNotify_type("HS");
+//        bizContent.setResult_type("0");
+//        bizContent.setPay_limit("no_credit");
+//        bizContent.setOrder_apd_inf("");
+//        CardbusinessAggregatepayB2cOnlineConsumepurchaseResponseV1 response;
+//        response = client.execute(request, System.currentTimeMillis()+"");//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一
+//        Map<String, String> map = new HashMap<>();
+//        if (response.getReturnCode() == 0) {
+//            // 6、业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据
+//            System.err.println("ReturnCode:"+response.getReturnCode());
+//            System.err.println("response:" + JSON.toJSONString(response));
+//            if(pay_mode == 9){//微信
+//                String order_id = response.getOrder_id();//工行订单号
+//                String out_trade_no1 = response.getOut_trade_no();//商户订单号
+//                map.put("order_id", order_id);
+//                map.put("out_trade_no1", out_trade_no1);
+//                map.put("data", response.getWx_data_package());
+//                map.put("code", "200");
+//                map.put("msg", "成功");
+//
+//                return map;
+//            }
+//            if(pay_mode == 10){//支付宝
+//                String order_id = response.getOrder_id();//工行订单号
+//                String out_trade_no1 = response.getOut_trade_no();//商户订单号
+//                map.put("order_id", order_id);
+//                map.put("out_trade_no1", out_trade_no1);
+//                map.put("data", response.getZfb_data_package());
+//                map.put("code", "200");
+//                map.put("msg", "成功");
+//                return map;
+//            }
+//        }
+//        if(response.getReturnCode() == 92209500){
+//            System.err.println("response:" + JSON.toJSONString(response));
+//            System.err.println("ReturnCode:"+response.getReturnCode());
+//            System.err.println("ReturnMsg:"+response.getReturnMsg());
+//            map.put("order_id", "");
+//            map.put("out_trade_no1", "");
+//            map.put("data", "");
+//            map.put("code", "300");
+//            map.put("msg", "支付失败,请过两分钟后再重新支付!");
+//            return map;
+//        }else {
+//            // 失败
+//            System.err.println("response:" + JSON.toJSONString(response));
+//            System.err.println("ReturnCode:"+response.getReturnCode());
+//            System.err.println("ReturnMsg:"+response.getReturnMsg());
+//            map.put("order_id", "");
+//            map.put("out_trade_no1", "");
+//            map.put("data", "");
+//            map.put("code", "300");
+//            map.put("msg", "支付失败");
+//            return map;
+//        }
+//    }
+//
+//
+//
+//
+//    /**
+//     * 查询交易(商户订单号和工行订单号二选其一)
+//     * @param out_trade_no  商户订单号
+//     * @param order_id      工行订单号
+//     * @return
+//     */
+//    public String queryTransaction(String out_trade_no, String order_id){
+//        //签名类型为RSA时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA,其他参数使用缺省值
+//        DefaultIcbcClient client = new DefaultIcbcClient(app_id, IcbcConstants.SIGN_TYPE_RSA2, privateKey, icbcPulicKey);
+//        CardbusinessAggregatepayB2cOnlineOrderqryRequestV1 request = new CardbusinessAggregatepayB2cOnlineOrderqryRequestV1();
+//        //根据测试环境和生产环境替换相应ip和端口
+//        request.setServiceUrl("https://gw.open.icbc.com.cn/api/cardbusiness/aggregatepay/b2c/online/orderqry/V1");
+//        CardbusinessAggregatepayB2cOnlineOrderqryRequestV1.CardbusinessAggregatepayB2cOnlineOrderqryRequestV1Biz bizContent = new
+//                CardbusinessAggregatepayB2cOnlineOrderqryRequestV1.CardbusinessAggregatepayB2cOnlineOrderqryRequestV1Biz();
+//        request.setBizContent(bizContent);
+//        //请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值
+//        bizContent.setMer_id(mer_id);
+//        bizContent.setOut_trade_no(out_trade_no);
+//        bizContent.setOrder_id(order_id);
+//        bizContent.setDeal_flag("0");//操作标志,0-查询;1-关单
+//        bizContent.setIcbc_appid(app_id);
+//        CardbusinessAggregatepayB2cOnlineOrderqryResponseV1 response;
+//        try {
+//            response = client.execute(request, System.currentTimeMillis()+"");//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一
+//            if (response.getReturnCode() == 0) {
+//                // 6、业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据
+//                System.out.println("ReturnCode:"+response.getReturnCode());
+//                System.out.println("response:" + JSON.toJSONString(response));
+//
+//                String pay_status = response.getPay_status();
+//
+//                return pay_status;
+//            } else {
+//                // 失败
+//                System.out.println("response:" + JSON.toJSONString(response));
+//                System.out.println("ReturnCode:"+response.getReturnCode());
+//                System.out.println("ReturnMsg:"+response.getReturnMsg());
+//            }
+//        } catch (IcbcApiException e) {
+//            e.printStackTrace();
+//        }
+//        return "";
+//    }
+//
+//
+//
+//    /**
+//     * 支付回调处理
+//     * @param request
+//     * @return
+//     * @throws Exception
+//     */
+//    public Map<String, String> payCallback(HttpServletRequest request) throws Exception{
+//        String biz_content1 = request.getParameter("biz_content");
+//        JSONObject biz_content = JSON.parseObject(biz_content1);
+//        int return_code = biz_content.getIntValue("return_code");
+//        String return_msg = biz_content.getString("return_msg");
+//        Map<String, String> map = new HashMap<>();
+//        if(return_code == 0){
+//            String out_trade_no = biz_content.getString("out_trade_no");//商家订单编号
+//            String order_id = biz_content.getString("order_id");//工行订单号
+//            String third_trade_no = biz_content.getString("third_trade_no");//第三方订单号(微信/支付宝)
+//            String attach = biz_content.getString("attach");//附加信息
+//            String pay_time = biz_content.getString("pay_time");//支付完成时间"20190112"
+//
+//            map.put("out_trade_no", out_trade_no);
+//            map.put("order_id", order_id);
+//            map.put("third_trade_no", third_trade_no);
+//            map.put("attach", attach);
+//            map.put("pay_time", pay_time);
+//        }else{
+//            System.err.println("支付失败:" + return_msg);
+//        }
+//        return map;
+//    }
+//
+//
+//    /**
+//     * 回调通知应答
+//     * @param response
+//     * @throws Exception
+//     */
+//    public void answer(HttpServletResponse response) throws Exception{
+//        response.setContentType("application/json;charset=UTF-8");
+//        StringBuffer sb = new StringBuffer();
+//        String nativeUUID = UUIDUtil.getNativeUUID();
+//        sb.append("\"response_biz_content\":{\"return_code\":0,\"return_msg\":\"success\",\"msg_id\":\"" + nativeUUID + "\"},\"sign_type\":\"RSA2\"");
+//        String sign = IcbcSignature.sign(sb.toString(), IcbcConstants.SIGN_TYPE_RSA2, privateKey, "UTF-8");
+//        StringBuffer string = new StringBuffer();
+//        string.append("{\"response_biz_content\":{\"return_code\":0,\"return_msg\":\"success\",\"msg_id\":\"" + nativeUUID + "\"},\"sign_type\":\"RSA2\",\"sign\":\"" + sign + "\"}");
+//        PrintWriter out = response.getWriter();
+//        out.write(string.toString());
+//        out.flush();
+//        out.close();
+//    }
+//
+//
+//
+//
+//
+//    /**
+//     * 转账
+//     * @param money             转账金额(分)
+//     * @param payeeAccount      收款账户(默认使用工行账户)
+//     * @param payeeCnname       收款账户名称
+//     * @return
+//     */
+//    public ResultUtil<String> transfer(Long money, String payeeAccount, String payeeCnname) throws Exception{
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+//        SimpleDateFormat sdf_ = new SimpleDateFormat("HHmmssSSS");
+//        Date date = new Date();
+//        String url = "https://gw.open.icbc.com.cn/api/mybank/enterprise/pay/payent/V1";
+//        DefaultIcbcClient client = new DefaultIcbcClient(app_id, IcbcConstants.SIGN_TYPE_RSA2, privateKey, icbcPulicKey);
+//        MybankEnterprisePayPayentRequestV1.MybankEnterprisePayPayentRequestBizV1 bizContent =
+//                new MybankEnterprisePayPayentRequestV1.MybankEnterprisePayPayentRequestBizV1();
+//        MybankEnterprisePayPayentRequestV1 request = new MybankEnterprisePayPayentRequestV1();
+//        // 请对照接⼝⽂档⽤bizContent.setxxx()⽅法对业务上送数据进⾏赋值
+//        bizContent.setTransCode("PAYPER");
+//        bizContent.setCis("210590000448207");//集团CIS号
+//        bizContent.setBankCode("102");//归属银行编号
+//        bizContent.setLoginId("GXYS01.y.2105");//证书ID
+//        bizContent.setTranDate(sdf.format(date));
+//        bizContent.setTranTime(sdf_.format(date));
+//        bizContent.setfSeqno(System.currentTimeMillis() + "");
+//        bizContent.setSettleMode(0);//入账方式。0:逐笔记账;2:并笔记账
+//        bizContent.setInstrCount(1);//总笔数
+//        bizContent.setTotalAmount(new BigDecimal(money));//总金额(分)
+//        ArrayList<MybankEnterprisePayPayentRequestV1.MybankEnterprisePayPayentRequestRdV1> list = new ArrayList<>();
+//        MybankEnterprisePayPayentRequestV1.MybankEnterprisePayPayentRequestRdV1 rd = new MybankEnterprisePayPayentRequestV1.MybankEnterprisePayPayentRequestRdV1();
+//        rd.setiSeqno(UUIDUtil.getRandomCode());//指令顺序号:每笔指令的序号,本包内不重复
+//        rd.setPayType("1");//记账处理方式:1:加急;2:普通;3:跨行快汇。联机批量标志为2-批量时,此字段无意义,上送1即可
+//        rd.setPayerAccount(mer_acct);//本方账户
+//        rd.setPayerCnname(payer_cnname);//本方账户名
+//        rd.setPayeeAccount(payeeAccount);//收方账号
+//        rd.setPayeeCnname(payeeCnname);//收方账户名
+//        rd.setIoFlag("1");//系统内外标志:1:系统内;2:系统外
+//        rd.setCurrency("CNY");
+//        rd.setAmount(new BigDecimal(money));//金额:无正负号,以分为单位
+//        rd.setPurpose("代收款");//用途描述
+//
+//        list.add(rd);
+//        bizContent.setRd(list);
+//        request.setServiceUrl(url);
+//        request.setBizContent(bizContent);
+//        MybankEnterprisePayPayentResponseV1 response = client.execute(request);
+//        if (response.isSuccess()) {
+//            // 业务成功处理
+//            System.err.println("ReturnCode:"+response.getReturnCode());
+//            System.err.println("response:" + JSON.toJSONString(response));
+//            if(response.getReturnCode() == 0){
+//                return ResultUtil.success(response.getSerialNo());
+//            }else{
+//                return ResultUtil.error("转账申请提交失败(" + response.getReturnMsg() + ")");
+//            }
+//        } else {
+//            System.err.println("response:" + JSON.toJSONString(response));
+//            System.err.println("ReturnCode:"+response.getReturnCode());
+//            System.err.println("ReturnMsg:"+response.getReturnMsg());
+//            return ResultUtil.error("转账申请提交失败(" + response.getReturnMsg() + ")");
+//        }
+//    }
+//
+//
+//    /**
+//     * 查询转账交易状态
+//     * @param serialNo      转账申请序列号(转账接口返回)
+//     * @return              -1=查询异常,0=交易成功,1=交易处理中,2=交易拒绝
+//     */
+//    public Integer queryTransfer(String serialNo){
+//        String url = "https://gw.open.icbc.com.cn/api/mybank/enterprise/pay/qpayent/V1";
+//        DefaultIcbcClient client = new DefaultIcbcClient(app_id, IcbcConstants.SIGN_TYPE_RSA2, privateKey, icbcPulicKey);
+//        try {
+//            MybankEnterprisePayQpayentRequestV1.MybankEnterprisePayQpayentRequestBizV1 bizContent =
+//                    new MybankEnterprisePayQpayentRequestV1.MybankEnterprisePayQpayentRequestBizV1();
+//            MybankEnterprisePayQpayentRequestV1 request = new MybankEnterprisePayQpayentRequestV1();
+//            Date date = new Date();
+//            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
+//            SimpleDateFormat sdf2 = new SimpleDateFormat("HHmmssSSS");
+//            bizContent.setTransCode("QPAYPER");//交易代码
+//            bizContent.setTranDate(sdf1.format(date));//交易日期:ERP系统产生,格式是yyyyMMdd
+//            bizContent.setTranTime(sdf2.format(date));//交易时间:ERP系统产生,格式如HHmmssSSS,精确到毫秒
+//            bizContent.setLanguage("zh_CN");
+//            bizContent.setfSeqNo(UUIDUtil.getRandomCode());//指令包序列号:ERP系统产生,一个集团永远不能重复
+//            bizContent.setQryfSeqno("");//待查指令包序列号:判断待查指令包序列号和待查平台交易流水号必须至少有一项有值
+//            bizContent.setQrySerialNo(serialNo);//待查平台交易序列号
+//            request.setServiceUrl(url);
+//            request.setBizContent(bizContent);
+//            MybankEnterprisePayQpayentResponseV1 response = client.execute(request);
+//            if (response.isSuccess()) {
+//                int returnCode = response.getReturnCode();//返回码,交易成功返回0,正表示业务报错,负表示系统报错,负值时须考虑疑帐
+//                String returnMsg = response.getReturnMsg();//返回说明
+//                if(0 == returnCode){
+//                    List<MybankEnterprisePayQpayentResponseV1.MybankEnterprisePayQpayentResponseRdV1> rd = response.getRd();
+//                    MybankEnterprisePayQpayentResponseV1.MybankEnterprisePayQpayentResponseRdV1 bank = rd.get(0);
+//                    String result = bank.getResult();//指令状态:0:提交成功,等待银行处理 1:授权成功, 等待银行处理 2:等待授权 3:等待二次授权 4:等待银行答复 5:主机返回待处理 6:被银行拒绝 7:处理成功 8:指令被拒绝授权 9:银行正在处理 10:预约指令 11:预约取消 86:等待电话核实 95:待核查 98:区域中心通讯可疑
+//                    if(result.equals("7")){//交易成功
+//                        return 0;
+//                    }
+//                    if(result.equals("6") || result.equals("8")){//交易拒绝
+//                        return 2;
+//                    }
+//                    return 1;//交易处理中
+//                }else{
+//                    System.err.println(returnMsg);
+//                    return -1;
+//                }
+//            } else {
+//                return -1;
+//            }
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            return -1;
+//        }
+//    }
+//
+//
+//    /**
+//     * 获取扫码支付二维码(客户扫商户二维码)
+//     * @param out_trade_no      商户系统订单号
+//     * @param order_amt         订单金额
+//     * @param orderTime         订单生成时间
+//     * @param attach            附加信息
+//     * @param notify_url        支付成功回调地址
+//     * @return
+//     * @throws Exception
+//     */
+//    public ResultUtil<Map<String, Object>> generate(String out_trade_no, Double order_amt, Date orderTime, String attach, String notify_url) throws Exception{
+//        order_amt = order_amt * 100;
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+//        SimpleDateFormat sdf1 = new SimpleDateFormat("HHmmss");
+//        //签名类型为RSA2时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA2,其他参数使用缺省值
+//        DefaultIcbcClient client = new DefaultIcbcClient(app_id, IcbcConstants.SIGN_TYPE_RSA2, privateKey, icbcPulicKey);
+//        QrcodeGenerateRequestV2 request = new QrcodeGenerateRequestV2();
+//        request.setServiceUrl("https://gw.open.icbc.com.cn/api/qrcode/V2/generate");
+//        QrcodeGenerateRequestV2.QrcodeGenerateRequestV2Biz bizContent = new QrcodeGenerateRequestV2.QrcodeGenerateRequestV2Biz();
+//        bizContent.setMerId(mer_id1);
+//        bizContent.setStoreCode("21050022636");//E生活编号
+//        bizContent.setOutTradeNo(out_trade_no);
+//        bizContent.setOrderAmt(order_amt.intValue() + "");
+//        bizContent.setTradeDate(sdf.format(orderTime));
+//        bizContent.setTradeTime(sdf1.format(orderTime));
+//        bizContent.setAttach(attach);//该字段非必输项
+//        bizContent.setPayExpire("1200");
+//        bizContent.setNotifyUrl(notify_url);//该字段非必输项
+//        bizContent.setTporderCreateIp(InetAddress.getLocalHost().getHostAddress());
+//        bizContent.setSpFlag("0");//该字段非必输项
+//        bizContent.setNotifyFlag("1");
+//        request.setBizContent(bizContent);
+//        QrcodeGenerateResponseV2 response = client.execute(request, System.currentTimeMillis()+"");
+//        if (response.isSuccess()) {
+//            // 业务成功处理
+//            System.out.println("ReturnCode:"+response.getReturnCode());
+//            System.out.println("response:" + response);
+//            Map<String, Object> map = new HashMap<>();
+//            map.put("qrcode", response.getQrcode());
+//            map.put("attach", response.getAttach());
+//            return ResultUtil.success(map);
+//        } else {
+//            // 失败
+//            System.out.println("ReturnCode:" + response.getReturnCode());
+//            System.out.println("ReturnMsg:" + response.getReturnMsg());
+//            return ResultUtil.error("获取支付二维码失败(" + response.getReturnMsg() + ")");
+//        }
+//    }
+//
+//
+//    /**
+//     * 扫码支付结果查询
+//     * @param out_trade_no  用户订单号
+//     * @param order_id      工行订单号
+//     * @return
+//     */
+//    public String queryGeneratePayState(String out_trade_no, String order_id){
+//        //签名类型为RSA2时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA2,其他参数使用缺省值
+//        DefaultIcbcClient client = new DefaultIcbcClient(app_id, IcbcConstants.SIGN_TYPE_RSA2, privateKey, icbcPulicKey);
+//        QrcodeQueryRequestV2 request = new QrcodeQueryRequestV2();
+//        request.setServiceUrl("https://gw.open.icbc.com.cn/api/qrcode/V2/query");
+//        QrcodeQueryRequestV2.QrcodeQueryRequestV2Biz bizContent = new QrcodeQueryRequestV2.QrcodeQueryRequestV2Biz();
+//        bizContent.setMerId(mer_id);
+//        bizContent.setOutTradeNo(out_trade_no);//该字段非必输项,out_trade_no和order_id选一项上送即可
+//        bizContent.setOrderId(order_id);//该字段非必输项,out_trade_no和order_id选一项上送即可
+//        request.setBizContent(bizContent);
+//        QrcodeQueryResponseV2 response;
+//        try {
+//            response = client.execute(request, System.currentTimeMillis()+"");
+//            if (response.getReturnCode() == 0) {
+//                // 6、业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据
+//                System.out.println("ReturnCode:"+response.getReturnCode());
+//                System.out.println("response:" + JSON.toJSONString(response));
+//
+//                String pay_status = response.getPayStatus();//交易结果标志,0:支付中,1:支付成功,2:支付失败
+//                return pay_status;
+//            } else {
+//                // 失败
+//                System.out.println("response:" + JSON.toJSONString(response));
+//                System.out.println("ReturnCode:"+response.getReturnCode());
+//                System.out.println("ReturnMsg:"+response.getReturnMsg());
+//            }
+//        } catch (IcbcApiException e) {
+//            e.printStackTrace();
+//        }
+//        return "";
+//    }
+//
+//
+//
+//    /**
+//     * 扫码支付成功回调客户扫商户二维码)
+//     * @param request
+//     * @return
+//     * @throws Exception
+//     */
+//    public Map<String, String> generatePayCallback(HttpServletRequest request) throws Exception{
+//        String biz_content1 = request.getParameter("biz_content");
+//        JSONObject biz_content = JSON.parseObject(biz_content1);
+//        int return_code = biz_content.getIntValue("return_code");
+//        String return_msg = biz_content.getString("return_msg");
+//        Map<String, String> map = new HashMap<>();
+//        if(return_code == 0){
+//            String out_trade_no = biz_content.getString("out_trade_no");//商家订单编号
+//            String order_id = biz_content.getString("order_id");//工行订单号
+////            String third_trade_no = biz_content.getString("third_trade_no");//第三方订单号(微信/支付宝)
+//            String attach = biz_content.getString("attach");//附加信息
+//            String pay_time = biz_content.getString("pay_time");//支付完成时间"20190112"
+//
+//            map.put("out_trade_no", out_trade_no);
+//            map.put("order_id", order_id);
+////            map.put("third_trade_no", third_trade_no);
+//            map.put("attach", attach);
+//            map.put("pay_time", pay_time);
+//        }else{
+//            System.err.println("支付失败:" + return_msg);
+//        }
+//        return map;
+//    }
+//
+//
+//
+//
+//    /**
+//     * 退款申请
+//     * @param order_id          工行下单订单号(与“商户系统下单订单号”二选一)
+//     * @param out_trade_no      商户系统下单订单号(与“工行下单订单号”二选一)
+//     * @param ret_total_amt     退款金额
+//     * @param order_apd_inf     附加信息
+//     * @param outtrx_serial_no  外部退货流水号
+//     * @return
+//     * @throws Exception
+//     */
+//    public Map<String, Object> merrefund(String order_id, String out_trade_no, Double ret_total_amt, String order_apd_inf, String outtrx_serial_no) throws Exception{
+//        ret_total_amt = ret_total_amt * 100;
+//        //签名类型为RSA2时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA2,其他参数使用缺省值
+//        DefaultIcbcClient client = new DefaultIcbcClient(app_id, IcbcConstants.SIGN_TYPE_RSA2, privateKey, icbcPulicKey);
+//        CardbusinessAggregatepayB2cOnlineMerrefundRequestV1 request = new CardbusinessAggregatepayB2cOnlineMerrefundRequestV1();
+//        //根据测试环境和生产环境替换相应ip和端口
+//        request.setServiceUrl("https://gw.open.icbc.com.cn/api/cardbusiness/aggregatepay/b2c/online/merrefund/V1");
+//        //请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值
+//        CardbusinessAggregatepayB2cOnlineMerrefundRequestV1.CardbusinessAggregatepayB2cOnlineMerrefundRequestV1Biz bizContent = new
+//                CardbusinessAggregatepayB2cOnlineMerrefundRequestV1.CardbusinessAggregatepayB2cOnlineMerrefundRequestV1Biz();
+//        request.setBizContent(bizContent);
+//        bizContent.setOrder_id(order_id);//消费工行订单号,工行订单号,商户订单号或行内订单号必须其中一个不为空
+//        bizContent.setMer_id(mer_id);//商户编号‐必输项
+//        bizContent.setOut_trade_no(out_trade_no);//商户订单号,工行订单号,商户订单号或行内订单号必须其中一个不为空
+//        bizContent.setOuttrx_serial_no(outtrx_serial_no);//外部退货流水号‐必输项
+//        bizContent.setRet_total_amt(ret_total_amt.intValue() + "");//退货总金额‐必输项
+//        bizContent.setTrnsc_ccy("001");//交易币种‐必输项
+//        bizContent.setOrder_apd_inf(order_apd_inf);//备注信息
+//        bizContent.setIcbc_appid(app_id);
+//        bizContent.setMer_acct("");
+//        CardbusinessAggregatepayB2cOnlineMerrefundResponseV1 response;
+//        Map<String, Object> map = new HashMap<>();
+//        try {
+//            response = client.execute(request, "msgId3");//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一
+//            if (response.isSuccess()) {
+//                // 业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据
+//                System.out.println("ReturnCode:"+response.getReturnCode());
+//                System.out.println("ReturnCode:"+response.getReturnCode());
+//                System.out.println("response:" + response);
+//                map.put("intrx_serial_no", response.getIntrx_serial_no());//退货工行流水号
+//                map.put("code", response.getReturnCode());
+//                map.put("mag", response.getReturnMsg());
+//            } else {
+//                // 失败
+//                System.out.println("ReturnCode:"+response.getReturnCode());
+//                System.out.println("ReturnMsg:"+response.getReturnMsg());
+//                map.put("code", response.getReturnCode());
+//                map.put("mag", response.getReturnMsg());
+//            }
+//        } catch (IcbcApiException e) {
+//            e.printStackTrace();
+//        }
+//        return map;
+//    }
+//
+//
+//    /**
+//     * 退款查询
+//     * @param out_trade_no          商户系统消费下单订单号
+//     * @param order_id              工行消费下单订单号
+//     * @param outtrx_serial_no      商户系统退货编号
+//     * @return
+//     */
+//    public Map<String, Object> refundqry(String out_trade_no, String order_id, String outtrx_serial_no){
+//        // 签名类型为RSA时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA,其他参数使用缺省值
+//        DefaultIcbcClient client = new DefaultIcbcClient(app_id, IcbcConstants.SIGN_TYPE_RSA2, privateKey, icbcPulicKey);
+//        CardbusinessAggregatepayB2cOnlineRefundqryRequestV1 request = new CardbusinessAggregatepayB2cOnlineRefundqryRequestV1();
+//        // 根据测试环境和生产环境替换相应ip和端口
+//        request.setServiceUrl("https://gw.open.icbc.com.cn/api/cardbusiness/aggregatepay/b2c/online/refundqry/V1");
+//        CardbusinessAggregatepayB2cOnlineRefundqryRequestV1.CardbusinessAggregatepayB2cOnlineRefundqryRequestV1Biz bizContent = new
+//                CardbusinessAggregatepayB2cOnlineRefundqryRequestV1.CardbusinessAggregatepayB2cOnlineRefundqryRequestV1Biz();
+//        request.setBizContent(bizContent);
+//        // 请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值
+//        bizContent.setMer_id(mer_id);
+//        bizContent.setOut_trade_no(out_trade_no);
+//        bizContent.setOuttrx_serial_no(outtrx_serial_no);
+//        bizContent.setOrder_id(order_id);
+//        CardbusinessAggregatepayB2cOnlineRefundqryResponseV1 response;
+//        Map<String, Object> map = new HashMap<>();
+//        try {
+//            response = client.execute(request, System.currentTimeMillis() + "");// msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一
+//            if (response.getReturnCode() == 0) {
+//                // 业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据
+//                System.out.println("ReturnCode:" + response.getReturnCode());
+//                System.out.println("response:" + JSON.toJSONString(response));
+//                map.put("code", response.getReturnCode());//0
+//                map.put("msg", response.getReturnMsg());
+//                map.put("pay_status", response.getPay_status());//订单状态说明:0-退货成功;1-退货失败;2-退货状态未知
+//            } else {
+//                // 失败
+//                System.out.println("response:" + JSON.toJSONString(response));
+//                System.out.println("ReturnCode:" + response.getReturnCode());
+//                System.out.println("ReturnMsg:" + response.getReturnMsg());
+//                map.put("code", response.getReturnCode());//0
+//                map.put("msg", response.getReturnMsg());
+//            }
+//        } catch (IcbcApiException e) {
+//            e.printStackTrace();
+//        }
+//        return map;
+//    }
+//
+//
+//
+//
+//    /**
+//     * 获取银行卡号归属地
+//     * @param code
+//     * @return
+//     */
+//    public Map<String, String> queryBank(String code){
+//        String url = "https://bankaddress.shumaidata.com/bankaddress?bankcard=" + code;
+//        Map<String, String> header = new HashMap<>();
+//        header.put("Authorization", "APPCODE b7d32437d08149099457dcb50fb57df2");
+//        String get = httpClientUtil.pushHttpRequset("GET", url, null, header, "form");
+//        JSONObject jsonObject = JSON.parseObject(get);
+//        int code1 = jsonObject.getIntValue("code");
+//        Map<String, String> map = new HashMap<>();
+//        if(code1 == 200){
+//            map.put("msg", "success");
+//            JSONObject data = jsonObject.getJSONObject("data");
+//            map.put("province", data.getString("province"));//开通省
+//            map.put("city", data.getString("city"));//开通市
+//            map.put("abbreviation", data.getString("abbreviation"));//银行英文大写
+//            map.put("type", data.getString("type"));//卡类型(借记卡)
+//            map.put("bank", data.getString("bank"));//总行名称
+//        }else{
+//            map.put("msg", jsonObject.getString("msg"));
+//        }
+//        return map;
+//    }
+//}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JuHeUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JuHeUtil.java
new file mode 100644
index 0000000..88b32ab
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JuHeUtil.java
@@ -0,0 +1,44 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 聚合数据工具类
+ */
+@Component
+public class JuHeUtil {
+
+    @Value("${juhe.appKey}")
+    private String key;
+
+    @Autowired
+    private HttpClientUtil httpClientUtil;
+
+    /**
+     * 身份证号码实名认证
+     * @param name
+     * @param idcard
+     * @return
+     */
+    public boolean idcard(String name, String idcard){
+        Map<String, Object> map = new HashMap<>();
+        map.put("key", key);
+        map.put("idcard", idcard);
+        map.put("realname", name);
+        String content = httpClientUtil.pushHttpRequset("GET", "http://op.juhe.cn/idcard/query", map, new HashMap<>(), "form");
+        System.err.println(content);
+        JSONObject jsonObject = JSON.parseObject(content);
+        if(jsonObject.getIntValue("error_code") == 0){
+            int res = jsonObject.getJSONObject("result").getIntValue("res");
+            return res == 1 ? true : false;
+        }
+        return false;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MD5AndKL.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MD5AndKL.java
new file mode 100644
index 0000000..c97abd6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MD5AndKL.java
@@ -0,0 +1,112 @@
+package com.stylefeng.guns.modular.system.util;
+
+import java.security.MessageDigest;
+
+public class MD5AndKL {
+	
+	/**
+	 * MD5加码。32位
+	 * 
+	 * @param inStr
+	 * @return
+	 */
+	public static String MD5(String inStr) {
+		MessageDigest md5 = null;
+		try {
+			md5 = MessageDigest.getInstance("MD5");
+		} catch (Exception e) {
+			throw new RuntimeException(e.toString());
+		}
+		byte[] md5Bytes = md5.digest(inStr.getBytes());
+		StringBuffer hexValue = new StringBuffer();
+		for (int i = 0; i < md5Bytes.length; i++) {
+			int val = ((int) md5Bytes[i]) & 0xff;
+			if (val < 16) {
+				hexValue.append("0");
+			}
+			hexValue.append(Integer.toHexString(val));
+		}
+		return hexValue.toString();
+	}
+
+	/**
+	 * 可逆的加密算法
+	 * 
+	 * @param inStr
+	 * @return
+	 */
+	public static String KL(String inStr) {
+		char[] a = inStr.toCharArray();
+		for (int i = 0; i < a.length; i++) {
+			a[i] = (char) (a[i] ^ 't');
+		}
+		String s = new String(a);
+		return s;
+	}
+
+	/**
+	 * 加密后解密
+	 * 
+	 * @param inStr
+	 * @return
+	 */
+	public static String JM(String inStr) {
+		char[] a = inStr.toCharArray();
+		for (int i = 0; i < a.length; i++) {
+			a[i] = (char) (a[i] ^ 't');
+		}
+		String k = new String(a);
+		return k;
+	}
+
+
+
+	private static String byteArrayToHexString(byte b[]) {
+		StringBuffer resultSb = new StringBuffer();
+		for (int i = 0; i < b.length; i++)
+			resultSb.append(byteToHexString(b[i]));
+
+		return resultSb.toString();
+	}
+
+	private static String byteToHexString(byte b) {
+		int n = b;
+		if (n < 0)
+			n += 256;
+		int d1 = n / 16;
+		int d2 = n % 16;
+		return hexDigits[d1] + hexDigits[d2];
+	}
+
+	public static String MD5Encode(String origin, String charsetname) {
+		String resultString = null;
+		try {
+			resultString = new String(origin);
+			MessageDigest md = MessageDigest.getInstance("MD5");
+			if (charsetname == null || "".equals(charsetname)){
+				resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
+			}else{
+				resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
+			}
+		} catch (Exception exception) {
+			exception.printStackTrace();
+		}
+		return resultString;
+	}
+
+	private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
+			"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
+
+	public static void main(String args[]) {
+		 
+		System.out.println("MD5后再加密:" + KL(MD5("123456")));
+		System.out.println(MD5("123456"));
+		// System.out.println("加密:" + KL(MD5("123456")));
+		// s = KL(s);
+		// System.out.println("解密:" + KL("81dc9bdb52d04dc20036dbd8313ed055"));
+		// System.out.println("解密:" + JM(KL(s)));
+		// System.out.println("解密为MD5后的:" + KL(KL(MD5(s))));
+		// System.out.println(JM("5d62957bb57d3e49dcf48a0df064be4c"));
+		// System.out.println(MD5AndKL.KL(MD5AndKL.MD5("admin"+"87654321")));
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MinistryOfTransport.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MinistryOfTransport.java
new file mode 100644
index 0000000..e6327bc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MinistryOfTransport.java
@@ -0,0 +1,1063 @@
+package com.stylefeng.guns.modular.system.util;
+
+
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import sun.security.krb5.internal.PAData;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 交通部接口对接
+ */
+@Component
+public class MinistryOfTransport {
+
+    private final String CompanyId = "4502YSGSGK3Y";//公司标识
+
+    private final String Source = "0";//消息来源标识
+
+    private final String url = "http://172.19.5.101:8085";
+
+    @Autowired
+    private HttpClientUtil httpClientUtil;
+
+    private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+
+    private SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
+
+    private SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMddHHmmss");
+
+
+    /**
+     * 上传企业基础信息
+     */
+    public void baseInfoCompany(){
+        String IPCType = "baseInfoCompany";
+        String path = url + "/baseinfo/company";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("CompanyName", "广西云森科技有限公司");//公司名称
+        jsonObject.put("Identifier", "91450200MA5K99GK3Y");//统一社会信用代码
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("BusinessScope", "网络预约出租汽车客运");//经营范围
+        jsonObject.put("ContactAddress", "柳州市柳南区航银路8号万利大厦3楼303室");//通信地址
+        jsonObject.put("EconomicType", "150");//经营业户经济类型
+        jsonObject.put("RegCapital", "壹仟万圆整");//注册资本
+        jsonObject.put("LegalName", "翁克顺");//法人代表姓名
+        jsonObject.put("LegalID", "44052419650805207X");//法人代表身份证号
+        jsonObject.put("LegalPhone", "13907728585");//法人代表电话
+        jsonObject.put("LegalPhoto", "");//法人代表身份证扫描件文件编号
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 2);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 网约车平台公司营运规模信息接口
+     */
+    public void baseInfoCompanyStat(){
+        String IPCType = "baseInfoCompanyStat";
+        String path = url + "/baseinfo/companystat";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("VehicleNum", 0);//平台注册网约车辆数
+        jsonObject.put("DriverNum", 0);//平台注册驾驶员数
+        jsonObject.put("Flag", 2);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 网约车平台公司支付信息
+     */
+    public void baseInfoCompanyPay(){
+        String IPCType = "baseInfoCompanyPay";
+        String path = url + "/baseinfo/companypay";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("PayName", "");//银行或者非银行支付机构名称
+        jsonObject.put("PayId", "");//非银行支付机构支付业务许可证编号
+        jsonObject.put("PayType", "");//支付业务类型
+        jsonObject.put("PayScope", "");//业务覆盖范围
+        jsonObject.put("PrepareBank", "");//备付金存管银行
+        jsonObject.put("CountDate", 1);//结算周期
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 2);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 网约车平台公司服务机构
+     */
+    public void baseInfoCompanyService(){
+        String IPCType = "baseInfoCompanyService";
+        String path = url + "/baseinfo/companyservice";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 450204);//行政区划代码
+        jsonObject.put("ServiceNae", "广西云森科技有限公司");//服务机构名称
+        jsonObject.put("ServiceNo", "");//服务机构代码
+        jsonObject.put("DetailAddress", "柳州市柳南区航银路8号万利大厦3楼303室");//服务机构地址
+        jsonObject.put("ResponsibleName", "");//服务机构负责人姓名
+        jsonObject.put("ResponsiblePhone", "");//负责人联系电话
+        jsonObject.put("ManagerName", "");//服务机构管理人姓名
+        jsonObject.put("ManagerPhone", "");//管理人联系电话
+        jsonObject.put("ContactPhone", "");//服务机构紧急联系电话
+        jsonObject.put("MailAddress", "");//行政文书送达邮寄地址
+        jsonObject.put("CreateDate", 20150918);//服务机构设立日期
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 2);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 网约车平台公司经营许可
+     */
+    public void baseInfoCompanyPermit(){
+        String IPCType = "baseInfoCompanyPermit";
+        String path = url + "/baseinfo/companypermit";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 450204);//许可地行政区划代码
+        jsonObject.put("Certificate", "450200005403");//网络预约出租车经营许可证号
+        jsonObject.put("OperationArea", "广西壮族自治州柳州市城区");//经营区域
+        jsonObject.put("OwnerName", "广西云森科技有限公司");//公司名称
+        jsonObject.put("Organization", "柳州市行政审批据");//发证机构名称
+        jsonObject.put("StartDate", 20180330);//有效期起YYYYMMDD
+        jsonObject.put("StopDate", 20220329);//有效期止YYYYMMDD
+        jsonObject.put("CertifyDate", 0);//初次发证日期YYYYMMDD
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 2);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 网约车平台公司运价信息
+     */
+    public void baseInfoCompanyFare(){
+        String IPCType = "baseInfoCompanyFare";
+        String path = url + "/baseinfo/companyfare";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 450204);//运价适用地行政区划代码
+        jsonObject.put("FareType", "");//运价类型编码(由网约车平台公司统一编码,应确保唯一性)
+        jsonObject.put("FareTypeNote", "");//运价类型说明
+        jsonObject.put("FareValidOn", 0);//运价有效期起YYYYMMDDhhmmss
+        jsonObject.put("FareValidOff", 0);//运价有效止YYYYMMDDhhmmss
+        jsonObject.put("StartFare", 0);//起步价(元)
+        jsonObject.put("StartMile", 0);//起步里程(km)
+        jsonObject.put("UnitPricePerMile", 0);//计程单价(按公里/元)
+        jsonObject.put("UnitPricePerMinute", 0);//计时单价(按分钟/元)
+        jsonObject.put("UpPrice", 0);//单程加价单价(元)
+        jsonObject.put("UpPriceStartMile", 0);//单程加价公里(km)
+        jsonObject.put("MorningPeakTimeOn", "");//营运早高峰时间起(HHmm 24小时)
+        jsonObject.put("MorningPeakTimeOff", "");//营运早高峰时间止(HHmm 24小时)
+        jsonObject.put("EveningPeakTimeOn", "");//营运晚高峰时间起(HHmm 24小时)
+        jsonObject.put("EveningPeakTimeOff", "");//营运晚高峰时间止(HHmm 24小时)
+        jsonObject.put("OtherPeakTimeOn", "");//其他营运高等时间起(HHmm 24小时)
+        jsonObject.put("OtherPeakTineOff", "");//其他营运高等时间止(HHmm 24小时)
+        jsonObject.put("PeakUnitPrice", 0);//高峰时间单程加价单价(元)
+        jsonObject.put("PeakPriceStartMile", 0);//高峰时间单程加价公里(km)
+        jsonObject.put("LowSpeedPriceMinute", 0);//低速计时加价(按分钟 元)
+        jsonObject.put("NightPricePerMile", 0);//夜间费(按公里 元)
+        jsonObject.put("NightPricePerMinute", 0);//夜间费(按分钟 元)
+        jsonObject.put("OtherPrice", 0);//其它加价金额(元)
+
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 2);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 车辆基本信息
+     */
+    public void baseInfoVehicle(){
+        String IPCType = "baseInfoVehicle";
+        String path = url + "/baseinfo/vehicle";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 450204);//车辆所在城市行政区划代码
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("PlateColor", "");//车牌颜色
+        jsonObject.put("Seats", 5);//核定载客位
+        jsonObject.put("Brand", "");//车辆厂牌
+        jsonObject.put("Model", "");//车辆型号
+        jsonObject.put("VehicleType", "");//车辆类型(以机动车行驶证为准)
+        jsonObject.put("OwnerName", "");//车辆所有人(以机动车行驶证为准)
+        jsonObject.put("VehicleColor", "");//车身颜色
+        jsonObject.put("EngineId", "");//发送机号(以机动车行驶证为准)
+        jsonObject.put("VIN", "");//车辆VIN码(以机动车行驶证为准)
+        jsonObject.put("CertifyDateA", 0);//车辆注册日期(以机动车行驶证为准)
+        jsonObject.put("FuelType", "");//车辆燃料类型
+        jsonObject.put("EngineDisplace", "");//发送机排量(毫升)
+        jsonObject.put("PhotoId", "");//车辆照片文件编号
+        jsonObject.put("Certificate", "");//运输证字号
+        jsonObject.put("TransAgency", "");//车辆运输证发证机构
+        jsonObject.put("TransArea", "");//车辆经营区域
+        jsonObject.put("TransDateStart", 0);//车辆运输证有效期起YYYYMMDD
+        jsonObject.put("TransDateStop", 0);//车辆运输证有效期止YYYYMMDD
+        jsonObject.put("CertifyDateB", 0);//车辆初次登记日期
+        jsonObject.put("FixState", "");//车辆维修状态(0:未检修,1:已检修,2:未知)
+        jsonObject.put("NextFixDate", 0);//车辆下次年检时间
+        jsonObject.put("CheckState", "");//车辆年度审验状态
+        jsonObject.put("FeePrintId", "");//发票打印设备序列号
+        jsonObject.put("GPSBrand", "");//卫星定位装置品牌
+        jsonObject.put("GPSModel", "");//卫星定位装置型号
+        jsonObject.put("GPSIMEI", "");//卫星定位装置IMEI号
+        jsonObject.put("GPSInstallDate", 0);//卫星定位设备安装日期YYYYMMDD
+        jsonObject.put("RegisterDate", 0);//报备日期(车辆信息向服务所在地出租车行政主管部门报备日期YYYYMMDD)
+        jsonObject.put("CommercialType", 0);//服务类型(1:网络预约出租车,2:巡游出租汽车,3:私人小客车合乘)
+        jsonObject.put("FareType", "");//运价类型编码(与云间信息中一一对应)
+
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 2);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 车辆保险信息
+     */
+    public void baseInfoVehicleInsurance(){
+        String IPCType = "baseInfoVehicleInsurance";
+        String path = url + "/baseinfo/vehicleinsurance";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("InsurCom", "");//保险公司名称
+        jsonObject.put("InsurNum", "");//保险号
+        jsonObject.put("InsurType", "");//保险类型
+        jsonObject.put("InsurCount", 0);//保险金额(元)
+        jsonObject.put("InsurEff", 0);//保险生效时间YYYYMMDD
+        jsonObject.put("InsurExp", 0);//保险到期时间YYYYMMDD
+
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 网约车车辆里程信息
+     */
+    public void baseInfoVehicleTotalMile(){
+        String IPCType = "baseInfoVehicleTotalMile";
+        String path = url + "/baseinfo/vehicletotalmile";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("TotalMile", 0);//行驶总里程(km)
+
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 驾驶员基本信息
+     */
+    public void baseInfoDriver(){
+        String IPCType = "baseInfoDriver";
+        String path = url + "/baseinfo/driver";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("DriverName", "");//机动车驾驶员姓名
+        jsonObject.put("DriverPhone", "");//驾驶员手机号
+        jsonObject.put("DriverGender", "");//驾驶员性别
+        jsonObject.put("DriverBirthday", 0);//出生日期YYYYMMDD
+        jsonObject.put("DriverNationality", "");//国籍
+        jsonObject.put("DriverNation", "");//驾驶员民族
+        jsonObject.put("DriverMaritalStatus", "");//驾驶员婚姻状况(未婚,已婚,离异)
+        jsonObject.put("DriverLanguageLevel", "");//驾驶员外语能力
+        jsonObject.put("DriverEducation", "");//驾驶员学历
+        jsonObject.put("DriverCensus", "");//户口登记机关名称
+        jsonObject.put("DriverAddress", "");//户口住址或长住地址
+        jsonObject.put("DriverContactAddress", "");//驾驶员通信地址
+        jsonObject.put("PhotoId", "");//驾驶员照片文件编号
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("LicensePhotoId", "");//机动车驾驶证扫描件文件编号
+        jsonObject.put("DriverType", "");//准驾车型
+        jsonObject.put("GetDriverLicenseDate", 0);//初次领取驾驶证日期YYYYMMDD
+        jsonObject.put("DriverLicenseOn", 0);//驾驶证有效期限起YYYYMMDD
+        jsonObject.put("DriverLicenseOff", 0);//驾驶证有效期限止YYYYMMDD
+        jsonObject.put("TaxiDriver", 0);//是否巡游出租汽车驾驶员(1:是,2:否)
+        jsonObject.put("CertificateNo", "");//网络预约出租汽车驾驶员资格证号
+        jsonObject.put("NetworkCarIssueOrganization", "");//网络预约出租汽车驾驶员证发证机构
+        jsonObject.put("NetworkCarIssueDate", 0);//资格证发证日期YYYYMMDD
+        jsonObject.put("GetNetworkCarProofDate", 0);//初次领取资格证日期YYYYMMDD
+        jsonObject.put("NetworkCarProofOn", 0);//资格证有效起始日期YYYYMMDD
+        jsonObject.put("NetworkCarProofOff", 0);//资格证有截止日期YYYYMMDD
+        jsonObject.put("RegisterDate", 0);//报备日期(驾驶员信息向服务所在地出租车行政主管部门报备日期)
+        jsonObject.put("FullTimeDriver", 0);//是否专职驾驶员(1:是,0:否)
+        jsonObject.put("InDriverBlacklist", 0);//是否在驾驶员黑名单内(1:是,0:否)
+        jsonObject.put("CommercialType", 0);//服务类型(1:网络预约出租汽车,2:巡游出租汽车,3:私人小客车合乘)
+        jsonObject.put("ContractCompany", "");//驾驶员合同签署公司
+        jsonObject.put("ContractOn", 0);//合同有效期起YYYYMMDD
+        jsonObject.put("ContractOff", 0);//合同有效期止YYYYMMDD
+        jsonObject.put("EmergencyContact", "");//紧急情况联系人
+        jsonObject.put("EmergencyContactPhone", "");//紧急情况联系人电话
+        jsonObject.put("EmergencyContactAddress", "");//紧急情况联系人通信地址
+
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 网约车驾驶员培训信息
+     */
+    public void baseInfoDriverEducate(){
+        String IPCType = "baseInfoDriverEducate";
+        String path = url + "/baseinfo/drivereducate";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("CourseName", "");//驾驶员培训课程名称
+        jsonObject.put("CourseDate", 0);//培训课程日期YYYYMMDD
+        jsonObject.put("StartTime", "");//培训开始时间
+        jsonObject.put("StopTime", "");//培训结束时间
+        jsonObject.put("Duration", 0);//培训时长
+
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 驾驶员移动终端信息
+     */
+    public void baseInfoDriverApp(){
+        String IPCType = "baseInfoDriverApp";
+        String path = url + "/baseinfo/driverapp";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("DriverPhone", "");//驾驶员手机号
+        jsonObject.put("NetType", 0);//手机运营商(1:中国联通,2:中国移动,3:中国电信,4:其他)
+        jsonObject.put("AppVersion", "");//使用APP版本号
+        jsonObject.put("MapType", 0);//使用地图类型(1:百度地图,2:高德地图,3:其他)
+
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 驾驶员统计信息
+     */
+    public void baseInfoDriverStat(){
+        String IPCType = "baseInfoDriverStat";
+        String path = url + "/baseinfo/driverstat";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("Cycle", 0);//统计周期(统计周期按月,内容填写统计月份YYYYMM)
+        jsonObject.put("OrderCount", 0);//完成订单次数
+        jsonObject.put("TrafficViolationCount", 0);//交通违章次数
+        jsonObject.put("ComplainedCount", 0);//被投诉次数
+
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 乘客基本信息
+     */
+    public void baseInfoPassenger(){
+        String IPCType = "baseInfoPassenger";
+        String path = url + "/baseinfo/passenger";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("RegisterDate", 0);//注册日期YYYYMMDD
+        jsonObject.put("PassengerPhone", "");//乘客手机号
+        jsonObject.put("PassengerName", "");//乘客称谓
+        jsonObject.put("PassengerGender", "");//乘客性别
+
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", Long.valueOf(sdf.format(new Date())));
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 订单发起接口
+     */
+    public void orderCreate(){
+        String IPCType = "orderCreate";
+        String path = url + "/order/create";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 0);//发起第行政区划代码
+        jsonObject.put("OrderId", "");//订单编号
+        jsonObject.put("DepartTime", 0);//预计用车时间YYYYMMDDhhmmss
+        jsonObject.put("OrderTime", 0);//订单发起时间YYYYMMDDhhmmss
+        jsonObject.put("PassengerNote", "");//乘客备注
+        jsonObject.put("Departure", "");//预计出发地点详细地址
+        jsonObject.put("DepLongitude", 0);//预计出发地点经度
+        jsonObject.put("DepLatitude", 0);//预计出发地点纬度
+        jsonObject.put("Destination", "");//预计目的地
+        jsonObject.put("DestLongitude", 0);//预计目的地经度
+        jsonObject.put("DestLatitude", 0);//预计目的地纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("FareType", "");//运价类型编码
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 订单成功接口
+     */
+    public void orderMatch(){
+        String IPCType = "orderMatch";
+        String path = url + "/order/match";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 0);//发起第行政区划代码
+        jsonObject.put("OrderId", "");//订单编号
+        jsonObject.put("Longitude", 0);//车辆经度
+        jsonObject.put("Latitude", 0);//车辆纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("LicenseId", "");//机动车驾驶证编号
+        jsonObject.put("DriverPhone", "");//驾驶员手机号
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("DistributeTime", 0);//派单成功时间YYYYMMDDhhmmss
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 订单撤销接口
+     */
+    public void orderCancel(){
+        String IPCType = "orderCancel";
+        String path = url + "/order/cancel";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 0);//上车地点行政区划代码
+        jsonObject.put("OrderId", "");//订单编号
+        jsonObject.put("OrderTime", 0);//订单时间YYYYMMDDhhmmss
+        jsonObject.put("CancelTime", 0);//订单撤销时间YYYYMMDDhhmmss
+        jsonObject.put("Operator", "");//撤销发起方(1:乘客,2:驾驶员,3:平台公司)
+        jsonObject.put("CancelTypeCode", "");//机动车驾驶证编号
+        jsonObject.put("DriverPhone", "");//撤销类型代码(1:乘客提前撤销,2:驾驶员提前撤销,3:平台公司撤销,4:乘客违约撤销,5:驾驶员违约撤销)
+        jsonObject.put("CancelReason", "");//撤销或违约原因
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 车辆经营上线接口
+     */
+    public void operateLogin(){
+        String IPCType = "operateLogin";
+        String path = url + "/operate/login";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("LoginTime", 0);//车辆经营上线时间YYYYMMDDhhmmss
+        jsonObject.put("Longitude", 0);//上线经度
+        jsonObject.put("Latitude", 0);//上线纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 车辆经营下线接口
+     */
+    public void operateLogout(){
+        String IPCType = "operateLogout";
+        String path = url + "/operate/logout";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("LoginTime", 0);//车辆经营下线时间YYYYMMDDhhmmss
+        jsonObject.put("Longitude", 0);//下线经度
+        jsonObject.put("Latitude", 0);//下线纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 经营出发接口
+     */
+    public void operateDepart(){
+        String IPCType = "operateDepart";
+        String path = url + "/operate/depart";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("OrderId", "");//订单号
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("FareType", "");//运价类型编码
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("DepLongitude", 0);//车辆出发经度
+        jsonObject.put("DepLatitude", 0);//车辆出发纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("DepTime", 0);//上车时间YYYYMMDDhhmmss
+        jsonObject.put("WaitMile", 0);//空驶里程(km)
+        jsonObject.put("WaitTime", 0);//等待时间(秒)
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 经营到达接口
+     */
+    public void operateArrive(){
+        String IPCType = "operateArrive";
+        String path = url + "/operate/arrive";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("OrderId", "");//订单号
+        jsonObject.put("DestLongitude", 0);//车辆到达经度
+        jsonObject.put("DestLatitude", 0);//车辆到达纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("DestTime", 0);//下车时间YYYYMMDDhhmmss
+        jsonObject.put("DriveMile", 0);//载客里程(km)
+        jsonObject.put("DriveTime", 0);//载客时间(秒)
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 经营支付接口
+     */
+    public void operatePay(){
+        String IPCType = "operatePay";
+        String path = url + "/operate/pay";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("OrderId", "");//订单号
+        jsonObject.put("OnArea", 0);//上车位置行政区划代码
+        jsonObject.put("DriverName", "");//机动车驾驶员
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("FareType", "");//运价类型编码(由网约车公司定义,与运价信息接口保持一街)
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("BookDepTime", 0);//预计上车时间YYYYMMDDhhmmss
+        jsonObject.put("WaitTime", 0);//等待时间(秒)
+        jsonObject.put("DepLongitude", 0);//车辆出发经度
+        jsonObject.put("DepLatitude", 0);//车辆出发纬度
+        jsonObject.put("DepArea", "");//上车点
+        jsonObject.put("DepTime", 0);//上车时间YYYYMMDDhhmmss
+        jsonObject.put("DestLongitude", 0);//车辆到达经度
+        jsonObject.put("DestLatitude", 0);//车辆到达纬度
+        jsonObject.put("DestArea", "");//下车地点
+        jsonObject.put("DestTime", 0);//下车时间YYYYMMDDhhmmss
+        jsonObject.put("BookModel", "");//预定车型
+        jsonObject.put("DriveMile", 0);//载客里程(km)
+        jsonObject.put("DriveTime", 0);//载客时间(秒)
+        jsonObject.put("WaitMile", 0);//空驶里程(km)
+        jsonObject.put("FactPrice", 0);//实收金额(元)
+        jsonObject.put("Price", 0);//应收金额(元)
+        jsonObject.put("CashPrice", 0);//现金支付金额(元)
+        jsonObject.put("LineName", "");//电子支付机构
+        jsonObject.put("LinePrice", 0);//电子支付金额(元)
+        jsonObject.put("PosName", "");//POS机支付机构
+        jsonObject.put("PosPrice", 0);//POS机支付金额(元)
+        jsonObject.put("BenfitPrice", 0);//优惠金额(元)
+        jsonObject.put("BookTip", 0);//预约服务费(元)
+        jsonObject.put("PassengerTip", 0);//附加费(元)
+        jsonObject.put("PeakUpPrice", 0);//高峰时段时间加价金额(元)
+        jsonObject.put("NightUpPrice", 0);//夜间时段里程加价金额(元)
+        jsonObject.put("FarUpPrice", 0);//远途加价金额(元)
+        jsonObject.put("OtherUpPrice", 0);//其他加价金额(元)
+        jsonObject.put("PayState", "");//结算状态(0:未结算,1:已结算,2:未知)
+        jsonObject.put("PayTime", 0);//乘客结算时间YYYYMMDDhhmmss
+        jsonObject.put("OrderMatchTime", 0);//订单完成时间YYYYMMDDhhmmss
+        jsonObject.put("InvoiceStatus", "");//发票状态(0:未开票,1:已开票,2:未知)
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 驾驶员定位信息
+     */
+    public void positionDriver(){
+        String IPCType = "positionDriver";
+        String path = url + "/position/driver";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("DriverRegionCode", 0);//行政区划代码
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("PositionTime", 0);//定位时间(时间戳)
+        jsonObject.put("Longitude", 0);//经度
+        jsonObject.put("Latitude", 0);//纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("Direction", 0);//方向角
+        jsonObject.put("Elevation", 0);//海拔高度
+        jsonObject.put("Speed", 0);//瞬时速度(km/h)
+        jsonObject.put("BizStatus", 0);//营运状态(1:载客,2:接单,3:空驶,4:停运)
+        jsonObject.put("OrderId", "");//订单编号
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 车辆定位信息
+     */
+    public void positionVehicle(){
+        String IPCType = "positionVehicle";
+        String path = url + "/position/vehicle";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("VehicleRegionCode", 0);//行政区划代码
+        jsonObject.put("PositionTime", 0);//定位时间(时间戳)
+        jsonObject.put("Longitude", 0);//经度
+        jsonObject.put("Latitude", 0);//纬度
+        jsonObject.put("Speed", 0);//瞬时速度(km/h)
+        jsonObject.put("Direction", 0);//方向角
+        jsonObject.put("Elevation", 0);//海拔高度
+        jsonObject.put("Mileage", 0);//行驶里程(KM)
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("WarnStatus", 0);//预警状态
+        jsonObject.put("VehStatus", 0);//车辆状态
+        jsonObject.put("BizStatus", 0);//营运状态(1:载客,2:接单,3:空驶,4:停运)
+        jsonObject.put("OrderId", "");//订单编号(非营运状态下填"0")
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 乘客评价信息
+     */
+    public void ratedPassenger(){
+        String IPCType = "ratedPassenger";
+        String path = url + "/rated/passenger";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("OrderId", "");//订单号
+        jsonObject.put("EvaluateTime", 0);//评价时间YYYYMMDDhhmms
+        jsonObject.put("ServiceScore", 0);//服务满意度(五分制)
+        jsonObject.put("DriverScore", 0);//驾驶员满意度(五分制)
+        jsonObject.put("VehicleScore", 0);//车辆满意度(五分制)
+        jsonObject.put("Detail", "");//评价内容
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 乘客投诉信息
+     */
+    public void ratedPassengerComplaint(){
+        String IPCType = "ratedPassengerComplaint";
+        String path = url + "/rated/passengercomplaint";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("OrderId", "");//订单号
+        jsonObject.put("ComplaintTime", 0);//投诉时间YYYYMMDDhhmms
+        jsonObject.put("Detail", "");//投诉内容
+        jsonObject.put("Result", "");//处理结果
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+    /**
+     * 驾驶员处罚信息
+     */
+    public void ratedDriverPunish(){
+        String IPCType = "ratedDriverPunish";
+        String path = url + "/rated/driverpunish";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("LicenseId", "");//机动车驾驶证编号
+        jsonObject.put("PunishTime", 0);//处罚时间YYYYMMDDhhmms
+        jsonObject.put("PunishReason", "");//处罚原因
+        jsonObject.put("PunishReault", "");//处罚结果
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 驾驶员信誉信息
+     */
+    public void ratedDriver(){
+        String IPCType = "ratedDriver";
+        String path = url + "/rated/driver";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("LicenseId", "");//机动车驾驶证编号
+        jsonObject.put("Level", 0);//服务质量信誉等级(五分制)
+        jsonObject.put("TestDate", 0);//服务质量信誉考核日期YYYYMMDD
+        jsonObject.put("TestDepartment", "");//服务质量信誉考核机构
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 私人小客车合乘信息服务平台基本信息
+     */
+    public void shareCompany(){
+        String IPCType = "shareCompany";
+        String path = url + "/share/company";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("CompanyName", "");//公司名称
+        jsonObject.put("Identifier", "");//统一社会信用代码
+        jsonObject.put("Address", 0);//注册地行政区划代码
+        jsonObject.put("ContactAddress", "");//通信地址
+        jsonObject.put("EconomicType", "");//经营业户经济类型
+        jsonObject.put("LegalName", "");//法人代表姓名(按照营业执照填写)
+        jsonObject.put("LegalPhone", "");//法人代表电话
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", 1);//更新时间YYYYMMDDhhmmss
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+    /**
+     * 私人小客车合乘驾驶员行程发布接口
+     */
+    public void shareRoute(){
+        String IPCType = "shareRoute";
+        String path = url + "/share/route";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 0);//行政区划代码
+        jsonObject.put("RouteId", "");//驾驶员发起行程编号
+        jsonObject.put("DriverName", "");//驾驶员姓名
+        jsonObject.put("DriverPhone", "");//驾驶员手机号
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("Departure", "");//行程出发地点
+        jsonObject.put("DepLongitude", 0);//车辆出发经度
+        jsonObject.put("DepLatitude", 0);//车辆出发纬度
+        jsonObject.put("Destination", "");//行程到达地点
+        jsonObject.put("DestLongitude", 0);//到达地经度
+        jsonObject.put("DestLatitude", 0);//到达纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("RouteCreateTime", 0);//行程发布时间YYYYMMDDhhmmss
+        jsonObject.put("RouteMile", 0);//行程预计里程(km)
+        jsonObject.put("RouteNote", "");//行程备注
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 此人小客车合乘订单接口
+     */
+    public void shareOrder(){
+        String IPCType = "shareOrder";
+        String path = url + "/share/order";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 0);//行政区划代码
+        jsonObject.put("RouteId", "");//驾驶员发起行程编号
+        jsonObject.put("OrderId", "");//乘客合乘订单号
+        jsonObject.put("BookDepartTime", 0);//预计上车时间YYYYMMDDhhmmss
+        jsonObject.put("Departure", "");//预计上车地点
+        jsonObject.put("DepLongitude", 0);//预计上车地点经度
+        jsonObject.put("DepLatitude", 0);//预计上车地点纬度
+        jsonObject.put("Destination", "");//预计下车地点
+        jsonObject.put("DestLongitude", 0);//预计下车地点经度
+        jsonObject.put("DestLatitude", 0);//预计下车地点纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("OrderEnsureTime", 0);//订单确认时间YYYYMMDDhhmmss
+        jsonObject.put("PassengerNum", 0);//乘客人数
+        jsonObject.put("PassengerNote", "");//乘客备注
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+
+
+    /**
+     * 私人小客车合乘订单支付接口
+     */
+    public void sharePay(){
+        String IPCType = "sharePay";
+        String path = url + "/share/pay";
+        Map<String, Object> data = new HashMap<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyId", CompanyId);
+        jsonObject.put("Address", 0);//行政区划代码
+        jsonObject.put("RouteId", "");//驾驶员发起行程编号
+        jsonObject.put("OrderId", "");//乘客合乘订单号
+        jsonObject.put("DriverPhone", "");//驾驶员手机号
+        jsonObject.put("LicenseId", "");//机动车驾驶证号
+        jsonObject.put("VehicleNo", "");//车辆号牌
+        jsonObject.put("FareType", "");//运价类型编码
+        jsonObject.put("BookDepartTime", 0);//预计上车时间YYYYMMDDhhmmss
+        jsonObject.put("DepartTime", 0);//实际上车时间YYYYMMDDhhmmss
+        jsonObject.put("Departure", "");//上车地点
+        jsonObject.put("DepLongitude", 0);//上车地点经度
+        jsonObject.put("DepLatitude", 0);//上车地点纬度
+        jsonObject.put("DestTime", 0);//下车时间YYYYMMDDhhmmss
+        jsonObject.put("Destination", "");//下车地点
+        jsonObject.put("DestLongitude", 0);//下车地点经度
+        jsonObject.put("DestLatitude", "");//下车地点纬度
+        jsonObject.put("Encrypt", 0);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("DriveMile", 0);//载客里程(km)
+        jsonObject.put("DriveTime", 0);//载客时间(秒)
+        jsonObject.put("FactPrice", 0);//实收金额(元)
+        jsonObject.put("Price", 0);//应收金额(元)
+        jsonObject.put("CashPrice", 0);//现金支付金额(元)
+        jsonObject.put("LineName", "");//电子支付机构
+        jsonObject.put("LinePrice", 0);//电子支付金额(元)
+        jsonObject.put("BenfitPrice", 0);//优惠金额(元)
+        jsonObject.put("ShareFuelFee", 0);//燃料成本分摊金额(元)
+        jsonObject.put("ShareHighwayToll", 0);//路桥通行分摊金额(元)
+        jsonObject.put("PassengerTip", 0);//附加费(元)
+        jsonObject.put("ShareOther", 0);//其他费用分摊金额(元)
+        jsonObject.put("PayState", 0);//结算状态(0:未结算,1:已结算,2:未知)
+        jsonObject.put("PassengerNum", 0);//乘客人数(元)
+        jsonObject.put("PayTime", 0);//乘客结算时间YYYYMMDDhhmmss
+        jsonObject.put("OrderMatchTime", 0);//订单完成时间YYYYMMDDhhmmss
+
+        data.put("CompanyId", CompanyId);
+        data.put("Source", Source);
+        data.put("IPCType", IPCType);
+        data.put("baseInfoCompany", jsonObject);
+        String s = httpClientUtil.pushHttpRequset("POST", path, data, null, "json");
+        System.err.println(s);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ObsUploadUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ObsUploadUtil.java
new file mode 100644
index 0000000..fbdb85c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ObsUploadUtil.java
@@ -0,0 +1,76 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.obs.services.ObsClient;
+import com.obs.services.model.ObjectMetadata;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+
+public class ObsUploadUtil {
+	//OBS图片访问域名
+	public static String endPoint = "obs.cn-southwest-2.myhuaweicloud.com";
+	public static String accessKeyId = "OQZYM4VGF42OBXL5DLSI";
+	public static String accessKeySecret = "gSFrPUZ59go8gunBxeL9Stnh9AqZ2EiQzQADRowr";
+	public static String bucketName = "huanqiucx";
+	public static String oss_domain = "https://huanqiucx.obs.cn-southwest-2.myhuaweicloud.com/";
+
+
+	// 创建ObsClient实例
+	public static ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endPoint);
+
+	public static String obsUpload(HttpServletRequest request,  MultipartFile file) throws IOException{
+		//CommonsMultipartFile file = (CommonsMultipartFile)multipartFile;
+		String fileName = "";
+		if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
+			InputStream content = file.getInputStream();//获得指定文件的输入流
+			ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
+			meta.setContentLength(file.getSize());  // 必须设置ContentLength
+			String originalFilename = file.getOriginalFilename();
+			fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
+			obsClient.putObject(bucketName,"admin/"+fileName,content,meta);// 上传Object.
+			if(fileName != null && !"".equals(fileName)){
+				System.out.println(fileName);
+				fileName = oss_domain+"admin/"+fileName;
+			}
+		}
+		return fileName;
+	}
+
+	/**
+	 * 删除某个Object
+	 *
+	 * @param bucketUrl
+	 * @return
+	 */
+	public static boolean deleteObject(String bucketUrl) {
+		try {
+			bucketUrl=bucketUrl.replace(oss_domain+"web","");
+			// 删除Object.
+			obsClient.deleteObject(bucketName, bucketUrl);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return false;
+		} finally {
+			//ossClient.shutdown();
+		}
+		return true;
+	}
+	
+//	 public static void createBucket(String bucketName)
+//     {
+//         //初始化 OSSClient
+////          ossClient = new OssClient(endPoint, accessKeyId, accessKeySecret);
+//
+//         // 新建一个Bucket
+//         Bucket bucket = ossClient.createBucket(bucketName);
+//         System.out.println(bucket.getName());
+//         System.out.println(bucket.getCreationDate());
+//     }
+//	 
+//	 public static void main(String[] args) {
+//		 OssUploadUtil.createBucket("ssfdfsd");
+//	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java
new file mode 100644
index 0000000..87a9703
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java
@@ -0,0 +1,57 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.ObjectMetadata;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+
+public class OssUploadUtil {
+	//OSS图片访问域名
+	public static String oss_domain = "http://bao-weiqing.oss-cn-hangzhou.aliyuncs.com/";
+	public static String accessKeyId = "LTAI5tR4whv88Y5CUucCJEu6";
+	public static String accessKeySecret = "2fObO6LE6U2OzrUfXw9YBlQWHohFvg";
+	public static String bucketName="bao-weiqing";
+	public static String endpoint = "oss-cn-hangzhou.aliyuncs.com";
+
+	public static OSSClient ossClient = new OSSClient(endpoint, accessKeyId,accessKeySecret);
+
+	public static String ossUpload(HttpServletRequest request, MultipartFile file) throws IOException{
+		String fileName = "";
+		if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
+			InputStream content = file.getInputStream();//获得指定文件的输入流
+			ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
+			meta.setContentLength(file.getSize());  // 必须设置ContentLength
+			String originalFilename = file.getOriginalFilename();
+			fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
+			ossClient.putObject(bucketName,"img/"+fileName,content,meta);// 上传Object.
+			if(fileName != null && !"".equals(fileName)){
+				System.out.println(fileName);
+				fileName = oss_domain+"img/"+fileName;
+			}
+		}
+		return fileName;
+	}
+
+	public static String ossUpload(MultipartFile file) throws IOException{
+		//CommonsMultipartFile file = (CommonsMultipartFile)multipartFile;
+		String fileName = "";
+		if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
+			InputStream content = file.getInputStream();//获得指定文件的输入流
+			ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
+			meta.setContentLength(file.getSize());  // 必须设置ContentLength
+			String originalFilename = file.getOriginalFilename();
+			fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
+			ossClient.putObject(bucketName,"img/"+fileName,content,meta);// 上传Object.
+			if(fileName != null && !"".equals(fileName)){
+				System.out.println(fileName);
+				fileName = oss_domain+"img/"+fileName;
+			}
+		}
+		return fileName;
+	}
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java
new file mode 100644
index 0000000..3874a8c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java
@@ -0,0 +1,1210 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.CertAlipayRequest;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.domain.AlipayTradeAppPayModel;
+import com.alipay.api.domain.AlipayTradeRefundModel;
+import com.alipay.api.request.*;
+import com.alipay.api.response.*;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.apache.commons.collections.map.HashedMap;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.math.BigDecimal;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.Security;
+import java.util.*;
+
+/**
+ * 第三方支付工具类
+ */
+@Component
+public class PayMoneyUtil {
+
+    @Value("${alipay.appid}")
+    private String aliAppid;//支付宝appid
+
+    @Value("${alipay.appPrivateKey}")
+    private String appPrivateKey;//支付宝开发者应用私钥
+
+    @Value("${alipay.alipayPublicKey}")
+    private String alipayPublicKey;//支付宝应用公钥
+
+    @Value("${alipay.alipay_public_key}")
+    private String alipay_public_key;//支付宝支付公钥
+
+    @Value("${wx.appid}")
+    private String appid;//微信appid
+
+    @Value("${wx.appletsAppid}")
+    private String appletsAppid;//微信小程序appid
+
+    @Value("${wx.mchId}")
+    private String mchId;//微信商户号
+
+    @Value("${wx.key}")
+    private String key;//微信商户号
+
+    @Value("${callbackPath}")
+    private String callbackPath;//支付回调网关地址
+
+    private String app_cert_path = "/usr/local/server/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_root_cert_path = "/usr/local/server/cer/zhifubao/user/alipay_root_cert_path.crt";//支付宝CA根证书文件路径
+
+    @Autowired
+    private HttpClientUtil httpClientUtil;
+
+    private Map<String, JSONObject> order = new HashMap<>();//存储支付订单用于主动查询支付结果
+
+
+    /**
+     * 支付宝支付
+     */
+    public ResultUtil alipay(String body, String subject, String passbackParams, String outTradeNo, String amount, String notifyUrl){
+//        //构造client
+//        CertAlipayRequest certAlipayRequest = new CertAlipayRequest ();
+//        //设置网关地址
+//        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
+//        //设置应用Id
+//        certAlipayRequest.setAppId(aliAppid);
+//        //设置应用私钥
+//        certAlipayRequest.setPrivateKey(appPrivateKey);
+//        //设置请求格式,固定值json
+//        certAlipayRequest.setFormat("json");
+//        //设置字符集
+//        certAlipayRequest.setCharset("UTF-8");
+//        //设置签名类型
+//        certAlipayRequest.setSignType("RSA2");
+//        //设置应用公钥证书路径
+//        certAlipayRequest.setCertPath(app_cert_path);
+//        //设置支付宝公钥证书路径
+//        certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path);
+//        //设置支付宝根证书路径
+//        certAlipayRequest.setRootCertPath(alipay_root_cert_path);
+//        //构造client
+//        AlipayClient alipayClient = null;
+//        try {
+//            alipayClient = new DefaultAlipayClient(certAlipayRequest);
+//        } catch (AlipayApiException e) {
+//            e.printStackTrace();
+//        }
+//        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
+//        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest ();
+//        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
+//        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel ();
+//        model.setBody(body);
+//        model.setSubject (subject);
+//        model.setOutTradeNo (outTradeNo);
+//        model.setTimeoutExpress ("30m" );
+//        model.setTotalAmount (amount);
+//        model.setProductCode ( "QUICK_MSECURITY_PAY" );
+//        model.setPassbackParams(passbackParams);//自定义参数
+//        request.setBizModel ( model );
+//        request.setNotifyUrl (callbackPath + notifyUrl);
+//        try  {
+//            //这里和普通的接口调用不同,使用的是sdkExecute
+//            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
+//            Map<String, String> map = new HashMap<>();
+//            map.put("orderString", response.getBody());
+//            System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。
+//            return ResultUtil.success(map);
+//        }  catch (AlipayApiException e ) {
+//            e.printStackTrace();
+//        }
+
+
+        //实例化客户端
+        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2");
+        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
+        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
+        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
+        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
+        model.setBody(body);//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
+        model.setSubject(subject);//商品的标题/交易标题/订单标题/订单关键字等。
+        model.setOutTradeNo(outTradeNo);//商户网站唯一订单号
+        model.setTimeoutExpress("30m");
+        model.setTotalAmount(amount);//付款金额
+        model.setProductCode("QUICK_MSECURITY_PAY");
+        model.setPassbackParams(passbackParams);//自定义参数
+        request.setBizModel(model);
+        request.setNotifyUrl(callbackPath + notifyUrl);
+        try {
+            //这里和普通的接口调用不同,使用的是sdkExecute
+            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
+            Map<String, String> map = new HashMap<>();
+            map.put("orderString", response.getBody());
+            System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。
+            return ResultUtil.success(map);
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 支付宝扫码支付下单
+     * @param body
+     * @param subject
+     * @param outTradeNo
+     * @param amount
+     * @param notifyUrl
+     * @return
+     */
+    public ResultUtil aliScanCodePay(String body, String subject, String outTradeNo, String amount, String notifyUrl){
+        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2"); //获得初始化的AlipayClient
+        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();//创建API对应的request类
+        request.setBizContent("{" +
+                "    \"out_trade_no\":\"" + outTradeNo + "\"," +//商户订单号
+                "    \"total_amount\":\"" + 1 + "\"," +
+                "    \"subject\":\"" + subject + "\"," +
+                "    \"notify_url\":\"" + callbackPath + notifyUrl + "\"," +
+                "    \"body\":\"" + body + "\"," +
+                "    \"store_id\":\"NJ_001\"," +
+                "    \"timeout_express\":\"90m\"}");//订单允许的最晚付款时间
+        AlipayTradePrecreateResponse response = null;
+        try {
+            response = alipayClient.execute(request);
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+        }
+        JSONObject alipay_trade_precreate_response = JSON.parseObject(response.getBody()).getJSONObject("alipay_trade_precreate_response");
+
+        System.err.print(alipay_trade_precreate_response.getString("qr_code"));
+        return ResultUtil.success(alipay_trade_precreate_response.getString("qr_code"));
+    }
+
+
+    /**
+     * 支付成功后的回调处理逻辑
+     * @param request
+     */
+    public Map<String, String> alipayCallback(HttpServletRequest request){
+        //获取支付宝POST过来反馈信息
+        Map<String,String> params = new HashMap<String,String>();
+        Map requestParams = request.getParameterMap();
+        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            String[] values = (String[]) requestParams.get(name);
+            String valueStr = "";
+            for (int i = 0; i < values.length; i++) {
+                valueStr = (i == values.length - 1) ? valueStr + values[i]
+                        : valueStr + values[i] + "_";
+            }
+            //乱码解决,这段代码在出现乱码时使用。
+            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
+            params.put(name, valueStr);
+        }
+        //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
+        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
+//        try {
+//            boolean flag = AlipaySignature.rsaCheckV1(params, alipay_public_key, "UTF-8","RSA2");
+//            if(flag){
+//                Map<String, String> map = new HashMap<>();
+//                String out_trade_no = params.get("out_trade_no");
+//                String subject = params.get("subject");
+//                String total_amount = params.get("total_amount");
+//                String trade_no = params.get("trade_no");
+//                String passback_params = params.get("passback_params");
+//                map.put("out_trade_no", out_trade_no);//商家订单号
+//                map.put("subject", subject);
+//                map.put("total_amount", total_amount);
+//                map.put("trade_no", trade_no);//支付宝交易号
+//                map.put("passback_params", passback_params);//回传参数
+//                return map;
+//            }else{
+//                System.err.println("验签失败");
+//            }
+//
+//        } catch (AlipayApiException e) {
+//            e.printStackTrace();
+//        }
+//        return null;
+
+
+        Map<String, String> map = new HashMap<>();
+        String out_trade_no = params.get("out_trade_no");
+        String subject = params.get("subject");
+        String total_amount = params.get("total_amount");
+        String trade_no = params.get("trade_no");
+        String passback_params = params.get("passback_params");
+        map.put("out_trade_no", out_trade_no);//商家订单号
+        map.put("subject", subject);
+        map.put("total_amount", total_amount);
+        map.put("trade_no", trade_no);//支付宝交易号
+        map.put("passback_params", passback_params);//回传参数
+        return map;
+    }
+
+
+    /**
+     * 支付宝查询订单支付状态
+     * @param out_trade_no
+     * @return
+     * @throws Exception
+     */
+    public ResultUtil queryALIOrder(String out_trade_no) throws Exception{
+        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",aliAppid, appPrivateKey,"json","UTF-8", alipay_public_key,"RSA2");
+        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
+        request.setBizContent("{" +
+                "\"out_trade_no\":" + out_trade_no +
+                "  }");
+        AlipayTradeQueryResponse response = alipayClient.execute(request);
+        if(response.isSuccess()){
+            String tradeStatus = response.getTradeStatus();//交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易结束,不可退款)
+            return ResultUtil.success(tradeStatus);
+        } else {
+            return ResultUtil.error(response.getMsg());
+        }
+    }
+
+
+
+    /**
+     * 微信统一下单
+     * @param body          商品描述
+     * @param attach        附加数据
+     * @param out_trade_no  商户订单号
+     * @param total_fee     标价金额
+     * @param notify_url    通知地址
+     * @param tradeType     交易类型
+     * @return
+     */
+    public ResultUtil weixinpay(String body, String attach, String out_trade_no, String total_fee, String notify_url, String tradeType, String openId) throws Exception{
+        if("JSAPI".equals(tradeType) && ToolUtil.isEmpty(openId)){
+            return ResultUtil.error("请先用微信登录后再进行支付");
+        }
+        int i = new BigDecimal(total_fee).multiply(new BigDecimal("100")).intValue();
+        String hostAddress = null;
+        try {
+            hostAddress = InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
+        String nonce_str = UUIDUtil.getRandomCode(16);
+        Map<String, Object> map = new HashMap<>();
+        map.put("appid", "APP".equals(tradeType) ? appid : appletsAppid);
+        map.put("mch_id", mchId);
+        map.put("nonce_str", nonce_str);
+        map.put("body", body);
+        map.put("attach", attach);//存储订单id
+        map.put("out_trade_no", out_trade_no);//存储的订单code
+        map.put("total_fee", i);
+        map.put("spbill_create_ip", hostAddress);
+        map.put("notify_url", callbackPath + notify_url);
+        map.put("trade_type", tradeType);
+        if("JSAPI".equals(tradeType)){
+            map.put("openid", openId);
+        }
+        String s = this.weixinSignature(map);
+        map.put("sign", s);
+
+        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
+        //设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_XML);
+        StringBuffer xmlString = new StringBuffer();
+        Set<String> strings = map.keySet();
+        String[] keys = {};
+        keys = strings.toArray(keys);
+        Arrays.sort(keys);
+        xmlString.append("<xml>");
+        for(int l = 0; l < keys.length; l++){
+            xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+        }
+        xmlString.append("</xml>");
+
+        Map<String, String> map1 = null;
+        String body1 = httpClientUtil.pushHttpRequsetXml(url, xmlString.toString(), new HashMap<>());
+        //将结果xml解析成map
+        body1 = body1.replaceAll("<!\\[CDATA\\[","");
+        body1 = body1.replaceAll("]]>", "");
+        try {
+            map1 = this.xmlToMap(body1, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        String return_code = map1.get("return_code");
+        if("SUCCESS".equals(return_code)){
+            String result_code = map1.get("result_code");
+            if("SUCCESS".equals(result_code)){
+                String type = map1.get("trade_type");
+                String prepay_id = map1.get("prepay_id");
+                switch (type){
+                    case "JSAPI":
+                        //重新进行签名后返回给前端
+                        Map<String, Object> map2 = new HashMap<>();
+                        map2.put("appId", map1.get("appid"));
+                        map2.put("nonceStr", map1.get("nonce_str"));
+                        map2.put("package", "prepay_id=" + prepay_id);
+                        map2.put("signType", "MD5");
+                        map2.put("timeStamp", new Date().getTime() + "");
+                        String s2 = this.weixinSignature(map2);
+
+                        map2.put("prepay_id", prepay_id);
+                        map2.put("mch_id", map1.get("mch_id"));
+                        map2.put("trade_type", map1.get("trade_type"));
+
+                        map2.put("sign", s2);
+                        return ResultUtil.success(map2);
+                    case "NATIVE":
+                        String code_url = map1.get("code_url");
+                        return ResultUtil.success(code_url);
+                    case "APP":
+                        //重新进行签名后返回给前端
+                        Map<String, Object> map3 = new HashMap<>();
+                        map3.put("appid", appid);
+                        map3.put("noncestr", nonce_str);
+                        map3.put("package", "Sign=WXPay");
+                        map3.put("partnerid", mchId);
+                        map3.put("prepayid", prepay_id);
+                        map3.put("timestamp", new Date().getTime() / 1000);
+                        String s1 = this.weixinSignature(map3);
+                        map3.put("sign", s1);
+                        System.err.println(map3);
+                        return ResultUtil.success(map3);
+                }
+                return null;
+            }else{
+                System.err.println(map1.get("err_code_des"));
+                return ResultUtil.error(map1.get("err_code_des"));
+            }
+        }else{
+            System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+            return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+        }
+    }
+
+
+
+
+
+    /**
+     * 微信支付成功后的回调处理
+     * @param request
+     */
+    public Map<String, String> weixinpayCallback(HttpServletRequest request){
+        try {
+            String param = this.getParam(request);
+            param = param.replaceAll("<!\\[CDATA\\[","");
+            param = param.replaceAll("]]>", "");
+            Map<String, String> map = this.xmlToMap(param, "UTF-8");
+            String return_code = map.get("return_code");
+            if("SUCCESS".equals(return_code)){
+                String result_code = map.get("result_code");
+                if("SUCCESS".equals(result_code)){
+                    Map<String, String> map1 = new HashedMap();
+                    map1.put("nonce_str", map.get("nonce_str"));
+                    map1.put("out_trade_no", map.get("out_trade_no"));//存储的订单code
+                    map1.put("attach", map.get("attach"));//存储订单id
+                    map1.put("total_fee", map.get("total_fee"));
+                    map1.put("transaction_id", map.get("transaction_id"));//微信支付订单号
+                    String result = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
+                    map1.put("result", result);
+                    return map1;
+                }else{
+                    System.err.println(map.get("err_code_des"));
+                }
+            }else{
+                System.err.println(map.get("return_msg"));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 微信扫码收款
+     * @param body              商品描述
+     * @param attach            附加数据
+     * @param nonce_str         随机字符串
+     * @param out_trade_no      商户订单号
+     * @param total_fee         订单金额
+     * @param auth_code         授权码	扫码支付授权码,设备读取用户微信中的条码或者二维码信息(注:用户付款码条形码规则:18位纯数字,以10、11、12、13、14、15开头)
+     * @return
+     */
+    public ResultUtil wxScanQRCodePay(String body, String attach, String nonce_str, String out_trade_no, String total_fee, String auth_code){
+        int i = new BigDecimal(total_fee).multiply(new BigDecimal("100")).intValue();
+        String hostAddress = null;
+        try {
+            InetAddress address = InetAddress.getLocalHost();
+            hostAddress = address.getHostAddress();
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
+        String randomCode = null;
+        try {
+            randomCode = UUIDUtil.getRandomCode(10);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Map<String, Object> map = new HashMap<>();
+        map.put("appid", appid);
+        map.put("mch_id", mchId);
+        map.put("nonce_str", nonce_str);//存储的支付人员id,员工扫描二维码支付的时候存储的是收款员工id
+        map.put("body", body);
+        map.put("attach", attach);//存储的费用月份数据,员工扫描二维码支付的时候存储的是收费项id
+        map.put("out_trade_no", randomCode + "_" + out_trade_no);//存储的房间id
+        map.put("total_fee", i);
+        map.put("spbill_create_ip", hostAddress);
+        map.put("auth_code", auth_code);
+        String s = this.weixinSignature(map);
+        map.put("sign", s);
+
+        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
+        //设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_XML);
+        StringBuffer xmlString = new StringBuffer();
+        Set<String> strings = map.keySet();
+        String[] keys = {};
+        keys = strings.toArray(keys);
+        Arrays.sort(keys);
+        xmlString.append("<xml>");
+        for(int l = 0; l < keys.length; l++){
+            xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+        }
+        xmlString.append("</xml>");
+
+        Map<String, String> map1 = null;
+        String body1 = httpClientUtil.pushHttpRequsetXml(url, xmlString.toString(), new HashMap<>());
+        //将结果xml解析成map
+        body1 = body1.replaceAll("<!\\[CDATA\\[","");
+        body1 = body1.replaceAll("]]>", "");
+        try {
+            map1 = this.xmlToMap(body1, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        String return_code = map1.get("return_code");
+        if("SUCCESS".equals(return_code)){
+            String result_code = map1.get("result_code");
+            if("SUCCESS".equals(result_code)){
+                String type = map1.get("trade_type");
+                switch (type){
+                    case "JSAPI":
+                        break;
+                    case "NATIVE":
+                        String code_url = map1.get("code_url");
+                        return ResultUtil.success(code_url);
+                    case "APP":
+                        String prepay_id = map1.get("prepay_id");
+                        //重新进行签名后返回给前端
+                        Map<String, Object> map2 = new HashMap<>();
+                        map2.put("appid", appid);
+                        map2.put("noncestr", nonce_str);
+                        map2.put("package", "Sign=WXPay");
+                        map2.put("partnerid", mchId);
+                        map2.put("prepayid", prepay_id);
+                        map2.put("timestamp", new Date().getTime() + "");
+                        String s1 = this.weixinSignature(map2);
+
+                        map2.put("pac", "Sign=WXPay");
+                        map2.put("sign", s1);
+//                      System.err.println(map2);
+                        return ResultUtil.success(map2);
+                }
+                return null;
+            }else{
+//                System.err.println(map1.get("err_code_des"));
+                return ResultUtil.error(map1.get("err_code_des"));
+            }
+        }else{
+//            System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+            return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+        }
+    }
+
+
+    /**
+     * 支付宝扫码收款
+     * @param data
+     * @return
+     */
+    public Object aliScanQRCodePay(String data){
+        return null;
+    }
+
+
+    /**
+     * 微信退款申请
+     * @param transaction_id    微信订单号。微信生成的订单号,在支付通知中有返回
+     * @param out_refund_no     商户退款单号。商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
+     * @param total_fee         订单金额。订单总金额,单位为分,只能为整数
+     * @param refund_fee        退款金额。退款总金额,订单总金额,单位为分,只能为整数
+     * @param notify_url        退款结果通知url。异步接收微信支付退款结果通知的回调地址,通知URL必须为外网可访问的url,不允许带参数 如果参数中传了notify_url,则商户平台上配置的回调地址将不会生效。
+     * @return
+     */
+    public Map<String, String> wxRefund(String transaction_id, String out_refund_no, String total_fee, String refund_fee, String notify_url){
+        int tf = new BigDecimal(total_fee).multiply(new BigDecimal("100")).intValue();
+        int rf = new BigDecimal(refund_fee).multiply(new BigDecimal("100")).intValue();
+        String nonce_str = UUIDUtil.getRandomCode();
+        Map<String, Object> map = new HashMap<>();
+        map.put("appid", appid);
+        map.put("mch_id", mchId);
+        map.put("nonce_str", nonce_str);
+        map.put("transaction_id", transaction_id);
+        map.put("out_refund_no", out_refund_no);
+        map.put("total_fee", tf);
+        map.put("refund_fee", rf);
+        map.put("notify_url", callbackPath + notify_url);
+        String s = this.weixinSignature(map, key);
+        map.put("sign", s);
+
+        String url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
+        //设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_XML);
+        StringBuffer xmlString = new StringBuffer();
+        Set<String> strings = map.keySet();
+        String[] keys = {};
+        keys = strings.toArray(keys);
+        Arrays.sort(keys);
+        xmlString.append("<xml>");
+        for(int l = 0; l < keys.length; l++){
+            xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+        }
+        xmlString.append("</xml>");
+
+        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");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        System.err.println(body1);
+        //将结果xml解析成map
+        body1 = body1.replaceAll("<!\\[CDATA\\[","");
+        body1 = body1.replaceAll("]]>", "");
+        try {
+            map1 = this.xmlToMap(body1, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        String return_code = map1.get("return_code");
+        Map<String, String> map2 = new HashMap<>();
+        if("SUCCESS".equals(return_code)){
+            String result_code = map1.get("result_code");
+            if("SUCCESS".equals(result_code)){
+                map2.put("return_code", result_code);
+                map2.put("refund_id", String.valueOf(map1.get("refund_id")));//微信退款订单号
+                map2.put("refund_fee", String.valueOf(map1.get("refund_fee")));//退款金额
+                return map2;
+            }else{
+                map2.put("return_code", result_code);
+                map2.put("return_msg", map1.get("err_code_des"));
+                return map2;
+            }
+        }else{
+            map2.put("return_code", return_code);
+            map2.put("return_msg", map1.get("return_msg"));
+            return map2;
+        }
+    }
+
+
+    /**
+     * 微信退款成功后的回调处理
+     * @param request
+     * @return
+     */
+    public Map<String, String> wxRefundCallback(HttpServletRequest request){
+        try {
+            String param = this.getParam(request);
+            param = param.replaceAll("<!\\[CDATA\\[","");
+            param = param.replaceAll("]]>", "");
+            Map<String, String> map = this.xmlToMap(param, "UTF-8");
+            String return_code = map.get("return_code");
+            if("SUCCESS".equals(return_code)){
+                String req_info = map.get("req_info");//加密信息请用商户秘钥进行解密
+                String s = this.wxDecrypt(req_info);
+                s = s.replaceAll("<!\\[CDATA\\[","");
+                s = s.replaceAll("]]>", "");
+                map = this.xmlToMap(s, "UTF-8");
+                Map<String, String> map1 = new HashMap<>();
+                map1.put("refund_id", map.get("refund_id"));
+                map1.put("out_refund_no", map.get("out_refund_no"));
+                String result = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
+                map1.put("result", result);
+                return map1;
+            }else{
+//                System.err.println(map.get("return_msg"));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        } catch (NoSuchProviderException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 支付宝退款
+     * @param trade_no          支付宝交易号
+     * @param refund_amount     退款金额
+     * @return
+     * @throws AlipayApiException
+     */
+    public Map<String, String> aliRefund(String trade_no, String refund_amount) throws AlipayApiException {
+        //构造client
+        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
+        //设置网关地址
+        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
+        //设置应用Id
+        certAlipayRequest.setAppId(aliAppid);
+        //设置应用私钥
+        certAlipayRequest.setPrivateKey(appPrivateKey);
+        //设置请求格式,固定值json
+        certAlipayRequest.setFormat("json");
+        //设置字符集
+        certAlipayRequest.setCharset("UTF8");
+        //设置签名类型
+        certAlipayRequest.setSignType("RSA2");
+        //设置应用公钥证书路径
+        certAlipayRequest.setCertPath(app_cert_path);
+        //设置支付宝公钥证书路径
+        certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path);
+        //设置支付宝根证书路径
+        certAlipayRequest.setRootCertPath(alipay_root_cert_path);
+        //构造client
+        AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
+        //构造API请求
+        AlipayTradeRefundApplyRequest request = new AlipayTradeRefundApplyRequest();
+        AlipayTradeRefundModel model = new AlipayTradeRefundModel();
+        model.setTradeNo(trade_no);
+        model.setRefundAmount(refund_amount);
+        request.setBizModel(model);
+        //发送请求
+        AlipayTradeRefundApplyResponse response = alipayClient.certificateExecute(request);
+
+//        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey,"json","UTF-8", alipay_public_key,"RSA2");
+//        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
+//        JSONObject jsonObject = new JSONObject();
+//        jsonObject.put("trade_no", trade_no);
+//        jsonObject.put("refund_amount", refund_amount);
+//        request.setBizContent(jsonObject.toJSONString());
+//        System.err.println(jsonObject.toJSONString());
+//        AlipayTradeRefundResponse response = alipayClient.execute(request);
+
+        Map<String, String> map = new HashMap<>();
+        System.err.println(response.getSubMsg());
+        if(response.isSuccess()){
+            System.out.println("调用成功");
+            String outTradeNo = response.getOutTradeNo();
+            map.put("code", response.getCode());//10000
+            map.put("trade_no", response.getTradeNo());//支付宝交易号
+            map.put("out_trade_no", outTradeNo);//商户订单号
+        } else {
+            System.out.println("调用失败");
+            map.put("code", response.getCode());
+            map.put("msg", response.getSubMsg());
+        }
+        return map;
+    }
+
+
+    /**
+     * 查询微信支付订单
+     * @return
+     * @throws Exception
+     */
+    public ResultUtil queryWXOrder() throws Exception{
+        String url = "https://api.mch.weixin.qq.com/pay/orderquery";
+        String nonce_str = UUIDUtil.getRandomCode(16);
+        Map<String, Object> map = new HashMap<>();
+        map.put("appid", appid);
+        map.put("mch_id", mchId);
+        map.put("transaction_id", nonce_str);//微信订单号
+        map.put("nonce_str", nonce_str);//随机字符串
+        String s = this.weixinSignature(map);
+        map.put("sign", s);
+
+        //设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_XML);
+        StringBuffer xmlString = new StringBuffer();
+        Set<String> strings = map.keySet();
+        String[] keys = {};
+        keys = strings.toArray(keys);
+        Arrays.sort(keys);
+        xmlString.append("<xml>");
+        for(int l = 0; l < keys.length; l++){
+            xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+        }
+        xmlString.append("</xml>");
+
+        Map<String, String> map1 = null;
+        String body1 = httpClientUtil.pushHttpRequsetXml(url, xmlString.toString(), new HashMap<>());
+        //将结果xml解析成map
+        body1 = body1.replaceAll("<!\\[CDATA\\[","");
+        body1 = body1.replaceAll("]]>", "");
+        try {
+            map1 = this.xmlToMap(body1, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        String return_code = map1.get("return_code");
+        if("SUCCESS".equals(return_code)){
+            String result_code = map1.get("result_code");
+            if("SUCCESS".equals(result_code)){
+                String type = map1.get("trade_type");
+                switch (type){
+                    case "JSAPI":
+                        break;
+                    case "NATIVE":
+                        String code_url = map1.get("code_url");
+                        return ResultUtil.success(code_url);
+                    case "APP":
+                        String trade_state = map1.get("trade_state");
+                        String time_end = map1.get("time_end");
+                        Map<String, Object> map2 = new HashMap<>();
+                        map2.put("trade_state", trade_state);//订单状态SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(刷卡支付),USERPAYING--用户支付中,PAYERROR--支付失败(其他原因,如银行返回失败)
+                        map2.put("time_end", time_end);//订单支付时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。
+                        return ResultUtil.success(map2);
+                }
+                return null;
+            }else{
+                System.err.println(map1.get("err_code_des"));
+                return ResultUtil.error(map1.get("err_code_des"));
+            }
+        }else{
+            System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+            return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+        }
+    }
+
+
+
+    /**
+     * 微信转账功能(企业付款到零钱)
+     * @param openid                商户appid下,某用户的openid
+     * @param desc                  企业付款备注,必填。
+     * @param total_fee             企业付款金额
+     * @param partner_trade_no      商户订单号,需保持唯一性
+     * @return
+     */
+    public Map<String, String> wxTransfers(String openid, String desc, String total_fee, String partner_trade_no) throws Exception{
+        int amount = new BigDecimal(total_fee).multiply(new BigDecimal("100")).intValue();
+        String nonce_str = UUIDUtil.getRandomCode();
+        Map<String, Object> map = new HashMap<>();
+        map.put("mch_appid", appid);//申请商户号的appid或商户号绑定的appid
+        map.put("mchid", mchId);//微信支付分配的商户号
+        map.put("nonce_str", nonce_str);//随机字符串,不长于32位
+        map.put("partner_trade_no", partner_trade_no);//商户订单号,需保持唯一性
+        map.put("openid", openid);//商户appid下,某用户的openid
+        map.put("check_name", "NO_CHECK");//NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名
+        map.put("amount", amount);//企业付款金额,单位为分
+        map.put("desc", desc);//企业付款备注,必填。
+        String s = this.weixinSignature(map, key);
+        map.put("sign", s);
+
+        String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
+        //设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_XML);
+        StringBuffer xmlString = new StringBuffer();
+        Set<String> strings = map.keySet();
+        String[] keys = {};
+        keys = strings.toArray(keys);
+        Arrays.sort(keys);
+        xmlString.append("<xml>");
+        for(int l = 0; l < keys.length; l++){
+            xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+        }
+        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");
+        //将结果xml解析成map
+        body1 = body1.replaceAll("<!\\[CDATA\\[","");
+        body1 = body1.replaceAll("]]>", "");
+        try {
+            map1 = this.xmlToMap(body1, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        String return_code = map1.get("return_code");
+        Map<String, String> map2 = new HashMap<>();
+        if("SUCCESS".equals(return_code)){
+            String result_code = map1.get("result_code");
+            if("SUCCESS".equals(result_code)){
+                map2.put("return_code", result_code);
+                map2.put("payment_no", String.valueOf(map1.get("payment_no")));//付款订单号
+                map2.put("payment_time", String.valueOf(map1.get("payment_time")));//付款时间
+                return map2;
+            }else{
+                map2.put("return_code", result_code);
+                map2.put("err_code", map1.get("err_code"));
+                map2.put("err_code_des", map1.get("err_code_des"));
+                return map2;
+            }
+        }else{
+            map2.put("return_code", return_code);
+            map2.put("return_msg", map1.get("return_msg"));
+            return map2;
+        }
+    }
+
+
+    /**
+     * 微信转账功能(企业付款到银行卡)
+     * @param desc              备注信息
+     * @param total_fee         转账金额
+     * @param partner_trade_no  订单号
+     * @param enc_bank_no       银行卡号
+     * @param enc_true_name     收款方用户名
+     * @param bankName          银行名称
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> wxPayBank(String desc, String total_fee, String partner_trade_no, String enc_bank_no, String enc_true_name, String bankName) throws Exception{
+        int amount = new BigDecimal(total_fee).multiply(new BigDecimal("100")).intValue();
+        String nonce_str = UUIDUtil.getRandomCode();
+        Map<String, Object> map = new HashMap<>();
+        map.put("mch_id", mchId);//微信支付分配的商户号
+        map.put("nonce_str", nonce_str);//随机字符串,不长于32位
+        map.put("partner_trade_no", partner_trade_no);//商户订单号,需保持唯一性
+        map.put("enc_bank_no", enc_bank_no);//收款方银行卡号(采用标准RSA算法,公钥由微信侧提供)
+        map.put("enc_true_name", enc_true_name);//收款方用户名(采用标准RSA算法,公钥由微信侧提供)
+        map.put("bank_code", findBankCode(bankName));//
+        map.put("amount", amount);//企业付款金额,单位为分
+        map.put("desc", desc);//企业付款备注,必填。
+        String s = this.weixinSignature(map, key);
+        map.put("sign", s);
+
+        String url = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank";
+        //设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_XML);
+        StringBuffer xmlString = new StringBuffer();
+        Set<String> strings = map.keySet();
+        String[] keys = {};
+        keys = strings.toArray(keys);
+        Arrays.sort(keys);
+        xmlString.append("<xml>");
+        for(int l = 0; l < keys.length; l++){
+            xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+        }
+        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");
+        //将结果xml解析成map
+        body1 = body1.replaceAll("<!\\[CDATA\\[","");
+        body1 = body1.replaceAll("]]>", "");
+        try {
+            map1 = this.xmlToMap(body1, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        String return_code = map1.get("return_code");
+        Map<String, String> map2 = new HashMap<>();
+        if("SUCCESS".equals(return_code)){
+            String result_code = map1.get("result_code");
+            if("SUCCESS".equals(result_code)){
+                map2.put("return_code", result_code);
+                map2.put("payment_no", String.valueOf(map1.get("payment_no")));//付款订单号
+                map2.put("cmms_amt", String.valueOf(map1.get("cmms_amt")));//手续费金额 RMB:分
+                return map2;
+            }else{
+                map2.put("return_code", result_code);
+                map2.put("err_code", map1.get("err_code"));
+                map2.put("err_code_des", map1.get("err_code_des"));
+                return map2;
+            }
+        }else{
+            map2.put("return_code", return_code);
+            map2.put("return_msg", map1.get("return_msg"));
+            return map2;
+        }
+    }
+
+    /**
+     * 微信转账到银行卡不编号
+     * @param bankName
+     * @return
+     */
+    public String findBankCode(String bankName){
+        String json = "{\"工商银行 \":1002,\"农业银行\":1005,\"建设银行\":1003,\"中国银行\":1026,\"交通银行 \":1020,\"招商银行 \":1001,\"邮储银行\":1066,\"民生银行 \":1006,\"平安银行 \":1010,\"中信银行\":1021,\"浦发银行 \":1004,\"兴业银行 \":1009,\"光大银行 \":1022,\"广发银行\":1027,\"华夏银行\":1025,\"宁波银行\":1056,\"北京银行\":4836,\"上海银行\":1024,\"南京银行\":1054,\"长子县融汇村镇银行\":4755,\"长沙银行\":4216,\"浙江泰隆商业银行\":4051,\"中原银行 \":4753,\"企业银行(中国)\":4761,\"顺德农商银行 \":4036,\"衡水银行\":4752,\"长治银行\":4756,\"大同银行\":4767,\"河南省农村信用社\":4115,\"宁夏黄河农村商业银行\":4150,\"山西省农村信用社\":4156,\"安徽省农村信用社\":4166,\"甘肃省农村信用社\":4157,\"天津农村商业银行\":4153,\"广西壮族自治区农村信用社\":4113,\"陕西省农村信用社\":4108,\"深圳农村商业银行\":4076,\"宁波鄞州农村商业银行\":4052,\"浙江省农村信用社联合社\":4764,\"江苏省农村信用社联合社\":4217,\"江苏紫金农村商业银行股份有限公司 \":4072,\"北京中关村银行股份有限公司 \":4769,\"星展银行( 中国) 有限公司 \":4778,\"枣庄银行股份有限公司 \":4766,\"海口联合农村商业银行股份有限公司 \":4758,\"南洋商业银行( 中国) 有限公司 \":4763}";
+        JSONObject jsonObject = JSON.parseObject(json);
+        Set<String> strings = jsonObject.keySet();
+        for(String key : strings){
+            if(key.indexOf(bankName) >= 0){
+                return jsonObject.getString(key);
+            }
+        }
+        return "";
+    }
+
+
+
+    /**
+     * 支付宝转账
+     * @param out_biz_no        商家侧唯一订单号,由商家自定义。对于不同转账请求,商家需保证该订单号在自身系统唯一。
+     * @param trans_amount      订单总金额,单位为元,精确到小数点后两位
+     * @param order_title       转账业务的标题,用于在支付宝用户的账单里显示
+     * @param identity          参与方的唯一标识(收款方支付宝账号)
+     * @param name              参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。
+     * @param remark            业务备注
+     * @return
+     * @throws Exception
+     */
+    public Map<String, Object> aliTransfer(String out_biz_no, Double trans_amount, String order_title, String identity, String name, String remark) throws Exception{
+        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
+        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");  //gateway:支付宝网关(固定)https://openapi.alipay.com/gateway.do
+        certAlipayRequest.setAppId(aliAppid);  //APPID 即创建应用后生成,详情见创建应用并获取 APPID
+        certAlipayRequest.setPrivateKey(appPrivateKey);  //开发者应用私钥,由开发者自己生成
+        certAlipayRequest.setFormat("json");  //参数返回格式,只支持 json 格式
+        certAlipayRequest.setCharset("UTF-8");  //请求和签名使用的字符编码格式,支持 GBK和 UTF-8
+        certAlipayRequest.setSignType("RSA2");  //商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。
+        certAlipayRequest.setCertPath(app_cert_path); //应用公钥证书路径(app_cert_path 文件绝对路径)
+        certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path); //支付宝公钥证书文件路径(alipay_cert_path 文件绝对路径)
+        certAlipayRequest.setRootCertPath(alipay_root_cert_path);  //支付宝CA根证书文件路径(alipay_root_cert_path 文件绝对路径)
+        AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
+        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
+        request.setBizContent("{" +
+                "\"out_biz_no\":\"" + out_biz_no + "\"," +
+                "\"trans_amount\":" + trans_amount + "," +
+                "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
+                "\"biz_scene\":\"DIRECT_TRANSFER\"," +
+                "\"order_title\":\"" + order_title + "\"," +
+                "\"payee_info\":{" +
+                "\"identity\":\"" + identity + "\"," +
+                "\"identity_type\":\"ALIPAY_USER_ID\"," +
+                "\"name\":\"" + name + "\"," +
+                "}," +
+                "\"remark\":\"" + remark + "\"" +
+                "}");
+        AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
+        Map<String, Object> map = new HashMap<>();
+        if(response.isSuccess()){
+            String status = response.getStatus();
+            if(status.equals("SUCCESS")){//成功
+                map.put("code", response.getCode());
+                map.put("order_id", response.getOrderId());//支付宝订单号
+                map.put("pay_fund_order_id", response.getPayFundOrderId());//支付宝流水号
+            }else{
+                map.put("code", response.getCode());
+                map.put("sub_msg", response.getSubMsg());
+            }
+        } else {
+            map.put("code", response.getSubCode());
+            map.put("sub_msg", response.getSubMsg());
+        }
+        return map;
+    }
+
+
+    /**
+     * 获取请求内容
+     * @param request
+     * @return
+     * @throws IOException
+     */
+    private 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();
+    }
+
+
+    /**
+     * 微信下单的签名算法
+     * @param map
+     * @return
+     */
+    private String weixinSignature(Map<String, Object> map){
+        try {
+            Set<Map.Entry<String, Object>> entries = map.entrySet();
+            List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(entries);
+            // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
+            Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() {
+                public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
+                    return (o1.getKey()).toString().compareTo(o2.getKey());
+                }
+            });
+            // 构造签名键值对的格式
+            StringBuilder sb = new StringBuilder();
+            for (Map.Entry<String, Object> item : infoIds) {
+                if (item.getKey() != null || item.getKey() != "") {
+                    String key = item.getKey();
+                    Object val = item.getValue();
+                    if (!(val == "" || val == null)) {
+                        sb.append(key + "=" + val + "&");
+                    }
+                }
+            }
+            sb.append("key=" + key);
+            String sign = MD5AndKL.MD5Encode(sb.toString(), "UTF-8").toUpperCase(); //注:MD5签名方式
+            return sign;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 微信下单的签名算法
+     * @param map
+     * @return
+     */
+    private String weixinSignature(Map<String, Object> map, String key_){
+        try {
+            Set<Map.Entry<String, Object>> entries = map.entrySet();
+            List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(entries);
+            // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
+            Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() {
+                public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
+                    return (o1.getKey()).toString().compareTo(o2.getKey());
+                }
+            });
+            // 构造签名键值对的格式
+            StringBuilder sb = new StringBuilder();
+            for (Map.Entry<String, Object> item : infoIds) {
+                if (item.getKey() != null || item.getKey() != "") {
+                    String key = item.getKey();
+                    Object val = item.getValue();
+                    if (!(val == "" || val == null)) {
+                        sb.append(key + "=" + val + "&");
+                    }
+                }
+            }
+            sb.append("key=" + key_);
+            String sign = MD5AndKL.MD5Encode(sb.toString(), "UTF-8").toUpperCase(); //注:MD5签名方式
+            return sign;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 微信退款成功后的解密
+     * @param req_info
+     * @return
+     */
+    private String wxDecrypt(String req_info) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException,
+            InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
+        byte[] decode = Base64.getDecoder().decode(req_info);
+        String sign = MD5AndKL.MD5Encode(key, "UTF-8").toLowerCase();
+        if (Security.getProvider("BC") == null){
+            Security.addProvider(new BouncyCastleProvider());
+        }
+        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
+        SecretKeySpec secretKeySpec = new SecretKeySpec(sign.getBytes(), "AES");
+        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
+        return new String(cipher.doFinal(decode));
+    }
+
+
+    public static void main(String[] ages){
+//        PayMoneyUtil payMoneyUtil = new PayMoneyUtil();
+//        payMoneyUtil.weixinpay("测试", "123", "12.5", "");
+    }
+
+
+    /**
+     * xml转map
+     * @param xml
+     * @param charset
+     * @return
+     * @throws UnsupportedEncodingException
+     * @throws DocumentException
+     */
+    public static Map<String, String> xmlToMap(String xml, String charset) throws UnsupportedEncodingException, DocumentException {
+
+        Map<String, String> respMap = new HashMap<String, String>();
+
+        SAXReader reader = new SAXReader();
+        Document doc = reader.read(new ByteArrayInputStream(xml.getBytes(charset)));
+        Element root = doc.getRootElement();
+        xmlToMap(root, respMap);
+        return respMap;
+    }
+
+    public static Map<String, String> xmlToMap(Element tmpElement, Map<String, String> respMap){
+        if (tmpElement.isTextOnly()) {
+            respMap.put(tmpElement.getName(), tmpElement.getText());
+            return respMap;
+        }
+
+        @SuppressWarnings("unchecked")
+        Iterator<Element> eItor = tmpElement.elementIterator();
+        while (eItor.hasNext()) {
+            Element element = eItor.next();
+            xmlToMap(element, respMap);
+        }
+        return respMap;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java
new file mode 100644
index 0000000..53916d2
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java
@@ -0,0 +1,711 @@
+package com.stylefeng.guns.modular.system.util;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.common.constant.state.Order;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.dao.CarMapper;
+import com.stylefeng.guns.modular.system.dao.ServerCarModelMapper;
+import com.stylefeng.guns.modular.system.dao.SystemPriceMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.taxi.model.TransactionDetails;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+import com.stylefeng.guns.modular.transfer.server.IOrderTransferService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 上传交通部
+ */
+@Component
+public class PushMinistryOfTransportUtil {
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private HttpClientUtil httpClientUtil;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Resource
+    private SystemPriceMapper systemPriceMapper;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Resource
+    private CarMapper carMapper;
+
+    @Resource
+    private ServerCarModelMapper serverCarModelMapper;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IOrderPositionService orderPositionService;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private IOrderEvaluateService orderEvaluateService;
+
+    @Autowired
+    private IOrderTransferService orderTransferService;
+
+    private String path = "http://120.77.11.218:8868/";
+
+
+    /**
+     * 乘客基本信息
+     * @param uid
+     */
+    public void baseInfoPassenger(Integer uid){
+        UserInfo userInfo = userInfoService.selectById(uid);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("RegisterDate", userInfo.getInsertTime());//注册日期YYYYMMDD
+        jsonObject.put("PassengerPhone", userInfo.getPhone());//乘客手机号
+        jsonObject.put("PassengerName", userInfo.getNickName());//乘客称谓
+        jsonObject.put("PassengerGender", userInfo.getSex() == 1 ? "男" : "女");//乘客性别
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, Object> map = new HashMap<>();
+        map.put("baseInfoPassenger", jsonObject.toJSONString());
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Connection", "keep-alive");
+        header.put("Content-Type", "application/x-www-form-urlencoded");
+        header.put("Accept", "*/*");
+        header.put("Accept-Encoding", "gzip");
+        header.put("Accept-Charset", "utf-8");
+        String result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/baseInfoPassenger", map, header,"form");
+        System.err.println("---------------------------乘客基本信息--------------------------:" + result);
+    }
+
+
+    /**
+     * 订单撤销接口
+     * @param orderId
+     */
+    public void orderCancel(Integer orderId){
+        OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+        Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+        OrderCancel query = null;
+        try {
+            query = orderCancelService.query(orderId, 1, null, null, 2);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Map<String, String> geocode = null;
+        try {
+            geocode = gdMapGeocodingUtil.geocode(orderPrivateCar.getBoardingLon().toString(),
+                    orderPrivateCar.getBoardingLat().toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", Integer.valueOf(geocode.get("districtCode")));//上车地点行政区划代码
+        jsonObject.put("OrderId", orderPrivateCar.getOrderNum());//订单编号
+        jsonObject.put("OrderTime", orderPrivateCar.getOrderNum());//订单时间YYYYMMDDhhmmss
+        jsonObject.put("CancelTime", query.getInsertTime());//订单撤销时间YYYYMMDDhhmmss
+        jsonObject.put("Operator", "1");//撤销发起方(1:乘客,2:驾驶员,3:平台公司)
+        jsonObject.put("CancelTypeCode", driver.getDriveCard());//机动车驾驶证编号
+        jsonObject.put("CancelReason", query.getReason());//撤销或违约原因
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderCancel", jsonObject.toJSONString());
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Connection", "keep-alive");
+        header.put("Content-Type", "application/x-www-form-urlencoded");
+        header.put("Accept", "*/*");
+        header.put("Accept-Encoding", "gzip");
+        header.put("Accept-Charset", "utf-8");
+        String result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/orderCancel", map, header,"form");
+        System.err.println("----------------------------订单撤销接口------------------:" + result);
+    }
+
+    public void transOrderCancel(Integer orderId){
+        OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+        Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+        OrderCancel query = null;
+        try {
+            query = orderCancelService.query(orderId, 7, null, null, 2);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Map<String, String> geocode = null;
+        try {
+            geocode = gdMapGeocodingUtil.geocode(orderPrivateCar.getBoardingLon().toString(),
+                    orderPrivateCar.getBoardingLat().toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", Integer.valueOf(geocode.get("districtCode")));//上车地点行政区划代码
+        jsonObject.put("OrderId", orderPrivateCar.getOrderNum());//订单编号
+        jsonObject.put("OrderTime", orderPrivateCar.getOrderNum());//订单时间YYYYMMDDhhmmss
+        jsonObject.put("CancelTime", query.getInsertTime());//订单撤销时间YYYYMMDDhhmmss
+        jsonObject.put("Operator", "1");//撤销发起方(1:乘客,2:驾驶员,3:平台公司)
+        jsonObject.put("CancelTypeCode", driver.getDriveCard());//机动车驾驶证编号
+        jsonObject.put("CancelReason", query.getReason());//撤销或违约原因
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderCancel", jsonObject.toJSONString());
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Connection", "keep-alive");
+        header.put("Content-Type", "application/x-www-form-urlencoded");
+        header.put("Accept", "*/*");
+        header.put("Accept-Encoding", "gzip");
+        header.put("Accept-Charset", "utf-8");
+        String result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/orderCancel", map, header,"form");
+        System.err.println("----------------------------订单撤销接口------------------:" + result);
+    }
+
+
+    /**
+     * 经营支付接口
+     * @param orderId
+     */
+    public void operatePay(Integer orderId){
+        OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+        Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+        Map<String, Object> query = systemPriceMapper.query(orderPrivateCar.getCompanyId(), 1, orderPrivateCar.getServerCarModelId());
+        Car car = carMapper.selectById(orderPrivateCar.getCarId());
+        ServerCarModel serverCarModel = serverCarModelMapper.selectById(orderPrivateCar.getServerCarModelId());
+//        TransactionDetails transactionDetails = transactionDetailsService.selectById(new EntityWrapper<TransactionDetails>().eq("orderId", orderId).eq("orderType", 1));
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("OrderId", orderPrivateCar.getOrderNum());//订单号
+        jsonObject.put("OnArea", 450204);//上车位置行政区划代码
+        jsonObject.put("DriverName", driver.getName());//机动车驾驶员
+        jsonObject.put("LicenseId", driver.getDriveCard());//机动车驾驶证号
+        jsonObject.put("FareType", query.get("id").toString());//运价类型编码(由网约车公司定义,与运价信息接口保持一街)
+        jsonObject.put("VehicleNo", car.getCarLicensePlate());//车辆号牌
+        jsonObject.put("BookDepTime", orderPrivateCar.getTravelTime());//预计上车时间YYYYMMDDhhmmss
+        jsonObject.put("WaitTime", orderPrivateCar.getWait() * 60);//等待时间(秒)
+        jsonObject.put("DepLongitude", orderPrivateCar.getBoardingLon());//车辆出发经度
+        jsonObject.put("DepLatitude", orderPrivateCar.getBoardingLat());//车辆出发纬度
+        jsonObject.put("DepArea", orderPrivateCar.getBoardingAddress());//上车点
+        jsonObject.put("DepTime", orderPrivateCar.getBoardingTime());//上车时间YYYYMMDDhhmmss
+        jsonObject.put("DestLongitude", orderPrivateCar.getGetoffLon());//车辆到达经度
+        jsonObject.put("DestLatitude", orderPrivateCar.getGetoffLat());//车辆到达纬度
+        jsonObject.put("DestArea", orderPrivateCar.getGetoffAddress());//下车地点
+        jsonObject.put("DestTime", orderPrivateCar.getGetoffTime());//下车时间YYYYMMDDhhmmss
+        jsonObject.put("BookModel", serverCarModel.getName());//预定车型
+        jsonObject.put("Model", serverCarModel.getName());//实际使用车型
+        jsonObject.put("DriveMile", Double.valueOf(orderPrivateCar.getMileage() / 1000).intValue());//载客里程(km)
+        jsonObject.put("DriveTime", Double.valueOf((orderPrivateCar.getGetoffTime().getTime() - orderPrivateCar.getBoardingTime().getTime()) / 1000).intValue());//载客时间(秒)
+        List<OrderPosition> orderPositions = null;
+        try {
+            orderPositions = orderPositionService.queryPosition(orderId, 1);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        int distance = 0;
+        if(orderPositions.size() > 0){
+            OrderPosition orderPosition = orderPositions.get(0);
+            Map<String, String> distance1 = gdMapElectricFenceUtil.getDistance(orderPosition.getLon() + "," + orderPosition.getLat(), orderPrivateCar.getBoardingLon() + "," + orderPrivateCar.getBoardingLat(), 1);
+            distance = Integer.valueOf(distance1.get("distance")) / 1000;
+        }
+        jsonObject.put("WaitMile", distance);//空驶里程(km)
+        jsonObject.put("FactPrice", orderPrivateCar.getPayMoney());//实收金额(元)
+        jsonObject.put("Price", orderPrivateCar.getOrderMoney());//应收金额(元)
+        jsonObject.put("CashPrice", orderPrivateCar.getPayType() == 3 ? orderPrivateCar.getPayMoney() : 0);//现金支付金额(元)
+        jsonObject.put("LineName", orderPrivateCar.getPayType() != 3 ? "" : "");//电子支付机构
+        jsonObject.put("LinePrice", orderPrivateCar.getPayType() != 3 ? orderPrivateCar.getPayMoney() : 0);//电子支付金额(元)
+        jsonObject.put("PosName", "");//POS机支付机构
+        jsonObject.put("PosPrice", 0);//POS机支付金额(元)
+        jsonObject.put("BenfitPrice", (orderPrivateCar.getRedPacketMoney() == null ? 0 : orderPrivateCar.getRedPacketMoney())
+                + (orderPrivateCar.getCouponMoney() == null ? 0 : orderPrivateCar.getCouponMoney())
+                + (orderPrivateCar.getDurationMoney() == null ? 0 : orderPrivateCar.getDurationMoney()));//优惠金额(元)
+        jsonObject.put("BookTip", 0);//预约服务费(元)
+        jsonObject.put("PassengerTip", (orderPrivateCar.getParkMoney() == null ? 0 : orderPrivateCar.getParkMoney())
+                + (orderPrivateCar.getRoadTollMoney() == null ? 0 : orderPrivateCar.getRoadTollMoney()));//附加费(元)
+        Map<String, Double> map1 = this.setMoney(orderPrivateCar);
+        Double amount3 = map1.get("amount3");//其他时间段
+        Double amount2 = map1.get("amount2");//高峰时段
+        Double amount1 = map1.get("amount1");//夜间时段
+        jsonObject.put("PeakUpPrice", null != amount2 ? (amount2 - amount3) : 0);//高峰时段时间加价金额(元)
+        jsonObject.put("NightUpPrice", null != amount1 ? (amount1 - amount3) : 0);//夜间时段里程加价金额(元)
+        jsonObject.put("FarUpPrice", orderPrivateCar.getLongDistanceMoney() == null ? 0 : orderPrivateCar.getLongDistanceMoney());//远途加价金额(元)
+        jsonObject.put("OtherUpPrice", (orderPrivateCar.getDurationMoney() == null ? 0 : orderPrivateCar.getDurationMoney())
+                + (orderPrivateCar.getWaitMoney() == null ? 0 : orderPrivateCar.getWaitMoney()));//其他加价金额(元)
+        jsonObject.put("PayState", 1);//结算状态(0:未结算,1:已结算,2:未知)
+        jsonObject.put("PayTime", new Date());//乘客结算时间YYYYMMDDhhmmss
+        jsonObject.put("OrderMatchTime", new Date());//订单完成时间YYYYMMDDhhmmss
+        jsonObject.put("InvoiceStatus", "0");//发票状态(0:未开票,1:已开票,2:未知)
+        Map<String, Object> map = new HashMap<>();
+        map.put("operatePay", jsonObject.toJSONString());
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Connection", "keep-alive");
+        header.put("Content-Type", "application/x-www-form-urlencoded");
+        header.put("Accept", "*/*");
+        header.put("Accept-Encoding", "gzip");
+        header.put("Accept-Charset", "utf-8");
+        String result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/operatePay", map, header,"form");
+        System.err.println("------------------------经营支付接口----------------------:" + result);
+    }
+
+
+    /**
+     * 经营支付接口
+     * @param orderId
+     */
+    public void operatePayTransfer(Integer orderId){
+        OrderTransferCar orderPrivateCar = orderTransferService.selectById(orderId);
+        Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+        Map<String, Object> query = systemPriceMapper.query(orderPrivateCar.getCompanyId(), 1, orderPrivateCar.getServerCarModelId());
+        Car car = carMapper.selectById(orderPrivateCar.getCarId());
+        ServerCarModel serverCarModel = serverCarModelMapper.selectById(orderPrivateCar.getServerCarModelId());
+//        TransactionDetails transactionDetails = transactionDetailsService.selectById(new EntityWrapper<TransactionDetails>().eq("orderId", orderId).eq("orderType", 1));
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("OrderId", orderPrivateCar.getOrderNum());//订单号
+        jsonObject.put("OnArea", 450204);//上车位置行政区划代码
+        jsonObject.put("DriverName", driver.getName());//机动车驾驶员
+        jsonObject.put("LicenseId", driver.getDriveCard());//机动车驾驶证号
+        jsonObject.put("FareType", query.get("id").toString());//运价类型编码(由网约车公司定义,与运价信息接口保持一街)
+        jsonObject.put("VehicleNo", car.getCarLicensePlate());//车辆号牌
+        jsonObject.put("BookDepTime", orderPrivateCar.getTravelTime());//预计上车时间YYYYMMDDhhmmss
+        jsonObject.put("WaitTime", orderPrivateCar.getWait() * 60);//等待时间(秒)
+        jsonObject.put("DepLongitude", orderPrivateCar.getBoardingLon());//车辆出发经度
+        jsonObject.put("DepLatitude", orderPrivateCar.getBoardingLat());//车辆出发纬度
+        jsonObject.put("DepArea", orderPrivateCar.getBoardingAddress());//上车点
+        jsonObject.put("DepTime", orderPrivateCar.getBoardingTime());//上车时间YYYYMMDDhhmmss
+        jsonObject.put("DestLongitude", orderPrivateCar.getGetoffLon());//车辆到达经度
+        jsonObject.put("DestLatitude", orderPrivateCar.getGetoffLat());//车辆到达纬度
+        jsonObject.put("DestArea", orderPrivateCar.getGetoffAddress());//下车地点
+        jsonObject.put("DestTime", orderPrivateCar.getGetoffTime());//下车时间YYYYMMDDhhmmss
+        jsonObject.put("BookModel", serverCarModel.getName());//预定车型
+        jsonObject.put("Model", serverCarModel.getName());//实际使用车型
+        jsonObject.put("DriveMile", Double.valueOf(orderPrivateCar.getMileage() / 1000).intValue());//载客里程(km)
+        jsonObject.put("DriveTime", Double.valueOf((orderPrivateCar.getGetoffTime().getTime() - orderPrivateCar.getBoardingTime().getTime()) / 1000).intValue());//载客时间(秒)
+        List<OrderPosition> orderPositions = null;
+        try {
+            orderPositions = orderPositionService.queryPosition(orderId, 7);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        int distance = 0;
+        if(orderPositions.size() > 0){
+            OrderPosition orderPosition = orderPositions.get(0);
+            Map<String, String> distance1 = gdMapElectricFenceUtil.getDistance(orderPosition.getLon() + "," + orderPosition.getLat(), orderPrivateCar.getBoardingLon() + "," + orderPrivateCar.getBoardingLat(), 1);
+            distance = Integer.valueOf(distance1.get("distance")) / 1000;
+        }
+        jsonObject.put("WaitMile", distance);//空驶里程(km)
+        jsonObject.put("FactPrice", orderPrivateCar.getPayMoney());//实收金额(元)
+        jsonObject.put("Price", orderPrivateCar.getOrderMoney());//应收金额(元)
+        jsonObject.put("CashPrice", orderPrivateCar.getPayType() == 3 ? orderPrivateCar.getPayMoney() : 0);//现金支付金额(元)
+        jsonObject.put("LineName", orderPrivateCar.getPayType() != 3 ? "" : "");//电子支付机构
+        jsonObject.put("LinePrice", orderPrivateCar.getPayType() != 3 ? orderPrivateCar.getPayMoney() : 0);//电子支付金额(元)
+        jsonObject.put("PosName", "");//POS机支付机构
+        jsonObject.put("PosPrice", 0);//POS机支付金额(元)
+        jsonObject.put("BenfitPrice", (orderPrivateCar.getRedPacketMoney() == null ? 0 : orderPrivateCar.getRedPacketMoney())
+                + (orderPrivateCar.getCouponMoney() == null ? 0 : orderPrivateCar.getCouponMoney())
+                + (orderPrivateCar.getDurationMoney() == null ? 0 : orderPrivateCar.getDurationMoney()));//优惠金额(元)
+        jsonObject.put("BookTip", 0);//预约服务费(元)
+        jsonObject.put("PassengerTip", (orderPrivateCar.getParkMoney() == null ? 0 : orderPrivateCar.getParkMoney())
+                + (orderPrivateCar.getRoadTollMoney() == null ? 0 : orderPrivateCar.getRoadTollMoney()));//附加费(元)
+        Map<String, Double> map1 = this.setTransferMoney(orderPrivateCar);
+        Double amount3 = map1.get("amount3");//其他时间段
+        Double amount2 = map1.get("amount2");//高峰时段
+        Double amount1 = map1.get("amount1");//夜间时段
+        jsonObject.put("PeakUpPrice", null != amount2 ? (amount2 - amount3) : 0);//高峰时段时间加价金额(元)
+        jsonObject.put("NightUpPrice", null != amount1 ? (amount1 - amount3) : 0);//夜间时段里程加价金额(元)
+        jsonObject.put("FarUpPrice", orderPrivateCar.getLongDistanceMoney() == null ? 0 : orderPrivateCar.getLongDistanceMoney());//远途加价金额(元)
+        jsonObject.put("OtherUpPrice", (orderPrivateCar.getDurationMoney() == null ? 0 : orderPrivateCar.getDurationMoney())
+                + (orderPrivateCar.getWaitMoney() == null ? 0 : orderPrivateCar.getWaitMoney()));//其他加价金额(元)
+        jsonObject.put("PayState", 1);//结算状态(0:未结算,1:已结算,2:未知)
+        jsonObject.put("PayTime", new Date());//乘客结算时间YYYYMMDDhhmmss
+        jsonObject.put("OrderMatchTime", new Date());//订单完成时间YYYYMMDDhhmmss
+        jsonObject.put("InvoiceStatus", "0");//发票状态(0:未开票,1:已开票,2:未知)
+        Map<String, Object> map = new HashMap<>();
+        map.put("operatePay", jsonObject.toJSONString());
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Connection", "keep-alive");
+        header.put("Content-Type", "application/x-www-form-urlencoded");
+        header.put("Accept", "*/*");
+        header.put("Accept-Encoding", "gzip");
+        header.put("Accept-Charset", "utf-8");
+        String result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/operatePay", map, header,"form");
+        System.err.println("------------------------经营支付接口----------------------:" + result);
+    }
+
+    /**
+     * 乘客评价信息
+     * @param id
+     */
+    public void ratedPassenger(Integer id){
+        OrderEvaluate orderEvaluate = orderEvaluateService.selectById(id);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("OrderId", orderEvaluate.getOrderId());//订单号
+        jsonObject.put("EvaluateTime", new Date());//评价时间YYYYMMDDhhmms
+        jsonObject.put("ServiceScore", orderEvaluate.getFraction());//服务满意度(五分制)
+        jsonObject.put("DriverScore", orderEvaluate.getFraction());//驾驶员满意度(五分制)
+        jsonObject.put("VehicleScore", orderEvaluate.getFraction());//车辆满意度(五分制)
+        jsonObject.put("Detail", orderEvaluate.getContent());//评价内容
+        Map<String, Object> map = new HashMap<>();
+        map.put("ratedPassenger", jsonObject.toJSONString());
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Connection", "keep-alive");
+        header.put("Content-Type", "application/x-www-form-urlencoded");
+        header.put("Accept", "*/*");
+        header.put("Accept-Encoding", "gzip");
+        header.put("Accept-Charset", "utf-8");
+        String result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/ratedPassenger", map, header,"form");
+        System.err.println("-----------------------------乘客评价信息----------------------:" + result);
+    }
+
+
+
+    /**
+     * 驾驶员信誉信息
+     * @param driverId
+     */
+    public void ratedDriver(Integer driverId){
+        Driver driver = driverService.selectById(driverId);
+        List<OrderEvaluate> driverId1 = orderEvaluateService.selectList(new EntityWrapper<OrderEvaluate>().eq("driverId", driverId));
+        Integer level = 0;
+        for(OrderEvaluate orderEvaluate : driverId1){
+            level += orderEvaluate.getFraction().intValue();
+        }
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("LicenseId", driver.getDriveCard());//机动车驾驶证编号
+        jsonObject.put("Level", driverId1.size() == 0 ? 0 : level / driverId1.size());//服务质量信誉等级(五分制)
+        jsonObject.put("TestDate", new Date());//服务质量信誉考核日期YYYYMMDD
+        jsonObject.put("TestDepartment", "广西云森科技有限公司");//服务质量信誉考核机构
+        Map<String, Object> map = new HashMap<>();
+        map.put("ratedDriver", jsonObject.toJSONString());
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Connection", "keep-alive");
+        header.put("Content-Type", "application/x-www-form-urlencoded");
+        header.put("Accept", "*/*");
+        header.put("Accept-Encoding", "gzip");
+        header.put("Accept-Charset", "utf-8");
+        String result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/ratedDriver", map, header,"form");
+        System.err.println("---------------------------驾驶员信誉信息-----------------------:" + result);
+    }
+
+
+
+
+    /**
+     * 计算价格
+     * @param orderPrivateCar
+     * @return
+     * @throws Exception
+     */
+    private Map<String, Double> setMoney(OrderPrivateCar orderPrivateCar) {
+        Map<String, Object> query1 = systemPriceMapper.query(orderPrivateCar.getCompanyId(), 1, orderPrivateCar.getServerCarModelId());
+        Map<String, Double> map = new HashMap<>();
+        //开始根据不同的方式计算金额
+        double amount1 = 0;
+        double amount2 = 0;
+        double amount3 = 0;
+        JSONObject jsonObject = JSON.parseObject(query1.get("content").toString());
+        Double num1 = jsonObject.getDouble("num1");//起步价(元)
+        Double num2 = jsonObject.getDouble("num2");//起步公里(公里)
+        Double num3 = jsonObject.getDouble("num3");//起步时间(分钟)
+        Double num4 = jsonObject.getDouble("num4");//里程费(元)
+        Double num5 = jsonObject.getDouble("num5");//时长费(分钟)
+        Double num6 = jsonObject.getDouble("num6");//等待费(分钟)
+        Double num7 = jsonObject.getDouble("num7");//等待费(元)
+        Double num8 = jsonObject.getDouble("num8");//远途费(公里)
+        Double num9 = jsonObject.getDouble("num9");//远途费(公里)
+        Double num10 = jsonObject.getDouble("num10");//远途费(元)
+        Double num11 = jsonObject.getDouble("num11");//远途费(公里)
+        Double num12 = jsonObject.getDouble("num12");//远途费(公里)
+        Double num13 = jsonObject.getDouble("num13");//远途费(元)
+        Double num14 = jsonObject.getDouble("num14");//远途费(公里)
+        Double num15 = jsonObject.getDouble("num15");//远途费(元)
+        String num16 = jsonObject.getString("num16");//夜间费(开始时间)
+        Double num17 = jsonObject.getDouble("num17");//夜间费(元)
+        Double num18 = jsonObject.getDouble("num18");//夜间费(元)
+        Double num19 = jsonObject.getDouble("num19");//夜间费(元)
+        Double num20 = jsonObject.getDouble("num20");//夜间费(元)
+        Double num21 = jsonObject.getDouble("num21");//夜间费(元)
+        Double num22 = jsonObject.getDouble("num22");//夜间费(元)
+        String num23 = jsonObject.getString("num23");//高峰费(开始时间)
+        String num24 = jsonObject.getString("num24");//高峰费(开始时间)
+        Double num25 = jsonObject.getDouble("num25");//高峰费(元)
+        Double num26 = jsonObject.getDouble("num26");//高峰费(元)
+        Double num27 = jsonObject.getDouble("num27");//高峰费(元)
+        Double num28 = jsonObject.getDouble("num28");//高峰费(元)
+        Double num29 = jsonObject.getDouble("num29");//高峰费(元)
+        Double num30 = jsonObject.getDouble("num30");//高峰费(元)
+
+        Date date = new Date();
+        double d = (null == orderPrivateCar.getMileage() ? 0D : orderPrivateCar.getMileage()) / 1000;//实际公里
+        double t = ((orderPrivateCar.getEndServiceTime().getTime() - orderPrivateCar.getStartServiceTime().getTime()) / 60000) + 1;//实际时间(不满一分钟按一分钟算)
+        double w = ((orderPrivateCar.getStartServiceTime().getTime() - orderPrivateCar.getArriveTime().getTime()) / 60000) + 1;//等待分钟(不满一分钟按一分钟算)
+        double d1 = (d - num2) < 0 ? 0 : d - num2;//超出起步里程的公里
+        double t1 = (t - num3) < 0 ? 0 : new BigDecimal(t - num3).setScale(0, BigDecimal.ROUND_UP).doubleValue();//超过起步分钟数的时间
+        double w1 = (w - num6) < 0 ? 0 : new BigDecimal(w - num6).setScale(0, BigDecimal.ROUND_UP).doubleValue();//超出等待时间的时间
+        double yt1 = 0;//远途1段
+        double yt2 = 0;//远途2段
+        double yt3 = 0;//远途3段
+
+
+        //夜间服务处理逻辑
+        Calendar s = Calendar.getInstance();
+        s.setTime(date);
+        s.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num16.split(" - ")[0].split(":")[0]));
+        s.set(Calendar.MINUTE, Integer.valueOf(num16.split(" - ")[0].split(":")[1]));
+
+        Calendar e = Calendar.getInstance();
+        e.setTime(date);
+        e.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num16.split(" - ")[1].split(":")[0]));
+        e.set(Calendar.MINUTE, Integer.valueOf(num16.split(" - ")[1].split(":")[1]));
+
+        if(date.getTime() > s.getTimeInMillis() && date.getTime() < e.getTimeInMillis()){
+            if(d > num8.doubleValue() && d <= num9.doubleValue()){
+                yt1 = num20 * (d - num8);
+            }
+            if(d > num9.doubleValue()){
+                yt1 = num20 * (num9 - num8);
+            }
+            if(d > num11.doubleValue() || d <= num12.doubleValue()){
+                yt2 = num21 * (d - num11);
+            }
+            if(d > num12.doubleValue()){
+                yt2 = num21 * (num12 - num11);
+            }
+            if(d > num14.doubleValue()){
+                yt3 = num22 * (d - num14);
+            }
+            amount1 = num17 + (d1 * num18) + (t1 * num19) + (w1 * num7) + yt1 + yt2 + yt3;
+            map.put("amount1", amount1);
+        }
+
+
+        //高峰时段处理逻辑
+        Calendar s1 = Calendar.getInstance();
+        s1.setTime(date);
+        s1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num23.split(" - ")[0].split(":")[0]));
+        s1.set(Calendar.MINUTE, Integer.valueOf(num23.split(" - ")[0].split(":")[1]));
+
+        Calendar e1 = Calendar.getInstance();
+        e1.setTime(date);
+        e1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num23.split(" - ")[1].split(":")[0]));
+        e1.set(Calendar.MINUTE, Integer.valueOf(num23.split(" - ")[1].split(":")[1]));
+
+        Calendar s2 = Calendar.getInstance();
+        s2.setTime(date);
+        s2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num24.split(" - ")[0].split(":")[0]));
+        s2.set(Calendar.MINUTE, Integer.valueOf(num24.split(" - ")[0].split(":")[1]));
+
+        Calendar e2 = Calendar.getInstance();
+        e2.setTime(date);
+        e2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num24.split(" - ")[1].split(":")[0]));
+        e2.set(Calendar.MINUTE, Integer.valueOf(num24.split(" - ")[1].split(":")[1]));
+
+        if((date.getTime() > s1.getTimeInMillis() && date.getTime() < e1.getTimeInMillis()) || (date.getTime() > s2.getTimeInMillis() && date.getTime() < e2.getTimeInMillis())){
+            if(d > num8.doubleValue() && d <= num9.doubleValue()){
+                yt1 = num28 * (d - num8);
+            }
+            if(d > num9.doubleValue()){
+                yt1 = num28 * (num9 - num8);
+            }
+            if(d > num11.doubleValue() && d <= num12.doubleValue()){
+                yt2 = num29 * (d - num11);
+            }
+            if(d > num12.doubleValue()){
+                yt2 = num29 * (num12 - num11);
+            }
+            if(d > num14.doubleValue()){
+                yt3 = num30 * (d - num14);
+            }
+            amount2 = num25 + (d1 * num26) + (t1 * num27) + (w1 * num7) + yt1 + yt2 + yt3;
+            map.put("amount2", amount2);
+        }
+
+        //其他时间段的计算
+        if(d > num8.doubleValue() && d <= num9.doubleValue()){
+            yt1 = num10 * (d - num8);
+        }
+        if(d > num9.doubleValue()){
+            yt1 = num10 * (num9 - num8);
+        }
+        if(d > num11.doubleValue() && d <= num12.doubleValue()){
+            yt2 = num13 * (d - num11);
+        }
+        if(d > num12.doubleValue()){
+            yt2 = num13 * (num12 - num11);
+        }
+        if(d > num14.doubleValue()){
+            yt3 = num15 * (d - num14);
+        }
+        amount3 = num1 + (d1 * num4) + (t1 * num5) + (w1 * num7) + yt1 + yt2 + yt3;
+        map.put("amount3", amount3);
+        return map;
+    }
+
+
+    private Map<String, Double> setTransferMoney(OrderTransferCar orderPrivateCar) {
+        Map<String, Object> query1 = systemPriceMapper.query(orderPrivateCar.getCompanyId(), 1, orderPrivateCar.getServerCarModelId());
+        Map<String, Double> map = new HashMap<>();
+        //开始根据不同的方式计算金额
+        double amount1 = 0;
+        double amount2 = 0;
+        double amount3 = 0;
+        JSONObject jsonObject = JSON.parseObject(query1.get("content").toString());
+        Double num1 = jsonObject.getDouble("num1");//起步价(元)
+        Double num2 = jsonObject.getDouble("num2");//起步公里(公里)
+        Double num3 = jsonObject.getDouble("num3");//起步时间(分钟)
+        Double num4 = jsonObject.getDouble("num4");//里程费(元)
+        Double num5 = jsonObject.getDouble("num5");//时长费(分钟)
+        Double num6 = jsonObject.getDouble("num6");//等待费(分钟)
+        Double num7 = jsonObject.getDouble("num7");//等待费(元)
+        Double num8 = jsonObject.getDouble("num8");//远途费(公里)
+        Double num9 = jsonObject.getDouble("num9");//远途费(公里)
+        Double num10 = jsonObject.getDouble("num10");//远途费(元)
+        Double num11 = jsonObject.getDouble("num11");//远途费(公里)
+        Double num12 = jsonObject.getDouble("num12");//远途费(公里)
+        Double num13 = jsonObject.getDouble("num13");//远途费(元)
+        Double num14 = jsonObject.getDouble("num14");//远途费(公里)
+        Double num15 = jsonObject.getDouble("num15");//远途费(元)
+        String num16 = jsonObject.getString("num16");//夜间费(开始时间)
+        Double num17 = jsonObject.getDouble("num17");//夜间费(元)
+        Double num18 = jsonObject.getDouble("num18");//夜间费(元)
+        Double num19 = jsonObject.getDouble("num19");//夜间费(元)
+        Double num20 = jsonObject.getDouble("num20");//夜间费(元)
+        Double num21 = jsonObject.getDouble("num21");//夜间费(元)
+        Double num22 = jsonObject.getDouble("num22");//夜间费(元)
+        String num23 = jsonObject.getString("num23");//高峰费(开始时间)
+        String num24 = jsonObject.getString("num24");//高峰费(开始时间)
+        Double num25 = jsonObject.getDouble("num25");//高峰费(元)
+        Double num26 = jsonObject.getDouble("num26");//高峰费(元)
+        Double num27 = jsonObject.getDouble("num27");//高峰费(元)
+        Double num28 = jsonObject.getDouble("num28");//高峰费(元)
+        Double num29 = jsonObject.getDouble("num29");//高峰费(元)
+        Double num30 = jsonObject.getDouble("num30");//高峰费(元)
+
+        Date date = new Date();
+        double d = (null == orderPrivateCar.getMileage() ? 0D : orderPrivateCar.getMileage()) / 1000;//实际公里
+        double t = ((orderPrivateCar.getEndServiceTime().getTime() - orderPrivateCar.getStartServiceTime().getTime()) / 60000) + 1;//实际时间(不满一分钟按一分钟算)
+        double w = ((orderPrivateCar.getStartServiceTime().getTime() - orderPrivateCar.getArriveTime().getTime()) / 60000) + 1;//等待分钟(不满一分钟按一分钟算)
+        double d1 = (d - num2) < 0 ? 0 : d - num2;//超出起步里程的公里
+        double t1 = (t - num3) < 0 ? 0 : new BigDecimal(t - num3).setScale(0, BigDecimal.ROUND_UP).doubleValue();//超过起步分钟数的时间
+        double w1 = (w - num6) < 0 ? 0 : new BigDecimal(w - num6).setScale(0, BigDecimal.ROUND_UP).doubleValue();//超出等待时间的时间
+        double yt1 = 0;//远途1段
+        double yt2 = 0;//远途2段
+        double yt3 = 0;//远途3段
+
+
+        //夜间服务处理逻辑
+        Calendar s = Calendar.getInstance();
+        s.setTime(date);
+        s.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num16.split(" - ")[0].split(":")[0]));
+        s.set(Calendar.MINUTE, Integer.valueOf(num16.split(" - ")[0].split(":")[1]));
+
+        Calendar e = Calendar.getInstance();
+        e.setTime(date);
+        e.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num16.split(" - ")[1].split(":")[0]));
+        e.set(Calendar.MINUTE, Integer.valueOf(num16.split(" - ")[1].split(":")[1]));
+
+        if(date.getTime() > s.getTimeInMillis() && date.getTime() < e.getTimeInMillis()){
+            if(d > num8.doubleValue() && d <= num9.doubleValue()){
+                yt1 = num20 * (d - num8);
+            }
+            if(d > num9.doubleValue()){
+                yt1 = num20 * (num9 - num8);
+            }
+            if(d > num11.doubleValue() || d <= num12.doubleValue()){
+                yt2 = num21 * (d - num11);
+            }
+            if(d > num12.doubleValue()){
+                yt2 = num21 * (num12 - num11);
+            }
+            if(d > num14.doubleValue()){
+                yt3 = num22 * (d - num14);
+            }
+            amount1 = num17 + (d1 * num18) + (t1 * num19) + (w1 * num7) + yt1 + yt2 + yt3;
+            map.put("amount1", amount1);
+        }
+
+
+        //高峰时段处理逻辑
+        Calendar s1 = Calendar.getInstance();
+        s1.setTime(date);
+        s1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num23.split(" - ")[0].split(":")[0]));
+        s1.set(Calendar.MINUTE, Integer.valueOf(num23.split(" - ")[0].split(":")[1]));
+
+        Calendar e1 = Calendar.getInstance();
+        e1.setTime(date);
+        e1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num23.split(" - ")[1].split(":")[0]));
+        e1.set(Calendar.MINUTE, Integer.valueOf(num23.split(" - ")[1].split(":")[1]));
+
+        Calendar s2 = Calendar.getInstance();
+        s2.setTime(date);
+        s2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num24.split(" - ")[0].split(":")[0]));
+        s2.set(Calendar.MINUTE, Integer.valueOf(num24.split(" - ")[0].split(":")[1]));
+
+        Calendar e2 = Calendar.getInstance();
+        e2.setTime(date);
+        e2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num24.split(" - ")[1].split(":")[0]));
+        e2.set(Calendar.MINUTE, Integer.valueOf(num24.split(" - ")[1].split(":")[1]));
+
+        if((date.getTime() > s1.getTimeInMillis() && date.getTime() < e1.getTimeInMillis()) || (date.getTime() > s2.getTimeInMillis() && date.getTime() < e2.getTimeInMillis())){
+            if(d > num8.doubleValue() && d <= num9.doubleValue()){
+                yt1 = num28 * (d - num8);
+            }
+            if(d > num9.doubleValue()){
+                yt1 = num28 * (num9 - num8);
+            }
+            if(d > num11.doubleValue() && d <= num12.doubleValue()){
+                yt2 = num29 * (d - num11);
+            }
+            if(d > num12.doubleValue()){
+                yt2 = num29 * (num12 - num11);
+            }
+            if(d > num14.doubleValue()){
+                yt3 = num30 * (d - num14);
+            }
+            amount2 = num25 + (d1 * num26) + (t1 * num27) + (w1 * num7) + yt1 + yt2 + yt3;
+            map.put("amount2", amount2);
+        }
+
+        //其他时间段的计算
+        if(d > num8.doubleValue() && d <= num9.doubleValue()){
+            yt1 = num10 * (d - num8);
+        }
+        if(d > num9.doubleValue()){
+            yt1 = num10 * (num9 - num8);
+        }
+        if(d > num11.doubleValue() && d <= num12.doubleValue()){
+            yt2 = num13 * (d - num11);
+        }
+        if(d > num12.doubleValue()){
+            yt2 = num13 * (num12 - num11);
+        }
+        if(d > num14.doubleValue()){
+            yt3 = num15 * (d - num14);
+        }
+        amount3 = num1 + (d1 * num4) + (t1 * num5) + (w1 * num7) + yt1 + yt2 + yt3;
+        map.put("amount3", amount3);
+        return map;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
new file mode 100644
index 0000000..7b6c60a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
@@ -0,0 +1,384 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+import com.stylefeng.guns.modular.transfer.server.IOrderTransferService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.util.*;
+
+/**
+ * socket推单处理类
+ */
+@Component
+public class PushUtil {
+
+    @Autowired
+    private RestTemplate internalRestTemplate;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+    @Autowired
+    private IOrderTransferService orderTransferService;
+
+    private Map<String, JSONObject> pushMap = new HashMap<>();//存储需要定时推送的数据
+
+    private Map<String, Timer> taskMap = new HashMap<>();//存储定时推送的定时器
+
+
+
+
+    /**
+     * 推送订单状态
+     * @param type          1=用户,2=司机
+     * @param uid           对象id
+     * @param orderId       订单id
+     * @param orderType     订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车 7=接送机)
+     * @param state         订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)
+     */
+    public void pushOrderState(Integer type, Integer uid, Integer orderId, Integer orderType, Integer state, Integer time){
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("code", 200);
+        jsonObject.put("msg", "SUCCESS");
+        jsonObject.put("method", "ORDER_STATUS");
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderId", orderId);
+        map.put("orderType", orderType);
+        map.put("state", state);
+        map.put("time", time);
+        jsonObject.put("data", map);
+
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("msg", jsonObject.toJSONString());
+        params.add("id", String.valueOf(uid));
+        params.add("type", String.valueOf(type));
+        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){
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
+
+
+    /**
+     * 推单完成后,没有司机接单的推送提醒
+     * @param type
+     * @param uid
+     * @param orderId
+     * @param orderType
+     */
+    public void pushEndPush(Integer type, Integer uid, Integer orderId, Integer orderType){
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("code", 200);
+        jsonObject.put("msg", "SUCCESS");
+        jsonObject.put("method", "END_PUSH");
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderId", orderId);
+        map.put("orderType", orderType);
+        jsonObject.put("data", map);
+
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("msg", jsonObject.toJSONString());
+        params.add("id", String.valueOf(uid));
+        params.add("type", String.valueOf(type));
+        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){
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
+
+
+
+
+    /**
+     * 推送司机位置给乘客端
+     */
+    public void pushDriverPosition(Integer orderId, Integer orderType){
+        Integer userId = null;
+        switch (orderType){
+            case 1:
+                OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+                userId = orderPrivateCar.getUserId();
+                break;
+            case 2:
+                OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
+                userId = orderTaxi.getUserId();
+                break;
+            case 3:
+                OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
+                userId = orderCrossCity.getUserId();
+                break;
+            case 7:
+                OrderTransferCar orderTransferCar = orderTransferService.selectById(orderId);
+                userId = orderTransferCar.getUserId();
+                break;
+        }
+        JSONObject data = new JSONObject();
+        data.put("id", userId);
+        data.put("type", 1);
+        this.pushMap.put(orderId + "_" + orderType, data);
+        this.createTask(orderId, orderType);
+    }
+
+
+    /**
+     * 创建定时任务
+     * @param orderId
+     */
+    public void createTask(Integer orderId, Integer orderType){
+        TimerTask task = new TimerTask() {
+            @Override
+            public void run() {
+                try {
+                    PushUtil.this.pushPositon(orderId, orderType);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        };
+        Timer timer = new Timer();
+        timer.schedule(task, 1000, 10000);//1秒后开始10秒钟一次的重复执行
+        taskMap.put(orderId + "_" + orderType, timer);
+    }
+
+
+    /**
+     * 推送处理方法
+     * @param orderId
+     * @param orderType
+     * @throws Exception
+     */
+    public void pushPositon(Integer orderId, Integer orderType) throws Exception{
+        Integer driverId = null;
+        String startLonLat = null;
+        String endLonLat = null;
+        Integer state = 0;
+        Integer oldState = 0;
+        Long startServiceTime = null;
+        Double servedMileage = null;
+        switch (orderType){
+            case 1:
+                OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+                driverId = orderPrivateCar.getDriverId();
+                startLonLat = orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat();
+                state = orderPrivateCar.getState();
+                oldState = orderPrivateCar.getOldState();
+                startServiceTime = null != orderPrivateCar.getStartServiceTime() ? orderPrivateCar.getStartServiceTime().getTime() : null;
+                servedMileage = orderPrivateCar.getMileage();
+                endLonLat = orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat();
+                break;
+            case 2:
+                OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
+                driverId = orderTaxi.getDriverId();
+                startLonLat = orderTaxi.getStartLon() + "," + orderTaxi.getStartLat();
+                state = orderTaxi.getState();
+                oldState = orderTaxi.getOldState();
+                startServiceTime = null != orderTaxi.getStartServiceTime() ? orderTaxi.getStartServiceTime().getTime() : null;
+                servedMileage = orderTaxi.getMileage();
+                endLonLat = orderTaxi.getEndLon() + "," + orderTaxi.getEndLat();
+                break;
+            case 3:
+                OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
+                driverId = orderCrossCity.getDriverId();
+                startLonLat = orderCrossCity.getStartLon() + "," + orderCrossCity.getStartLat();
+                state = orderCrossCity.getState();
+                oldState = orderCrossCity.getOldState();
+                startServiceTime = null != orderCrossCity.getStartServiceTime() ? orderCrossCity.getStartServiceTime().getTime() : null;
+                servedMileage = orderCrossCity.getMileage();
+                endLonLat = orderCrossCity.getEndLon() + "," + orderCrossCity.getEndLat();
+                break;
+        }
+        //计算预计距离和剩余时间
+        String value = redisUtil.getValue("DRIVER" + String.valueOf(driverId));
+        if(null == value || "".equals(value)){
+            System.err.println("司机没有上传位置信息");
+        }
+        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, startLonLat, 1);
+        String d = "0";
+        String t = "0";
+        if(null == distance){
+            System.err.println("查询距离出错了");
+        }else{
+            d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
+            t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
+        }
+        JSONObject msg = new JSONObject();
+        msg.put("code", 200);
+        msg.put("msg", "SUCCESS");
+        msg.put("method", "DRIVER_POSITION");
+        Map<String, String> map = new HashMap<>();
+        map.put("orderId", String.valueOf(orderId));
+        map.put("orderType", String.valueOf(orderType));
+        map.put("lon", (null != value ? value.split(",")[0] : ""));
+        map.put("lat", (null != value ? value.split(",")[1] : ""));
+        if(state == 7 || state == 8 || state == 9 || state == 10 || state == 12){//删除定时任务
+            this.removeTask(orderId, orderType);
+            return;
+        }
+        if((state == 2 || state == 3 || state == 4) || (oldState != null && (oldState == 2 || oldState == 3 || oldState == 4))){//前往预约地
+            map.put("reservationMileage", d);//当前位置距离预约点的剩余里程
+            map.put("reservationTime", t);//当前位置距离预约点的剩余分钟
+            map.put("servedMileage", "0");//距离起点已经服务的里程
+            map.put("servedTime", "0");//距离起点已经服务的时间
+            map.put("laveMileage", "0");//距离终点剩余未服务的里程数
+            map.put("laveTime", "0");//距离终端剩余未服务的预计时间
+        }
+        if((state == 5 || state == 6) || (oldState != null && (oldState == 5 || oldState == 6))){//服务中
+            map.put("reservationMileage", "0");//当前位置距离预约点的剩余里程
+            map.put("reservationTime", "0");//当前位置距离预约点的剩余分钟
+            map.put("servedMileage", String.valueOf(servedMileage / 1000));//距离起点已经服务的里程
+            Integer servedTime = Long.valueOf((new Date().getTime() - startServiceTime) / 60000).intValue();
+            map.put("servedTime", servedTime + "");//距离起点已经服务的时间
+            distance = gdMapElectricFenceUtil.getDistance(value, endLonLat, 1);
+            if(null == distance){
+                System.err.println("查询距离出错了");
+            }else{
+                d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
+                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
+            }
+            map.put("laveMileage", d);//距离终点剩余未服务的里程数
+            map.put("laveTime", t);//距离终端剩余未服务的预计时间
+        }
+
+        msg.put("data", map);
+
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        JSONObject jsonObject = pushMap.get(orderId + "_" + orderType);
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("msg", msg.toJSONString());
+        params.add("id", jsonObject.getString("id"));
+        params.add("type", jsonObject.getString("type"));
+        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){
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
+
+
+    /**
+     * 推送强迫下线
+     * @param id
+     * @param type
+     */
+    public void pushOffline(Integer id, Integer type){
+        JSONObject msg = new JSONObject();
+        msg.put("code", 200);
+        msg.put("msg", "SUCCESS");
+        msg.put("method", "OFFLINE");
+        msg.put("data", new Object());
+
+        //调用推送
+        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){
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
+
+
+    /**
+     * 摆渡抢单成功后推单
+     * @param type
+     * @param uid
+     * @param orderId
+     * @param orderType
+     * @param state
+     */
+    public void pushFerryOrderState(Integer type, Integer uid, Integer orderId, Integer orderType, Integer state){
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("code", 200);
+        jsonObject.put("msg", "SUCCESS");
+        jsonObject.put("method", "FERRY");
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderId", orderId);
+        map.put("orderType", orderType);
+        map.put("state", state);
+        jsonObject.put("data", map);
+
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("msg", jsonObject.toJSONString());
+        params.add("id", String.valueOf(uid));
+        params.add("type", String.valueOf(type));
+        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){
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
+
+
+
+    /**
+     * 删除定时任务
+     * @param orderId
+     */
+    public void removeTask(Integer orderId, Integer orderType){
+        Timer timer = taskMap.get(orderId + "_" + orderType);
+        if (null != timer){
+            timer.cancel();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
new file mode 100644
index 0000000..22f75e6
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
@@ -0,0 +1,128 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+
+
+/**
+ * Redis工具类
+ */
+@Component
+public class RedisUtil {
+
+    @Autowired
+    private RestTemplate internalRestTemplate;
+
+
+    /**
+     * 向redis中存储字符串没有过期时间
+     * @param key
+     * @param value
+     */
+    public void setStrValue(String key, String value){
+        if(ToolUtil.isNotEmpty(key)){
+            //发送验证码短信
+            HttpHeaders headers = new HttpHeaders();
+            // 以表单的方式提交
+            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+            //将请求头部和参数合成一个请求
+            MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+            params.add("key", key);
+            params.add("value", value);
+            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+            String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/setValue_", requestEntity, String.class);
+            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+            if(jsonObject.getIntValue("code") != 200){
+                System.err.println("调用redis出错了");
+            }
+        }
+
+    }
+
+
+    /**
+     * 以分钟为单位设置存储值(设置过期时间)
+     * @param key
+     * @param value
+     * @param time 秒
+     */
+    public void setStrValue(String key, String value, int time){
+        if(ToolUtil.isNotEmpty(key)){
+            //发送验证码短信
+            HttpHeaders headers = new HttpHeaders();
+            // 以表单的方式提交
+            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+            //将请求头部和参数合成一个请求
+            MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+            params.add("key", key);
+            params.add("value", value);
+            params.add("time", String.valueOf(time));
+            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
+            String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/setValue", requestEntity, String.class);
+            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+            if(jsonObject.getIntValue("code") != 200){
+                System.err.println("调用redis出错了");
+            }
+        }
+    }
+
+
+    /**
+     * 从redis中获取值
+     * @param key
+     * @return
+     */
+    public String getValue(String key){
+        if(ToolUtil.isNotEmpty(key)){
+            HttpHeaders headers = new HttpHeaders();
+            // 以表单的方式提交
+            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+            //将请求头部和参数合成一个请求
+            MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+            params.add("key", key);
+            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+            String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/getValue",requestEntity , String.class);
+            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+            if(jsonObject.getIntValue("code") != 200){
+                System.err.println("调用redis出错了");
+            }
+            return jsonObject.getString("data");
+        }
+        return null;
+    }
+
+
+    /**
+     * 删除key
+     * @param key
+     */
+    public String remove(String key){
+        if(ToolUtil.isNotEmpty(key)){
+            HttpHeaders headers = new HttpHeaders();
+            // 以表单的方式提交
+            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+            //将请求头部和参数合成一个请求
+            MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+            params.add("key", key);
+            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+            String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/remove",requestEntity , String.class);
+            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+            if(jsonObject.getIntValue("code") != 200){
+                System.err.println("调用redis出错了");
+            }
+            return jsonObject.getString("data");
+        }
+        return null;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java
new file mode 100644
index 0000000..d8102a0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java
@@ -0,0 +1,188 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 定义统一返回对象
+ */
+@ApiModel(value = "统一返回结果集")
+public class ResultUtil<T> {
+
+    public static final Integer SUCCESS = 200;
+
+    public static final Integer PARAM_ERROR = 300;
+
+    public static final Integer RUNTIME_ERROR = 400;
+
+    public static final Integer ERROR = 500;
+
+    public static final Integer TOKEN_ERROR = 600;
+
+    public static final Integer SIGN_ERROR = 700;
+
+    public static final String Token = "TOKEN_INVALID";
+
+    public static final String SIGN = "SIGN_INVALID";
+
+    @ApiModelProperty(name = "code", value = "业务状态码 200:成功,300:参数错误,400:运行异常,500:其他异常, 600:token无效,需重新登录,700:签名无效")
+    private Integer code;//备用状态码
+
+    @ApiModelProperty(name = "msg", value = "返回结果说明")
+    private String msg;//返回说明
+
+    @ApiModelProperty(name = "data", value = "返回结果值")
+    private T data;//返回数据
+
+
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+
+    public Integer getCode() {
+        return code;
+    }
+
+    private ResultUtil(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    private ResultUtil(Integer code, String msg, T data) {
+        this.code = code;
+        this.msg = msg;
+        this.data = data;
+    }
+
+
+    public static <T> ResultUtil<T> getResult(Integer code, String msg){
+        return new ResultUtil<>(code, msg);
+    }
+
+    public static <T> ResultUtil<T> getResult(Integer code, String msg, T data){
+        return new ResultUtil<>(code, msg, data);
+    }
+
+    /**
+     * 错误信息
+     * @return
+     */
+    public static ResultUtil error(String mag){
+        return ResultUtil.getResult(ResultUtil.ERROR, mag, new JSONObject());
+    }
+
+    /**
+     * 错误信息
+     * @return
+     */
+    public static <T> ResultUtil <T> error(String mag, T obj){
+        return ResultUtil.getResult(ResultUtil.ERROR, mag, obj);
+    }
+
+    /**
+     * token失效
+     * @return
+     */
+    public static ResultUtil tokenErr(){
+        return ResultUtil.getResult(ResultUtil.TOKEN_ERROR, ResultUtil.Token, new JSONObject());
+    }
+
+    /**
+     * token失效
+     * @return
+     */
+    public static ResultUtil tokenErr(String msg){
+        return ResultUtil.getResult(ResultUtil.TOKEN_ERROR, msg, new JSONObject());
+    }
+
+    /**
+     * 参数异常
+     * @return
+     */
+    public static  ResultUtil paranErr(){
+        return ResultUtil.getResult(ResultUtil.PARAM_ERROR, "PARAM_ERROR", new JSONObject());
+    }
+
+    /**
+     * 参数异常
+     * @return
+     */
+    public static <T> ResultUtil<T> paranErr(T data){
+        return ResultUtil.getResult(ResultUtil.PARAM_ERROR, "SYSTEM_RUN_ERROR", data);
+    }
+
+    /**
+     * 运行异常
+     * @return
+     */
+    public static ResultUtil runErr(){
+        return ResultUtil.getResult(ResultUtil.RUNTIME_ERROR, "SYSTEM_RUN_ERROR", new JSONObject());
+    }
+
+
+    /**
+     * 运行异常
+     * @return
+     */
+    public static <T>ResultUtil<T> runErr(T data){
+        return ResultUtil.getResult(ResultUtil.RUNTIME_ERROR, "SYSTEM_RUN_ERROR", data);
+    }
+
+    /**
+     * 运行异常
+     * @return
+     */
+    public static <T>ResultUtil<T> runErr(T data, String msg){
+        return ResultUtil.getResult(ResultUtil.RUNTIME_ERROR, msg, data);
+    }
+
+
+    /**
+     * 返回成功
+     * @param
+     * @return
+     */
+    public static ResultUtil success(){
+        return ResultUtil.getResult(ResultUtil.SUCCESS, "SUCCESS", new JSONObject());
+    }
+
+
+    /**
+     * 返回成功
+     * @param data
+     * @param <T>
+     * @return
+     */
+    public static <T> ResultUtil<T> success(T data){
+        return ResultUtil.getResult(ResultUtil.SUCCESS, "SUCCESS", data);
+    }
+
+    /**
+     * 返回成功
+     * @param msg
+     * @param data
+     * @param <T>
+     * @return
+     */
+    public static <T> ResultUtil<T> success(String msg, T data){
+        return ResultUtil.getResult(ResultUtil.SUCCESS, msg, data);
+    }
+
+
+    /**
+     * 签名无效
+     * @param <T>
+     * @return
+     */
+    public static <T> ResultUtil<T> sign(){
+        return ResultUtil.getResult(ResultUtil.SIGN_ERROR, SIGN);
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SystemException.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SystemException.java
new file mode 100644
index 0000000..7017207
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SystemException.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.util;
+
+/**
+ * 自定义系统异常类
+ */
+public class SystemException extends Exception {
+
+    public SystemException(String message) {
+        super(message);
+    }
+
+    public SystemException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public SystemException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java
new file mode 100644
index 0000000..9965c15
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java
@@ -0,0 +1,59 @@
+package com.stylefeng.guns.modular.system.util;
+
+
+import com.stylefeng.guns.modular.system.service.IUserCouponRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 定时任务工具类
+ */
+@Component
+public class TaskUtil {
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+
+
+    /**
+     * 每隔一分钟去处理的定时任务
+     */
+    @Scheduled(fixedRate = 1000 * 60)
+    public void taskMinute(){
+        try {
+            //修改过期的优惠券
+            userCouponRecordService.updateTimeOut();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+//    /**
+//     * 每天的凌晨执行的任务
+//     */
+//    @Scheduled(cron = "0 0 0 * * *")
+//    public void taskDay(){
+//        try {
+//        }catch (Exception e){
+//            e.printStackTrace();
+//        }
+//    }
+
+
+//
+//    /**
+//     * 每月第一天的1点执行的任务
+//     */
+//    @Scheduled(cron = "0 0 1 1 * *")
+//    public void taskMonth(){
+//        try {
+//
+//        }catch (Exception e){
+//            e.printStackTrace();
+//        }
+//    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java
new file mode 100644
index 0000000..0f9b2be
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java
@@ -0,0 +1,78 @@
+package com.stylefeng.guns.modular.system.util;
+
+
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 定义生成随机码的工具类
+ */
+public class UUIDUtil {
+
+    private int i = 1;
+
+
+    /**
+     * 定义生成原生的UUID随机码
+     * @return
+     */
+    public static String getNativeUUID(){
+        return UUID.randomUUID().toString();
+    }
+
+
+    /**
+     * 生成32位随机码
+     * @return
+     */
+    public static String getRandomCode(){
+        return UUIDUtil.getNativeUUID().replaceAll("-", "");
+    }
+
+
+    /**
+     * 获取给定长度的随机码
+     * @param num
+     * @return
+     * @throws Exception
+     */
+    public static String getRandomCode(Integer num) throws Exception{
+        String str = null;
+        if(0 < num){
+            if(num % 32 > 0){
+                Integer s = num / 32;
+                Integer l = num % 32;
+                StringBuffer sb = new StringBuffer();
+                for(int i = 0; i < s; i++){
+                    sb.append(UUIDUtil.getRandomCode());
+                }
+                sb.append(UUIDUtil.getRandomCode().substring(0, l));
+                str = sb.toString();
+            }else if(num % 32 == 0){
+                Integer s = num / 32;
+                StringBuffer sb = new StringBuffer();
+                for(int i = 0; i < s; i++){
+                    sb.append(UUIDUtil.getRandomCode());
+                }
+                str = sb.toString();
+            }else{
+                str = UUIDUtil.getRandomCode().substring(0, num);
+            }
+        }else{
+            throw new Exception("参数只能大于0");
+        }
+        return str;
+    }
+
+
+    /**
+     * 获取根据当前时间的字符串数据
+     * @return
+     */
+    public synchronized static String getTimeStr(){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddhhmmssS");
+        return simpleDateFormat.format(new Date());
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UrlLinkUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UrlLinkUtil.java
new file mode 100644
index 0000000..5a6e58c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UrlLinkUtil.java
@@ -0,0 +1,50 @@
+//package com.stylefeng.guns.modular.system.util;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import com.stylefeng.guns.core.util.ToolUtil;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.http.HttpEntity;
+//import org.springframework.http.ResponseEntity;
+//import org.springframework.stereotype.Component;
+//
+//import java.util.HashMap;
+//import java.util.Map;
+//
+//@Component
+//public class UrlLinkUtil {
+//    @Autowired
+//    private HttpClientUtil httpClientUtil;
+//
+//    @Autowired
+//    private RedisUtil redisUtil;
+//    public String getWxAppletsAccessToken() throws Exception{
+//        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + "wxc89ecab90d24edd8" + "&secret=" + "bca863174d22736a4a9758a67484947e";
+//        String s = httpClientUtil.pushHttpRequset("GET", url, null, null, "form");
+//        if(ToolUtil.isEmpty(s)){
+//            return null;
+//        }
+//        JSONObject jsonObject = JSON.parseObject(s);
+//        return jsonObject.getString("access_token");
+//    }
+//
+//    public String getUrlLink(String path, String query) throws Exception{
+//        String wxAppletsAccessToken = redisUtil.getValue("wxAppletsAccessToken");
+//        String url = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + wxAppletsAccessToken;
+//        Map<String, Object> param = new HashMap<>();
+//        param.put("expire_type", 1);
+//        param.put("expire_interval", 1);
+//        param.put("path", path);
+//        param.put("query", query);
+//        param.put("env_version", "release");
+//        HttpHeaders httpHeaders = new HttpHeaders();
+//        MediaType type=MediaType.parseMediaType("application/json;charset=UTF-8");
+//        httpHeaders.setContentType(type);
+//        HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(param, httpHeaders);
+//        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
+//        String body1 = exchange.getBody();
+//        return body1;
+//    }
+//
+//
+//}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WeChatUtil.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WeChatUtil.java
new file mode 100644
index 0000000..c22e882
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WeChatUtil.java
@@ -0,0 +1,209 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.api.UserInfoController;
+import com.stylefeng.guns.modular.system.util.HttpClientUtil;
+import com.stylefeng.guns.modular.system.util.RedisUtil;
+import com.stylefeng.guns.modular.system.util.UUIDUtil;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.http.entity.ContentType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * 微信工具类
+ */
+@Component
+public class WeChatUtil {
+
+    @Value("${wx.appletsAppid}")
+    private String wxAppletsAppid;
+
+    @Value("${wx.appletsAppSecret}")
+    private String wxAppletsAppSecret;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+
+
+    /**
+     * 小程序使用jscode获取openid
+     * @param jscode
+     * @return
+     */
+    public Map<String, String> code2Session(String jscode){
+        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret
+                + "&js_code=" + jscode + "&grant_type=authorization_code";
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        int errcode = jsonObject.getIntValue("errcode");
+        Map<String, String> map = new HashMap<>();
+        if(errcode == 0){//成功
+            map.put("openid", jsonObject.getString("openid"));
+            map.put("sessionKey", jsonObject.getString("session_key"));
+            map.put("unionid", jsonObject.getString("unionid"));
+            return map;
+        }
+        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        if(errcode == 40029){//code 无效
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        if(errcode == 45011){//频率限制,每个用户每分钟100次
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        return null;
+    }
+
+
+    /**
+     * 通过config接口注入权限验证配置(公众号)
+     * 附录1-JS-SDK使用权限签名算法,
+     * @return
+     */
+    public Map<String,Object> getSignatureConfig(String url){
+        //获取token
+        try {
+            url = URLDecoder.decode(url, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        String ticket = getJSApiTicket();
+        String noncestr = UUIDUtil.getRandomCode();
+        Long timestamp = System.currentTimeMillis();
+        String content = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;
+        String signature = DigestUtils.sha1Hex(content);
+        Map<String,Object> map=new HashMap<>();
+        map.put("appId", "wx0e72f86394831b34");
+        map.put("timestamp", timestamp);
+        map.put("nonceStr", noncestr);
+        map.put("signature", signature);
+        return  map;
+    }
+
+
+
+    /***
+     * 获取jsapiTicket(公众号)
+     * 来源 www.vxzsk.com
+     * @return
+     */
+    public String getJSApiTicket(){
+        //获取token
+        String acess_token= this.getAccessToken();
+        String urlStr = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + acess_token + "&type=jsapi";
+        String backData = restTemplate.getForObject(urlStr, String.class);
+        System.out.println(backData);
+        String ticket = JSONObject.parseObject(backData).getString("ticket");
+        return  ticket;
+    }
+
+
+    /***
+     * 获取acess_token (公众号)
+     * 来源www.vxzsk.com
+     * @return
+     */
+    public String getAccessToken(){
+        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx66a25427a9e6f21e&secret=5ccdfc37576afe86b2a5532b88bfd147";
+        String backData = restTemplate.getForObject(url, String.class);
+        String accessToken = JSONObject.parseObject(backData).getString("access_token");
+        return accessToken;
+    }
+
+    public String getUrlLink(String path, String query) throws Exception{
+        String wxAppletsAccessToken = getAccessToken();
+        String url = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + wxAppletsAccessToken;
+        Map<String, Object> param = new HashMap<>();
+        param.put("expire_type", 1);
+        param.put("expire_interval", 1);
+        param.put("path", path);
+        param.put("query", query);
+        param.put("env_version", "trial");
+        HttpHeaders httpHeaders = new HttpHeaders();
+        MediaType type=MediaType.parseMediaType("application/json;charset=UTF-8");
+        httpHeaders.setContentType(type);
+        HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(param, httpHeaders);
+        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
+        String body1 = exchange.getBody();
+        return body1;
+    }
+
+    public String getPhone(String code) throws Exception{
+        String wxAppletsAccessToken = getAccessToken();
+        String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + wxAppletsAccessToken;
+        Map<String, Object> param = new HashMap<>();
+        param.put("code",code);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        MediaType type=MediaType.parseMediaType("application/json;charset=UTF-8");
+        httpHeaders.setContentType(type);
+        HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(param, httpHeaders);
+        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
+        String body1 = exchange.getBody();
+//        String body1 ="{\"errcode\":0,\"errmsg\":\"ok\",\"phone_info\":{\"phoneNumber\":\"15708179461\",\"purePhoneNumber\":\"15708179461\",\"countryCode\":\"86\",\"watermark\":{\"timestamp\":1720420413,\"appid\":\"wxc89ecab90d24edd8\"}}}";
+
+        JSONObject jsonObject = JSON.parseObject(body1);
+        // 从JSON对象中获取phone_info子对象
+        JSONObject phoneInfo = jsonObject.getJSONObject("phone_info");
+        // 从phone_info中获取phoneNumber
+        String phoneNumber = phoneInfo.getString("phoneNumber");
+        System.out.println("Phone Number: " + phoneNumber);
+
+
+        return phoneNumber;
+    }
+
+    
+    @Autowired
+    private UserInfoController userInfoController;
+    public String rid(String path, String query) throws Exception{
+        // 获取access_token
+        String accessToken = getAccessToken();
+        // 替换CREATE_CODE_URL
+        String url = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token="+accessToken;
+        // 发送请求
+        String stringApiResult = null;
+        try {
+            HashMap<String, String> map = new HashMap<>();
+            map.put("path", path+"?driverId=979");
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            HttpEntity requestEntity = new HttpEntity(map, headers);
+            ResponseEntity<byte[]> rep = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class);
+            byte[] bytes = rep.getBody();
+            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
+            MultipartFile file = new MockMultipartFile(ContentType.APPLICATION_OCTET_STREAM.toString(), byteArrayInputStream);
+            ResultUtil resultUtil = userInfoController.uploadImg(file, null, null);
+            StringBuilder sb = new StringBuilder(stringApiResult);
+            stringApiResult = sb.toString();
+        } catch (Exception e) {
+        }
+        return stringApiResult;
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/AdvertisementWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/AdvertisementWarpper.java
new file mode 100644
index 0000000..ed2d37f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/AdvertisementWarpper.java
@@ -0,0 +1,103 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("广告")
+public class AdvertisementWarpper {
+    @ApiModelProperty("主键")
+    private Integer id;
+    @ApiModelProperty("名称")
+    private String name;
+    @ApiModelProperty("图片地址")
+    private String imgUrl;
+    @ApiModelProperty("类型(1:弹窗,2:底部)")
+    private Integer type;
+    @ApiModelProperty("是否跳转(1:是,2:否)")
+    private Integer isJump;
+    @ApiModelProperty("跳转类型(1:外部,2:内部)")
+    private Integer jumpType;
+    @ApiModelProperty("跳转路径")
+    private String jumpUrl;
+    @ApiModelProperty("内容")
+    private String content;
+
+    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 getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getIsJump() {
+        return isJump;
+    }
+
+    public void setIsJump(Integer isJump) {
+        this.isJump = isJump;
+    }
+
+    public Integer getJumpType() {
+        return jumpType;
+    }
+
+    public void setJumpType(Integer jumpType) {
+        this.jumpType = jumpType;
+    }
+
+    public String getJumpUrl() {
+        return jumpUrl;
+    }
+
+    public void setJumpUrl(String jumpUrl) {
+        this.jumpUrl = jumpUrl;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "AdvertisementWarpper{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", imgUrl='" + imgUrl + '\'' +
+                ", type=" + type +
+                ", isJump=" + isJump +
+                ", jumpType=" + jumpType +
+                ", jumpUrl='" + jumpUrl + '\'' +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/BaseWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/BaseWarpper.java
new file mode 100644
index 0000000..9394d0c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/BaseWarpper.java
@@ -0,0 +1,146 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 公共封装类
+ */
+@ApiModel("公共对象")
+public class BaseWarpper {
+    @ApiModelProperty("主键id")
+    private Integer id;
+    @ApiModelProperty("名称")
+    private String name;
+    @ApiModelProperty("内容")
+    private String content;
+    @ApiModelProperty("数量")
+    private Integer number;
+    @ApiModelProperty("总数量")
+    private Integer totalNumber;
+    @ApiModelProperty("金额")
+    private Double amount;
+    @ApiModelProperty("时长(分钟)")
+    private Integer minute;
+    @ApiModelProperty("经度")
+    private Double lon;
+    @ApiModelProperty("纬度")
+    private Double lat;
+
+    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 getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public Integer getTotalNumber() {
+        return totalNumber;
+    }
+
+    public void setTotalNumber(Integer totalNumber) {
+        this.totalNumber = totalNumber;
+    }
+
+    public Double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public Integer getMinute() {
+        return minute;
+    }
+
+    public void setMinute(Integer minute) {
+        this.minute = minute;
+    }
+
+    public Double getLon() {
+        return lon;
+    }
+
+    public void setLon(Double lon) {
+        this.lon = lon;
+    }
+
+    public Double getLat() {
+        return lat;
+    }
+
+    public void setLat(Double lat) {
+        this.lat = lat;
+    }
+
+    @Override
+    public String toString() {
+        return "BaseWarpper{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", content='" + content + '\'' +
+                ", number=" + number +
+                ", totalNumber=" + totalNumber +
+                ", amount=" + amount +
+                ", minute=" + minute +
+                ", lon=" + lon +
+                ", lat=" + lat +
+                '}';
+    }
+
+    public static BaseWarpper getBaseWarpper(Map<String, Object> map){
+        BaseWarpper baseWarpper = new BaseWarpper();
+        if(null != map){
+            baseWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            baseWarpper.setName(null != map.get("name") ? map.get("name").toString() : "");
+            baseWarpper.setContent(null != map.get("content") ? map.get("content").toString() : "");
+            baseWarpper.setNumber(null != map.get("number") ? Integer.valueOf(map.get("number").toString()) : 0);
+            baseWarpper.setTotalNumber(null != map.get("totalNumber") ? Integer.valueOf(map.get("totalNumber").toString()) : 0);
+            baseWarpper.setAmount(null != map.get("amount") ? Double.valueOf(map.get("amount").toString()) : 0);
+            baseWarpper.setMinute(null != map.get("minute") ? Integer.valueOf(map.get("minute").toString()) : 0);
+            baseWarpper.setLon(null != map.get("lon") ? Double.valueOf(map.get("lon").toString()) : 0);
+            baseWarpper.setLat(null != map.get("lat") ? Double.valueOf(map.get("lat").toString()) : 0);
+        }
+        return baseWarpper;
+    }
+
+    public static List<BaseWarpper> getBaseWarppers(List<Map<String, Object>> list){
+        List<BaseWarpper> data = new ArrayList<>();
+        if(null != list){
+            for(Map<String, Object> map : list){
+                data.add(BaseWarpper.getBaseWarpper(map));
+            }
+        }
+        return data;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CouponWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CouponWarpper.java
new file mode 100644
index 0000000..0ffad5a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CouponWarpper.java
@@ -0,0 +1,124 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("优惠券列表")
+public class CouponWarpper {
+    @ApiModelProperty("主键id")
+    private Integer id;
+    @ApiModelProperty("优惠金额")
+    private Double money;
+    @ApiModelProperty("类型(0=通用,1=专车,2=出租车,3=城际,4=小件物流)")
+    private Integer userType;
+    @ApiModelProperty("有效期")
+    private String time;
+    @ApiModelProperty("优惠券类型(1=抵扣,2=满减)")
+    private Integer type;
+    @ApiModelProperty("满金额")
+    private Double fullMoney;
+    @ApiModelProperty("公司名称")
+    private String name;
+    @ApiModelProperty("状态(1=未使用,2=已使用,3=已过期)")
+    private Integer state;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Double getFullMoney() {
+        return fullMoney;
+    }
+
+    public void setFullMoney(Double fullMoney) {
+        this.fullMoney = fullMoney;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "CouponWarpper{" +
+                "id=" + id +
+                ", money=" + money +
+                ", userType=" + userType +
+                ", time='" + time + '\'' +
+                ", type=" + type +
+                ", fullMoney=" + fullMoney +
+                ", name='" + name + '\'' +
+                '}';
+    }
+
+    public static List<CouponWarpper> getCouponWarppers(List<Map<String, Object>> maps){
+        List<CouponWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                CouponWarpper couponWarpper = new CouponWarpper();
+                couponWarpper.setId(null != map.get("id") ? Integer.valueOf(String.valueOf(map.get("id"))) : 0);
+                couponWarpper.setMoney(null != map.get("money") ? Double.valueOf(String.valueOf(map.get("money"))) : 0);
+                couponWarpper.setUserType(null != map.get("userType") ? Integer.valueOf(String.valueOf(map.get("userType"))) : 0);
+                couponWarpper.setTime(null != map.get("time") ? String.valueOf(map.get("time")) : "");
+                couponWarpper.setType(null != map.get("type") ? Integer.valueOf(String.valueOf(map.get("type"))) : 0);
+                couponWarpper.setFullMoney(null != map.get("fullMoney") ? Double.valueOf(String.valueOf(map.get("fullMoney"))) : 0);
+                couponWarpper.setName(null != map.get("name") ? String.valueOf(map.get("name")) : "");
+                couponWarpper.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0);
+                list.add(couponWarpper);
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java
new file mode 100644
index 0000000..d1cb1a8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.util.Map;
+
+/**
+ * 部门列表的包装
+ *
+ * @author fengshuonan
+ * @date 2017年4月25日 18:10:31
+ */
+public class DeptWarpper extends BaseControllerWarpper {
+
+    public DeptWarpper(Object list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+
+        Integer pid = (Integer) map.get("pid");
+
+        if (ToolUtil.isEmpty(pid) || pid.equals(0)) {
+            map.put("pName", "--");
+        } else {
+            map.put("pName", ConstantFactory.me().getDeptName(pid));
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java
new file mode 100644
index 0000000..c56a1e4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.modular.system.model.Dict;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典列表的包装
+ *
+ * @author fengshuonan
+ * @date 2017年4月25日 18:10:31
+ */
+public class DictWarpper extends BaseControllerWarpper {
+
+    public DictWarpper(Object list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        StringBuffer detail = new StringBuffer();
+        Integer id = Integer.valueOf(map.get("id").toString());
+        List<Dict> dicts = ConstantFactory.me().findInDict(id);
+        if(dicts != null){
+            for (Dict dict : dicts) {
+                detail.append(dict.getCode() + ":" +dict.getName() + ",");
+            }
+            map.put("detail", ToolUtil.removeSuffix(detail.toString(),","));
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DriverInfoWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DriverInfoWarpper.java
new file mode 100644
index 0000000..83a7efc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DriverInfoWarpper.java
@@ -0,0 +1,168 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("司机详情")
+public class DriverInfoWarpper {
+    @ApiModelProperty("主键")
+    private Integer id;
+    @ApiModelProperty("头像")
+    private String avatar;
+    @ApiModelProperty("姓名")
+    private String name;
+    @ApiModelProperty("电话")
+    private String phone;
+    @ApiModelProperty("身份证号")
+    private String idcode;
+    @ApiModelProperty("车牌")
+    private String licensePlate;
+    @ApiModelProperty("车辆颜色")
+    private String carColor;
+    @ApiModelProperty("车辆品牌")
+    private String brand;
+    @ApiModelProperty("订单数")
+    private Integer orderNum;
+    @ApiModelProperty("评分")
+    private Double fraction;
+    @ApiModelProperty("1=未上班,2=空闲,3=服务中")
+    private Integer state;
+    @ApiModelProperty("司机业务类型")
+    private List<JSONObject> list;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIdcode() {
+        return idcode;
+    }
+
+    public void setIdcode(String idcode) {
+        this.idcode = idcode;
+    }
+
+    public String getLicensePlate() {
+        return licensePlate;
+    }
+
+    public void setLicensePlate(String licensePlate) {
+        this.licensePlate = licensePlate;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Double getFraction() {
+        return fraction;
+    }
+
+    public void setFraction(Double fraction) {
+        this.fraction = fraction;
+    }
+
+    public List<JSONObject> getList() {
+        return list;
+    }
+
+    public void setList(List<JSONObject> list) {
+        this.list = list;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getCarColor() {
+        return carColor;
+    }
+
+    public void setCarColor(String carColor) {
+        this.carColor = carColor;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverInfoWarpper{" +
+                "id=" + id +
+                ", avatar='" + avatar + '\'' +
+                ", name='" + name + '\'' +
+                ", idcode='" + idcode + '\'' +
+                ", licensePlate='" + licensePlate + '\'' +
+                ", brand='" + brand + '\'' +
+                ", orderNum=" + orderNum +
+                ", fraction=" + fraction +
+                '}';
+    }
+
+    public static DriverInfoWarpper getDriverInfoWarpper(Map<String, Object> map){
+        DriverInfoWarpper driverInfoWarpper = new DriverInfoWarpper();
+        if(null != map){
+            driverInfoWarpper.setId(null != map.get("id") ? Integer.valueOf(String.valueOf(map.get("id"))) : 0);
+            driverInfoWarpper.setAvatar(null != map.get("avatar") ? String.valueOf(map.get("avatar")) : "");
+            driverInfoWarpper.setName(null != map.get("name") ? String.valueOf(map.get("name")) : "");
+            driverInfoWarpper.setPhone(null != map.get("phone") ? String.valueOf(map.get("phone")) : "");
+            driverInfoWarpper.setIdcode(null != map.get("idcode") ? String.valueOf(map.get("idcode")) : "");
+            driverInfoWarpper.setLicensePlate(null != map.get("licensePlate") ? String.valueOf(map.get("licensePlate")) : "");
+            driverInfoWarpper.setBrand(null != map.get("brand") ? String.valueOf(map.get("brand")) : "");
+            driverInfoWarpper.setOrderNum(null != map.get("orderNum") ? Integer.valueOf(String.valueOf(map.get("orderNum"))) : 0);
+            driverInfoWarpper.setFraction(null != map.get("fraction") ? Double.valueOf(String.valueOf(map.get("fraction"))) : 0);
+            driverInfoWarpper.setList(null != map.get("list") ? JSONArray.parseArray(JSON.toJSONString(map.get("list")), JSONObject.class) : new ArrayList<>());
+            driverInfoWarpper.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0);
+            driverInfoWarpper.setCarColor(null != map.get("carColor") ? String.valueOf(map.get("carColor")) : "");
+        }
+        return driverInfoWarpper;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/EndPushWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/EndPushWarpper.java
new file mode 100644
index 0000000..9cd1f31
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/EndPushWarpper.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("下单后无人接单提醒")
+public class EndPushWarpper {
+    @ApiModelProperty("订单id")
+    private Integer orderId = 0;
+    @ApiModelProperty("订单类型()")
+    private Integer orderType = 0;
+    @ApiModelProperty("状态(1=正在推单,2=无人接单)")
+    private Integer state = 0;
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "EndPushWarpper{" +
+                "orderId=" + orderId +
+                ", orderType=" + orderType +
+                ", state=" + state +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/IntegralGoodsWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/IntegralGoodsWarpper.java
new file mode 100644
index 0000000..823289d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/IntegralGoodsWarpper.java
@@ -0,0 +1,84 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("积分商品")
+public class IntegralGoodsWarpper {
+    @ApiModelProperty("商品id")
+    private Integer id;
+    @ApiModelProperty("商品名称")
+    private String name;
+    @ApiModelProperty("商品图片")
+    private String url;
+    @ApiModelProperty("兑换积分")
+    private Integer integral;
+    @ApiModelProperty("商品说明")
+    private String instructions;
+
+    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 getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    public String getInstructions() {
+        return instructions;
+    }
+
+    public void setInstructions(String instructions) {
+        this.instructions = instructions;
+    }
+
+    public static IntegralGoodsWarpper getIntegralGoodsWarpper(Map<String, Object> map){
+        IntegralGoodsWarpper integralGoodsWarpper = new IntegralGoodsWarpper();
+        if(null != map){
+            integralGoodsWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            integralGoodsWarpper.setName(null != map.get("name") ? map.get("name").toString() : "");
+            integralGoodsWarpper.setUrl(null != map.get("url") ? map.get("url").toString() : "");
+            integralGoodsWarpper.setIntegral(null != map.get("integral") ? Integer.valueOf(map.get("integral").toString()) : 0);
+            integralGoodsWarpper.setInstructions(null != map.get("instructions") ? map.get("instructions").toString() : "");
+        }
+        return integralGoodsWarpper;
+    }
+
+    public static List<IntegralGoodsWarpper> getIntegralGoodsWarppers(List<Map<String, Object>> maps){
+        List<IntegralGoodsWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                list.add(IntegralGoodsWarpper.getIntegralGoodsWarpper(map));
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/IntegralOrderWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/IntegralOrderWarpper.java
new file mode 100644
index 0000000..54f215d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/IntegralOrderWarpper.java
@@ -0,0 +1,74 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("历史订单")
+public class IntegralOrderWarpper {
+    @ApiModelProperty("订单id")
+    private Integer id;
+    @ApiModelProperty("商品名称")
+    private String name;
+    @ApiModelProperty("兑换时间")
+    private String time;
+    @ApiModelProperty("兑换积分")
+    private String integral;
+
+    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 getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(String integral) {
+        this.integral = integral;
+    }
+
+
+    public static IntegralOrderWarpper getIntegralOrderWarpper(Map<String, Object> map){
+        IntegralOrderWarpper integralOrderWarpper = new IntegralOrderWarpper();
+        if(null != map){
+            integralOrderWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            integralOrderWarpper.setName(null != map.get("name") ? map.get("name").toString() : "");
+            integralOrderWarpper.setTime(null != map.get("time") ? map.get("time").toString() : "");
+            integralOrderWarpper.setIntegral(null != map.get("integral") ? map.get("integral").toString() : "");
+        }
+        return integralOrderWarpper;
+    }
+
+    public static List<IntegralOrderWarpper> getIntegralOrderWarppers(List<Map<String, Object>> maps){
+        List<IntegralOrderWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                list.add(IntegralOrderWarpper.getIntegralOrderWarpper(map));
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/InvoiceWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/InvoiceWarpper.java
new file mode 100644
index 0000000..ec52c79
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/InvoiceWarpper.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 发票
+ */
+@ApiModel("发票")
+public class InvoiceWarpper {
+    @ApiModelProperty("主键")
+    private Integer id;
+    @ApiModelProperty("申请时间")
+    private String insertTime;
+    @ApiModelProperty("发票类型说明")
+    private String type;
+    @ApiModelProperty("发票内容")
+    private String content;
+    @ApiModelProperty("开票状态(1=待开,2=已开,3=失败)")
+    private Integer state;
+    @ApiModelProperty("开票金额")
+    private Double money;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(String insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    @Override
+    public String toString() {
+        return "InvoiceWarpper{" +
+                "id=" + id +
+                ", insertTime='" + insertTime + '\'' +
+                ", type='" + type + '\'' +
+                ", content='" + content + '\'' +
+                ", state=" + state +
+                ", money=" + money +
+                '}';
+    }
+
+    public static List<InvoiceWarpper> getInvoiceWarpper(List<Map<String, Object>> maps){
+        List<InvoiceWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                InvoiceWarpper invoiceWarpper = new InvoiceWarpper();
+                invoiceWarpper.setId(null != map.get("id") ? Integer.valueOf(String.valueOf(map.get("id"))) : 0);
+                invoiceWarpper.setInsertTime(null != map.get("insertTime") ? String.valueOf(map.get("insertTime")) : "");
+                invoiceWarpper.setType(null != map.get("type") ? String.valueOf(map.get("type")) : "");
+                invoiceWarpper.setContent(null != map.get("content") ? String.valueOf(map.get("content")) : "");
+                invoiceWarpper.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0);
+                invoiceWarpper.setMoney(null != map.get("money") ? Double.valueOf(String.valueOf(map.get("money"))) : 0);
+                list.add(invoiceWarpper);
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java
new file mode 100644
index 0000000..6cf266b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java
@@ -0,0 +1,44 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.util.Contrast;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.util.Map;
+
+/**
+ * 日志列表的包装类
+ *
+ * @author fengshuonan
+ * @date 2017年4月5日22:56:24
+ */
+public class LogWarpper extends BaseControllerWarpper {
+
+    public LogWarpper(Object list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        String message = (String) map.get("message");
+
+        Integer userid = (Integer) map.get("userid");
+        map.put("userName", ConstantFactory.me().getUserNameById(userid));
+
+        //如果信息过长,则只截取前100位字符串
+        if (ToolUtil.isNotEmpty(message) && message.length() >= 100) {
+            String subMessage = message.substring(0, 100) + "...";
+            map.put("message", subMessage);
+        }
+
+        //如果信息中包含分割符号;;;   则分割字符串返给前台
+        if (ToolUtil.isNotEmpty(message) && message.indexOf(Contrast.separator) != -1) {
+            String[] msgs = message.split(Contrast.separator);
+            map.put("regularMessage",msgs);
+        }else{
+            map.put("regularMessage",message);
+        }
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java
new file mode 100644
index 0000000..a095cbf
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java
@@ -0,0 +1,68 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("登录")
+public class LoginWarpper {
+    @ApiModelProperty("id")
+    private Integer id;
+    @ApiModelProperty("token")
+    private String token;
+    @ApiModelProperty("appid")
+    private String appid;
+    @ApiModelProperty("是否有手机号码(1=否,2=是)")
+    private Integer phone;
+    @ApiModelProperty("紧急联系人")
+    private String emergencyContact;
+    @ApiModelProperty("联系人电话")
+    private String emergencyContactNumber;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public String getAppid() {
+        return appid;
+    }
+
+    public void setAppid(String appid) {
+        this.appid = appid;
+    }
+
+    public Integer getPhone() {
+        return phone;
+    }
+
+    public void setPhone(Integer phone) {
+        this.phone = phone;
+    }
+
+    public String getEmergencyContact() {
+        return emergencyContact;
+    }
+
+    public void setEmergencyContact(String emergencyContact) {
+        this.emergencyContact = emergencyContact;
+    }
+
+    public String getEmergencyContactNumber() {
+        return emergencyContactNumber;
+    }
+
+    public void setEmergencyContactNumber(String emergencyContactNumber) {
+        this.emergencyContactNumber = emergencyContactNumber;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java
new file mode 100644
index 0000000..3503f3e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.constant.IsMenu;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 菜单列表的包装类
+ *
+ * @author fengshuonan
+ * @date 2017年2月19日15:07:29
+ */
+public class MenuWarpper extends BaseControllerWarpper {
+
+    public MenuWarpper(List<Map<String, Object>> list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        map.put("statusName", ConstantFactory.me().getMenuStatusName((Integer) map.get("status")));
+        map.put("isMenuName", IsMenu.valueOf((Integer) map.get("ismenu")));
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java
new file mode 100644
index 0000000..6e5cc76
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+
+import java.util.Map;
+
+/**
+ * 部门列表的包装
+ *
+ * @author fengshuonan
+ * @date 2017年4月25日 18:10:31
+ */
+public class NoticeWrapper extends BaseControllerWarpper {
+
+    public NoticeWrapper(Object list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        Integer creater = (Integer) map.get("creater");
+        map.put("createrName", ConstantFactory.me().getUserNameById(creater));
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderDriverWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderDriverWarpper.java
new file mode 100644
index 0000000..9c72d33
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderDriverWarpper.java
@@ -0,0 +1,181 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Map;
+
+@ApiModel("订单中的司机")
+public class OrderDriverWarpper {
+    @ApiModelProperty("订单id")
+    private Integer orderId;
+    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)")
+    private Integer state;
+    @ApiModelProperty("司机id")
+    private Integer driverId;
+    @ApiModelProperty("姓名")
+    private String name;
+    @ApiModelProperty("头像")
+    private String avatar;
+    @ApiModelProperty("电话")
+    private String phone;
+    @ApiModelProperty("车牌号")
+    private String carCode;
+    @ApiModelProperty("车辆品牌及颜色")
+    private String carName;
+    @ApiModelProperty("历史评分")
+    private Double score;
+    @ApiModelProperty("历史单数")
+    private Integer num;
+    @ApiModelProperty("出发时间")
+    private String time;
+    @ApiModelProperty("起点")
+    private String start;
+    @ApiModelProperty("终点")
+    private String end;
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getCarCode() {
+        return carCode;
+    }
+
+    public void setCarCode(String carCode) {
+        this.carCode = carCode;
+    }
+
+    public String getCarName() {
+        return carName;
+    }
+
+    public void setCarName(String carName) {
+        this.carName = carName;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public String getStart() {
+        return start;
+    }
+
+    public void setStart(String start) {
+        this.start = start;
+    }
+
+    public String getEnd() {
+        return end;
+    }
+
+    public void setEnd(String end) {
+        this.end = end;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderDriverWarpper{" +
+                "orderId=" + orderId +
+                ", state=" + state +
+                ", driverId=" + driverId +
+                ", name='" + name + '\'' +
+                ", avatar='" + avatar + '\'' +
+                ", phone='" + phone + '\'' +
+                ", carCode='" + carCode + '\'' +
+                ", carName='" + carName + '\'' +
+                ", score=" + score +
+                ", num=" + num +
+                ", time='" + time + '\'' +
+                ", start='" + start + '\'' +
+                ", end='" + end + '\'' +
+                '}';
+    }
+
+
+    public static OrderDriverWarpper getOrderDriverWarpper(Map<String, Object> map){
+        OrderDriverWarpper orderDriverWarpper = new OrderDriverWarpper();
+        if(null != map){
+            orderDriverWarpper.setOrderId(null != map.get("orderId") ? Integer.valueOf(String.valueOf(map.get("orderId"))) : 0);
+            orderDriverWarpper.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0);
+            orderDriverWarpper.setDriverId(null != map.get("driverId") ? Integer.valueOf(String.valueOf(map.get("driverId"))) : 0);
+            orderDriverWarpper.setName(null != map.get("name") ? String.valueOf(map.get("name")) : "");
+            orderDriverWarpper.setAvatar(null != map.get("avatar") ? String.valueOf(map.get("avatar")) : "");
+            orderDriverWarpper.setPhone(null != map.get("phone") ? String.valueOf(map.get("phone")) : "");
+            orderDriverWarpper.setCarCode(null != map.get("carCode") ? String.valueOf(map.get("carCode")) : "");
+            orderDriverWarpper.setCarName(null != map.get("carName") ? String.valueOf(map.get("carName")) : "");
+            orderDriverWarpper.setScore(null != map.get("score") ? Double.valueOf(String.valueOf(map.get("score"))) : 0);
+            orderDriverWarpper.setNum(null != map.get("num") ? Integer.valueOf(String.valueOf(map.get("num"))) : 0);
+            orderDriverWarpper.setTime(null != map.get("time") ? String.valueOf(map.get("time")) : "");
+            orderDriverWarpper.setStart(null != map.get("start") ? String.valueOf(map.get("start")) : "");
+            orderDriverWarpper.setEnd(null != map.get("end") ? String.valueOf(map.get("end")) : "");
+        }
+        return orderDriverWarpper;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderEvaluateWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderEvaluateWarpper.java
new file mode 100644
index 0000000..f16fc2b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderEvaluateWarpper.java
@@ -0,0 +1,66 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("历史司机评价")
+public class OrderEvaluateWarpper {
+    @ApiModelProperty("评价时间")
+    private String time;
+    @ApiModelProperty("评价内容")
+    private String content;
+    @ApiModelProperty("评分")
+    private Double fraction;
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Double getFraction() {
+        return fraction;
+    }
+
+    public void setFraction(Double fraction) {
+        this.fraction = fraction;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderEvaluateWarpper{" +
+                "time='" + time + '\'' +
+                ", content='" + content + '\'' +
+                ", fraction=" + fraction +
+                '}';
+    }
+
+
+    public static List<OrderEvaluateWarpper> getOrderEvaluateWarpper(List<Map<String, Object>> maps){
+        List<OrderEvaluateWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                OrderEvaluateWarpper orderEvaluateWarpper = new OrderEvaluateWarpper();
+                orderEvaluateWarpper.setTime(null != map.get("time") ? String.valueOf(map.get("time")) : "");
+                orderEvaluateWarpper.setContent(null != map.get("content") ? String.valueOf(map.get("content")) : "");
+                orderEvaluateWarpper.setFraction(null != map.get("fraction") ? Double.valueOf(String.valueOf(map.get("fraction"))) : 0);
+                list.add(orderEvaluateWarpper);
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java
new file mode 100644
index 0000000..93ef99e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java
@@ -0,0 +1,716 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Map;
+
+@ApiModel("订单详情")
+public class OrderInfoWarpper {
+    @ApiModelProperty("订单id")
+    private Integer orderId;
+    @ApiModelProperty("订单类型(1=专车,2=出租车,3=跨城)")
+    private Integer orderType;
+    @ApiModelProperty("订单类型(1=普通订单,2=摆渡车)")
+    private Integer type;
+    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)")
+    private Integer state;
+    @ApiModelProperty("下单时间")
+    private String insertTime;
+    @ApiModelProperty("出行时间")
+    private String travelTime;
+    @ApiModelProperty("出行时间(完整)")
+    private String travelTime1;
+    @ApiModelProperty("班次时间")
+    private String lineShiftTime;
+    @ApiModelProperty("到达预约点时间")
+    private String arriveTime;
+    @ApiModelProperty("起点经度")
+    private Double startLon;
+    @ApiModelProperty("起点纬度")
+    private Double startLat;
+    @ApiModelProperty("起点")
+    private String startAddress;
+    @ApiModelProperty("起点市")
+    private String startCity;
+    @ApiModelProperty("终点经度")
+    private Double endLon;
+    @ApiModelProperty("终点纬度")
+    private Double endLat;
+    @ApiModelProperty("终点")
+    private String endAddress;
+    @ApiModelProperty("终点市")
+    private String endCity;
+    @ApiModelProperty("司机id")
+    private Integer driverId;
+    @ApiModelProperty("司机头像")
+    private String driverAvatar;
+    @ApiModelProperty("司机名称")
+    private String driverName;
+    @ApiModelProperty("车牌")
+    private String licensePlate;
+    @ApiModelProperty("车辆品牌")
+    private String brand;
+    @ApiModelProperty("车辆颜色")
+    private String carColor;
+    @ApiModelProperty("司机评分")
+    private Double score;
+    @ApiModelProperty("历史单数")
+    private Integer orderNum;
+    @ApiModelProperty("司机电话")
+    private String driverPhone;
+    @ApiModelProperty("订单取消支付金额")
+    private Double cancelPayMoney;
+    @ApiModelProperty("取消单预支付id(支付的时候需要回传)")
+    private Integer cancelId;
+    @ApiModelProperty("订单总金额")
+    private Double orderMoney;
+    @ApiModelProperty("起步里程")
+    private Double startMoney;
+    @ApiModelProperty("起步价")
+    private Double startMileage;
+    @ApiModelProperty("里程数")
+    private Double mileage;
+    @ApiModelProperty("里程费")
+    private Double mileageMoney;
+    @ApiModelProperty("时长")
+    private Double duration;
+    @ApiModelProperty("时长费")
+    private Double durationMoney;
+    @ApiModelProperty("等待时长")
+    private Double wait;
+    @ApiModelProperty("等待费")
+    private Double waitMoney;
+    @ApiModelProperty("远途里程")
+    private Double longDistance;
+    @ApiModelProperty("远途费")
+    private Double longDistanceMoney;
+    @ApiModelProperty("行程费")
+    private Double travelMoney;
+    @ApiModelProperty("停车费")
+    private Double parkMoney;
+    @ApiModelProperty("过路费")
+    private Double roadTollMoney;
+    @ApiModelProperty("红包抵扣金额")
+    private Double redPacketMoney;
+    @ApiModelProperty("优惠券抵扣金额")
+    private Double couponMoney;
+    @ApiModelProperty("discount")
+    private Double discount;
+    @ApiModelProperty("折扣优惠金额")
+    private Double discountMoney;
+    @ApiModelProperty("订单支付金额")
+    private Double payMoney;
+    @ApiModelProperty("小费金额")
+    private Double tipMoney;
+    @ApiModelProperty("订单评分")
+    private Integer orderScore;
+    @ApiModelProperty("评价内容")
+    private String evaluate;
+    @ApiModelProperty("接单设备(1=APP,2=车载端)")
+    private Integer device;
+    @ApiModelProperty("出行人数")
+    private Integer peopleNumber;
+    @ApiModelProperty("座位号")
+    private String seatNumber;
+    @ApiModelProperty("取消方(1=用户,2=后台,3=调度)")
+    private Integer cancelUserType;
+    @ApiModelProperty("取消费用")
+    private Double cancelMoney;
+    @ApiModelProperty("取消原因")
+    private String cancelReason;
+    @ApiModelProperty("取消备注")
+    private String cancelRemark;
+    @ApiModelProperty("备注")
+    private String remark;
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(String travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    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 getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getDriverAvatar() {
+        return driverAvatar;
+    }
+
+    public void setDriverAvatar(String driverAvatar) {
+        this.driverAvatar = driverAvatar;
+    }
+
+    public String getDriverName() {
+        return driverName;
+    }
+
+    public void setDriverName(String driverName) {
+        this.driverName = driverName;
+    }
+
+    public String getLicensePlate() {
+        return licensePlate;
+    }
+
+    public void setLicensePlate(String licensePlate) {
+        this.licensePlate = licensePlate;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public String getDriverPhone() {
+        return driverPhone;
+    }
+
+    public void setDriverPhone(String driverPhone) {
+        this.driverPhone = driverPhone;
+    }
+
+    public Double getCancelPayMoney() {
+        return cancelPayMoney;
+    }
+
+    public void setCancelPayMoney(Double cancelPayMoney) {
+        this.cancelPayMoney = cancelPayMoney;
+    }
+
+    public Double getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(Double payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Double getTipMoney() {
+        return tipMoney;
+    }
+
+    public void setTipMoney(Double tipMoney) {
+        this.tipMoney = tipMoney;
+    }
+
+    public Double getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(Double orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public Double getStartMoney() {
+        return startMoney;
+    }
+
+    public void setStartMoney(Double startMoney) {
+        this.startMoney = startMoney;
+    }
+
+    public Double getMileageMoney() {
+        return mileageMoney;
+    }
+
+    public void setMileageMoney(Double mileageMoney) {
+        this.mileageMoney = mileageMoney;
+    }
+
+    public Double getDurationMoney() {
+        return durationMoney;
+    }
+
+    public void setDurationMoney(Double durationMoney) {
+        this.durationMoney = durationMoney;
+    }
+
+    public Double getLongDistanceMoney() {
+        return longDistanceMoney;
+    }
+
+    public void setLongDistanceMoney(Double longDistanceMoney) {
+        this.longDistanceMoney = longDistanceMoney;
+    }
+
+    public String getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(String insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(String arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public Integer getOrderScore() {
+        return orderScore;
+    }
+
+    public void setOrderScore(Integer orderScore) {
+        this.orderScore = orderScore;
+    }
+
+    public String getEvaluate() {
+        return evaluate;
+    }
+
+    public void setEvaluate(String evaluate) {
+        this.evaluate = evaluate;
+    }
+
+    public String getCarColor() {
+        return carColor;
+    }
+
+    public void setCarColor(String carColor) {
+        this.carColor = carColor;
+    }
+
+    public Integer getCancelId() {
+        return cancelId;
+    }
+
+    public void setCancelId(Integer cancelId) {
+        this.cancelId = cancelId;
+    }
+
+    public Double getTravelMoney() {
+        return travelMoney;
+    }
+
+    public void setTravelMoney(Double travelMoney) {
+        this.travelMoney = travelMoney;
+    }
+
+    public Double getParkMoney() {
+        return parkMoney;
+    }
+
+    public void setParkMoney(Double parkMoney) {
+        this.parkMoney = parkMoney;
+    }
+
+    public Double getRoadTollMoney() {
+        return roadTollMoney;
+    }
+
+    public void setRoadTollMoney(Double roadTollMoney) {
+        this.roadTollMoney = roadTollMoney;
+    }
+
+    public Double getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(Double redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public Double getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(Double couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Double getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Double discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getDevice() {
+        return device;
+    }
+
+    public void setDevice(Integer device) {
+        this.device = device;
+    }
+
+    public Integer getPeopleNumber() {
+        return peopleNumber;
+    }
+
+    public void setPeopleNumber(Integer peopleNumber) {
+        this.peopleNumber = peopleNumber;
+    }
+
+    public String getSeatNumber() {
+        return seatNumber;
+    }
+
+    public void setSeatNumber(String seatNumber) {
+        this.seatNumber = seatNumber;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Double getDuration() {
+        return duration;
+    }
+
+    public void setDuration(Double duration) {
+        this.duration = duration;
+    }
+
+    public Double getWait() {
+        return wait;
+    }
+
+    public void setWait(Double wait) {
+        this.wait = wait;
+    }
+
+    public Double getWaitMoney() {
+        return waitMoney;
+    }
+
+    public void setWaitMoney(Double waitMoney) {
+        this.waitMoney = waitMoney;
+    }
+
+    public Double getLongDistance() {
+        return longDistance;
+    }
+
+    public void setLongDistance(Double longDistance) {
+        this.longDistance = longDistance;
+    }
+
+    public Double getStartMileage() {
+        return startMileage;
+    }
+
+    public void setStartMileage(Double startMileage) {
+        this.startMileage = startMileage;
+    }
+
+    public String getTravelTime1() {
+        return travelTime1;
+    }
+
+    public void setTravelTime1(String travelTime1) {
+        this.travelTime1 = travelTime1;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Integer getCancelUserType() {
+        return cancelUserType;
+    }
+
+    public void setCancelUserType(Integer cancelUserType) {
+        this.cancelUserType = cancelUserType;
+    }
+
+    public Double getCancelMoney() {
+        return cancelMoney;
+    }
+
+    public void setCancelMoney(Double cancelMoney) {
+        this.cancelMoney = cancelMoney;
+    }
+
+    public String getCancelReason() {
+        return cancelReason;
+    }
+
+    public void setCancelReason(String cancelReason) {
+        this.cancelReason = cancelReason;
+    }
+
+    public String getCancelRemark() {
+        return cancelRemark;
+    }
+
+    public void setCancelRemark(String cancelRemark) {
+        this.cancelRemark = cancelRemark;
+    }
+
+    public String getStartCity() {
+        return startCity;
+    }
+
+    public void setStartCity(String startCity) {
+        this.startCity = startCity;
+    }
+
+    public String getEndCity() {
+        return endCity;
+    }
+
+    public void setEndCity(String endCity) {
+        this.endCity = endCity;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getLineShiftTime() {
+        return lineShiftTime;
+    }
+
+    public void setLineShiftTime(String lineShiftTime) {
+        this.lineShiftTime = lineShiftTime;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderInfoWarpper{" +
+                "orderId=" + orderId +
+                ", type=" + type +
+                ", state=" + state +
+                ", insertTime='" + insertTime + '\'' +
+                ", travelTime='" + travelTime + '\'' +
+                ", travelTime1='" + travelTime1 + '\'' +
+                ", arriveTime='" + arriveTime + '\'' +
+                ", startLon=" + startLon +
+                ", startLat=" + startLat +
+                ", startAddress='" + startAddress + '\'' +
+                ", startCity='" + startCity + '\'' +
+                ", endLon=" + endLon +
+                ", endLat=" + endLat +
+                ", endAddress='" + endAddress + '\'' +
+                ", endCity='" + endCity + '\'' +
+                ", driverId=" + driverId +
+                ", driverAvatar='" + driverAvatar + '\'' +
+                ", driverName='" + driverName + '\'' +
+                ", licensePlate='" + licensePlate + '\'' +
+                ", brand='" + brand + '\'' +
+                ", carColor='" + carColor + '\'' +
+                ", score=" + score +
+                ", orderNum=" + orderNum +
+                ", driverPhone='" + driverPhone + '\'' +
+                ", cancelPayMoney=" + cancelPayMoney +
+                ", cancelId=" + cancelId +
+                ", orderMoney=" + orderMoney +
+                ", startMoney=" + startMoney +
+                ", startMileage=" + startMileage +
+                ", mileage=" + mileage +
+                ", mileageMoney=" + mileageMoney +
+                ", duration=" + duration +
+                ", durationMoney=" + durationMoney +
+                ", wait=" + wait +
+                ", waitMoney=" + waitMoney +
+                ", longDistance=" + longDistance +
+                ", longDistanceMoney=" + longDistanceMoney +
+                ", travelMoney=" + travelMoney +
+                ", parkMoney=" + parkMoney +
+                ", roadTollMoney=" + roadTollMoney +
+                ", redPacketMoney=" + redPacketMoney +
+                ", couponMoney=" + couponMoney +
+                ", discount=" + discount +
+                ", discountMoney=" + discountMoney +
+                ", payMoney=" + payMoney +
+                ", tipMoney=" + tipMoney +
+                ", orderScore=" + orderScore +
+                ", evaluate='" + evaluate + '\'' +
+                ", device=" + device +
+                ", peopleNumber=" + peopleNumber +
+                ", seatNumber='" + seatNumber + '\'' +
+                ", cancelUserType=" + cancelUserType +
+                ", cancelMoney=" + cancelMoney +
+                ", cancelReason='" + cancelReason + '\'' +
+                ", cancelRemark='" + cancelRemark + '\'' +
+                '}';
+    }
+
+    public static OrderInfoWarpper getOrderInfoWarpper(Map<String, Object> map){
+        OrderInfoWarpper orderInfoWarpper = new OrderInfoWarpper();
+        if(null != map){
+            orderInfoWarpper.setOrderId(null != map.get("orderId") ? Integer.valueOf(String.valueOf(map.get("orderId"))) : 0);
+            orderInfoWarpper.setOrderType(null != map.get("orderType") ? Integer.valueOf(map.get("orderType").toString()) : 0);
+            orderInfoWarpper.setType(null != map.get("type") ? Integer.valueOf(map.get("type").toString()) : 0);
+            orderInfoWarpper.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0);
+            orderInfoWarpper.setTravelTime(null != map.get("travelTime") ? String.valueOf(map.get("travelTime")) : "");
+            orderInfoWarpper.setTravelTime1(null != map.get("travelTime1") ? String.valueOf(map.get("travelTime1")) : "");
+            orderInfoWarpper.setStartAddress(null != map.get("startAddress") ? String.valueOf(map.get("startAddress")) : "");
+            orderInfoWarpper.setEndAddress(null != map.get("endAddress") ? String.valueOf(map.get("endAddress")) : "");
+            orderInfoWarpper.setDriverId(null != map.get("driverId") ? Integer.valueOf(String.valueOf(map.get("driverId"))) : 0);
+            orderInfoWarpper.setDriverAvatar(null != map.get("driverAvatar") ? String.valueOf(map.get("driverAvatar")) : "");
+            orderInfoWarpper.setDriverName(null != map.get("driverName") ? String.valueOf(map.get("driverName")).substring(0, 1) + "师傅" : "");
+            orderInfoWarpper.setLicensePlate(null != map.get("licensePlate") ? String.valueOf(map.get("licensePlate")) : "");
+            orderInfoWarpper.setBrand(null != map.get("brand") ? String.valueOf(map.get("brand")) : "");
+            orderInfoWarpper.setScore(null != map.get("score") ? Double.valueOf(String.valueOf(map.get("score"))) : 0);
+            orderInfoWarpper.setOrderNum(null != map.get("orderNum") ? Integer.valueOf(String.valueOf(map.get("orderNum"))) : 0);
+            orderInfoWarpper.setDriverPhone(null != map.get("driverPhone") ? String.valueOf(map.get("driverPhone")) : "");
+            orderInfoWarpper.setCancelPayMoney(null != map.get("cancelPayMoney") ? Double.valueOf(String.valueOf(map.get("cancelPayMoney"))) : 0);
+            orderInfoWarpper.setPayMoney(null != map.get("payMoney") ? Double.valueOf(String.valueOf(map.get("payMoney"))) : 0);
+            orderInfoWarpper.setTipMoney(null != map.get("tipMoney") ? Double.valueOf(String.valueOf(map.get("tipMoney"))) : 0);
+            orderInfoWarpper.setOrderMoney(null != map.get("orderMoney") ? Double.valueOf(String.valueOf(map.get("orderMoney"))) : 0);
+            orderInfoWarpper.setStartMileage(null != map.get("startMileage") ? Double.valueOf(String.valueOf(map.get("startMileage"))) : 0);
+            orderInfoWarpper.setStartMoney(null != map.get("startMoney") ? Double.valueOf(String.valueOf(map.get("startMoney"))) : 0);
+            orderInfoWarpper.setMileage(null != map.get("mileageKilometers") ? Double.valueOf(String.valueOf(map.get("mileageKilometers"))) : 0);
+            orderInfoWarpper.setMileageMoney(null != map.get("mileageMoney") ? Double.valueOf(String.valueOf(map.get("mileageMoney"))) : 0);
+            orderInfoWarpper.setDuration(null != map.get("duration") ? Double.valueOf(String.valueOf(map.get("duration"))) : 0);
+            orderInfoWarpper.setDurationMoney(null != map.get("durationMoney") ? Double.valueOf(String.valueOf(map.get("durationMoney"))) : 0);
+            orderInfoWarpper.setWait(null != map.get("wait") ? Double.valueOf(String.valueOf(map.get("wait"))) : 0);
+            orderInfoWarpper.setWaitMoney(null != map.get("waitMoney") ? Double.valueOf(String.valueOf(map.get("waitMoney"))) : 0);
+            orderInfoWarpper.setLongDistance(null != map.get("longDistance") ? Double.valueOf(String.valueOf(map.get("longDistance"))) : 0);
+            orderInfoWarpper.setLongDistanceMoney(null != map.get("longDistanceMoney") ? Double.valueOf(String.valueOf(map.get("longDistanceMoney"))) : 0);
+            orderInfoWarpper.setInsertTime(null != map.get("insertTime") ? String.valueOf(map.get("insertTime")) : "");
+            orderInfoWarpper.setArriveTime(null != map.get("arriveTime") ? String.valueOf(map.get("arriveTime")) : "");
+            orderInfoWarpper.setStartLon(null != map.get("startLon") ? Double.valueOf(String.valueOf(map.get("startLon"))) : 0);
+            orderInfoWarpper.setStartLat(null != map.get("startLat") ? Double.valueOf(String.valueOf(map.get("startLat"))) : 0);
+            orderInfoWarpper.setEndLon(null != map.get("endLon") ? Double.valueOf(String.valueOf(map.get("endLon"))) : 0);
+            orderInfoWarpper.setEndLat(null != map.get("endLat") ? Double.valueOf(String.valueOf(map.get("endLat"))) : 0);
+            orderInfoWarpper.setOrderScore(null != map.get("orderScore") ? Double.valueOf(String.valueOf(map.get("orderScore"))).intValue() : 0);
+            orderInfoWarpper.setEvaluate(null != map.get("evaluate") ? String.valueOf(map.get("evaluate")) : "");
+            orderInfoWarpper.setCarColor(null != map.get("carColor") ? String.valueOf(map.get("carColor")) : "");
+            orderInfoWarpper.setCancelId(null != map.get("cancelId") ? Integer.valueOf(String.valueOf(map.get("cancelId"))) : 0);
+            orderInfoWarpper.setTravelMoney(null != map.get("travelMoney") ? Double.valueOf(String.valueOf(map.get("travelMoney"))) : 0);
+            orderInfoWarpper.setParkMoney(null != map.get("parkMoney") ? Double.valueOf(String.valueOf(map.get("parkMoney"))) : 0);
+            orderInfoWarpper.setRoadTollMoney(null != map.get("roadTollMoney") ? Double.valueOf(String.valueOf(map.get("roadTollMoney"))) : 0);
+            orderInfoWarpper.setRedPacketMoney(null != map.get("redPacketMoney") ? Double.valueOf(String.valueOf(map.get("redPacketMoney"))) : 0);
+            orderInfoWarpper.setCouponMoney(null != map.get("couponMoney") ? Double.valueOf(String.valueOf(map.get("couponMoney"))) : 0);
+            orderInfoWarpper.setDiscountMoney(null != map.get("discountMoney") ? Double.valueOf(String.valueOf(map.get("discountMoney"))) : 0);
+            orderInfoWarpper.setDevice(null != map.get("device") ? Integer.valueOf(String.valueOf(map.get("device"))) : 1);
+            orderInfoWarpper.setPeopleNumber(null != map.get("peopleNumber") ? Integer.valueOf(String.valueOf(map.get("peopleNumber"))) : 1);
+            orderInfoWarpper.setSeatNumber(null != map.get("seatNumber") ? String.valueOf(map.get("seatNumber")) : "");
+            orderInfoWarpper.setDiscount(null != map.get("discount") ? Double.valueOf(map.get("discount").toString()) : 0);
+            orderInfoWarpper.setCancelUserType(null != map.get("cancelUserType") ? Integer.valueOf(map.get("cancelUserType").toString()) : 0);
+            orderInfoWarpper.setCancelMoney(null != map.get("cancelMoney") ? Double.valueOf(map.get("cancelMoney").toString()) : 0);
+            orderInfoWarpper.setCancelReason(null != map.get("cancelReason") ? map.get("cancelReason").toString() : "");
+            orderInfoWarpper.setCancelRemark(null != map.get("cancelRemark") ? map.get("cancelRemark").toString() : "");
+            orderInfoWarpper.setStartCity(null != map.get("startCity") ? map.get("startCity").toString() : "");
+            orderInfoWarpper.setEndCity(null != map.get("endCity") ? map.get("endCity").toString() : "");
+            orderInfoWarpper.setRemark(null != map.get("remark") ? map.get("remark").toString() : "");
+            orderInfoWarpper.setLineShiftTime(null != map.get("lineShiftTime") ? map.get("lineShiftTime").toString() : "");
+        }
+        return orderInfoWarpper;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderServerWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderServerWarpper.java
new file mode 100644
index 0000000..a1432a7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderServerWarpper.java
@@ -0,0 +1,128 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("订单服务中的数据")
+public class OrderServerWarpper {
+    @ApiModelProperty("订单id")
+    private Integer orderId;
+    @ApiModelProperty("订单类型")
+    private Integer orderType;
+    @ApiModelProperty("司机位置经度")
+    private String lon;
+    @ApiModelProperty("司机位置纬度")
+    private String lat;
+    @ApiModelProperty("当前位置距离预约点的剩余里程")
+    private String reservationMileage;
+    @ApiModelProperty("当前位置距离预约点的剩余分钟")
+    private String reservationTime;
+    @ApiModelProperty("距离起点已经服务的里程")
+    private String servedMileage;
+    @ApiModelProperty("距离起点已经服务的时间")
+    private String servedTime;
+    @ApiModelProperty("距离终点剩余未服务的里程数")
+    private String laveMileage;
+    @ApiModelProperty("距离终端剩余未服务的预计时间")
+    private String laveTime;
+    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)")
+    private Integer state;
+    @ApiModelProperty("订单改派状态(0=未改派,1=改派中,2=已改派)")
+    private Integer reassignNotice;
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public String getLon() {
+        return lon;
+    }
+
+    public void setLon(String lon) {
+        this.lon = lon;
+    }
+
+    public String getLat() {
+        return lat;
+    }
+
+    public void setLat(String lat) {
+        this.lat = lat;
+    }
+
+    public String getReservationMileage() {
+        return reservationMileage;
+    }
+
+    public void setReservationMileage(String reservationMileage) {
+        this.reservationMileage = reservationMileage;
+    }
+
+    public String getReservationTime() {
+        return reservationTime;
+    }
+
+    public void setReservationTime(String reservationTime) {
+        this.reservationTime = reservationTime;
+    }
+
+    public String getServedMileage() {
+        return servedMileage;
+    }
+
+    public void setServedMileage(String servedMileage) {
+        this.servedMileage = servedMileage;
+    }
+
+    public String getServedTime() {
+        return servedTime;
+    }
+
+    public void setServedTime(String servedTime) {
+        this.servedTime = servedTime;
+    }
+
+    public String getLaveMileage() {
+        return laveMileage;
+    }
+
+    public void setLaveMileage(String laveMileage) {
+        this.laveMileage = laveMileage;
+    }
+
+    public String getLaveTime() {
+        return laveTime;
+    }
+
+    public void setLaveTime(String laveTime) {
+        this.laveTime = laveTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getReassignNotice() {
+        return reassignNotice;
+    }
+
+    public void setReassignNotice(Integer reassignNotice) {
+        this.reassignNotice = reassignNotice;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderStatusWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderStatusWarpper.java
new file mode 100644
index 0000000..29f3c8a
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderStatusWarpper.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("订单状态")
+public class OrderStatusWarpper {
+    @ApiModelProperty("订单id")
+    private Integer orderId;
+    @ApiModelProperty("订单类型")
+    private Integer orderType;
+    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)")
+    private Integer state;
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderWarpper.java
new file mode 100644
index 0000000..d3b797c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderWarpper.java
@@ -0,0 +1,267 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单(综合)
+ */
+@ApiModel("订单列表")
+public class OrderWarpper  implements Comparable {
+    @ApiModelProperty("订单id")
+    private Integer orderId;
+    @ApiModelProperty("订单日期")
+    private String orderTime;
+    @ApiModelProperty("出行时间/(小件物流的取货时间)")
+    private String time;
+    @ApiModelProperty("起点名称")
+    private String startAddress;
+    @ApiModelProperty("终点名称")
+    private String endAddress;
+    @ApiModelProperty("人数")
+    private Integer num;
+    @ApiModelProperty("司机id")
+    private Integer driverId;
+    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)<br/>" +
+            "小件物流订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待取货,5=送货中,6=已送达,7=待支付,8=需补差价,9=已取货,10=已取消,11=已支付差价")
+    private Integer state;
+    @ApiModelProperty("货物类型(小件物流)")
+    private String cargoType;
+    @ApiModelProperty("用车时长")
+    private Double carTime;
+    @ApiModelProperty("车型")
+    private String serverCarModel;
+    @ApiModelProperty("订单金额")
+    private Double orderMoney;
+    @ApiModelProperty("支付金额")
+    private Double payMoney;
+    @ApiModelProperty("差价金额")
+    private Double differenceMoney;
+    @ApiModelProperty("开票状态(1=未开票,2=已开票)")
+    private Integer invoice;
+    @ApiModelProperty("订单名称")
+    private String orderName;
+    @ApiModelProperty("订单类型(1=专车,2=出租车,3=跨城出行,4=同城小件物流,5=跨城小件物流)")
+    private Integer orderType;
+    private Long insertTime;
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getOrderTime() {
+        return orderTime;
+    }
+
+    public void setOrderTime(String orderTime) {
+        this.orderTime = orderTime;
+    }
+
+    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 getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Double getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(Double payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Integer getInvoice() {
+        return invoice;
+    }
+
+    public void setInvoice(Integer invoice) {
+        this.invoice = invoice;
+    }
+
+    public String getOrderName() {
+        return orderName;
+    }
+
+    public void setOrderName(String orderName) {
+        this.orderName = orderName;
+    }
+
+    public Long getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Long insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getCargoType() {
+        return cargoType;
+    }
+
+    public void setCargoType(String cargoType) {
+        this.cargoType = cargoType;
+    }
+
+    public Double getCarTime() {
+        return carTime;
+    }
+
+    public void setCarTime(Double carTime) {
+        this.carTime = carTime;
+    }
+
+    public String getServerCarModel() {
+        return serverCarModel;
+    }
+
+    public void setServerCarModel(String serverCarModel) {
+        this.serverCarModel = serverCarModel;
+    }
+
+    public Double getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(Double orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public Double getDifferenceMoney() {
+        return differenceMoney;
+    }
+
+    public void setDifferenceMoney(Double differenceMoney) {
+        this.differenceMoney = differenceMoney;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderWarpper{" +
+                "orderId=" + orderId +
+                ", orderTime='" + orderTime + '\'' +
+                ", time='" + time + '\'' +
+                ", startAddress='" + startAddress + '\'' +
+                ", endAddress='" + endAddress + '\'' +
+                ", num=" + num +
+                ", driverId=" + driverId +
+                ", state=" + state +
+                ", cargoType='" + cargoType + '\'' +
+                ", carTime=" + carTime +
+                ", serverCarModel='" + serverCarModel + '\'' +
+                ", payMoney=" + payMoney +
+                ", invoice=" + invoice +
+                ", orderName='" + orderName + '\'' +
+                ", orderType=" + orderType +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+
+    public static List<OrderWarpper> getOrderWarpper(List<Map<String, Object>> maps){
+        List<OrderWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                OrderWarpper orderWarpper = new OrderWarpper();
+                orderWarpper.setOrderId(null != map.get("orderId") ? Integer.valueOf(String.valueOf(map.get("orderId"))) : 0);
+                orderWarpper.setOrderTime(null != map.get("orderTime") ? String.valueOf(map.get("orderTime")) : "");
+                orderWarpper.setTime(null != map.get("time") ? String.valueOf(map.get("time")) : "");
+                orderWarpper.setStartAddress(null != map.get("startAddress") ? String.valueOf(map.get("startAddress")) : "");
+                orderWarpper.setEndAddress(null != map.get("endAddress") ? String.valueOf(map.get("endAddress")) : "");
+                orderWarpper.setNum(null != map.get("num") ? Integer.valueOf(String.valueOf(map.get("num"))) : 0);
+                orderWarpper.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0);
+                orderWarpper.setOrderMoney(null != map.get("orderMoney") ? Double.valueOf(String.valueOf(map.get("orderMoney"))) : 0);
+                orderWarpper.setPayMoney(null != map.get("payMoney") ? Double.valueOf(String.valueOf(map.get("payMoney"))) : 0);
+                orderWarpper.setInvoice(null != map.get("invoice") ? Integer.valueOf(String.valueOf(map.get("invoice"))) : 0);
+                orderWarpper.setOrderName(null != map.get("orderName") ? String.valueOf(map.get("orderName")) : "");
+                orderWarpper.setInsertTime(null != map.get("insertTime") ? Long.valueOf(String.valueOf(map.get("insertTime"))) : 0);
+                orderWarpper.setOrderType(null != map.get("orderType") ? Integer.valueOf(String.valueOf(map.get("orderType"))) : 0);
+                orderWarpper.setDriverId(null != map.get("driverId") ? Integer.valueOf(String.valueOf(map.get("driverId"))) : 0);
+                orderWarpper.setCargoType(null != map.get("cargoType") ? String.valueOf(map.get("cargoType")) : "");
+                orderWarpper.setCarTime(null != map.get("carTime") ? Double.parseDouble(String.valueOf(map.get("carTime"))) : 0);
+                orderWarpper.setServerCarModel(null != map.get("serverCarModel") ? String.valueOf(map.get("serverCarModel")) : "");
+                orderWarpper.setDifferenceMoney(null != map.get("differenceMoney") ? Double.valueOf(map.get("differenceMoney").toString()) : 0D);
+                list.add(orderWarpper);
+            }
+        }
+        Collections.sort(list);
+        return list;
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        if (o instanceof OrderWarpper) {
+            OrderWarpper s = (OrderWarpper) o;
+            if(this.insertTime == null || s.insertTime == null){
+                return -1;
+            }
+            if (this.insertTime > s.insertTime) {
+                return -1;
+            } else if (this.insertTime == s.insertTime) {
+                return 0;
+            } else {
+                return 1;
+            }
+        }
+        return 0;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ProblemWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ProblemWarpper.java
new file mode 100644
index 0000000..9c34d3d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ProblemWarpper.java
@@ -0,0 +1,78 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("客服留言")
+public class ProblemWarpper {
+    @ApiModelProperty("主键")
+    private Integer id;
+    @ApiModelProperty("留言时间")
+    private String insertTime;
+    @ApiModelProperty("留言内容")
+    private String content;
+    @ApiModelProperty("回复内容")
+    private String answer;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(String insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    @Override
+    public String toString() {
+        return "ProblemWarpper{" +
+                "id=" + id +
+                ", insertTime='" + insertTime + '\'' +
+                ", content='" + content + '\'' +
+                ", answer='" + answer + '\'' +
+                '}';
+    }
+
+
+    public static List<ProblemWarpper> getProblemWarpper(List<Map<String, Object>> maps){
+        List<ProblemWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps) {
+                ProblemWarpper problemWarpper = new ProblemWarpper();
+                problemWarpper.setId(null != map.get("id") ? Integer.valueOf(String.valueOf(map.get("id"))) : 0);
+                problemWarpper.setInsertTime(null != map.get("insertTime") ? String.valueOf(map.get("insertTime")) : "");
+                problemWarpper.setContent(null != map.get("content") ? String.valueOf(map.get("content")) : "");
+                problemWarpper.setAnswer(null != map.get("answer") ? String.valueOf(map.get("answer")) : "");
+                list.add(problemWarpper);
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java
new file mode 100644
index 0000000..172961b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 角色列表的包装类
+ *
+ * @author fengshuonan
+ * @date 2017年2月19日10:59:02
+ */
+public class RoleWarpper extends BaseControllerWarpper {
+
+    public RoleWarpper(List<Map<String, Object>> list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        map.put("pName", ConstantFactory.me().getSingleRoleName((Integer) map.get("pid")));
+        map.put("deptName", ConstantFactory.me().getDeptName((Integer) map.get("deptid")));
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ServerCarModelWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ServerCarModelWarpper.java
new file mode 100644
index 0000000..66ff9f4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ServerCarModelWarpper.java
@@ -0,0 +1,121 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("服务车型")
+public class ServerCarModelWarpper {
+    @ApiModelProperty("车型id")
+    private Integer id;
+    @ApiModelProperty("车型名称")
+    private String name;
+    @ApiModelProperty("车型照片")
+    private String img;
+    @ApiModelProperty("预估金额")
+    private Double amount;
+    @ApiModelProperty("包车的价格")
+    private String price;
+    @ApiModelProperty("预估里程(公里)")
+    private Double mileage;
+    @ApiModelProperty("预估时间(分钟)")
+    private Double duration;
+
+    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 getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public Double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public String getPrice() {
+        return price;
+    }
+
+    public void setPrice(String price) {
+        this.price = price;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Double getDuration() {
+        return duration;
+    }
+
+    public void setDuration(Double duration) {
+        this.duration = duration;
+    }
+
+    @Override
+    public String toString() {
+        return "ServerCarModelWarpper{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", img='" + img + '\'' +
+                ", amount=" + amount +
+                ", price='" + price + '\'' +
+                ", mileage=" + mileage +
+                ", duration=" + duration +
+                '}';
+    }
+
+    public static ServerCarModelWarpper getServerCarModelWarpper(Map<String, Object> map){
+        ServerCarModelWarpper serverCarModelWarpper = new ServerCarModelWarpper();
+        if(null != map){
+            serverCarModelWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            serverCarModelWarpper.setName(null != map.get("name") ? map.get("name").toString() : "");
+            serverCarModelWarpper.setImg(null != map.get("img") ? map.get("img").toString() : "");
+            serverCarModelWarpper.setAmount(null != map.get("amount") ? Double.valueOf(map.get("amount").toString()) : 0);
+            serverCarModelWarpper.setPrice(null != map.get("price") ? map.get("price").toString() : "");
+            serverCarModelWarpper.setMileage(null != map.get("mileage") ? Double.valueOf(map.get("mileage").toString()) : 0);
+            serverCarModelWarpper.setDuration(null != map.get("duration") ? Double.valueOf(map.get("duration").toString()) : 0);
+        }
+        return serverCarModelWarpper;
+    }
+
+
+    public static List<ServerCarModelWarpper>getServerCarModelWarppers(List<Map<String, Object>> list){
+        List<ServerCarModelWarpper> data = new ArrayList<>();
+        if(null != list){
+            for(Map<String, Object> map : list){
+                data.add(ServerCarModelWarpper.getServerCarModelWarpper(map));
+            }
+        }
+        return data;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/SystemNoticeWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/SystemNoticeWarpper.java
new file mode 100644
index 0000000..31a6974
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/SystemNoticeWarpper.java
@@ -0,0 +1,124 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("消息类表")
+public class SystemNoticeWarpper {
+    @ApiModelProperty("主键")
+    private Integer id;
+    @ApiModelProperty("类型(1=公告,2=系统消息)")
+    private Integer type;
+    @ApiModelProperty("标题")
+    private String title;
+    @ApiModelProperty("内容")
+    private String content;
+    @ApiModelProperty("图片")
+    private String img;
+    @ApiModelProperty("时间")
+    private String time;
+    @ApiModelProperty("阅读状态(1=未读,2=已读)")
+    private Integer read;
+    @ApiModelProperty("消息类型(1=打车业务,2=优惠券)")
+    private Integer noticeType;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public Integer getRead() {
+        return read;
+    }
+
+    public void setRead(Integer read) {
+        this.read = read;
+    }
+
+    public Integer getNoticeType() {
+        return noticeType;
+    }
+
+    public void setNoticeType(Integer noticeType) {
+        this.noticeType = noticeType;
+    }
+
+    @Override
+    public String toString() {
+        return "SystemNoticeWarpper{" +
+                "id=" + id +
+                ", type=" + type +
+                ", title='" + title + '\'' +
+                ", content='" + content + '\'' +
+                ", img='" + img + '\'' +
+                ", time='" + time + '\'' +
+                '}';
+    }
+
+
+    public static List<SystemNoticeWarpper> getSystemNoticeWarpper(List<Map<String, Object>> maps){
+        List<SystemNoticeWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                SystemNoticeWarpper systemNoticeWarpper = new SystemNoticeWarpper();
+                systemNoticeWarpper.setId(null != map.get("id") ? Integer.valueOf(String.valueOf(map.get("id"))) : 0);
+                systemNoticeWarpper.setType(null != map.get("type") ? Integer.valueOf(String.valueOf(map.get("type"))) : 0);
+                systemNoticeWarpper.setTitle(null != map.get("title") ? String.valueOf(map.get("title")) : "");
+                systemNoticeWarpper.setContent(null != map.get("content") ? String.valueOf(map.get("content")) : "");
+                systemNoticeWarpper.setImg(null != map.get("img") ? String.valueOf(map.get("img")) : "");
+                systemNoticeWarpper.setTime(null != map.get("time") ? String.valueOf(map.get("time")) : "");
+                systemNoticeWarpper.setRead(null != map.get("read") ? Integer.valueOf(String.valueOf(map.get("read"))) : 0);
+                systemNoticeWarpper.setNoticeType(null != map.get("noticeType") ? Integer.valueOf(String.valueOf(map.get("noticeType"))) : 1);
+                list.add(systemNoticeWarpper);
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TNoticeWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TNoticeWarpper.java
new file mode 100644
index 0000000..bfd91fc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TNoticeWarpper.java
@@ -0,0 +1,78 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.modular.system.model.TNotices;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel("公告")
+public class TNoticeWarpper {
+    @ApiModelProperty("主键")
+    private Integer id;
+    @ApiModelProperty("标题")
+    private String title;
+    @ApiModelProperty("内容")
+    private String content;
+    @ApiModelProperty("图片地址")
+    private String imgUrl;
+    @ApiModelProperty("发布时间")
+    private Long insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Long getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Long insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public static List<TNoticeWarpper> getTNoticeWarppers(List<TNotices> notices){
+        List<TNoticeWarpper> list = new ArrayList<>();
+        if(null != notices){
+            for(TNotices t : notices){
+                TNoticeWarpper noticeWarpper = new TNoticeWarpper();
+                noticeWarpper.setId(t.getId());
+                noticeWarpper.setTitle(t.getTitle());
+                noticeWarpper.setContent(t.getContent());
+                noticeWarpper.setImgUrl(t.getImgUrl());
+                noticeWarpper.setInsertTime(t.getInsertTime().getTime());
+                list.add(noticeWarpper);
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TravelRecordWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TravelRecordWarpper.java
new file mode 100644
index 0000000..073f84f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TravelRecordWarpper.java
@@ -0,0 +1,101 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 个人中心消费记录列表
+ */
+@ApiModel("消费记录")
+public class TravelRecordWarpper implements Comparable {
+    @ApiModelProperty("金额")
+    private Double money;
+    @ApiModelProperty("时间")
+    private String time;
+    @ApiModelProperty("订单名称")
+    private String name;
+    private Long insertTime;
+
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Long insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "TravelRecordWarpper{" +
+                "money=" + money +
+                ", time='" + time + '\'' +
+                ", name='" + name + '\'' +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+
+
+    public static List<TravelRecordWarpper> getTravelRecordWarpper(List<Map<String, Object>> maps){
+        List<TravelRecordWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                TravelRecordWarpper travelRecordWarpper = new TravelRecordWarpper();
+                travelRecordWarpper.setMoney(null != map.get("money") ? Double.valueOf(String.valueOf(map.get("money"))) : 0);
+                travelRecordWarpper.setTime(null != map.get("time") ? String.valueOf(map.get("time")) : "");
+                travelRecordWarpper.setName(null != map.get("name") ? String.valueOf(map.get("name")) : "");
+                travelRecordWarpper.setInsertTime(null != map.get("insertTime") ? Long.valueOf(String.valueOf(map.get("insertTime"))) : 0);
+                list.add(travelRecordWarpper);
+            }
+        }
+        Collections.sort(list);
+        return list;
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        if (o instanceof TravelRecordWarpper) {
+            TravelRecordWarpper s = (TravelRecordWarpper) o;
+            if(this.insertTime == null || s.insertTime == null){
+                return -1;
+            }
+            if (this.insertTime > s.insertTime) {
+                return -1;
+            } else if (this.insertTime == s.insertTime) {
+                return 0;
+            } else {
+                return 1;
+            }
+        }
+        return 0;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserInfoWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserInfoWarpper.java
new file mode 100644
index 0000000..61ef8e1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserInfoWarpper.java
@@ -0,0 +1,183 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Map;
+
+/**
+ * 用户信息
+ */
+@ApiModel("用户信息")
+public class UserInfoWarpper {
+    @ApiModelProperty("主键")
+    private Integer id;
+    @ApiModelProperty("姓名")
+    private String name;
+    @ApiModelProperty("昵称")
+    private String nickName;
+    @ApiModelProperty("电话")
+    private String phone;
+    @ApiModelProperty("是否实名(1:否,2:是)")
+    private Integer isAuth;
+    @ApiModelProperty("实名认证状态(1=待认证,2=认证通过,3=认证失败)")
+    private Integer verified;
+    @ApiModelProperty("头像")
+    private String avatar;
+    @ApiModelProperty("性别(1=男,2=女)")
+    private Integer sex;
+    @ApiModelProperty("生日")
+    private String birthday;
+    @ApiModelProperty("积分")
+    private Integer integral;
+    @ApiModelProperty("账户余额")
+    private Double balance;
+    @ApiModelProperty("紧急联系人姓名")
+    private String emergencyContact;
+    @ApiModelProperty("紧急联系人电话")
+    private String emergencyContactNumber;
+
+    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 getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getIsAuth() {
+        return isAuth;
+    }
+
+    public void setIsAuth(Integer isAuth) {
+        this.isAuth = isAuth;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public String getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(String birthday) {
+        this.birthday = birthday;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    public Integer getVerified() {
+        return verified;
+    }
+
+    public void setVerified(Integer verified) {
+        this.verified = verified;
+    }
+
+    public String getEmergencyContact() {
+        return emergencyContact;
+    }
+
+    public void setEmergencyContact(String emergencyContact) {
+        this.emergencyContact = emergencyContact;
+    }
+
+    public String getEmergencyContactNumber() {
+        return emergencyContactNumber;
+    }
+
+    public void setEmergencyContactNumber(String emergencyContactNumber) {
+        this.emergencyContactNumber = emergencyContactNumber;
+    }
+
+    public Double getBalance() {
+        return balance;
+    }
+
+    public void setBalance(Double balance) {
+        this.balance = balance;
+    }
+
+    @Override
+    public String toString() {
+        return "UserInfoWarpper{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", nickName='" + nickName + '\'' +
+                ", phone='" + phone + '\'' +
+                ", isAuth=" + isAuth +
+                ", verified=" + verified +
+                ", avatar='" + avatar + '\'' +
+                ", sex=" + sex +
+                ", birthday='" + birthday + '\'' +
+                ", integral=" + integral +
+                ", balance=" + balance +
+                ", emergencyContact='" + emergencyContact + '\'' +
+                ", emergencyContactNumber='" + emergencyContactNumber + '\'' +
+                '}';
+    }
+
+    public static UserInfoWarpper getUserInfoWarpper(Map<String, Object> map){
+        UserInfoWarpper userInfoWarpper = new UserInfoWarpper();
+        if (null != map) {
+            userInfoWarpper.setId(null != map.get("id")  ? Integer.valueOf(String.valueOf(map.get("id"))) : null);
+            userInfoWarpper.setName(null != map.get("name") ? String.valueOf(map.get("name")) : "");
+            userInfoWarpper.setNickName(null != map.get("nickName") ? String.valueOf(map.get("nickName")) : "");
+            userInfoWarpper.setPhone(null != map.get("phone") ? String.valueOf(map.get("phone")) : "");
+            userInfoWarpper.setIsAuth(null != map.get("isAuth") ? Integer.valueOf(String.valueOf(map.get("isAuth"))) : null);
+            userInfoWarpper.setAvatar(null != map.get("avatar") ? String.valueOf(map.get("avatar")) : "http://bao-weiqing.oss-cn-hangzhou.aliyuncs.com/img/ad02d59ae74342359270f62a024fa9c6.png");
+            userInfoWarpper.setSex(null != map.get("sex") ? Integer.valueOf(String.valueOf(map.get("sex"))) : null);
+            userInfoWarpper.setBirthday(null != map.get("birthday") ? String.valueOf(map.get("birthday")) : "");
+            userInfoWarpper.setIntegral(null != map.get("integral") ? Integer.valueOf(String.valueOf(map.get("integral"))) : 0);
+            userInfoWarpper.setVerified(null != map.get("verified") ? Integer.valueOf(String.valueOf(map.get("verified"))) : 0);
+            userInfoWarpper.setEmergencyContact(null != map.get("emergencyContact") ? String.valueOf(map.get("emergencyContact")) : "");
+            userInfoWarpper.setEmergencyContactNumber(null != map.get("emergencyContactNumber") ? String.valueOf(map.get("emergencyContactNumber")) : "");
+            userInfoWarpper.setBalance(null != map.get("balance") ? Double.valueOf(String.valueOf(map.get("balance"))) : 0);
+        }
+        return userInfoWarpper;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java
new file mode 100644
index 0000000..643677e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户管理的包装类
+ *
+ * @author fengshuonan
+ * @date 2017年2月13日 下午10:47:03
+ */
+public class UserWarpper extends BaseControllerWarpper {
+
+    public UserWarpper(List<Map<String, Object>> list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        map.put("sexName", ConstantFactory.me().getSexName((Integer) map.get("sex")));
+        map.put("roleName", ConstantFactory.me().getRoleName((String) map.get("roleid")));
+        map.put("deptName", ConstantFactory.me().getDeptName((Integer) map.get("deptid")));
+        map.put("statusName", ConstantFactory.me().getStatusName((Integer) map.get("status")));
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VerifiedWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VerifiedWarpper.java
new file mode 100644
index 0000000..3791ec4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VerifiedWarpper.java
@@ -0,0 +1,69 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.modular.system.model.Verified;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("实名认证")
+public class VerifiedWarpper {
+    @ApiModelProperty(value = "姓名", required = true, dataType = "String")
+    private String name;
+    @ApiModelProperty(value = "身份证号码", required = true, dataType = "String")
+    private String idcode;
+    @ApiModelProperty(value = "身份证正面照", required = false, dataType = "String")
+    private String img1;
+    @ApiModelProperty(value = "身份证背面照", required = false, dataType = "String")
+    private String img2;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIdcode() {
+        return idcode;
+    }
+
+    public void setIdcode(String idcode) {
+        this.idcode = idcode;
+    }
+
+    public String getImg1() {
+        return img1;
+    }
+
+    public void setImg1(String img1) {
+        this.img1 = img1;
+    }
+
+    public String getImg2() {
+        return img2;
+    }
+
+    public void setImg2(String img2) {
+        this.img2 = img2;
+    }
+
+    @Override
+    public String toString() {
+        return "VerifiedWarpper{" +
+                "name='" + name + '\'' +
+                ", idcode='" + idcode + '\'' +
+                ", img1='" + img1 + '\'' +
+                ", img2='" + img2 + '\'' +
+                '}';
+    }
+
+
+    public static Verified getVerified(VerifiedWarpper verifiedWarpper){
+        Verified verified = new Verified();
+        verified.setName(verifiedWarpper.getName());
+        verified.setIdcode(verifiedWarpper.getIdcode());
+        verified.setImg1(verifiedWarpper.getImg1());
+        verified.setImg2(verifiedWarpper.getImg2());
+        return verified;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VersionWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VersionWarpper.java
new file mode 100644
index 0000000..413a31d
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VersionWarpper.java
@@ -0,0 +1,84 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Map;
+
+@ApiModel("版本")
+public class VersionWarpper {
+    @ApiModelProperty("主键")
+    private Integer id;
+    @ApiModelProperty("包地址")
+    private String url;
+    @ApiModelProperty("版本说明")
+    private String content;
+    @ApiModelProperty("是否强制更新(0=否,1=是)")
+    private Integer mandatory;
+    @ApiModelProperty("版本号")
+    private String version;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getMandatory() {
+        return mandatory;
+    }
+
+    public void setMandatory(Integer mandatory) {
+        this.mandatory = mandatory;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    @Override
+    public String toString() {
+        return "VersionWarpper{" +
+                "id=" + id +
+                ", url='" + url + '\'' +
+                ", content='" + content + '\'' +
+                ", mandatory=" + mandatory +
+                ", version='" + version + '\'' +
+                '}';
+    }
+
+
+    public static VersionWarpper getVersionWarpper(Map<String, Object> map){
+        VersionWarpper versionWarpper = new VersionWarpper();
+        if(null != map){
+            versionWarpper.setId(null != map.get("id") ? Integer.valueOf(String.valueOf(map.get("id"))) : 0);
+            versionWarpper.setUrl(null != map.get("url") ? String.valueOf(map.get("url")) : "");
+            versionWarpper.setContent(null != map.get("content") ? String.valueOf(map.get("content")) : "");
+            versionWarpper.setMandatory(null != map.get("mandatory") ? Integer.valueOf(String.valueOf(map.get("mandatory"))) : 0);
+            versionWarpper.setVersion(null != map.get("version") ? String.valueOf(map.get("version")) : "");
+        }
+        return versionWarpper;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/WithdrawalWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/WithdrawalWarpper.java
new file mode 100644
index 0000000..e9b1d9c
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/WithdrawalWarpper.java
@@ -0,0 +1,101 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ApiModel("提现历史记录")
+public class WithdrawalWarpper {
+    @ApiModelProperty("主键")
+    private Integer id;
+    @ApiModelProperty("提现时间")
+    private String insertTime;
+    @ApiModelProperty("提现金额")
+    private Double money;
+    @ApiModelProperty("提现方式")
+    private String name;
+    @ApiModelProperty("备注")
+    private String remark;
+    @ApiModelProperty("提现状态(1=待处理,2=成功,3=失败)")
+    private Integer state;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(String insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "WithdrawalWarpper{" +
+                "id=" + id +
+                ", insertTime='" + insertTime + '\'' +
+                ", money=" + money +
+                ", name='" + name + '\'' +
+                ", remark='" + remark + '\'' +
+                ", state=" + state +
+                '}';
+    }
+
+    public static List<WithdrawalWarpper> getWithdrawalWarpper(List<Map<String, Object>> maps){
+        List<WithdrawalWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                WithdrawalWarpper withdrawalWarpper = new WithdrawalWarpper();
+                withdrawalWarpper.setId(null != map.get("id") ? Integer.valueOf(String.valueOf(map.get("id"))) : 0);
+                withdrawalWarpper.setMoney(null != map.get("money") ? Double.valueOf(String.valueOf(map.get("money"))) : 0);
+                withdrawalWarpper.setName(null != map.get("name") ? String.valueOf(map.get("name")) : "");
+                withdrawalWarpper.setRemark(null != map.get("remark") ? String.valueOf(map.get("remark")) : "");
+                withdrawalWarpper.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0);
+                withdrawalWarpper.setInsertTime(null != map.get("insertTime") ? String.valueOf(map.get("insertTime")) : "");
+                list.add(withdrawalWarpper);
+            }
+        }
+        return list;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/OrderTaxiController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/OrderTaxiController.java
new file mode 100644
index 0000000..76c2007
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/OrderTaxiController.java
@@ -0,0 +1,90 @@
+package com.stylefeng.guns.modular.taxi.controller;
+
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.taxi.warpper.OrderTaxiWarpper;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 出租车订单控制器
+ */
+@RestController
+@RequestMapping("")
+public class OrderTaxiController {
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+
+
+    /**
+     * 出租车下单操作(APP下单和扫码下单)
+     * @param orderTaxiWarpper
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/taxiOrder")
+    @ApiOperation(value = "出租车下单操作(APP下单和扫码下单)", tags = {"用户端-出租车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> taxiOrder(OrderTaxiWarpper orderTaxiWarpper, HttpServletRequest request){
+        try {
+            OrderTaxi orderTaxi = OrderTaxiWarpper.getOrderTaxi(orderTaxiWarpper);
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderTaxiService.taxiOrder(orderTaxi, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+
+    /**
+     * 手动确认订单完成
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/taxi/completeOrder")
+    @ApiOperation(value = "手动确认订单完成", tags = {"用户端-出租车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil completeOrder(Integer orderId, Integer orderType){
+        try {
+            return orderTaxiService.completeOrder(orderId, orderType);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/TaxiCallbackController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/TaxiCallbackController.java
new file mode 100644
index 0000000..19567c4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/TaxiCallbackController.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.taxi.controller;
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+//import com.stylefeng.guns.modular.system.util.ICBCPayUtil;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * 支付回调控制器
+ */
+@RestController
+@RequestMapping("/base")
+public class TaxiCallbackController {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/TaxiDriverController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/TaxiDriverController.java
new file mode 100644
index 0000000..882fc3b
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/controller/TaxiDriverController.java
@@ -0,0 +1,52 @@
+package com.stylefeng.guns.modular.taxi.controller;
+
+import com.stylefeng.guns.modular.system.service.IDriverService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.OrderDriverWarpper;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * 出租车模块的司机控制器
+ */
+@RestController
+@RequestMapping("/api/taxiDrive")
+public class TaxiDriverController {
+
+    @Autowired
+    private IDriverService driverService;
+
+
+    /**
+     * 根据订单id获取司机数据
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryOrderDriver")
+    @ApiOperation(value = "根据订单id获取司机数据", tags = {"用户端-出租车", "用户端-专车"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<OrderDriverWarpper> queryOrderDriver(Integer id, Integer orderType){
+        try {
+            Map<String, Object> map = driverService.queryOrderDriver(id, orderType);
+            // TODO: 2020/5/25 需要推送订单数据
+            OrderDriverWarpper orderDriverWarpper = OrderDriverWarpper.getOrderDriverWarpper(map);
+            return ResultUtil.success(orderDriverWarpper);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java
new file mode 100644
index 0000000..6f8920e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java
@@ -0,0 +1,92 @@
+package com.stylefeng.guns.modular.taxi.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface OrderTaxiMapper extends BaseMapper<OrderTaxi> {
+
+
+    /**
+     * 获取数据
+     * @param start
+     * @param end
+     * @return
+     * @throws Exception
+     */
+    List<OrderTaxi> query(@Param("start") Date start, @Param("end") Date end) throws Exception;
+
+
+    /**
+     * 获取用户的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryMyOrderList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
+                                               @Param("size") Integer size);
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyTravelRecord(@Param("uid") Integer uid);
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryRedEnvelope(@Param("uid") Integer uid);
+
+
+    /**
+     * 获取用户单发票页面的订单列表
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryInvoiceOrder(@Param("type") Integer type, @Param("startTime") Date startTime,
+                                                @Param("endTime") Date endTime, @Param("startMoney") Double startMoney,
+                                                @Param("endMoney") Double endMoney, @Param("uid") Integer uid);
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(@Param("orderId") Integer orderId);
+
+
+    /**
+     * 获取订单数据
+     * @param uid
+     * @param state
+     * @return
+     */
+    List<OrderTaxi> queryByState(@Param("uid") Integer uid, @Param("state") Integer...state);
+
+
+    /**
+     * 获取订单数据
+     * @param uid
+     * @param orderType     1=即时单,2=预约单
+     * @param state
+     * @return
+     */
+    List<OrderTaxi> queryByState_(@Param("uid") Integer uid, @Param("orderType") Integer orderType,
+                                  @Param("type") Integer type, @Param("state") Integer...state);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/PaymentRecordMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/PaymentRecordMapper.java
new file mode 100644
index 0000000..f8fd1ab
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/PaymentRecordMapper.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.taxi.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface PaymentRecordMapper extends BaseMapper<PaymentRecord> {
+
+
+    /**
+     * 获取数据
+     * @param orderId
+     * @param payType
+     * @param state
+     * @return
+     */
+    PaymentRecord query(@Param("category") Integer category, @Param("userId") Integer userId,
+                               @Param("type") Integer type, @Param("orderId") Integer orderId,
+                               @Param("orderType") Integer orderType, @Param("payType") Integer payType,
+                               @Param("state") Integer state);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/TransactionDetailsMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/TransactionDetailsMapper.java
new file mode 100644
index 0000000..fbdcbdb
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/TransactionDetailsMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.taxi.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.taxi.model.TransactionDetails;
+
+public interface TransactionDetailsMapper extends BaseMapper<TransactionDetails> {
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml
new file mode 100644
index 0000000..7095723
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.taxi.model.OrderTaxi">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="crossCityOrderId" property="crossCityOrderId"/>
+        <result column="place" property="place"/>
+        <result column="userId" property="userId"/>
+        <result column="driverId" property="driverId"/>
+        <result column="carId" property="carId"/>
+        <result column="orderNum" property="orderNum"/>
+        <result column="placementLon" property="placementLon"/>
+        <result column="placementLat" property="placementLat"/>
+        <result column="placementAddress" property="placementAddress"/>
+        <result column="startLon" property="startLon"/>
+        <result column="startLat" property="startLat"/>
+        <result column="startAddress" property="startAddress"/>
+        <result column="endLon" property="endLon"/>
+        <result column="endLat" property="endLat"/>
+        <result column="endAddress" property="endAddress"/>
+        <result column="boardingLon" property="boardingLon"/>
+        <result column="boardingLat" property="boardingLat"/>
+        <result column="boardingAddress" property="boardingAddress"/>
+        <result column="boardingTime" property="boardingTime"/>
+        <result column="getoffLon" property="getoffLon"/>
+        <result column="getoffLat" property="getoffLat"/>
+        <result column="getoffAddress" property="getoffAddress"/>
+        <result column="getoffTime" property="getoffTime"/>
+        <result column="mileage" property="mileage"/>
+        <result column="payManner" property="payManner"/>
+        <result column="payType" property="payType"/>
+        <result column="orderMoney" property="orderMoney"/>
+        <result column="travelMoney" property="travelMoney"/>
+        <result column="parkMoney" property="parkMoney"/>
+        <result column="roadTollMoney" property="roadTollMoney"/>
+        <result column="tipMoney" property="tipMoney"/>
+        <result column="redPacketMoney" property="redPacketMoney"/>
+        <result column="couponMoney" property="couponMoney"/>
+        <result column="redPacketId" property="redPacketId"/>
+        <result column="couponId" property="couponId"/>
+        <result column="discount" property="discount"/>
+        <result column="discountMoney" property="discountMoney"/>
+        <result column="activityId" property="activityId"/>
+        <result column="companyId" property="companyId"/>
+        <result column="payMoney" property="payMoney"/>
+        <result column="substitute" property="substitute"/>
+        <result column="passengers" property="passengers"/>
+        <result column="passengersPhone" property="passengersPhone"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="travelTime" property="travelTime"/>
+        <result column="snatchOrderTime" property="snatchOrderTime"/>
+        <result column="setOutTime" property="setOutTime"/>
+        <result column="arriveTime" property="arriveTime"/>
+        <result column="startServiceTime" property="startServiceTime"/>
+        <result column="endServiceTime" property="endServiceTime"/>
+        <result column="orderType" property="orderType"/>
+        <result column="orderSource" property="orderSource"/>
+        <result column="invoiceId" property="invoiceId"/>
+        <result column="isReassign" property="isReassign"/>
+        <result column="reassignNotice" property="reassignNotice"/>
+        <result column="trackId" property="trackId"/>
+        <result column="isDelete" property="isDelete"/>
+        <result column="oldState" property="oldState"/>
+        <result column="telX" property="telX"/>
+        <result column="bindId" property="bindId"/>
+    </resultMap>
+
+
+
+    <select id="query" resultType="OrderTaxi">
+        select
+        id as id,
+        userId as userId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        travelMoney as travelMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        tipMoney as tipMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId
+        from t_order_taxi where insertTime between #{start} and #{end}
+    </select>
+
+
+
+    <select id="queryMyOrderList" resultType="map">
+        select
+        id as orderId,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+        DATE_FORMAT(travelTime, '%m月%d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (2) as orderType,
+        state as state,
+        oldState as oldState
+        from t_order_taxi where userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+
+
+    <select id="queryMyTravelRecord" resultType="map">
+        select
+        (payMoney * -1) as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        ('出租车订单') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_taxi where payMoney != 0 and userId = #{uid} and state in (8, 9, 10, 11, 12)
+    </select>
+
+
+    <select id="queryRedEnvelope" resultType="map">
+        select
+        redPacketMoney as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        ('出租车订单') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_taxi where userId = #{uid} and state in (8, 9) and redPacketId is not null
+    </select>
+
+
+
+    <select id="queryInvoiceOrder" resultType="map">
+        select
+        id as id,
+        DATE_FORMAT(travelTime, '%Y-%m-%d %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        payMoney as payMoney,
+        ('出租车订单') as orderName,
+        if(invoiceId is null, 1, 2) as invoice,
+        unix_timestamp(insertTime) as insertTime,
+        (2) as orderType
+        from t_order_taxi where state in (8, 9)
+        <if test="type == 1">
+            and invoiceId is null and invoiceId in (select id from t_invoice where state != 2)
+        </if>
+        <if test="type == 2">
+            and invoiceId in (select id from t_invoice where state = 2)
+        </if>
+        <if test="null != startTime and null != endTime">
+            and travelTime between #{startTime} and #{endTime}
+        </if>
+        <if test="null != startMoney and null != endMoney">
+            and payMoney between #{startMoney} and #{endMoney}
+        </if>
+        <if test="null !=uid">
+            and userId = #{uid}
+        </if>
+    </select>
+
+
+
+    <select id="queryOrderInfo" resultType="map">
+        select
+        a.id as orderId,
+        a.type as type,
+        a.state as state,
+        DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as insertTime,
+        DATE_FORMAT(a.travelTime, '%m月%d日 %H:%i') as travelTime,
+        DATE_FORMAT(a.arriveTime, '%Y-%m-%d %H:%i:%s') as arriveTime,
+        a.startLon as startLon,
+        a.startLat as startLat,
+        a.startAddress as startAddress,
+        a.endLon as endLon,
+        a.endLat as endLat,
+        a.endAddress as endAddress,
+		a.driverId as driverId,
+		a.orderMoney as orderMoney,
+		a.travelMoney as travelMoney,
+		a.parkMoney as parkMoney,
+		a.roadTollMoney as roadTollMoney,
+		a.redPacketMoney as redPacketMoney,
+		a.couponMoney as couponMoney,
+		a.discountMoney as discountMoney,
+		a.tipMoney as tipMoney,
+		a.payMoney as payMoney,
+		a.reassignNotice as reassignNotice,
+		a.oldState as oldState,
+		b.headImgUrl as driverAvatar,
+		b.`name` as driverName,
+		c.carLicensePlate as licensePlate,
+		c.carColor as carColor,
+		CONCAT(f.`name`, d.`name`) as brand,
+		((select sum(fraction) from t_order_evaluate where driverId = a.driverId) / (select count(id) from t_order_evaluate where driverId = a.driverId)) as score,
+		(
+		(select count(id) from t_order_private_car where driverId = a.driverId and state in (7, 8, 9)) +
+		(select count(id) from t_order_taxi where driverId = a.driverId and state in (7, 8, 9)) +
+		(select count(id) from t_order_cross_city where driverId = a.driverId and state in (6, 8, 9))
+		) as orderNum,
+		b.phone as driverPhone,
+		if(a.state = 12, (select money from t_order_cancel where orderId = a.id and orderType = 2 and state = 1 order by insertTime desc limit 0, 1), if(a.state = 10, (select money from t_order_cancel where orderId = a.id and orderType = 2 and state = 2 order by insertTime desc limit 0, 1), 0)) as cancelPayMoney,
+		if(a.state = 12, (select id from t_order_cancel where orderId = a.id and orderType = 2 and state = 1 order by insertTime desc limit 0, 1), 0) as cancelId,
+		g.fraction as orderScore,
+		g.content as evaluate,
+		a.telX as telX,
+		h.userType as cancelUserType,
+		h.money as cancelMoney,
+		h.reason as cancelReason,
+		h.remark as cancelRemark
+        from t_order_taxi a
+		left join t_driver b on (a.driverId = b.id)
+		left join t_car c on (a.carId = c.id)
+		left join t_car_model d on (c.carModelId = d.id)
+		left join t_car_brand f on (d.brandId = f.id)
+		left join t_order_evaluate g on (a.id = g.orderId and g.orderType = 2)
+		left join t_order_cancel h on (a.id = h.orderId and h.orderType = 2 and h.state = 2)
+		where a.id = #{orderId}
+    </select>
+
+
+
+    <select id="queryByState" resultType="OrderTaxi">
+        select
+        id as id,
+        userId as userId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        travelMoney as travelMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        tipMoney as tipMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId
+        from t_order_taxi where userId = #{uid}
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
+
+
+
+    <select id="queryByState_" resultType="OrderTaxi">
+        select
+        id as id,
+        `type` as `type`,
+        userId as userId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        travelMoney as travelMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        tipMoney as tipMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId
+        from t_order_taxi where userId = #{uid}
+        <if test="null != orderType">
+            and orderType = #{orderType}
+        </if>
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != type">
+            and `type` = #{type}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml
new file mode 100644
index 0000000..d65166f
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.taxi.dao.PaymentRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.taxi.model.PaymentRecord">
+        <id column="id" property="id"/>
+        <result column="category" property="category"/>
+        <result column="userId" property="userId"/>
+        <result column="type" property="type"/>
+        <result column="orderId" property="orderId"/>
+        <result column="orderType" property="orderType"/>
+        <result column="payType" property="payType"/>
+        <result column="amount" property="amount"/>
+        <result column="code" property="code"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+    <select id="query" resultType="PaymentRecord">
+        select
+        id as id,
+        category as category,
+        userId as userId,
+        `type` as `type`,
+        orderId as orderId,
+        orderType as orderType,
+        payType as payType,
+        amount as amount,
+        code as code,
+        state as state,
+        insertTime as insertTime
+        from t_payment_record where category = #{category}
+        <if test="null != userId">
+            and userId = #{userId}
+        </if>
+        <if test="null != type">
+            and type = #{type}
+        </if>
+        <if test="null != orderId">
+            and orderId = #{orderId}
+        </if>
+        <if test="null != orderType">
+            and orderType = #{orderType}
+        </if>
+        <if test="null != payType">
+            and payType = #{payType}
+        </if>
+        <if test="null != state">
+            and state = #{state}
+        </if>
+        order by insertTime desc limit 0,1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/TransactionDetailsMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/TransactionDetailsMapper.xml
new file mode 100644
index 0000000..dc37967
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/TransactionDetailsMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.taxi.dao.TransactionDetailsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.taxi.model.TransactionDetails">
+        <id column="id" property="id"/>
+        <result column="userId" property="userId"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="remark" property="remark"/>
+        <result column="money" property="money"/>
+        <result column="state" property="state"/>
+        <result column="type" property="type"/>
+        <result column="userType" property="userType"/>
+        <result column="orderType" property="orderType"/>
+        <result column="orderId" property="orderId"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java
new file mode 100644
index 0000000..56d9374
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java
@@ -0,0 +1,911 @@
+package com.stylefeng.guns.modular.taxi.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 com.stylefeng.guns.modular.system.model.BaseBean;
+
+import java.util.Date;
+
+/**
+ * 出租车订单
+ */
+@TableName("t_order_taxi")
+public class OrderTaxi {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单类型(1=普通订单,2=摆渡订单)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 跨城订单id(摆渡车专用)
+     */
+    @TableField("crossCityOrderId")
+    private Integer crossCityOrderId;
+    /**
+     * 摆渡方位(1=跨城起点,2=跨城终点)
+     */
+    @TableField("place")
+    private Integer place;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 车辆id
+     */
+    @TableField("carId")
+    private Integer carId;
+    /**
+     * 订单号
+     */
+    @TableField("orderNum")
+    private String orderNum;
+    /**
+     * 下单地点经度
+     */
+    @TableField("placementLon")
+    private Double placementLon;
+    /**
+     * 下单地点纬度
+     */
+    @TableField("placementLat")
+    private Double placementLat;
+    /**
+     * 下单地点
+     */
+    @TableField("placementAddress")
+    private String placementAddress;
+    /**
+     * 起点经度
+     */
+    @TableField("startLon")
+    private Double startLon;
+    /**
+     * 起点纬度
+     */
+    @TableField("startLat")
+    private Double startLat;
+    /**
+     * 起点
+     */
+    @TableField("startAddress")
+    private String startAddress;
+    /**
+     * 目的地经度
+     */
+    @TableField("endLon")
+    private Double endLon;
+    /**
+     * 目的地纬度
+     */
+    @TableField("endLat")
+    private Double endLat;
+    /**
+     * 目的地
+     */
+    @TableField("endAddress")
+    private String endAddress;
+    /**
+     * 上车点经度
+     */
+    @TableField("boardingLon")
+    private Double boardingLon;
+    /**
+     * 上车点纬度
+     */
+    @TableField("boardingLat")
+    private Double boardingLat;
+    /**
+     * 上车地点
+     */
+    @TableField("boardingAddress")
+    private String boardingAddress;
+    /**
+     * 上车时间
+     */
+    @TableField("boardingTime")
+    private Date boardingTime;
+    /**
+     * 下车点经度
+     */
+    @TableField("getoffLon")
+    private Double getoffLon;
+    /**
+     * 下车点纬度
+     */
+    @TableField("getoffLat")
+    private Double getoffLat;
+    /**
+     * 下车点
+     */
+    @TableField("getoffAddress")
+    private String getoffAddress;
+    /**
+     * 下车时间
+     */
+    @TableField("getoffTime")
+    private Date getoffTime;
+    /**
+     * 行驶里程数(米)
+     */
+    @TableField("mileage")
+    private Double mileage;
+    /**
+     * 支付方式(1=OK平台支付,2=其他方式支付)
+     */
+    @TableField("payManner")
+    private Integer payManner;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=余额)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 订单金额
+     */
+    @TableField("orderMoney")
+    private Double orderMoney;
+    /**
+     * 行程费
+     */
+    @TableField("travelMoney")
+    private Double travelMoney;
+    /**
+     * 停车费
+     */
+    @TableField("parkMoney")
+    private Double parkMoney;
+    /**
+     * 过路费
+     */
+    @TableField("roadTollMoney")
+    private Double roadTollMoney;
+    /**
+     * 小费
+     */
+    @TableField("tipMoney")
+    private Double tipMoney;
+    /**
+     * 红包抵扣金额
+     */
+    @TableField("redPacketMoney")
+    private Double redPacketMoney;
+    /**
+     * 优惠券抵扣金额
+     */
+    @TableField("couponMoney")
+    private Double couponMoney;
+    /**
+     * 红包id
+     */
+    @TableField("redPacketId")
+    private Integer redPacketId;
+    /**
+     * 优惠券id
+     */
+    @TableField("couponId")
+    private Integer couponId;
+    /**
+     * 折扣
+     */
+    @TableField("discount")
+    private Double discount;
+    /**
+     * 折扣优惠金额
+     */
+    @TableField("discountMoney")
+    private Double discountMoney;
+    /**
+     * 折扣活动id
+     */
+    @TableField("activityId")
+    private Integer activityId;
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 支付金额
+     */
+    @TableField("payMoney")
+    private Double payMoney;
+    /**
+     * 是否是代下单(0:否,1:是)
+     */
+    @TableField("substitute")
+    private Integer substitute;
+    /**
+     * 乘车人姓名
+     */
+    @TableField("passengers")
+    private String passengers;
+    /**
+     * 乘车人电话
+     */
+    @TableField("passengersPhone")
+    private String passengersPhone;
+    /**
+     * 订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 下单时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 出行时间
+     */
+    @TableField("travelTime")
+    private Date travelTime;
+    /**
+     * 抢单时间
+     */
+    @TableField("snatchOrderTime")
+    private Date snatchOrderTime;
+    /**
+     * 司机点出发时间
+     */
+    @TableField("setOutTime")
+    private Date setOutTime;
+    /**
+     * 司机到达预约地点时间
+     */
+    @TableField("arriveTime")
+    private Date arriveTime;
+    /**
+     * 开始服务时间
+     */
+    @TableField("startServiceTime")
+    private Date startServiceTime;
+    /**
+     * 结束服务时间
+     */
+    @TableField("endServiceTime")
+    private Date endServiceTime;
+    /**
+     * 订单类型(1=普通,2=预约)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单,6:道行龙城下单)
+     */
+    @TableField("orderSource")
+    private Integer orderSource;
+    /**
+     * 发票id
+     */
+    @TableField("invoiceId")
+    private Integer invoiceId;
+    /**
+     * 是否是改派单(1=否,=是)
+     * @return
+     */
+    @TableField("isReassign")
+    private Integer isReassign;
+    /**
+     * 改派通知标识(0=没有改派,1=改派中,2=已改派)用于通知前端获取新司机数据
+     */
+    @TableField("reassignNotice")
+    private Integer reassignNotice;
+    /**
+     * 高德猎鹰轨迹id
+     * @return
+     */
+    @TableField("trackId")
+    private String trackId;
+    /**
+     * 是否删除(1=否,2=是)
+     */
+    @TableField("isDelete")
+    private Integer isDelete;
+    /**
+     * 该派前的订单状态
+     * @return
+     */
+    @TableField("oldState")
+    private Integer oldState;
+    /**
+     * 移动小号
+     * @return
+     */
+    @TableField("telX")
+    private String telX;
+    /**
+     * 绑定小号关系id
+     * @return
+     */
+    @TableField("bindId")
+    private String bindId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getCrossCityOrderId() {
+        return crossCityOrderId;
+    }
+
+    public void setCrossCityOrderId(Integer crossCityOrderId) {
+        this.crossCityOrderId = crossCityOrderId;
+    }
+
+    public Integer getPlace() {
+        return place;
+    }
+
+    public void setPlace(Integer place) {
+        this.place = place;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Double getBoardingLon() {
+        return boardingLon;
+    }
+
+    public void setBoardingLon(Double boardingLon) {
+        this.boardingLon = boardingLon;
+    }
+
+    public Double getBoardingLat() {
+        return boardingLat;
+    }
+
+    public void setBoardingLat(Double boardingLat) {
+        this.boardingLat = boardingLat;
+    }
+
+    public String getBoardingAddress() {
+        return boardingAddress;
+    }
+
+    public void setBoardingAddress(String boardingAddress) {
+        this.boardingAddress = boardingAddress;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Double getGetoffLon() {
+        return getoffLon;
+    }
+
+    public void setGetoffLon(Double getoffLon) {
+        this.getoffLon = getoffLon;
+    }
+
+    public Double getGetoffLat() {
+        return getoffLat;
+    }
+
+    public void setGetoffLat(Double getoffLat) {
+        this.getoffLat = getoffLat;
+    }
+
+    public String getGetoffAddress() {
+        return getoffAddress;
+    }
+
+    public void setGetoffAddress(String getoffAddress) {
+        this.getoffAddress = getoffAddress;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(Double orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public Double getTravelMoney() {
+        return travelMoney;
+    }
+
+    public void setTravelMoney(Double travelMoney) {
+        this.travelMoney = travelMoney;
+    }
+
+    public Double getParkMoney() {
+        return parkMoney;
+    }
+
+    public void setParkMoney(Double parkMoney) {
+        this.parkMoney = parkMoney;
+    }
+
+    public Double getRoadTollMoney() {
+        return roadTollMoney;
+    }
+
+    public void setRoadTollMoney(Double roadTollMoney) {
+        this.roadTollMoney = roadTollMoney;
+    }
+
+    public Double getTipMoney() {
+        return tipMoney;
+    }
+
+    public void setTipMoney(Double tipMoney) {
+        this.tipMoney = tipMoney;
+    }
+
+    public Double getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(Double redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public Double getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(Double couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Integer getRedPacketId() {
+        return redPacketId;
+    }
+
+    public void setRedPacketId(Integer redPacketId) {
+        this.redPacketId = redPacketId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Double getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(Double payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Integer getSubstitute() {
+        return substitute;
+    }
+
+    public void setSubstitute(Integer substitute) {
+        this.substitute = substitute;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+
+    public String getPassengersPhone() {
+        return passengersPhone;
+    }
+
+    public void setPassengersPhone(String passengersPhone) {
+        this.passengersPhone = passengersPhone;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Date getSnatchOrderTime() {
+        return snatchOrderTime;
+    }
+
+    public void setSnatchOrderTime(Date snatchOrderTime) {
+        this.snatchOrderTime = snatchOrderTime;
+    }
+
+    public Date getSetOutTime() {
+        return setOutTime;
+    }
+
+    public void setSetOutTime(Date setOutTime) {
+        this.setOutTime = setOutTime;
+    }
+
+    public Date getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Date arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Date getStartServiceTime() {
+        return startServiceTime;
+    }
+
+    public void setStartServiceTime(Date startServiceTime) {
+        this.startServiceTime = startServiceTime;
+    }
+
+    public Date getEndServiceTime() {
+        return endServiceTime;
+    }
+
+    public void setEndServiceTime(Date endServiceTime) {
+        this.endServiceTime = endServiceTime;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+
+    public Integer getInvoiceId() {
+        return invoiceId;
+    }
+
+    public void setInvoiceId(Integer invoiceId) {
+        this.invoiceId = invoiceId;
+    }
+
+    public Integer getPayManner() {
+        return payManner;
+    }
+
+    public void setPayManner(Integer payManner) {
+        this.payManner = payManner;
+    }
+
+    public Integer getIsReassign() {
+        return isReassign;
+    }
+
+    public void setIsReassign(Integer isReassign) {
+        this.isReassign = isReassign;
+    }
+
+    public Integer getReassignNotice() {
+        return reassignNotice;
+    }
+
+    public void setReassignNotice(Integer reassignNotice) {
+        this.reassignNotice = reassignNotice;
+    }
+
+    public String getTrackId() {
+        return trackId;
+    }
+
+    public void setTrackId(String trackId) {
+        this.trackId = trackId;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Double getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Double discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getOldState() {
+        return oldState;
+    }
+
+    public void setOldState(Integer oldState) {
+        this.oldState = oldState;
+    }
+
+    public String getTelX() {
+        return telX;
+    }
+
+    public void setTelX(String telX) {
+        this.telX = telX;
+    }
+
+    public String getBindId() {
+        return bindId;
+    }
+
+    public void setBindId(String bindId) {
+        this.bindId = bindId;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderTaxi{" +
+                "id=" + id +
+                ", type=" + type +
+                ", crossCityOrderId=" + crossCityOrderId +
+                ", place=" + place +
+                ", userId=" + userId +
+                ", driverId=" + driverId +
+                ", carId=" + carId +
+                ", orderNum='" + orderNum + '\'' +
+                ", placementLon=" + placementLon +
+                ", placementLat=" + placementLat +
+                ", placementAddress='" + placementAddress + '\'' +
+                ", startLon=" + startLon +
+                ", startLat=" + startLat +
+                ", startAddress='" + startAddress + '\'' +
+                ", endLon=" + endLon +
+                ", endLat=" + endLat +
+                ", endAddress='" + endAddress + '\'' +
+                ", boardingLon=" + boardingLon +
+                ", boardingLat=" + boardingLat +
+                ", boardingAddress='" + boardingAddress + '\'' +
+                ", boardingTime=" + boardingTime +
+                ", getoffLon=" + getoffLon +
+                ", getoffLat=" + getoffLat +
+                ", getoffAddress='" + getoffAddress + '\'' +
+                ", getoffTime=" + getoffTime +
+                ", mileage=" + mileage +
+                ", payManner=" + payManner +
+                ", payType=" + payType +
+                ", orderMoney=" + orderMoney +
+                ", travelMoney=" + travelMoney +
+                ", parkMoney=" + parkMoney +
+                ", roadTollMoney=" + roadTollMoney +
+                ", tipMoney=" + tipMoney +
+                ", redPacketMoney=" + redPacketMoney +
+                ", couponMoney=" + couponMoney +
+                ", redPacketId=" + redPacketId +
+                ", couponId=" + couponId +
+                ", discount=" + discount +
+                ", discountMoney=" + discountMoney +
+                ", activityId=" + activityId +
+                ", companyId=" + companyId +
+                ", payMoney=" + payMoney +
+                ", substitute=" + substitute +
+                ", passengers='" + passengers + '\'' +
+                ", passengersPhone='" + passengersPhone + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                ", travelTime=" + travelTime +
+                ", snatchOrderTime=" + snatchOrderTime +
+                ", setOutTime=" + setOutTime +
+                ", arriveTime=" + arriveTime +
+                ", startServiceTime=" + startServiceTime +
+                ", endServiceTime=" + endServiceTime +
+                ", orderType=" + orderType +
+                ", orderSource=" + orderSource +
+                ", invoiceId=" + invoiceId +
+                ", isReassign=" + isReassign +
+                ", reassignNotice=" + reassignNotice +
+                ", trackId='" + trackId + '\'' +
+                ", isDelete=" + isDelete +
+                ", oldState=" + oldState +
+                ", telX='" + telX + '\'' +
+                ", bindId='" + bindId + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/PaymentRecord.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/PaymentRecord.java
new file mode 100644
index 0000000..12032a4
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/PaymentRecord.java
@@ -0,0 +1,176 @@
+package com.stylefeng.guns.modular.taxi.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 java.util.Date;
+
+/**
+ * 第三方支付记录
+ */
+@TableName("t_payment_record")
+public class PaymentRecord {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 支付类别(1=订单相关支付,2=其他支付)
+     */
+    @TableField("category")
+    private Integer category;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 用户类型(1=用户,2=司机)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 订单类型
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 支付方式(1=微信,2=支付宝)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 支付金额
+     */
+    @TableField("amount")
+    private Double amount;
+    /**
+     * 第三方支付订单号
+     */
+    @TableField("code")
+    private String code;
+    /**
+     * 支付状态(1=未支付,2=已支付)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCategory() {
+        return category;
+    }
+
+    public void setCategory(Integer category) {
+        this.category = category;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "PaymentRecord{" +
+                "id=" + id +
+                ", category=" + category +
+                ", userId=" + userId +
+                ", type=" + type +
+                ", orderId=" + orderId +
+                ", orderType=" + orderType +
+                ", payType=" + payType +
+                ", amount=" + amount +
+                ", code='" + code + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/TransactionDetails.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/TransactionDetails.java
new file mode 100644
index 0000000..d7c2ce7
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/TransactionDetails.java
@@ -0,0 +1,164 @@
+package com.stylefeng.guns.modular.taxi.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 java.util.Date;
+
+/**
+ * 交易明细
+ */
+@TableName("t_pub_transaction_details")
+public class TransactionDetails {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 对象id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 金额/积分
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 状态(1=增加,2=减少)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 类型(1=金额,2:积分)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 类型(1=用户,2=司机)
+     */
+    @TableField("userType")
+    private Integer userType;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    @Override
+    public String toString() {
+        return "TransactionDetails{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", insertTime=" + insertTime +
+                ", remark='" + remark + '\'' +
+                ", money=" + money +
+                ", state=" + state +
+                ", type=" + type +
+                ", userType=" + userType +
+                ", orderType=" + orderType +
+                ", orderId=" + orderId +
+                '}';
+    }
+
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java
new file mode 100644
index 0000000..482b534
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java
@@ -0,0 +1,239 @@
+package com.stylefeng.guns.modular.taxi.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderStatusWarpper;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderTaxiService extends IService<OrderTaxi> {
+
+
+
+
+
+    /**
+     * 出租车下单操作
+     * @param orderTaxi
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> taxiOrder(OrderTaxi orderTaxi, Integer uid) throws Exception;
+
+
+    /**
+     * 继续推送操作
+     * @param id
+     * @throws Exception
+     */
+    ResultUtil pushOrderTaxi(Integer id) throws Exception;
+
+
+    /**
+     * 获取取消订单需要支付的金额
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception;
+
+
+    /**
+     * 添加取消
+     * @param id
+     * @param reason
+     * @param remark
+     * @param uid
+     * @throws Exception
+     */
+    ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception;
+
+
+    /**
+     * 取消订单操作
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    ResultUtil cancleOrderTaxi(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception;
+
+
+    /**
+     * 删除定时任务
+     * @param orderId
+     */
+    void deleteTask(Integer orderId);
+
+
+    /**
+     * 获取用户余额和可用优惠券数量
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception;
+
+
+    /**
+     * 获取优惠券列表
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+    /**
+     * 订单完成支付订单操作
+     * @param payType
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil payTaxiOrder(Integer payType, Integer orderId, Integer couponId, Integer type)throws Exception;
+
+
+    /**
+     * 完成订单操作
+     * @param orderId
+     * @param orderType
+     * @return
+     * @throws Exception
+     */
+    ResultUtil completeOrder(Integer orderId, Integer orderType) throws Exception;
+
+
+    /**
+     * 获取员工的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyTravelRecord(Integer uid) throws Exception;
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception;
+
+
+    /**
+     * 获取用户端发票页面中的订单列表数据
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney,
+                                                Double endMoney, Integer uid) throws Exception;
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(Integer orderId) throws Exception;
+
+
+    /**
+     * 获取下单推送完后没有司机下单的提醒
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    EndPushWarpper queryEndPush(Integer uid) throws Exception;
+
+
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception;
+
+
+    /**
+     * 评论成功后获取红包金额
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception;
+
+
+    /**
+     * 分享成功后添加红包
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil shareRedEnvelope(Integer orderId) throws Exception;
+
+
+    /**
+     * 获取订单数据
+     * @param uid
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    List<OrderTaxi> queryOrder(Integer uid, Integer...state) throws Exception;
+
+
+    /**
+     * 支付完成后的订单处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payOrderTaxiCallback(Integer id, String order_id, Integer type) throws Exception;
+
+
+    /**
+     * 取消订单支付后的处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payCancelOrderTaxi(Integer id, String order_id, Integer type) throws Exception;
+
+
+    /**
+     * 获取订单编号
+     * @return
+     * @throws Exception
+     */
+    String getOrderNum() throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IPaymentRecordService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IPaymentRecordService.java
new file mode 100644
index 0000000..edca3ff
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IPaymentRecordService.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.taxi.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+
+import java.util.List;
+
+public interface IPaymentRecordService extends IService<PaymentRecord> {
+
+
+    /**
+     * 添加数据
+     * @param orderId       订单id
+     * @param orderType     订单类型
+     * @param payType       支付方式(1=微信,2=支付宝)
+     * @param amount        支付金额
+     * @param code          第三方支付单号
+     * @param state         支付状态(1=待支付,2=已支付)
+     * @throws Exception
+     */
+    Integer saveData(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType, Integer payType,
+                  Double amount, String code, Integer state) throws Exception;
+
+
+    /**
+     * 获取数据
+     * @param orderId
+     * @param payType
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    PaymentRecord query(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType,
+               Integer payType, Integer state) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/ITransactionDetailsService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/ITransactionDetailsService.java
new file mode 100644
index 0000000..81ca3ba
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/ITransactionDetailsService.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.taxi.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.taxi.model.TransactionDetails;
+
+public interface ITransactionDetailsService extends IService<TransactionDetails> {
+
+
+    /**
+     * 添加数据
+     * @param userId    对象id
+     * @param remark    备注
+     * @param money     金额
+     * @param state     状态(1=添加,2=减少)
+     * @param type      类型(1=金额,2=积分)
+     * @param userType  用户类型(1=用户,2=司机)
+     * @param orderType 订单类型(1=专车,2=出租车,3=城际,4=小件物流,5=余额充值,6=余额提现,7=积分兑换)
+     * @param orderId
+     * @throws Exception
+     */
+    void saveData(Integer userId, String remark, Double money, Integer state,
+                  Integer type, Integer userType, Integer orderType, Integer orderId) throws Exception;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
new file mode 100644
index 0000000..c0cf62e
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -0,0 +1,1388 @@
+package com.stylefeng.guns.modular.taxi.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.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.crossCity.server.impl.OrderCrossCityServiceImpl;
+import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.dao.*;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import org.bouncycastle.crypto.tls.MACAlgorithm;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.util.*;
+
+@Service
+@Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+public class OrderTaxiServiceImpl extends ServiceImpl<OrderTaxiMapper, OrderTaxi> implements IOrderTaxiService {
+
+    @Resource
+    private OrderTaxiMapper orderTaxiMapper;
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+    @Resource
+    private SysIntegralMapper sysIntegralMapper;
+
+    @Resource
+    private UserActivityDiscount1Mapper userActivityDiscount1Mapper;
+
+    @Resource
+    private OrderPrivateCarMapper orderPrivateCarMapper;
+
+    @Resource
+    private RegionMapper regionMapper;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IPushOrderService pushOrderService;
+
+    @Autowired
+    private ICancleOrderService cancleOrderService;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    @Autowired
+    private IUserRedPacketRecordService userRedPacketRecordService;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private ICompanyCityService companyCityService;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private RestTemplate internalRestTemplate;
+
+    @Autowired
+    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
+
+    @Autowired
+    private IDriverOrdersService driverOrdersService;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+//    @Autowired
+//    private ICBCPayUtil icbcPayUtil;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private IOrderPositionService orderPositionService;
+
+    @Autowired
+    private ChinaMobileUtil chinaMobileUtil;
+
+    @Autowired
+    private IDriverServiceService driverServiceService;
+
+    @Autowired
+    private GDFalconUtil gdFalconUtil;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    public static List<Integer> orderIds = new ArrayList<>();
+
+
+    @Value("${callbackPath}")
+    private String callbackPath;
+
+
+
+
+
+
+
+    /**
+     * 出租车下单操作
+     * @param orderTaxi
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil<BaseWarpper> taxiOrder(OrderTaxi orderTaxi, Integer uid) throws Exception {
+        //定义用户所属公司
+        UserInfo userInfo1 = userInfoService.selectById(uid);
+        Company query = companyCityService.query(String.valueOf(orderTaxi.getStartLon()), String.valueOf(orderTaxi.getStartLat()));
+        if(null == query){
+            return ResultUtil.error("出发点暂未开通");
+        }
+        if(null != userInfo1.getCompanyId() && 0 != userInfo1.getCompanyId()){
+            userInfo1.setCompanyId(query.getId());
+            userInfoService.updateById(userInfo1);
+        }
+
+        if(orderTaxi.getTravelTime().getTime() > (System.currentTimeMillis() + 600000)){
+            orderTaxi.setOrderType(2);
+        }
+
+
+        /**
+         * 1.下了即时单就不能下预约单和即时单
+         * 2.下了预约单和再下一张即时单不能再下预约单
+         */
+        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+
+        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0 && orderTaxi.getOrderType() == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0 && orderTaxi.getOrderType() == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+
+
+        orderTaxi.setOrderNum(this.getOrderNum());
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(orderTaxi.getPlacementLon()), String.valueOf(orderTaxi.getPlacementLat()));
+        orderTaxi.setPlacementAddress(geocode.get("address"));
+        orderTaxi.setStartAddress(orderTaxi.getStartAddress().replaceAll("& #40;", "\\("));//特殊字符转义
+        orderTaxi.setStartAddress(orderTaxi.getStartAddress().replaceAll("& #41;", "\\)"));
+        orderTaxi.setEndAddress(orderTaxi.getEndAddress().replaceAll("& #40;", "\\("));
+        orderTaxi.setEndAddress(orderTaxi.getEndAddress().replaceAll("& #41;", "\\)"));
+        orderTaxi.setUserId(uid);
+        orderTaxi.setMileage(0D);
+        orderTaxi.setOrderMoney(0D);
+        orderTaxi.setTravelMoney(0D);
+        orderTaxi.setParkMoney(0D);
+        orderTaxi.setRoadTollMoney(0D);
+        orderTaxi.setRedPacketMoney(0D);
+        orderTaxi.setCouponMoney(0D);
+        orderTaxi.setInsertTime(new Date());
+        orderTaxi.setIsReassign(1);
+        if(orderTaxi.getSubstitute() == 0){//不是代下单
+            UserInfo userInfo = userInfoService.selectById(uid);
+            if(ToolUtil.isEmpty(userInfo.getPhone())){
+                return ResultUtil.error("请先绑定手机号码");
+            }
+            orderTaxi.setPassengers(userInfo.getName());
+            orderTaxi.setPassengersPhone(userInfo.getPhone());
+        }
+        orderTaxi.setState(1);//待接单
+        if(orderTaxi.getOrderSource() == 2 && null != orderTaxi.getDriverId()){//扫码下单,
+            Driver driver = driverService.selectById(orderTaxi.getDriverId());
+            if(null == driver){
+                return ResultUtil.error("扫码下单失败,司机信息有误");
+            }
+            if(driver.getAuthState() == 1){
+                return ResultUtil.error("司机信息还未完成审核,无法完成下单");
+            }
+            if(driver.getAuthState() == 3){
+                return ResultUtil.error("司机账户已被冻结,无法提供服务");
+            }
+            if(driver.getAuthState() == 4){
+                return ResultUtil.error("司机信息未通过审核,无法提供服务");
+            }
+            if(driver.getState() == 1){
+                return ResultUtil.error("司机还未上线,无法提供服务");
+            }
+            if(driver.getState() == 3){
+                return ResultUtil.error("司机正在服务中,无法提供服务");
+            }
+            List<DriverService> driverServices = driverServiceService.query(orderTaxi.getDriverId(), 2);
+            if(driverServices.size() == 0){
+                return ResultUtil.error("该司机不能服务此业务");
+            }
+
+            orderTaxi.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
+                    driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
+            orderTaxi.setCarId(driver.getCarId());
+            orderTaxi.setState(2);//待出发
+            orderTaxi.setSnatchOrderTime(new Date());
+            //调用高德创建轨迹
+            String s = gdFalconUtil.selectTerminal(driver.getPhone());
+            String track = gdFalconUtil.createTrack(s);
+            orderTaxi.setTrackId(track);
+
+            //调用移动的小号接口
+            Map<String, String> geocode1 = gdMapGeocodingUtil.geocode(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString());
+            Region region = regionMapper.query(geocode1.get("districtCode"));
+//            Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderTaxi.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1)));
+//            if(String.valueOf(map.get("code")).equals("200")){
+//                orderTaxi.setTelX(map.get("telX"));
+//                orderTaxi.setBindId(map.get("bindId"));
+//            }
+
+            driver.setState(3);
+            driverService.updateById(driver);
+        }
+
+        this.insert(orderTaxi);
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(orderTaxi.getState() == 2){
+                    //推送司机订单状态
+                    pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+
+                    pushUtil.pushDriverPosition(orderTaxi.getId(), 2);
+                }
+            }
+        }).start();
+
+        if(orderTaxi.getState() == 1){
+            //推送司机抢单
+            this.pushOrder(orderTaxi);
+        }
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您的出租车订单已下单成功,我们正在为您指派司机,请稍后!", orderTaxi.getUserId(), 1);
+
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(orderTaxi.getId());
+        return ResultUtil.success(baseWarpper);
+    }
+
+
+    /**
+     * 继续执行推动等待操作
+     * @param id
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil pushOrderTaxi(Integer id) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(id);
+        if(null == orderTaxi){
+            return ResultUtil.error("推送订单失败,订单信息有误");
+        }
+        if(orderTaxi.getState() != 1){
+            return ResultUtil.error("订单已被司机接单,不能重复推送");
+        }
+
+        //处理摆渡订单的继续推单操作
+        if(orderTaxi.getType() == 2){
+            OrderCrossCityServiceImpl.pushEndMap.put(orderTaxi.getCrossCityOrderId(), false);//还原标识数据
+            List<OrderPrivateCar> list = orderPrivateCarService.selectList(new EntityWrapper<OrderPrivateCar>().eq("type", 2).eq("crossCityOrderId", orderTaxi.getCrossCityOrderId()).eq("place", orderTaxi.getPlace()));
+            List<Map<String, Integer>> orders = new ArrayList<>();
+            for(OrderPrivateCar orderPrivateCar1 : list){
+                if(orderPrivateCar1.getState() != 1){
+                    return ResultUtil.error("订单已被司机接单,推单取消");
+                }
+                Map<String, Integer> map = new HashMap<>();
+                map.put("orderType", 1);
+                map.put("orderId", orderPrivateCar1.getId());
+                orders.add(map);
+            }
+            List<OrderTaxi> list1 = this.selectList(new EntityWrapper<OrderTaxi>().eq("type", 2).eq("crossCityOrderId", orderTaxi.getCrossCityOrderId()).eq("place", orderTaxi.getPlace()));
+            for(OrderTaxi orderTaxi1 : list1){
+                if(orderTaxi1.getState() != 1){
+                    return ResultUtil.error("订单已被司机接单,推单取消");
+                }
+                Map<String, Integer> map = new HashMap<>();
+                map.put("orderType", 2);
+                map.put("orderId", orderTaxi1.getId());
+                orders.add(map);
+            }
+            //开始重新推单
+            orderCrossCityService.pushOrder(orders);
+
+        }else{
+            this.pushOrder(orderTaxi);
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取取消订单需要支付的金额(包含小费)
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(id);
+        if(null == orderTaxi){
+            return ResultUtil.error("获取数据失败,订单信息有误");
+        }
+        double amount = 0;
+        CancleOrder query = cancleOrderService.query(orderTaxi.getOrderType(), 2, orderTaxi.getCompanyId());
+        if(null != orderTaxi.getDriverId() &&
+                (orderTaxi.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况
+            if(null != query){
+                amount += query.getMoney();
+            }
+        }
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setAmount(amount);
+        return ResultUtil.success(baseWarpper);
+    }
+
+
+    /**
+     * 添加订单取消
+     * @param id
+     * @param reason
+     * @param remark
+     * @param uid
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(remark)){
+            if(ToolUtil.isNotEmpty(remark)){
+                List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+                for(SensitiveWords s : sensitiveWords){
+                    remark = remark.replaceAll(s.getContent(), "***");
+                }
+            }
+        }
+
+        OrderTaxi orderTaxi = this.selectById(id);
+        Integer integer = null;
+        if(null == orderTaxi){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderTaxi.getState() > 5 && orderTaxi.getState() != 11){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+        if(null == orderTaxi.getDriverId()){//没有接单的情况
+            if(orderTaxi.getType() == 2){//摆渡车
+                OrderCrossCityServiceImpl.pushEndMap.remove(orderTaxi.getCrossCityOrderId());//删除标识数据
+                List<OrderPrivateCar> list = orderPrivateCarService.selectList(new EntityWrapper<OrderPrivateCar>().eq("type", 2).eq("crossCityOrderId", orderTaxi.getCrossCityOrderId()).eq("place", orderTaxi.getPlace()));
+                for(OrderPrivateCar orderPrivateCar1 : list){
+                    orderCancelService.saveData(orderPrivateCar1.getId(), 1, "无司机接单", "无司机接单", null, null, 2, 1, uid);
+                    orderPrivateCar1.setState(10);
+                    orderPrivateCarService.updateById(orderPrivateCar1);
+                }
+                List<OrderTaxi> list1 = this.selectList(new EntityWrapper<OrderTaxi>().eq("type", 2).eq("crossCityOrderId", orderTaxi.getCrossCityOrderId()).eq("place", orderTaxi.getPlace()));
+                for(OrderTaxi orderTaxi1 : list1){
+                    orderCancelService.saveData(orderTaxi1.getId(), 2, "无司机接单", "无司机接单", null, null, 2, 1, uid);
+                    orderTaxi1.setState(10);
+                    this.updateById(orderTaxi1);
+                }
+            }else{
+                integer = orderCancelService.saveData(id, 2, "无司机接单", "无司机接单", null, null, 2, 1, uid);
+                orderTaxi.setState(10);
+                this.updateById(orderTaxi);
+            }
+        }else {
+            CancleOrder query = cancleOrderService.query(orderTaxi.getOrderType(), 2, orderTaxi.getCompanyId());
+            if (null != query) {
+                if ((orderTaxi.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < System.currentTimeMillis() && query.getMoney().compareTo(0D) > 0) {//收费的情况
+                    orderTaxi.setState(12);
+                    this.updateById(orderTaxi);
+                    integer = orderCancelService.saveData(id, 2, reason, remark, null, query.getMoney(), 1, 1, uid);
+                } else {
+                    integer = orderCancelService.saveData(id, 2, reason, remark, null, null, 2, 1, uid);
+
+                    orderTaxi.setState(10);
+                    this.updateById(orderTaxi);
+                }
+                this.deleteTask(id);//删除定时任务
+
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+                        System.err.println("推送取消操作---------------------");
+                    }
+                }).start();
+
+                //修改司机为空闲
+                Driver driver = driverService.selectById(orderTaxi.getDriverId());
+                driver.setState(2);
+                driverService.updateById(driver);
+            }else{
+                return ResultUtil.error("请完善后台取消规则设置");
+            }
+
+        }
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您已成功取消出行订单,谢谢使用!", orderTaxi.getUserId(), 1);
+        Map<String, Object> map = new HashMap<>();
+        map.put("id", integer);
+        return ResultUtil.success(map);
+    }
+
+
+    /**
+     * 取消订单操作
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil cancleOrderTaxi(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(id);
+        Integer uid = orderTaxi.getUserId();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+
+        if(null == orderTaxi){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderTaxi.getState() != 12){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+        OrderCancel orderCancel = null;
+        if(null == cancleId){
+            orderCancel = orderCancelService.query(id, 2, null, null, 1);
+        }else{
+            orderCancel = orderCancelService.selectById(cancleId);
+        }
+
+        CancleOrder query = cancleOrderService.query(orderTaxi.getOrderType(), 2, orderTaxi.getCompanyId());
+        if(null != query){
+            if(payType == 1){//微信支付
+                String value = redisUtil.getValue("appletOpenId");
+                String appletsOpenId = null;
+                if(ToolUtil.isNotEmpty(value)){
+                    JSONObject jsonObject = JSON.parseObject(value);
+                    appletsOpenId = jsonObject.getString(uid.toString());
+                }else{
+                    appletsOpenId = userInfo.getAppletsOpenId();
+                }
+                orderCancel.setPayType(1);
+                orderCancelService.updateById(orderCancel);
+                String app = type == 1 ? "APP" : "JSAPI";
+                resultUtil = payMoneyUtil.weixinpay("订单取消", "", id + "_2_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/wxCancelOrderTaxi", app, userInfo.getAppletsOpenId());
+                paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, id, 2, 1, query.getMoney(), "", 1);//添加预支付数据
+
+
+
+//                String value = redisUtil.getValue("appletOpenId");
+//                String appletsOpenId = null;
+//                if(ToolUtil.isNotEmpty(value)){
+//                    JSONObject jsonObject = JSON.parseObject(value);
+//                    appletsOpenId = jsonObject.getString(uid.toString());
+//                }else{
+//                    appletsOpenId = userInfo.getAppletsOpenId();
+//                }
+//                orderCancel.setPayType(1);
+//                orderCancelService.updateById(orderCancel);
+//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",2", 9, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/wxCancelOrderTaxi", "", type, appletsOpenId);
+//                if(map.get("code").equals("200")){
+//                    paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, id, 2, 1, query.getMoney(), map.get("order_id"), 1);//添加预支付数据
+//                    resultUtil = ResultUtil.success(map.get("data"));
+//                }else{
+//                    resultUtil = ResultUtil.error(map.get("msg"), "");
+//                }
+            }
+            if(payType == 2){//支付宝支付
+                orderCancel.setPayType(2);
+                orderCancelService.updateById(orderCancel);
+                resultUtil = payMoneyUtil.alipay("订单取消", "订单取消", "", id + "_2_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/aliCancelOrderTaxi");
+                paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, id, 2, 2, query.getMoney(), "", 1);//添加预支付数据
+
+//                orderCancel.setPayType(2);
+//                orderCancelService.updateById(orderCancel);
+//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",2", 10, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/aliCancelOrderTaxi", "", type, null);
+//                if(map.get("code").equals("200")){
+//                    paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, id, 2, 2, query.getMoney(), map.get("order_id"), 1);//添加预支付数据
+//                    resultUtil = ResultUtil.success(map.get("data"));
+//                }else{
+//                    resultUtil = ResultUtil.error(map.get("msg"), "");
+//                }
+            }
+            if(payType == 3){//余额支付
+                if(userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()){
+                    return ResultUtil.error("余额不足,无法完成支付");
+                }
+
+                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                //添加交易明细
+                transactionDetailsService.saveData(uid, "取消订单", query.getMoney(), 2, 1, 1, 2, id);
+                userInfoService.updateById(userInfo);
+
+                //解除小号绑定
+                if(orderTaxi.getBindId() != null){
+                    chinaMobileUtil.midAxbUnBindSend(orderTaxi.getBindId());
+                }
+
+                orderTaxi.setState(10);
+                orderTaxi.setTelX("");
+                orderTaxi.setBindId("");
+                this.updateById(orderTaxi);
+
+                orderCancel.setState(2);
+                orderCancel.setPayType(3);
+                orderCancelService.updateById(orderCancel);
+
+                //添加已收入明细
+                incomeService.saveData(1, orderTaxi.getCompanyId(), 3, orderTaxi.getId(), 2, query.getMoney());
+
+                this.deleteTask(id);//删除定时任务
+
+//                new Thread(new Runnable() {
+//                    @Override
+//                    public void run() {
+//                        pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+//                    }
+//                }).start();
+
+                //添加消息
+                systemNoticeService.addSystemNotice(1, "您已使用余额成功支付取消订单费用,谢谢使用!", orderTaxi.getUserId(), 1);
+            }
+        }
+        return resultUtil;
+    }
+
+
+    /**
+     * 删除定时任务
+     * @param orderId
+     */
+    @Override
+    public void deleteTask(Integer orderId){
+        //发送验证码短信
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("orderId", orderId + "");
+        params.add("orderType", "2");
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = internalRestTemplate.postForObject("http://driver-server/base/netty/deleteTask", requestEntity, String.class);
+        JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+        if(jsonObject.getIntValue("code") != 200){
+            System.err.println("调用driver-server出错了");
+        }
+    }
+
+
+    /**
+     * 获取用户余额和可用优惠券数量
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        map.put("balance", userInfo.getBalance());
+        OrderTaxi orderTaxi = this.selectById(orderId);
+        int i = userCouponRecordService.queryAvailable(uid, orderTaxi.getCompanyId(), 1, 2, orderTaxi.getOrderMoney());
+        i = i + userCouponRecordService.queryAvailable(uid, orderTaxi.getCompanyId(), 1, 0, orderTaxi.getOrderMoney());
+        map.put("coupon", i);
+        return map;
+    }
+
+
+    /**
+     * 获取优惠券列表
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(orderId);
+        List<Map<String, Object>> list = userCouponRecordService.queryCoupon(uid, orderTaxi.getCompanyId(), 1, 2, orderTaxi.getOrderMoney(), pageNum, size);
+        List<Map<String, Object>> list1 = userCouponRecordService.queryCoupon(uid, orderTaxi.getCompanyId(), 1, 0, orderTaxi.getOrderMoney(), pageNum, size);
+        list.addAll(list1);
+        return list;
+    }
+
+
+    /**
+     * 订单完成支付订单操作
+     * @param payType   1=微信,2=支付宝,3=余额
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil payTaxiOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(orderId);
+        if(orderTaxi.getState() == 8 || orderTaxi.getState() == 9){
+            return ResultUtil.error("订单已完成支付,不允许重复支付", "");
+        }
+        if(orderTaxi.getState() != 7){
+            return ResultUtil.error("订单不在待支付状态,不允许支付", "");
+        }
+        Integer uid = orderTaxi.getUserId();
+        Double orderMoney = orderTaxi.getOrderMoney();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+        orderTaxi.setCouponMoney(0D);//初始化历史数据
+        orderTaxi.setCouponId(null);
+
+        //计算优惠券
+        UserCouponRecord userCouponRecord = null;
+        if(null != couponId){
+            userCouponRecord = userCouponRecordService.selectById(couponId);
+            if(userCouponRecord.getCompanyId() != orderTaxi.getCompanyId()){
+                return ResultUtil.error("优惠券不能用于此订单");
+            }
+            if(userCouponRecord.getState() == 2){
+                return ResultUtil.error("优惠券已使用");
+            }
+            if(userCouponRecord.getState() == 3){
+                return ResultUtil.error("优惠券已过期");
+            }
+            if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 2){
+                return ResultUtil.error("优惠券不能用于此类型订单");
+            }
+            if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){
+                return ResultUtil.error("优惠券不能用于此订单");
+            }
+            orderMoney = orderMoney - userCouponRecord.getMoney();
+            orderTaxi.setCouponMoney(userCouponRecord.getMoney());
+            orderTaxi.setCouponId(couponId);
+        }
+
+        //计算红包
+        UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderTaxi.getCompanyId(), 1, 2, orderMoney);
+        if(null != query && orderMoney.compareTo(query.getMoney()) > 0){
+            orderMoney = orderMoney - query.getMoney();
+            orderTaxi.setRedPacketMoney(query.getMoney());
+            orderTaxi.setRedPacketId(query.getId());
+        }
+
+        //计算折扣
+        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderTaxi.getCompanyId());
+        if(null != query2){
+            Double taxi = query2.getTaxi();
+            orderTaxi.setDiscount(taxi);
+            double v = new BigDecimal(orderMoney).multiply(new BigDecimal(taxi / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+            if(orderMoney.compareTo(v) > 0){
+                orderTaxi.setDiscountMoney(orderMoney - v);
+                orderTaxi.setActivityId(query2.getId());
+                orderMoney = v;
+            }
+        }
+
+        if(payType == 1){//微信支付
+            String app = type == 1 ? "APP" : "JSAPI";
+            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_2_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
+            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 1, orderMoney, "", 1);//添加预支付数据
+        }
+        if(payType == 2){//支付宝支付
+            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_2_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
+            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 2, orderMoney, "", 1);//添加预支付数据
+        }
+
+//        if(payType == 1){//微信支付
+//            String value = redisUtil.getValue("appletOpenId");
+//            String appletsOpenId = null;
+//            if(ToolUtil.isNotEmpty(value)){
+//                JSONObject jsonObject = JSON.parseObject(value);
+//                appletsOpenId = jsonObject.getString(uid.toString());
+//            }else{
+//                appletsOpenId = userInfo.getAppletsOpenId();
+//            }
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",2", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+//        if(payType == 2){//支付宝支付
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",2", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+        if(payType == 3){//余额支付
+            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
+                return ResultUtil.error("余额不足,无法完成支付");
+            }
+
+            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+
+            SysIntegral query1 = sysIntegralMapper.query(orderTaxi.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
+
+            //添加交易明细
+            transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 2, orderId);
+            userInfoService.updateById(userInfo);
+
+            orderTaxi.setState(8);
+            orderTaxi.setPayType(3);
+            orderTaxi.setPayMoney(orderMoney);
+
+            //处理优惠券和红包
+            if(null != userCouponRecord){
+                userCouponRecord.setState(2);
+                userCouponRecord.setEndTime(new Date());
+                userCouponRecordService.updateById(userCouponRecord);
+            }
+            if(null != query){
+                query.setState(2);
+                query.setEndTime(new Date());
+                userRedPacketRecordService.updateById(query);
+            }
+
+            //添加已收入明细
+            Company company = companyService.selectById(orderTaxi.getCompanyId());
+            Double taxi = company.getTaxiMoney();
+            BigDecimal d = null;//企业收入
+            BigDecimal c = null;//司机收入
+            if(company.getIsTaxiFixedOrProportional() == 2){//固定
+                d = new BigDecimal(taxi);
+                c = new BigDecimal(orderTaxi.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
+            }
+            if(company.getIsTaxiFixedOrProportional() == 1){//比例
+                d = new BigDecimal(orderTaxi.getTravelMoney()).multiply(new BigDecimal(taxi).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                c = new BigDecimal(orderTaxi.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            incomeService.saveData(1, orderTaxi.getCompanyId(), 2, orderTaxi.getId(), 2, d.doubleValue());
+            incomeService.saveData(2, orderTaxi.getDriverId(), 2, orderTaxi.getId(), 2, c.doubleValue());
+            Driver driver = driverService.selectById(orderTaxi.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+                    pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+                }
+            }).start();
+
+            //用户付款后,删除限制司机6分钟不能接单的标识
+            String vehicle = redisUtil.getValue("VEHICLE");
+            if(ToolUtil.isNotEmpty(vehicle)){
+                JSONArray jsonArray = JSON.parseArray(vehicle);
+                for(int i = 0; i < jsonArray.size(); i++){
+                    if(jsonArray.getInteger(i).compareTo(orderTaxi.getDriverId()) == 0){
+                        jsonArray.remove(i);
+                        break;
+                    }
+                }
+                redisUtil.setStrValue("VEHICLE", jsonArray.toJSONString());
+            }
+            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1);
+        }
+
+        this.updateAllColumnById(orderTaxi);
+        return resultUtil;
+    }
+
+
+    /**
+     * 手动完成订单操作
+     * @param orderId
+     * @param orderType
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil completeOrder(Integer orderId, Integer orderType) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(orderId);
+        if(orderTaxi.getState() != 7){
+            return ResultUtil.error("订单不在待支付,无法完成订单");
+        }
+        orderTaxi.setPayManner(2);//其他方式支付
+//        orderTaxi.setOrderMoney(0D);
+//        orderTaxi.setTravelMoney(0D);
+//        orderTaxi.setParkMoney(0D);
+//        orderTaxi.setRoadTollMoney(0D);
+        orderTaxi.setRedPacketMoney(0D);
+        orderTaxi.setCouponMoney(0D);
+        orderTaxi.setDiscount(0D);
+        orderTaxi.setDiscountMoney(0D);
+        orderTaxi.setPayMoney(orderTaxi.getOrderMoney());
+        orderTaxi.setState(8);
+        this.updateById(orderTaxi);
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                pushUtil.pushOrderState(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+                pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+            }
+        }).start();
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取用户的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        List<Map<String, Object>> maps = orderTaxiMapper.queryMyOrderList(uid, pageNum, size);
+        for(Map<String, Object> map : maps){
+            if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
+                map.put("state", map.get("oldState"));
+            }
+        }
+        return maps;
+    }
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryMyTravelRecord(Integer uid) throws Exception {
+        return orderTaxiMapper.queryMyTravelRecord(uid);
+    }
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception {
+        return orderTaxiMapper.queryRedEnvelope(uid);
+    }
+
+
+    /**
+     * 获取用户单发票页面的订单列表
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney,
+                                                       Double endMoney, Integer uid) throws Exception {
+        startTime = dateUtil.getStartOrEndDate(startTime, "start");
+        endTime = dateUtil.getStartOrEndDate(endTime, "end");
+        return orderTaxiMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+    }
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    @Override
+    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception{
+        Map<String, Object> map = orderTaxiMapper.queryOrderInfo(orderId);
+        if(null != map && null != map.get("reassignNotice") && Integer.valueOf(String.valueOf(map.get("reassignNotice"))) == 2){//改派完成,重新获取了新的司机数据,开始修改数据防止继续调用
+            OrderTaxi orderTaxi = this.selectById(orderId);
+            orderTaxi.setReassignNotice(0);
+            this.updateById(orderTaxi);
+        }
+        if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
+            map.put("state", map.get("oldState"));
+        }
+        String driverId = redisUtil.getValue("DEVICE_" + map.get("driverId"));
+        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
+        map.put("orderType", 2);
+        return map;
+    }
+
+
+    /**
+     * 获取下单推送完后没有司机下单的提醒
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public EndPushWarpper queryEndPush(Integer uid) throws Exception {
+        List<OrderTaxi> list = orderTaxiMapper.queryByState(uid, 1);
+        EndPushWarpper endPushWarpper = new EndPushWarpper();
+        if(list.size() > 0){
+            OrderTaxi orderTaxi = list.get(0);
+            if(!orderIds.contains(orderTaxi.getId())){
+                endPushWarpper.setOrderId(orderTaxi.getId());
+                endPushWarpper.setOrderType(2);
+                endPushWarpper.setState(1);
+                List<PushOrder> querys = pushOrderService.querys(null, 2, orderTaxi.getCompanyId());//获取需要推送的次数
+                int time = 0;
+                for(int i = 1; i <= querys.size(); i++){
+                    PushOrder pushOrder = pushOrderService.querys(i, 2, orderTaxi.getCompanyId()).get(0);
+                    time += pushOrder.getPushTime() * 1000;
+                }
+                //当前时间减去推单总时间大于下单时间
+                if((System.currentTimeMillis() - time) > orderTaxi.getInsertTime().getTime()){
+                    endPushWarpper.setState(2);
+                }
+            }
+
+        }
+        return endPushWarpper;
+    }
+
+
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(orderId);
+        //计算预计距离和剩余时间
+        String value = redisUtil.getValue("DRIVER" + String.valueOf(orderTaxi.getDriverId()));
+        if(null == value || "".equals(value)){
+            System.err.println("司机没有上传位置信息");
+
+            //调用获取轨迹中的数据
+            List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 2);
+            if(list.size() > 0){
+                Map<String, Object> map = list.get(list.size() - 1);
+                value = map.get("lon") + "," + map.get("lat");
+            }
+        }
+        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderTaxi.getStartLon() + "," + orderTaxi.getStartLat(), 1);
+        String d = "0";
+        String t = "0";
+        if(null == distance){
+            System.err.println("查询距离出错了");
+        }else{
+            d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
+            t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + "";
+        }
+        OrderServerWarpper orderServerWarpper = new OrderServerWarpper();
+        orderServerWarpper.setOrderId(orderTaxi.getId());
+        orderServerWarpper.setOrderType(2);
+        orderServerWarpper.setState(orderTaxi.getState());
+        orderServerWarpper.setLon(null != value ? value.split(",")[0] : "0.0");
+        orderServerWarpper.setLat(null != value ? value.split(",")[1] : "0.0");
+        orderServerWarpper.setReassignNotice(orderTaxi.getReassignNotice());
+        if(orderTaxi.getState() == 2 || orderTaxi.getState() == 3){//前往预约地
+            orderServerWarpper.setReservationMileage(d);
+            orderServerWarpper.setReservationTime(t);
+            orderServerWarpper.setServedMileage("0");
+            orderServerWarpper.setServedTime("0");
+            orderServerWarpper.setLaveMileage("0");
+            orderServerWarpper.setLaveTime("0");
+        }
+        if(orderTaxi.getState() == 5 || orderTaxi.getState() == 6){//服务中
+            distance = gdMapElectricFenceUtil.getDistance(value, orderTaxi.getEndLon() + "," + orderTaxi.getEndLat(), 1);
+            if(null == distance){
+                System.err.println("查询距离出错了");
+            }else{
+                d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
+                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + "";
+            }
+            orderServerWarpper.setReservationMileage("0");
+            orderServerWarpper.setReservationTime("0");
+            orderServerWarpper.setServedMileage(String.valueOf(orderTaxi.getMileage() / 1000));
+            orderServerWarpper.setServedTime(Long.valueOf((new Date().getTime() - orderTaxi.getStartServiceTime().getTime()) / 60000).intValue() + "");
+            orderServerWarpper.setLaveMileage(d);
+            orderServerWarpper.setLaveTime(t);
+        }
+
+        return orderServerWarpper;
+    }
+
+
+    /**
+     * 评论成功后获取红包金额
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(orderId);
+        Integer companyId = orderTaxi.getCompanyId();
+
+        Map<String, Object> query = userActivityRedenvelopeService.query(companyId, orderTaxi.getTravelTime());
+        Double money = 0D;
+        BaseWarpper baseWarpper = new BaseWarpper();
+        if(null != query){
+            Integer type = Integer.valueOf(String.valueOf(query.get("type")));
+            if(type == 1){//固定金额
+                money = Double.valueOf(String.valueOf(query.get("money")));
+            }else{//随机金额
+                Double startMoney = Double.valueOf(String.valueOf(query.get("startMoney")));
+                Double endMoney = Double.valueOf(String.valueOf(query.get("endMoney")));
+                int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue();
+                Random random = new Random();
+                int num = random.nextInt(i);
+                money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+            }
+
+            //判断当前红包是否大于剩余可领取总金额
+            if(money.compareTo(Double.valueOf(query.get("lavePrice").toString())) > 0){
+                baseWarpper.setAmount(0D);
+                return ResultUtil.success(baseWarpper);
+            }
+        }
+        baseWarpper.setAmount(money);
+
+        if(money > 0){
+            //添加临时红包数据
+            UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
+            userRedPacketRecord.setMoney(money);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(new Date());
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(query.get("effective"))));
+            userRedPacketRecord.setExpirationTime(calendar.getTime());
+            userRedPacketRecord.setInsertTime(new Date());
+            userRedPacketRecord.setCompanyId(Integer.valueOf(String.valueOf(query.get("companyId"))));
+            userRedPacketRecord.setState(0);
+            userRedPacketRecord.setOrderId(orderTaxi.getId());
+            userRedPacketRecord.setOrderType(2);
+            userRedPacketRecord.setUserId(orderTaxi.getUserId());
+            userRedPacketRecordService.insert(userRedPacketRecord);
+        }
+
+        return ResultUtil.success(baseWarpper);
+    }
+
+    /**
+     * 分享成功后添加红包
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil shareRedEnvelope(Integer orderId) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(orderId);
+        UserRedPacketRecord query = userRedPacketRecordService.query_(orderTaxi.getUserId(), orderTaxi.getCompanyId(), 0, 2, null);
+        if(null != query){
+            Double money = query.getMoney();
+            Map<String, Object> map = userActivityRedenvelopeService.query(orderTaxi.getCompanyId(), orderTaxi.getTravelTime());
+            Double laveMoney = Double.valueOf(String.valueOf(map.get("laveMoney")));
+            if(money.compareTo(laveMoney) > 0){
+                return ResultUtil.error("手速太慢了,红包已派发完啦!");
+            }
+            //判断当前红包是否大于剩余可领取总金额
+            if(money.compareTo(Double.valueOf(map.get("lavePrice").toString())) > 0){
+                return ResultUtil.error("手速太慢了,红包已派发完啦!");
+            }
+            double v = new BigDecimal(laveMoney).subtract(new BigDecimal(money)).doubleValue();
+
+            UserActivityRedenvelope id = userActivityRedenvelopeService.selectById(String.valueOf(map.get("id")));
+            id.setLaveMoney(v);
+            id.setLavePrice(new BigDecimal(id.getLavePrice() - money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            userActivityRedenvelopeService.updateById(id);
+
+            query.setState(1);
+            query.setRedPacketActivityId(id.getId());
+            userRedPacketRecordService.updateById(query);
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取订单数据
+     * @param uid
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<OrderTaxi> queryOrder(Integer uid, Integer... state) throws Exception {
+        List<OrderTaxi> list = orderTaxiMapper.queryByState(uid, state);
+        return list;
+    }
+
+
+    /**
+     * 订单支付完成后的处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    @Override
+    public void payOrderTaxiCallback(Integer id, String order_id, Integer type) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(id);
+        PaymentRecord query = paymentRecordService.query(1, orderTaxi.getUserId(), 1, Integer.valueOf(id), 2, type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderTaxi.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, 2, query.getOrderId());
+            orderTaxi.setState(8);
+            orderTaxi.setPayType(type);
+            orderTaxi.setPayMoney(query.getAmount());
+            this.updateById(orderTaxi);
+
+            UserInfo userInfo = userInfoService.selectById(orderTaxi.getUserId());
+            SysIntegral query1 = sysIntegralMapper.query(orderTaxi.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
+            userInfoService.updateById(userInfo);
+
+            //处理优惠券和红包
+            if(null != orderTaxi.getCouponId()){
+                UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderTaxi.getCouponId());
+                userCouponRecord.setState(2);
+                userCouponRecord.setEndTime(new Date());
+                userCouponRecordService.updateById(userCouponRecord);
+            }
+            if(null != orderTaxi.getRedPacketId()){
+                UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderTaxi.getRedPacketId());
+                userRedPacketRecord.setState(2);
+                userRedPacketRecord.setEndTime(new Date());
+                userRedPacketRecordService.updateById(userRedPacketRecord);
+            }
+
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            //添加已收入明细
+            Company company = companyService.selectById(orderTaxi.getCompanyId());
+            Double taxi = company.getTaxiMoney();
+            BigDecimal d = null;//企业收入
+            BigDecimal c = null;//司机收入
+            if(company.getIsTaxiFixedOrProportional() == 2){//固定
+                d = new BigDecimal(taxi);
+                c = new BigDecimal(orderTaxi.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            if(company.getIsTaxiFixedOrProportional() == 1){//比例
+                d = new BigDecimal(orderTaxi.getTravelMoney()).multiply(new BigDecimal(taxi).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                c = new BigDecimal(orderTaxi.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            incomeService.saveData(1, orderTaxi.getCompanyId(), 2, orderTaxi.getId(), 2, d.doubleValue());
+            incomeService.saveData(2, orderTaxi.getDriverId(), 2, orderTaxi.getId(), 2, c.doubleValue());
+            Driver driver = driverService.selectById(orderTaxi.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+                    pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+                }
+            }).start();
+
+            //用户付款后,删除限制司机6分钟不能接单的标识
+            String vehicle = redisUtil.getValue("VEHICLE");
+            if(ToolUtil.isNotEmpty(vehicle)){
+                JSONArray jsonArray = JSON.parseArray(vehicle);
+                for(int i = 0; i < jsonArray.size(); i++){
+                    if(jsonArray.getInteger(i).compareTo(orderTaxi.getDriverId()) == 0){
+                        jsonArray.remove(i);
+                        break;
+                    }
+                }
+                redisUtil.setStrValue("VEHICLE", jsonArray.toJSONString());
+            }
+
+
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成出行订单支付,谢谢使用!", orderTaxi.getUserId(), 1);
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+
+
+    /**
+     * 取消订单支付后的处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    @Override
+    public void payCancelOrderTaxi(Integer id, String order_id, Integer type) throws Exception {
+        OrderTaxi orderTaxi = this.selectById(id);
+        PaymentRecord query = paymentRecordService.query(1, orderTaxi.getUserId(), 1, Integer.valueOf(id), 2, type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderTaxi.getUserId(), "取消订单", query.getAmount(), 2, 1, 1, 2, query.getOrderId());
+            orderTaxi.setState(10);
+            //解除小号绑定
+            if(orderTaxi.getBindId() != null){
+                chinaMobileUtil.midAxbUnBindSend(orderTaxi.getBindId());
+            }
+            orderTaxi.setBindId("");
+            orderTaxi.setTelX("");
+            this.updateById(orderTaxi);
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            OrderCancel query1 = orderCancelService.query(query.getOrderId(), query.getOrderType(), query.getAmount(), query.getPayType(), 1);
+            if (null != query1){
+                query1.setState(2);
+                orderCancelService.updateById(query1);
+            }
+
+            //添加已收入明细
+            incomeService.saveData(1, orderTaxi.getCompanyId(), 3, orderTaxi.getId(), 2, query.getAmount());
+
+            this.deleteTask(orderTaxi.getId());//删除定时任务
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+//            new Thread(new Runnable() {
+//                @Override
+//                public void run() {
+//                    pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
+//                }
+//            }).start();
+
+            //添加消息
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功支付取消订单费用,谢谢使用!", orderTaxi.getUserId(), 1);
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+
+
+    /**
+     * 推送订单给司机抢单
+     * @param orderTaxi
+     * @throws Exception
+     */
+    public void pushOrder(OrderTaxi orderTaxi) throws Exception{
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    orderIds.add(orderTaxi.getId());//添加记录,防止调用接口重复提醒无人接单
+                    String vehicle = redisUtil.getValue("VEHICLE");
+                    List<Integer> integers = new ArrayList<>();
+                    if(ToolUtil.isNotEmpty(vehicle)){
+                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
+                    }
+                    Company query = companyCityService.query(String.valueOf(orderTaxi.getStartLon()), String.valueOf(orderTaxi.getStartLat()));//获取起点所属分公司
+                    List<PushOrder> querys = pushOrderService.querys(null, 2, query.getId());//获取需要推送的次数
+                    for(int i = 1; i <= querys.size(); i++){
+                        PushOrder pushOrder = pushOrderService.querys(i, 2, query.getId()).get(0);
+                        //获取空闲司机
+                        List<Driver> list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+                        if(list.size() > 0){
+                            double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
+                            int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
+                            list = list.subList(0, lastIndex);//获取空闲司机中占比数据
+                            for(Driver driver : list){//开始进行推送
+                                //查询是否在限制推单范围内
+                                boolean bo = false;
+                                for(Integer integer : integers){
+                                    if(integer.compareTo(driver.getId()) == 0){
+                                        bo = true;
+                                        break;
+                                    }
+                                }
+                                if(bo){
+                                    continue;
+                                }
+                                pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime());
+                            }
+                        }
+                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
+                        Integer state = orderTaxiMapper.selectById(orderTaxi.getId()).getState();
+                        if(state > 1){
+                            break;
+                        }
+                        if(i == querys.size() && state == 1){
+                            pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2);
+                            orderIds.remove(orderTaxi.getId());
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+    }
+
+
+
+    @Override
+    public synchronized String getOrderNum() throws Exception{
+        int size = this.selectCount(null);
+        return "TAXI" + String.valueOf(1000000 + size + 1).substring(1);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java
new file mode 100644
index 0000000..4d6da69
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java
@@ -0,0 +1,69 @@
+package com.stylefeng.guns.modular.taxi.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.taxi.dao.PaymentRecordMapper;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class PaymentRecordServiceImpl extends ServiceImpl<PaymentRecordMapper, PaymentRecord> implements IPaymentRecordService {
+
+    @Resource
+    private PaymentRecordMapper paymentRecordMapper;
+
+
+
+
+    /**
+     * 添加数据
+     * @param orderId       订单id
+     * @param payType       支付方式(1=微信,2=支付宝)
+     * @param amount        支付金额
+     * @param code          第三方支付单号
+     * @param state         支付状态(1=待支付,2=已支付)
+     * @throws Exception
+     */
+    @Override
+    public Integer saveData(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType, Integer payType,
+                         Double amount, String code, Integer state) throws Exception {
+        //先删除现有数据避免重复
+        PaymentRecord query = paymentRecordMapper.query(category, userId, type, orderId, orderType, payType, state);
+        if(null != query){
+            this.deleteById(query.getId());
+        }
+        PaymentRecord paymentRecord = new PaymentRecord();
+        paymentRecord.setCategory(category);
+        paymentRecord.setUserId(userId);
+        paymentRecord.setType(type);
+        paymentRecord.setOrderId(orderId);
+        paymentRecord.setOrderType(orderType);
+        paymentRecord.setPayType(payType);
+        paymentRecord.setAmount(amount);
+        paymentRecord.setCode(code);
+        paymentRecord.setState(state);
+        paymentRecord.setInsertTime(new Date());
+        this.insert(paymentRecord);
+        return paymentRecord.getId();
+    }
+
+
+    /**
+     * 获取数据
+     * @param orderId
+     * @param payType
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public PaymentRecord query(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType,
+                                     Integer payType, Integer state) throws Exception {
+        return paymentRecordMapper.query(category, userId, type, orderId, orderType, payType, state);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/TransactionDetailsServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/TransactionDetailsServiceImpl.java
new file mode 100644
index 0000000..c6c02c1
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/TransactionDetailsServiceImpl.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.taxi.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.taxi.dao.TransactionDetailsMapper;
+import com.stylefeng.guns.modular.taxi.model.TransactionDetails;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+
+
+@Service
+@Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+public class TransactionDetailsServiceImpl extends ServiceImpl<TransactionDetailsMapper, TransactionDetails> implements ITransactionDetailsService {
+
+
+    /**
+     * 添加数据
+     * @param userId    对象id
+     * @param remark    备注
+     * @param money     金额
+     * @param state     状态(1=添加,2=减少)
+     * @param type      类型(1=金额,2=积分)
+     * @param userType  用户类型(1=用户,2=司机)
+     * @param orderType 订单类型(1=专车,2=出租车,3=城际,4=小件物流)
+     * @param orderId
+     * @throws Exception
+     */
+    @Override
+    public void saveData(Integer userId, String remark, Double money, Integer state, Integer type, Integer userType,
+                         Integer orderType, Integer orderId) throws Exception {
+
+        TransactionDetails transactionDetails = new TransactionDetails();
+        transactionDetails.setInsertTime(new Date());
+        transactionDetails.setMoney(money);
+        transactionDetails.setOrderId(orderId);
+        transactionDetails.setOrderType(orderType);
+        transactionDetails.setRemark(remark);
+        transactionDetails.setState(state);
+        transactionDetails.setType(type);
+        transactionDetails.setUserId(userId);
+        transactionDetails.setUserType(userType);
+        this.insert(transactionDetails);
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/warpper/OrderTaxiWarpper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/warpper/OrderTaxiWarpper.java
new file mode 100644
index 0000000..727b9cf
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/warpper/OrderTaxiWarpper.java
@@ -0,0 +1,226 @@
+package com.stylefeng.guns.modular.taxi.warpper;
+
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+
+@ApiModel("出租车订单")
+public class OrderTaxiWarpper {
+    @ApiModelProperty(dataType = "int", required = false, value = "扫码下单时传此参数")
+    private Integer driverId;
+    @ApiModelProperty(dataType = "int", required = true, value = "订单类型(1=普通订单,2=摆渡订单)")
+    private Integer type;
+    @ApiModelProperty(dataType = "double", required = true, value = "下单地点经度")
+    private Double placementLon;
+    @ApiModelProperty(dataType = "double", required = true, value = "下单地点纬度")
+    private Double placementLat;
+    @ApiModelProperty(dataType = "double", required = true, value = "起点经度")
+    private Double startLon;
+    @ApiModelProperty(dataType = "double", required = true, value = "起点纬度")
+    private Double startLat;
+    @ApiModelProperty(dataType = "double", required = true, value = "起点详情地址")
+    private String startAddress;
+    @ApiModelProperty(dataType = "double", required = false, value = "终点经度")
+    private Double endLon;
+    @ApiModelProperty(dataType = "double", required = false, value = "终点纬度")
+    private Double endLat;
+    @ApiModelProperty(dataType = "double", required = false, value = "终点详细地址")
+    private String endAddress;
+    @ApiModelProperty(dataType = "double", required = true, value = "小费金额,没有小费传0")
+    private Double tipMoney;
+    @ApiModelProperty(dataType = "int", required = true, value = "是否是代下单(0:否,1:是)")
+    private Integer substitute;
+    @ApiModelProperty(dataType = "String", required = false, value = "乘车人姓名,substitute=0,不传")
+    private String passengers;
+    @ApiModelProperty(dataType = "String", required = false, value = "乘车人电话,substitute=0,不传")
+    private String passengersPhone;
+    @ApiModelProperty(dataType = "int", required = true, value = "订单类型(1=普通,2=预约)")
+    private Integer orderType;
+    @ApiModelProperty(dataType = "int", required = true, value = "订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)")
+    private Integer orderSource;
+    @ApiModelProperty(dataType = "string", required = true, value = "出行时间(2020-06-06 08:47)")
+    private Date travelTime;
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public Double getTipMoney() {
+        return tipMoney;
+    }
+
+    public void setTipMoney(Double tipMoney) {
+        this.tipMoney = tipMoney;
+    }
+
+    public Integer getSubstitute() {
+        return substitute;
+    }
+
+    public void setSubstitute(Integer substitute) {
+        this.substitute = substitute;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+
+    public String getPassengersPhone() {
+        return passengersPhone;
+    }
+
+    public void setPassengersPhone(String passengersPhone) {
+        this.passengersPhone = passengersPhone;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    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;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderTaxiWarpper{" +
+                "driverId=" + driverId +
+                ", placementLon=" + placementLon +
+                ", placementLat=" + placementLat +
+                ", startLon=" + startLon +
+                ", startLat=" + startLat +
+                ", startAddress='" + startAddress + '\'' +
+                ", endLon=" + endLon +
+                ", endLat=" + endLat +
+                ", endAddress='" + endAddress + '\'' +
+                ", tipMoney=" + tipMoney +
+                ", substitute=" + substitute +
+                ", passengers='" + passengers + '\'' +
+                ", passengersPhone='" + passengersPhone + '\'' +
+                ", orderType=" + orderType +
+                ", orderSource=" + orderSource +
+                ", travelTime='" + travelTime + '\'' +
+                '}';
+    }
+
+    public static OrderTaxi getOrderTaxi(OrderTaxiWarpper orderTaxiWarpper){
+        OrderTaxi orderTaxi = new OrderTaxi();
+        orderTaxi.setDriverId(orderTaxiWarpper.getDriverId());
+        orderTaxi.setType(orderTaxiWarpper.getType());
+        orderTaxi.setPlacementLon(orderTaxiWarpper.getPlacementLon());
+        orderTaxi.setPlacementLat(orderTaxiWarpper.getPlacementLat());
+        orderTaxi.setStartLon(orderTaxiWarpper.getStartLon());
+        orderTaxi.setStartLat(orderTaxiWarpper.getStartLat());
+        orderTaxi.setEndLon(orderTaxiWarpper.getEndLon());
+        orderTaxi.setEndLat(orderTaxiWarpper.getEndLat());
+        orderTaxi.setTipMoney(orderTaxiWarpper.getTipMoney());
+        orderTaxi.setSubstitute(orderTaxiWarpper.getSubstitute());
+        orderTaxi.setPassengers(orderTaxiWarpper.getPassengers());
+        orderTaxi.setPassengersPhone(orderTaxiWarpper.getPassengersPhone());
+        orderTaxi.setOrderType(orderTaxiWarpper.getOrderType());
+        orderTaxi.setOrderSource(orderTaxiWarpper.getOrderSource());
+        orderTaxi.setTravelTime(orderTaxiWarpper.getTravelTime());
+        orderTaxi.setStartAddress(orderTaxiWarpper.getStartAddress());
+        orderTaxi.setEndAddress(orderTaxiWarpper.getEndAddress());
+        return orderTaxi;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/controller/OrderTransferController.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/controller/OrderTransferController.java
new file mode 100644
index 0000000..b84e0e9
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/controller/OrderTransferController.java
@@ -0,0 +1,217 @@
+package com.stylefeng.guns.modular.transfer.controller;
+
+
+import com.aliyuncs.utils.StringUtils;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.dao.TOpenCitySiteMapper;
+import com.stylefeng.guns.modular.system.model.OpenCity;
+import com.stylefeng.guns.modular.system.model.TOpenCitySite;
+import com.stylefeng.guns.modular.system.service.IOpenCityService;
+import com.stylefeng.guns.modular.system.service.IOrderService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.AmapGeocoding;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.transfer.model.SiteDto;
+import com.stylefeng.guns.modular.transfer.server.IOrderTransferService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Api
+@RestController
+@RequestMapping("")
+public class OrderTransferController {
+
+    @Autowired
+    private IOrderTransferService orderPrivateCarService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+
+    /**
+     * 专车下单
+     * @param serverCarModelId
+     * @param travelTime
+     * @param orderType
+     * @param substitute
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @param passengers
+     * @param passengersPhone
+     * @param orderSource
+     * @param driverId
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/transfer/saveTransferCar")
+    @ApiOperation(value = "接送机下单/扫码下单", tags = {"用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单类型(1=普通订单,2=摆渡订单)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "服务车型id(扫码下单不用上传)", name = "serverCarModelId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "出行时间(2020-08-20 10:10)", name = "travelTime", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "是否预约(1=否,2=是)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "是否代下单(0=否,1=是)", name = "substitute", required = true, dataType = "int"),
+                @ApiImplicitParam(value = "下单地点经度", name = "placementLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "下单地点纬度", name = "placementLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点经度", name = "startLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点纬度", name = "startLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点地址", name = "startAddress", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点经度", name = "endLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点纬度", name = "endLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点地址", name = "endAddress", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)", name = "orderSource", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "司机id(扫码下单必传)", name = "driverId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "乘客姓名(代下单必传)", name = "passengers", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "乘客电话(代下单必传)", name = "passengersPhone", required = false, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer orderType, Integer substitute, String placementLon, String placementLat, String startLon, String startLat,
+                                                       String startAddress, String endLon, String endLat, String endAddress, String passengers, String passengersPhone, Integer orderSource, Integer driverId,
+                                                       Integer type, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderPrivateCarService.saveOrderPrivateCar(serverCarModelId, travelTime, orderType, substitute, placementLon, placementLat,
+                    startLon, startLat, startAddress, endLon, endLat, endAddress, passengers, passengersPhone, orderSource, driverId, type, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 专车下单
+     * @param serverCarModelId
+     * @param travelTime
+     * @param orderType
+     * @param substitute
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @param passengers
+     * @param passengersPhone
+     * @param orderSource
+     * @param driverId
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/transferCar/saveTransferCars")
+    @ApiOperation(value = "接送机下单/扫码下单[2024.05.11]", tags = {"用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单类型(1=普通订单,2=摆渡订单)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "服务车型id(扫码下单不用上传)", name = "serverCarModelId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "出行时间(2020-08-20 10:10)", name = "travelTime", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "是否预约(1=否,2=是)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "是否代下单(0=否,1=是)", name = "substitute", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "下单地点经度", name = "placementLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "下单地点纬度", name = "placementLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点经度", name = "startLon", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点纬度", name = "startLat", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "起点地址", name = "startAddress", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "终点经度", name = "endLon", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "终点纬度", name = "endLat", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "终点地址", name = "endAddress", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)", name = "orderSource", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "司机id(扫码下单必传)", name = "driverId", required = false, dataType = "int"),
+            @ApiImplicitParam(value = "乘客姓名(代下单必传)", name = "passengers", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "乘客电话(代下单必传)", name = "passengersPhone", required = false, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<BaseWarpper> saveOrderPrivateCars(Integer serverCarModelId, Date travelTime, Integer orderType, Integer substitute, String placementLon, String placementLat, String startLon, String startLat,
+                                                       String startAddress, String endLon, String endLat, String endAddress, String passengers, String passengersPhone, Integer orderSource, Integer driverId,
+                                                       Integer type, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return orderPrivateCarService.saveOrderPrivateCars(serverCarModelId, travelTime, orderType, substitute, placementLon, placementLat,
+                    startLon, startLat, startAddress, endLon, endLat, endAddress, passengers, passengersPhone, orderSource, driverId, type, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @Autowired
+    private IOpenCityService openCityService;
+    @Autowired
+    private TOpenCitySiteMapper openCitySiteMapper;
+    @ResponseBody
+    @PostMapping("/api/get/site")
+    @ApiOperation(value = "获取站点", tags = {"用户端-接送机"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil site(double latitude, double longitude,String code) throws Exception {
+        //获取当前城市名称
+//        String cityName = AmapGeocoding.getCityName(latitude, longitude);
+
+        Wrapper<OpenCity> ne = new EntityWrapper<OpenCity>().ne("flag", 3);
+        if (!StringUtils.isEmpty(code)){
+            ne.eq("code",code);
+        }
+        //查询ids
+        List<OpenCity> cityName1 = openCityService.selectList(ne);
+        List<Integer> ids = new ArrayList<>();
+        for (OpenCity openCity : cityName1) {
+            ids.add(openCity.getId());
+        }
+        if (ids.isEmpty()){
+            return ResultUtil.error("当前城市暂无开通站点");
+        }
+
+        List<TOpenCitySite> tOpenCitySites = openCitySiteMapper.selectList(new EntityWrapper<TOpenCitySite>().in("openCityId",ids).ne("flag",3));
+        List<TOpenCitySite> jichang = new ArrayList<>();
+        List<TOpenCitySite> dongche = new ArrayList<>();
+
+        for (TOpenCitySite tOpenCitySite : tOpenCitySites) {
+
+            String address = AmapGeocoding.getAddress(Double.parseDouble(tOpenCitySite.getLat()), Double.parseDouble(tOpenCitySite.getLon()));
+            tOpenCitySite.setAddress(address);
+            if (tOpenCitySite.getType()==1){
+                jichang.add(tOpenCitySite);
+            }
+            if (tOpenCitySite.getType()==2){
+                dongche.add(tOpenCitySite);
+            }
+        }
+
+        SiteDto siteDto = new SiteDto();
+        siteDto.setDongche(dongche);
+        siteDto.setJichang(jichang);
+        return ResultUtil.success(siteDto);
+    }
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/dao/OrderTransferMapper.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/dao/OrderTransferMapper.java
new file mode 100644
index 0000000..31de7fe
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/dao/OrderTransferMapper.java
@@ -0,0 +1,91 @@
+package com.stylefeng.guns.modular.transfer.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface OrderTransferMapper extends BaseMapper<OrderTransferCar> {
+
+
+    /**
+     * 根据状态数据订单数据
+     * @param uid
+     * @param orderType
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    List<OrderTransferCar> queryByState(@Param("uid") Integer uid, @Param("orderType") Integer orderType,
+                                       @Param("type") Integer type, @Param("state") Integer...state) throws Exception;
+
+
+
+    List<OrderPrivateCar> query(@Param("start") Date start, @Param("end") Date end) throws Exception;
+
+
+
+
+    List<OrderTransferCar> queryByState_(@Param("uid") Integer uid, @Param("state") Integer... state);
+
+
+
+    /**
+     * 获取用户的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryMyOrderList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
+                                               @Param("size") Integer size);
+
+
+
+    /**
+     * 获取用户单发票页面的订单列表
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryInvoiceOrder(@Param("type") Integer type, @Param("startTime") Date startTime,
+                                                @Param("endTime") Date endTime, @Param("startMoney") Double startMoney,
+                                                @Param("endMoney") Double endMoney, @Param("uid") Integer uid);
+
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(@Param("orderId") Integer orderId);
+
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryMyTravelRecord(@Param("uid") Integer uid);
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     */
+    List<Map<String, Object>> queryRedEnvelope(@Param("uid") Integer uid);
+
+
+    List<OrderPrivateCar> queryByDriver(@Param("driverId") Integer driverId, @Param("state") Integer...state);
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/dao/mapping/OrderTransferMapper.xml b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/dao/mapping/OrderTransferMapper.xml
new file mode 100644
index 0000000..85b1481
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/dao/mapping/OrderTransferMapper.xml
@@ -0,0 +1,546 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.transfer.dao.OrderTransferMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.transfer.model.OrderTransferCar">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="crossCityOrderId" property="crossCityOrderId"/>
+        <result column="place" property="place"/>
+        <result column="userId" property="userId"/>
+        <result column="serverCarModelId" property="serverCarModelId"/>
+        <result column="driverId" property="driverId"/>
+        <result column="carId" property="carId"/>
+        <result column="orderNum" property="orderNum"/>
+        <result column="placementLon" property="placementLon"/>
+        <result column="placementLat" property="placementLat"/>
+        <result column="placementAddress" property="placementAddress"/>
+        <result column="startLon" property="startLon"/>
+        <result column="startLat" property="startLat"/>
+        <result column="startAddress" property="startAddress"/>
+        <result column="endLon" property="endLon"/>
+        <result column="endLat" property="endLat"/>
+        <result column="endAddress" property="endAddress"/>
+        <result column="boardingLon" property="boardingLon"/>
+        <result column="boardingLat" property="boardingLat"/>
+        <result column="boardingAddress" property="boardingAddress"/>
+        <result column="boardingTime" property="boardingTime"/>
+        <result column="getoffLon" property="getoffLon"/>
+        <result column="getoffLat" property="getoffLat"/>
+        <result column="getoffAddress" property="getoffAddress"/>
+        <result column="getoffTime" property="getoffTime"/>
+        <result column="mileage" property="mileage"/>
+        <result column="payManner" property="payManner"/>
+        <result column="payType" property="payType"/>
+        <result column="orderMoney" property="orderMoney"/>
+        <result column="startMileage" property="startMileage"/>
+        <result column="startMoney" property="startMoney"/>
+        <result column="mileageKilometers" property="mileageKilometers"/>
+        <result column="mileageMoney" property="mileageMoney"/>
+        <result column="duration" property="duration"/>
+        <result column="durationMoney" property="durationMoney"/>
+        <result column="wait" property="wait"/>
+        <result column="waitMoney" property="waitMoney"/>
+        <result column="longDistance" property="longDistance"/>
+        <result column="longDistanceMoney" property="longDistanceMoney"/>
+        <result column="parkMoney" property="parkMoney"/>
+        <result column="roadTollMoney" property="roadTollMoney"/>
+        <result column="redPacketMoney" property="redPacketMoney"/>
+        <result column="couponMoney" property="couponMoney"/>
+        <result column="redPacketId" property="redPacketId"/>
+        <result column="couponId" property="couponId"/>
+        <result column="discount" property="discount"/>
+        <result column="discountMoney" property="discountMoney"/>
+        <result column="activityId" property="activityId"/>
+        <result column="companyId" property="companyId"/>
+        <result column="payMoney" property="payMoney"/>
+        <result column="substitute" property="substitute"/>
+        <result column="passengers" property="passengers"/>
+        <result column="passengersPhone" property="passengersPhone"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="travelTime" property="travelTime"/>
+        <result column="snatchOrderTime" property="snatchOrderTime"/>
+        <result column="setOutTime" property="setOutTime"/>
+        <result column="arriveTime" property="arriveTime"/>
+        <result column="startServiceTime" property="startServiceTime"/>
+        <result column="endServiceTime" property="endServiceTime"/>
+        <result column="orderType" property="orderType"/>
+        <result column="orderSource" property="orderSource"/>
+        <result column="invoiceId" property="invoiceId"/>
+        <result column="isReassign" property="isReassign"/>
+        <result column="reassignNotice" property="reassignNotice"/>
+        <result column="trackId" property="trackId"/>
+        <result column="isDelete" property="isDelete"/>
+        <result column="oldState" property="oldState"/>
+        <result column="telX" property="telX"/>
+        <result column="bindId" property="bindId"/>
+    </resultMap>
+
+
+
+    <select id="queryByState" resultType="OrderTransferCar">
+        select
+        id as id,
+        `type` as `type`,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        startMileage as startMileage,
+        startMoney as startMoney,
+        mileageKilometers as mileageKilometers,
+        mileageMoney as mileageMoney,
+        duration as duration,
+        durationMoney as durationMoney,
+        wait as wait,
+        waitMoney as waitMoney,
+        longDistance as longDistance,
+        longDistanceMoney as longDistanceMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId
+        from t_order_transfer where isDelete = 1 and userId = #{uid}
+        <if test="null != orderType">
+            and orderType = #{orderType}
+        </if>
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != type">
+            and `type` = #{type}
+        </if>
+    </select>
+
+
+
+    <select id="query" resultType="OrderTransferCar">
+        select
+        id as id,
+        `type` as `type`,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        startMileage as startMileage,
+        startMoney as startMoney,
+        mileageKilometers as mileageKilometers,
+        mileageMoney as mileageMoney,
+        duration as duration,
+        durationMoney as durationMoney,
+        wait as wait,
+        waitMoney as waitMoney,
+        longDistance as longDistance,
+        longDistanceMoney as longDistanceMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId
+        from t_order_private_car where isDelete = 1
+        <if test="null != start and null != end">
+            and insertTime between #{start} and #{end}
+        </if>
+    </select>
+
+
+
+    <select id="queryByState_" resultType="OrderTransferCar">
+        select
+        id as id,
+        `type` as `type`,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        startMileage as startMileage,
+        startMoney as startMoney,
+        mileageKilometers as mileageKilometers,
+        mileageMoney as mileageMoney,
+        duration as duration,
+        durationMoney as durationMoney,
+        wait as wait,
+        waitMoney as waitMoney,
+        longDistance as longDistance,
+        longDistanceMoney as longDistanceMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId
+        from t_order_transfer where isDelete = 1 and userId = #{uid}
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
+
+
+    <select id="queryMyOrderList" resultType="map">
+        select
+        id as orderId,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+        DATE_FORMAT(travelTime, '%m月%d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (7) as orderType,
+        state as state,
+        oldState as oldState
+        from t_order_transfer where userId = #{uid} order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+
+
+    <select id="queryInvoiceOrder" resultType="map">
+        select
+        id as id,
+        DATE_FORMAT(travelTime, '%Y-%m-%d %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        payMoney as payMoney,
+        ('接送机订单') as orderName,
+        if(invoiceId is null, 1, 2) as invoice,
+        unix_timestamp(insertTime) as insertTime,
+        (7) as orderType
+        from t_order_transfer where state in (8, 9)
+        <if test="type == 1">
+            and invoiceId is null and invoiceId in (select id from t_invoice where state != 2)
+        </if>
+        <if test="type == 2">
+            and invoiceId in (select id from t_invoice where state = 2)
+        </if>
+        <if test="null != startTime and null != endTime">
+            and travelTime between #{startTime} and #{endTime}
+        </if>
+        <if test="null != startMoney and null != endMoney">
+            and payMoney between #{startMoney} and #{endMoney}
+        </if>
+        <if test="null !=uid">
+            and userId = #{uid}
+        </if>
+    </select>
+
+
+    <select id="queryOrderInfo" resultType="map">
+        select
+        a.id as orderId,
+        a.type as type,
+        a.state as state,
+        DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as insertTime,
+        DATE_FORMAT(a.travelTime, '%m月%d日 %H:%i') as travelTime,
+        DATE_FORMAT(a.travelTime, '%Y-%m-%d %H:%i:%s') as travelTime1,
+        DATE_FORMAT(a.arriveTime, '%Y-%m-%d %H:%i:%s') as arriveTime,
+        a.startLon as startLon,
+        a.startLat as startLat,
+        a.startAddress as startAddress,
+        a.endLon as endLon,
+        a.endLat as endLat,
+        a.endAddress as endAddress,
+		a.driverId as driverId,
+		a.orderMoney as orderMoney,
+        a.startMileage as startMileage,
+        a.startMoney as startMoney,
+        a.mileageKilometers as mileageKilometers,
+        a.mileageMoney as mileageMoney,
+        a.duration as duration,
+        a.durationMoney as durationMoney,
+        a.wait as wait,
+        a.waitMoney as waitMoney,
+        a.longDistance as longDistance,
+        a.longDistanceMoney as longDistanceMoney,
+		a.parkMoney as parkMoney,
+		a.roadTollMoney as roadTollMoney,
+		a.redPacketMoney as redPacketMoney,
+		a.couponMoney as couponMoney,
+		a.discount as discount,
+		a.discountMoney as discountMoney,
+		a.payMoney as payMoney,
+		a.reassignNotice as reassignNotice,
+		a.oldState as oldState,
+		b.headImgUrl as driverAvatar,
+		b.`name` as driverName,
+		c.carLicensePlate as licensePlate,
+		c.carColor as carColor,
+		CONCAT(f.`name`, d.`name`) as brand,
+		((select sum(fraction) from t_order_evaluate where driverId = a.driverId) / (select count(id) from t_order_evaluate where driverId = a.driverId)) as score,
+		(
+		(select count(id) from t_order_private_car where driverId = a.driverId and state in (7, 8, 9)) +
+		(select count(id) from t_order_taxi where driverId = a.driverId and state in (7, 8, 9)) +
+		(select count(id) from t_order_cross_city where driverId = a.driverId and state in (6, 8, 9))
+		) as orderNum,
+		b.phone as driverPhone,
+		if(a.state = 12, (select money from t_order_cancel where orderId = a.id and orderType = 7 and state = 1 order by insertTime desc limit 0, 1), if(a.state = 10, (select money from t_order_cancel where orderId = a.id and orderType = 7 and state = 2 order by insertTime desc limit 0, 1), 0)) as cancelPayMoney,
+		if(a.state = 12, (select id from t_order_cancel where orderId = a.id and orderType = 1 and state = 1 order by insertTime desc limit 0, 1), 0) as cancelId,
+		g.fraction as orderScore,
+		g.content as evaluate,
+		a.telX as telX,
+		h.userType as cancelUserType,
+		h.money as cancelMoney,
+		h.reason as cancelReason,
+		h.remark as cancelRemark
+        from t_order_transfer a
+		left join t_driver b on (a.driverId = b.id)
+		left join t_car c on (a.carId = c.id)
+		left join t_car_model d on (c.carModelId = d.id)
+		left join t_car_brand f on (d.brandId = f.id)
+		left join t_order_evaluate g on (a.id = g.orderId and g.orderType = 7)
+		left join t_order_cancel h on (a.id = h.orderId and h.orderType = 7 and h.state = 2)
+		where a.id = #{orderId}
+    </select>
+
+
+
+    <select id="queryMyTravelRecord" resultType="map">
+        select
+        (payMoney * -1) as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        ('接送机订单') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_transfer where payMoney != 0 and userId = #{uid} and state in (8, 9, 10, 11, 12)
+    </select>
+
+
+    <select id="queryRedEnvelope" resultType="map">
+        select
+        redPacketMoney as money,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as time,
+        ('接送机订单') as name,
+        UNIX_TIMESTAMP(insertTime) as insertTime
+        from t_order_transfer where userId = #{uid} and state in (8, 9) and redPacketId is not null
+    </select>
+
+
+    <select id="queryByDriver" resultType="OrderPrivateCar">
+        select
+        id as id,
+        `type` as `type`,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        startMileage as startMileage,
+        startMoney as startMoney,
+        mileageKilometers as mileageKilometers,
+        mileageMoney as mileageMoney,
+        duration as duration,
+        durationMoney as durationMoney,
+        wait as wait,
+        waitMoney as waitMoney,
+        longDistance as longDistance,
+        longDistanceMoney as longDistanceMoney,
+        parkMoney as parkMoney,
+        roadTollMoney as roadTollMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        substitute as substitute,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        orderType as orderType,
+        orderSource as orderSource,
+        invoiceId as invoiceId,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId
+        from t_order_private_car where isDelete = 1 and driverId = #{driverId} and state in
+        <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/model/OrderTransferCar.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/model/OrderTransferCar.java
new file mode 100644
index 0000000..192fb89
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/model/OrderTransferCar.java
@@ -0,0 +1,1035 @@
+package com.stylefeng.guns.modular.transfer.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 java.util.Date;
+
+/**
+ * 专车车订单
+ */
+@TableName("t_order_transfer")
+public class OrderTransferCar {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单类型(1=普通订单,2=摆渡订单)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 跨城订单id(摆渡车专用)
+     */
+    @TableField("crossCityOrderId")
+    private Integer crossCityOrderId;
+    /**
+     * 摆渡方位(1=跨城起点,2=跨城终点)
+     */
+    @TableField("place")
+    private Integer place;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 服务车型id
+     */
+    @TableField("serverCarModelId")
+    private Integer serverCarModelId;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 车辆id
+     */
+    @TableField("carId")
+    private Integer carId;
+    /**
+     * 订单号
+     */
+    @TableField("orderNum")
+    private String orderNum;
+    /**
+     * 下单地点经度
+     */
+    @TableField("placementLon")
+    private Double placementLon;
+    /**
+     * 下单地点纬度
+     */
+    @TableField("placementLat")
+    private Double placementLat;
+    /**
+     * 下单地点
+     */
+    @TableField("placementAddress")
+    private String placementAddress;
+    /**
+     * 起点经度
+     */
+    @TableField("startLon")
+    private Double startLon;
+    /**
+     * 起点纬度
+     */
+    @TableField("startLat")
+    private Double startLat;
+    /**
+     * 起点
+     */
+    @TableField("startAddress")
+    private String startAddress;
+    /**
+     * 目的地经度
+     */
+    @TableField("endLon")
+    private Double endLon;
+    /**
+     * 目的地纬度
+     */
+    @TableField("endLat")
+    private Double endLat;
+    /**
+     * 目的地
+     */
+    @TableField("endAddress")
+    private String endAddress;
+    /**
+     * 上车点经度
+     */
+    @TableField("boardingLon")
+    private Double boardingLon;
+    /**
+     * 上车点纬度
+     */
+    @TableField("boardingLat")
+    private Double boardingLat;
+    /**
+     * 上车地点
+     */
+    @TableField("boardingAddress")
+    private String boardingAddress;
+    /**
+     * 上车时间
+     */
+    @TableField("boardingTime")
+    private Date boardingTime;
+    /**
+     * 下车点经度
+     */
+    @TableField("getoffLon")
+    private Double getoffLon;
+    /**
+     * 下车点纬度
+     */
+    @TableField("getoffLat")
+    private Double getoffLat;
+    /**
+     * 下车点
+     */
+    @TableField("getoffAddress")
+    private String getoffAddress;
+    /**
+     * 下车时间
+     */
+    @TableField("getoffTime")
+    private Date getoffTime;
+    /**
+     * 行驶里程数(米)
+     */
+    @TableField("mileage")
+    private Double mileage;
+    /**
+     * 支付方式(1=OK平台支付,2=其他方式支付)
+     */
+    @TableField("payManner")
+    private Integer payManner;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=余额)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 订单金额
+     */
+    @TableField("orderMoney")
+    private Double orderMoney;
+    /**
+     * 起步里程
+     */
+    @TableField("startMileage")
+    private Double startMileage;
+    /**
+     * 起步价
+     */
+    @TableField("startMoney")
+    private Double startMoney;
+    /**
+     * 里程公里
+     */
+    @TableField("mileageKilometers")
+    private Double mileageKilometers;
+    /**
+     * 里程费
+     */
+    @TableField("mileageMoney")
+    private Double mileageMoney;
+    /**
+     * 时长分钟
+     */
+    @TableField("duration")
+    private Double duration;
+    /**
+     * 时长费
+     */
+    @TableField("durationMoney")
+    private Double durationMoney;
+    /**
+     * 等待分钟
+     */
+    @TableField("wait")
+    private Double wait;
+    /**
+     * 等待费
+     */
+    @TableField("waitMoney")
+    private Double waitMoney;
+    /**
+     * 远途公里
+     */
+    @TableField("longDistance")
+    private Double longDistance;
+    /**
+     * 远途费
+     */
+    @TableField("longDistanceMoney")
+    private Double longDistanceMoney;
+    /**
+     * 停车费
+     */
+    @TableField("parkMoney")
+    private Double parkMoney;
+    /**
+     * 过路费
+     */
+    @TableField("roadTollMoney")
+    private Double roadTollMoney;
+    /**
+     * 红包抵扣金额
+     */
+    @TableField("redPacketMoney")
+    private Double redPacketMoney;
+    /**
+     * 优惠券抵扣金额
+     */
+    @TableField("couponMoney")
+    private Double couponMoney;
+    /**
+     * 红包id
+     */
+    @TableField("redPacketId")
+    private Integer redPacketId;
+    /**
+     * 优惠券id
+     */
+    @TableField("couponId")
+    private Integer couponId;
+    /**
+     * 折扣
+     */
+    @TableField("discount")
+    private Double discount;
+    /**
+     * 折扣优惠金额
+     */
+    @TableField("discountMoney")
+    private Double discountMoney;
+    /**
+     * 折扣活动id
+     */
+    @TableField("activityId")
+    private Integer activityId;
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 支付金额
+     */
+    @TableField("payMoney")
+    private Double payMoney;
+    /**
+     * 是否是代下单(0:否,1:是)
+     */
+    @TableField("substitute")
+    private Integer substitute;
+    /**
+     * 乘车人姓名
+     */
+    @TableField("passengers")
+    private String passengers;
+    /**
+     * 乘车人电话
+     */
+    @TableField("passengersPhone")
+    private String passengersPhone;
+    /**
+     * 订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 下单时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 出行时间
+     */
+    @TableField("travelTime")
+    private Date travelTime;
+    /**
+     * 抢单时间
+     */
+    @TableField("snatchOrderTime")
+    private Date snatchOrderTime;
+    /**
+     * 司机点出发时间
+     */
+    @TableField("setOutTime")
+    private Date setOutTime;
+    /**
+     * 司机到达预约地点时间
+     */
+    @TableField("arriveTime")
+    private Date arriveTime;
+    /**
+     * 开始服务时间
+     */
+    @TableField("startServiceTime")
+    private Date startServiceTime;
+    /**
+     * 结束服务时间
+     */
+    @TableField("endServiceTime")
+    private Date endServiceTime;
+    /**
+     * 订单类型(1=普通,2=预约)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)
+     */
+    @TableField("orderSource")
+    private Integer orderSource;
+    /**
+     * 发票id
+     */
+    @TableField("invoiceId")
+    private Integer invoiceId;
+    /**
+     * 是否是改派单(1=否,=是)
+     * @return
+     */
+    @TableField("isReassign")
+    private Integer isReassign;
+    /**
+     * 改派通知标识(0=没有改派,1=改派中,2=已改派)用于通知前端获取新司机数据
+     */
+    @TableField("reassignNotice")
+    private Integer reassignNotice;
+    /**
+     * 高德猎鹰轨迹id
+     * @return
+     */
+    @TableField("trackId")
+    private String trackId;
+    /**
+     * 是否删除(1=否,2=是)
+     */
+    @TableField("isDelete")
+    private Integer isDelete;
+    /**
+     * 该派前的订单状态
+     * @return
+     */
+    @TableField("oldState")
+    private Integer oldState;
+    /**
+     * 移动小号
+     * @return
+     */
+    @TableField("telX")
+    private String telX;
+    /**
+     * 绑定小号关系id
+     * @return
+     */
+    @TableField("bindId")
+    private String bindId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getCrossCityOrderId() {
+        return crossCityOrderId;
+    }
+
+    public void setCrossCityOrderId(Integer crossCityOrderId) {
+        this.crossCityOrderId = crossCityOrderId;
+    }
+
+    public Integer getPlace() {
+        return place;
+    }
+
+    public void setPlace(Integer place) {
+        this.place = place;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Double getBoardingLon() {
+        return boardingLon;
+    }
+
+    public void setBoardingLon(Double boardingLon) {
+        this.boardingLon = boardingLon;
+    }
+
+    public Double getBoardingLat() {
+        return boardingLat;
+    }
+
+    public void setBoardingLat(Double boardingLat) {
+        this.boardingLat = boardingLat;
+    }
+
+    public String getBoardingAddress() {
+        return boardingAddress;
+    }
+
+    public void setBoardingAddress(String boardingAddress) {
+        this.boardingAddress = boardingAddress;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Double getGetoffLon() {
+        return getoffLon;
+    }
+
+    public void setGetoffLon(Double getoffLon) {
+        this.getoffLon = getoffLon;
+    }
+
+    public Double getGetoffLat() {
+        return getoffLat;
+    }
+
+    public void setGetoffLat(Double getoffLat) {
+        this.getoffLat = getoffLat;
+    }
+
+    public String getGetoffAddress() {
+        return getoffAddress;
+    }
+
+    public void setGetoffAddress(String getoffAddress) {
+        this.getoffAddress = getoffAddress;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Integer getPayManner() {
+        return payManner;
+    }
+
+    public void setPayManner(Integer payManner) {
+        this.payManner = payManner;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(Double orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public Double getStartMileage() {
+        return startMileage;
+    }
+
+    public void setStartMileage(Double startMileage) {
+        this.startMileage = startMileage;
+    }
+
+    public Double getStartMoney() {
+        return startMoney;
+    }
+
+    public void setStartMoney(Double startMoney) {
+        this.startMoney = startMoney;
+    }
+
+    public Double getMileageKilometers() {
+        return mileageKilometers;
+    }
+
+    public void setMileageKilometers(Double mileageKilometers) {
+        this.mileageKilometers = mileageKilometers;
+    }
+
+    public Double getMileageMoney() {
+        return mileageMoney;
+    }
+
+    public void setMileageMoney(Double mileageMoney) {
+        this.mileageMoney = mileageMoney;
+    }
+
+    public Double getDuration() {
+        return duration;
+    }
+
+    public void setDuration(Double duration) {
+        this.duration = duration;
+    }
+
+    public Double getDurationMoney() {
+        return durationMoney;
+    }
+
+    public void setDurationMoney(Double durationMoney) {
+        this.durationMoney = durationMoney;
+    }
+
+    public Double getWait() {
+        return wait;
+    }
+
+    public void setWait(Double wait) {
+        this.wait = wait;
+    }
+
+    public Double getWaitMoney() {
+        return waitMoney;
+    }
+
+    public void setWaitMoney(Double waitMoney) {
+        this.waitMoney = waitMoney;
+    }
+
+    public Double getLongDistance() {
+        return longDistance;
+    }
+
+    public void setLongDistance(Double longDistance) {
+        this.longDistance = longDistance;
+    }
+
+    public Double getLongDistanceMoney() {
+        return longDistanceMoney;
+    }
+
+    public void setLongDistanceMoney(Double longDistanceMoney) {
+        this.longDistanceMoney = longDistanceMoney;
+    }
+
+    public Double getParkMoney() {
+        return parkMoney;
+    }
+
+    public void setParkMoney(Double parkMoney) {
+        this.parkMoney = parkMoney;
+    }
+
+    public Double getRoadTollMoney() {
+        return roadTollMoney;
+    }
+
+    public void setRoadTollMoney(Double roadTollMoney) {
+        this.roadTollMoney = roadTollMoney;
+    }
+
+    public Double getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(Double redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public Double getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(Double couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Integer getRedPacketId() {
+        return redPacketId;
+    }
+
+    public void setRedPacketId(Integer redPacketId) {
+        this.redPacketId = redPacketId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Double getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Double discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Double getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(Double payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Integer getSubstitute() {
+        return substitute;
+    }
+
+    public void setSubstitute(Integer substitute) {
+        this.substitute = substitute;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+
+    public String getPassengersPhone() {
+        return passengersPhone;
+    }
+
+    public void setPassengersPhone(String passengersPhone) {
+        this.passengersPhone = passengersPhone;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Date getSnatchOrderTime() {
+        return snatchOrderTime;
+    }
+
+    public void setSnatchOrderTime(Date snatchOrderTime) {
+        this.snatchOrderTime = snatchOrderTime;
+    }
+
+    public Date getSetOutTime() {
+        return setOutTime;
+    }
+
+    public void setSetOutTime(Date setOutTime) {
+        this.setOutTime = setOutTime;
+    }
+
+    public Date getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Date arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Date getStartServiceTime() {
+        return startServiceTime;
+    }
+
+    public void setStartServiceTime(Date startServiceTime) {
+        this.startServiceTime = startServiceTime;
+    }
+
+    public Date getEndServiceTime() {
+        return endServiceTime;
+    }
+
+    public void setEndServiceTime(Date endServiceTime) {
+        this.endServiceTime = endServiceTime;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public Integer getInvoiceId() {
+        return invoiceId;
+    }
+
+    public void setInvoiceId(Integer invoiceId) {
+        this.invoiceId = invoiceId;
+    }
+
+    public Integer getIsReassign() {
+        return isReassign;
+    }
+
+    public void setIsReassign(Integer isReassign) {
+        this.isReassign = isReassign;
+    }
+
+    public Integer getReassignNotice() {
+        return reassignNotice;
+    }
+
+    public void setReassignNotice(Integer reassignNotice) {
+        this.reassignNotice = reassignNotice;
+    }
+
+    public String getTrackId() {
+        return trackId;
+    }
+
+    public void setTrackId(String trackId) {
+        this.trackId = trackId;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getOldState() {
+        return oldState;
+    }
+
+    public void setOldState(Integer oldState) {
+        this.oldState = oldState;
+    }
+
+    public String getTelX() {
+        return telX;
+    }
+
+    public void setTelX(String telX) {
+        this.telX = telX;
+    }
+
+    public String getBindId() {
+        return bindId;
+    }
+
+    public void setBindId(String bindId) {
+        this.bindId = bindId;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderPrivateCar{" +
+                "id=" + id +
+                ", type=" + type +
+                ", crossCityOrderId=" + crossCityOrderId +
+                ", place=" + place +
+                ", userId=" + userId +
+                ", serverCarModelId=" + serverCarModelId +
+                ", driverId=" + driverId +
+                ", carId=" + carId +
+                ", orderNum='" + orderNum + '\'' +
+                ", placementLon=" + placementLon +
+                ", placementLat=" + placementLat +
+                ", placementAddress='" + placementAddress + '\'' +
+                ", startLon=" + startLon +
+                ", startLat=" + startLat +
+                ", startAddress='" + startAddress + '\'' +
+                ", endLon=" + endLon +
+                ", endLat=" + endLat +
+                ", endAddress='" + endAddress + '\'' +
+                ", boardingLon=" + boardingLon +
+                ", boardingLat=" + boardingLat +
+                ", boardingAddress='" + boardingAddress + '\'' +
+                ", boardingTime=" + boardingTime +
+                ", getoffLon=" + getoffLon +
+                ", getoffLat=" + getoffLat +
+                ", getoffAddress='" + getoffAddress + '\'' +
+                ", getoffTime=" + getoffTime +
+                ", mileage=" + mileage +
+                ", payManner=" + payManner +
+                ", payType=" + payType +
+                ", orderMoney=" + orderMoney +
+                ", startMileage=" + startMileage +
+                ", startMoney=" + startMoney +
+                ", mileageKilometers=" + mileageKilometers +
+                ", mileageMoney=" + mileageMoney +
+                ", duration=" + duration +
+                ", durationMoney=" + durationMoney +
+                ", wait=" + wait +
+                ", waitMoney=" + waitMoney +
+                ", longDistance=" + longDistance +
+                ", longDistanceMoney=" + longDistanceMoney +
+                ", parkMoney=" + parkMoney +
+                ", roadTollMoney=" + roadTollMoney +
+                ", redPacketMoney=" + redPacketMoney +
+                ", couponMoney=" + couponMoney +
+                ", redPacketId=" + redPacketId +
+                ", couponId=" + couponId +
+                ", discount=" + discount +
+                ", discountMoney=" + discountMoney +
+                ", activityId=" + activityId +
+                ", companyId=" + companyId +
+                ", payMoney=" + payMoney +
+                ", substitute=" + substitute +
+                ", passengers='" + passengers + '\'' +
+                ", passengersPhone='" + passengersPhone + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                ", travelTime=" + travelTime +
+                ", snatchOrderTime=" + snatchOrderTime +
+                ", setOutTime=" + setOutTime +
+                ", arriveTime=" + arriveTime +
+                ", startServiceTime=" + startServiceTime +
+                ", endServiceTime=" + endServiceTime +
+                ", orderType=" + orderType +
+                ", orderSource=" + orderSource +
+                ", invoiceId=" + invoiceId +
+                ", isReassign=" + isReassign +
+                ", reassignNotice=" + reassignNotice +
+                ", trackId='" + trackId + '\'' +
+                ", isDelete=" + isDelete +
+                ", oldState=" + oldState +
+                ", telX='" + telX + '\'' +
+                ", bindId='" + bindId + '\'' +
+                '}';
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/model/SiteDto.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/model/SiteDto.java
new file mode 100644
index 0000000..5a5bb88
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/model/SiteDto.java
@@ -0,0 +1,12 @@
+package com.stylefeng.guns.modular.transfer.model;
+
+import com.stylefeng.guns.modular.system.model.TOpenCitySite;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+@Data
+public class SiteDto {
+   private   List<TOpenCitySite> jichang ;
+   private List<TOpenCitySite> dongche ;
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/server/IOrderTransferService.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/server/IOrderTransferService.java
new file mode 100644
index 0000000..d08a9b0
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/server/IOrderTransferService.java
@@ -0,0 +1,279 @@
+package com.stylefeng.guns.modular.transfer.server;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderTransferService extends IService<OrderTransferCar> {
+
+
+
+
+    /**
+     * 专车下单操作
+     * @param serverCarModelId  服务车型id
+     * @param travelTime        出行时间
+     * @param reservation       是否预约(1=否,2=是)
+     * @param instead           是否代下单(0=否,1=是)
+     * @param startLon          起点经度
+     * @param startLat          起点纬度
+     * @param startAddress      起点详细地址
+     * @param endLon            终点经度
+     * @param endLat            终点纬度
+     * @param endAddress        终点详细地址
+     * @param name              乘客姓名
+     * @param phone             乘客电话
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat,
+                                                String startLon, String startLat, String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid) throws Exception;
+
+    /**
+     * 专车一键叫车
+     * @param serverCarModelId
+     * @param travelTime
+     * @param reservation
+     * @param instead
+     * @param placementLon
+     * @param placementLat
+     * @param startLon
+     * @param startLat
+     * @param startAddress
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     * @param name
+     * @param phone
+     * @param orderSource
+     * @param driverId
+     * @param type
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> saveOrderPrivateCars(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat,
+                                                 String startLon, String startLat, String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid) throws Exception;
+
+
+    /**
+     * 继续推送操作
+     * @param id
+     * @throws Exception
+     */
+    ResultUtil pushOrderPrivateCar(Integer id) throws Exception;
+
+
+
+    /**
+     * 获取取消订单需要支付的金额
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception;
+
+
+
+    /**
+     * 添加取消
+     * @param id
+     * @param reason
+     * @param remark
+     * @param uid
+     * @throws Exception
+     */
+    ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception;
+
+
+    /**
+     * 取消订单操作
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    ResultUtil cancleOrderPrivateCar(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception;
+
+
+    String getOrderNum() throws Exception;
+
+    /**
+     * 删除定时任务
+     * @param orderId
+     */
+    void deleteTask(Integer orderId);
+
+
+
+    /**
+     * 获取用户余额和可用优惠券数量
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取优惠券列表
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+
+
+    /**
+     * 订单完成支付订单操作
+     * @param payType
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type)throws Exception;
+
+
+
+
+    /**
+     * 评论成功后获取红包金额
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception;
+
+
+
+
+
+    /**
+     * 分享成功后添加红包
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil shareRedEnvelope(Integer orderId) throws Exception;
+
+
+
+
+    /**
+     * 取消订单支付后的处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payCancelOrderPrivateCar(Integer id, String order_id, Integer type) throws Exception;
+
+
+
+    /**
+     * 支付完成后的订单处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception;
+
+
+
+    /**
+     * 获取订单数据
+     * @param uid
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    List<OrderTransferCar> queryOrder(Integer uid, Integer...state) throws Exception;
+
+
+
+
+    /**
+     * 获取员工的订单列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+
+    /**
+     * 获取用户端发票页面中的订单列表数据
+     * @param type          开票状态(1=未开票,2=已开票)
+     * @param startTime     订单开始时间
+     * @param endTime       订单结束时间
+     * @param startMoney    订单金额范围
+     * @param endMoney
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney,
+                                                Double endMoney, Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(Integer orderId) throws Exception;
+
+
+
+    /**
+     * 获取历史消费记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyTravelRecord(Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception;
+
+
+    /**
+     * 获取下单推送完后没有司机下单的提醒
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    EndPushWarpper queryEndPush(Integer uid) throws Exception;
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception;
+
+}
diff --git a/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/server/impl/OrderTransferServiceImpl.java b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/server/impl/OrderTransferServiceImpl.java
new file mode 100644
index 0000000..a9c64ba
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/transfer/server/impl/OrderTransferServiceImpl.java
@@ -0,0 +1,1443 @@
+package com.stylefeng.guns.modular.transfer.server.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.stylefeng.guns.core.common.constant.state.Order;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
+import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
+import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
+import com.stylefeng.guns.modular.crossCity.server.impl.OrderCrossCityServiceImpl;
+import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.dao.*;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
+import com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper;
+import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
+import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
+import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
+import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import com.stylefeng.guns.modular.transfer.dao.OrderTransferMapper;
+import com.stylefeng.guns.modular.transfer.model.OrderTransferCar;
+import com.stylefeng.guns.modular.transfer.server.IOrderTransferService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.util.StringUtils;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.util.*;
+
+
+@Service
+public class OrderTransferServiceImpl extends ServiceImpl<OrderTransferMapper, OrderTransferCar> implements IOrderTransferService {
+
+    @Resource
+    private OrderPrivateCarMapper orderPrivateCarMapper;
+
+    @Resource
+    private CarServiceMapper carServiceMapper;
+
+
+    @Resource
+    private OrderTaxiMapper orderTaxiMapper;
+
+    @Resource
+    private SensitiveWordsMapper sensitiveWordsMapper;
+
+    @Resource
+    private UserActivityDiscount1Mapper userActivityDiscount1Mapper;
+
+    @Resource
+    private SysIntegralMapper sysIntegralMapper;
+
+    @Resource
+    private OrderCrossCityMapper orderCrossCityMapper;
+
+    @Resource
+    private RegionMapper regionMapper;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private IDriverServiceService driverServiceService;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private ICompanyCityService companyCityService;
+
+    @Autowired
+    private IPushOrderService pushOrderService;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private ICancleOrderService cancleOrderService;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private RestTemplate internalRestTemplate;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+//    @Autowired
+//    private ICBCPayUtil icbcPayUtil;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private ChinaMobileUtil chinaMobileUtil;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    @Autowired
+    private IUserRedPacketRecordService userRedPacketRecordService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private GDFalconUtil gdFalconUtil;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private IOrderPositionService orderPositionService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+
+
+    public static List<Integer> orderIds = new ArrayList<>();
+
+    @Value("${callbackPath}")
+    private String callbackPath;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+    @Autowired
+    private OrderTransferMapper orderTransferMapper;
+
+
+
+
+    /**
+     * 专车下单操作
+     * @param serverCarModelId  服务车型id
+     * @param travelTime        出行时间
+     * @param reservation       是否预约(1=否,2=是)
+     * @param instead           是否代下单(0=否,1=是)
+     * @param startLon          起点经度
+     * @param startLat          起点纬度
+     * @param startAddress      起点详细地址
+     * @param endLon            终点经度
+     * @param endLat            终点纬度
+     * @param endAddress        终点详细地址
+     * @param name              乘客姓名
+     * @param phone             乘客电话
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat, String startLon, String startLat,
+                                          String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid) throws Exception {
+
+        //如果出行时间大于当前10分钟则默认为预约单
+        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
+            reservation = 2;
+        }
+
+        /**
+         * 1.下了即时单就不能下预约单和即时单
+         * 2.下了预约单和再下一张即时单不能再下预约单
+         */
+        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+        //TODO 加跨城判断是否有未完成订单
+        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderCrossCities.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+
+        //TODO 加接送机是否有未完成订单
+        List<OrderTransferCar> orderTransferCars = orderTransferMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderTransferCars.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+
+        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0 && reservation == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0 && reservation == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+        //TODO 加跨城判读是否有未完成订单
+        List<OrderCrossCity> orderCrossCityList = orderCrossCityMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderCrossCityList.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+        //TODO 加接送机判读是否已完成订单
+        List<OrderTransferCar> orderTransferCarList = orderTransferMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderTransferCarList.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+
+
+        if(ToolUtil.isEmpty(placementLon) || ToolUtil.isEmpty(placementLat) || 0 == Double.valueOf(placementLon) || 0 == Double.valueOf(placementLat)){
+            return ResultUtil.error("请先开启定位功能");
+        }
+
+        startAddress = startAddress.replaceAll("& #40;", "(");
+        startAddress = startAddress.replaceAll("& #41;", ")");
+        endAddress = endAddress.replaceAll("& #40;", "(");
+        endAddress = endAddress.replaceAll("& #41;", ")");
+        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
+            return ResultUtil.error("请选择服务车型");
+        }
+
+        OrderTransferCar orderPrivateCar = new OrderTransferCar();
+        orderPrivateCar.setType(1);
+        orderPrivateCar.setUserId(uid);
+        orderPrivateCar.setServerCarModelId(serverCarModelId);
+        orderPrivateCar.setOrderNum(this.getOrderNum());
+        orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
+        orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
+        orderPrivateCar.setPlacementAddress(geocode.get("address"));
+        orderPrivateCar.setStartLon(Double.valueOf(startLon));
+        orderPrivateCar.setStartLat(Double.valueOf(startLat));
+        orderPrivateCar.setStartAddress(startAddress);
+        orderPrivateCar.setEndLon(Double.valueOf(endLon));
+        orderPrivateCar.setEndLat(Double.valueOf(endLat));
+        orderPrivateCar.setEndAddress(endAddress);
+        orderPrivateCar.setSubstitute(instead);
+        orderPrivateCar.setPassengers(name);
+        orderPrivateCar.setPassengersPhone(phone);
+        if(instead == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
+            UserInfo userInfo = userInfoService.selectById(uid);
+            if(ToolUtil.isEmpty(userInfo.getPhone())){
+                return ResultUtil.error("请先绑定手机号码");
+            }
+            orderPrivateCar.setPassengers(userInfo.getName());
+            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
+        }
+        orderPrivateCar.setState(1);
+        orderPrivateCar.setInsertTime(new Date());
+        orderPrivateCar.setTravelTime(travelTime);
+        orderPrivateCar.setOrderType(reservation);
+        orderPrivateCar.setOrderSource(orderSource);
+        if(orderSource == 2){//扫码下单
+            Driver driver = driverService.selectById(driverId);
+            if(null == driver){
+                return ResultUtil.error("司机信息有误,无法完成下单");
+            }
+            if(driver.getAuthState() == 1){
+                return ResultUtil.error("司机信息还未完成审核,无法完成下单");
+            }
+            if(driver.getAuthState() == 3){
+                return ResultUtil.error("司机账户已被冻结,无法提供服务");
+            }
+            if(driver.getAuthState() == 4){
+                return ResultUtil.error("司机信息未通过审核,无法提供服务");
+            }
+            if(driver.getState() == 1){
+                return ResultUtil.error("司机还未上线,无法提供服务");
+            }
+            if(driver.getState() == 3){
+                return ResultUtil.error("司机正在服务中,无法提供服务");
+            }
+            List<DriverService> query = driverServiceService.query(driverId, 1);
+            if(query.size() == 0){
+                return ResultUtil.error("该司机不能服务此业务");
+            }
+
+            orderPrivateCar.setDriverId(driverId);
+            orderPrivateCar.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
+                    driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
+            orderPrivateCar.setState(2);
+            orderPrivateCar.setCarId(driver.getCarId());
+            CarService query1 = carServiceMapper.query(7, driver.getCarId());
+            orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
+            orderPrivateCar.setSnatchOrderTime(new Date());
+
+            //调用高德创建轨迹
+//            String s = gdFalconUtil.selectTerminal(driver.getPhone());
+//            String track = gdFalconUtil.createTrack(s);
+//            orderPrivateCar.setTrackId(track);
+
+            //调用移动的小号接口
+//            Map<String, String> geocode1 = gdMapGeocodingUtil.geocode(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
+//            Region region = regionMapper.query(geocode1.get("districtCode"));
+//            Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderPrivateCar.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1)));
+//            if(String.valueOf(map.get("code")).equals("200")){
+//                orderPrivateCar.setTelX(map.get("telX"));
+//                orderPrivateCar.setBindId(map.get("bindId"));
+//            }
+
+            driver.setState(3);
+            driverService.updateById(driver);
+        }
+
+        orderPrivateCar.setIsReassign(1);
+        orderPrivateCar.setIsDelete(1);
+        this.insert(orderPrivateCar);
+
+        if(orderSource == 2){//扫码下单
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 7, 2, 0);
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 7, 2, 0);
+                    pushUtil.pushDriverPosition(orderPrivateCar.getId(), 7);
+                }
+            }).start();
+        }
+
+
+        System.err.println("===="+orderPrivateCar.getState());
+        //推单操作
+        if(orderPrivateCar.getState() == 1){
+            this.pushOrder(orderPrivateCar);
+        }
+        System.err.println("===="+orderPrivateCar.getState());
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您的接送机订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
+
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(orderPrivateCar.getId());
+        return ResultUtil.success(baseWarpper);
+    }
+
+    @Override
+    public ResultUtil<BaseWarpper> saveOrderPrivateCars(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat,
+                                                        String startLon, String startLat, String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid) throws Exception {
+        //如果出行时间大于当前10分钟则默认为预约单
+        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
+            reservation = 2;
+        }
+
+        /**
+         * 1.下了即时单就不能下预约单和即时单
+         * 2.下了预约单和再下一张即时单不能再下预约单
+         */
+        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0){
+            return ResultUtil.error("有未完成的订单");
+        }
+
+        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6, 7, 11);
+        if(orderPrivateCars.size() > 0 && reservation == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
+        if(list.size() > 0 && reservation == 2){
+            return ResultUtil.error("有未完成的订单");
+        }
+        if(ToolUtil.isEmpty(placementLon) || ToolUtil.isEmpty(placementLat) || 0 == Double.valueOf(placementLon) || 0 == Double.valueOf(placementLat)){
+            return ResultUtil.error("请先开启定位功能");
+        }
+
+        startAddress = startAddress.replaceAll("& #40;", "(");
+        startAddress = startAddress.replaceAll("& #41;", ")");
+        if(StringUtils.hasLength(endAddress)){
+            endAddress = endAddress.replaceAll("& #40;", "(");
+            endAddress = endAddress.replaceAll("& #41;", ")");
+        }
+        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
+            return ResultUtil.error("请选择服务车型");
+        }
+
+        OrderTransferCar orderPrivateCar = new OrderTransferCar();
+        orderPrivateCar.setType(type);
+        orderPrivateCar.setUserId(uid);
+        orderPrivateCar.setServerCarModelId(serverCarModelId);
+        orderPrivateCar.setOrderNum(this.getOrderNum());
+        orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
+        orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
+        orderPrivateCar.setPlacementAddress(geocode.get("address"));
+        orderPrivateCar.setStartLon(Double.valueOf(startLon));
+        orderPrivateCar.setStartLat(Double.valueOf(startLat));
+        orderPrivateCar.setStartAddress(startAddress);
+        if(StringUtils.hasLength(endAddress)){
+            orderPrivateCar.setEndLon(Double.valueOf(endLon));
+            orderPrivateCar.setEndLat(Double.valueOf(endLat));
+            orderPrivateCar.setEndAddress(endAddress);
+        }
+        orderPrivateCar.setSubstitute(instead);
+        orderPrivateCar.setPassengers(name);
+        orderPrivateCar.setPassengersPhone(phone);
+        if(instead == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
+            UserInfo userInfo = userInfoService.selectById(uid);
+            if(ToolUtil.isEmpty(userInfo.getPhone())){
+                return ResultUtil.error("请先绑定手机号码");
+            }
+            orderPrivateCar.setPassengers(userInfo.getName());
+            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
+        }
+        orderPrivateCar.setState(1);
+        orderPrivateCar.setInsertTime(new Date());
+        orderPrivateCar.setTravelTime(travelTime);
+        orderPrivateCar.setOrderType(reservation);
+        orderPrivateCar.setOrderSource(orderSource);
+        if(orderSource == 2){//扫码下单
+            Driver driver = driverService.selectById(driverId);
+            if(null == driver){
+                return ResultUtil.error("司机信息有误,无法完成下单");
+            }
+            if(driver.getAuthState() == 1){
+                return ResultUtil.error("司机信息还未完成审核,无法完成下单");
+            }
+            if(driver.getAuthState() == 3){
+                return ResultUtil.error("司机账户已被冻结,无法提供服务");
+            }
+            if(driver.getAuthState() == 4){
+                return ResultUtil.error("司机信息未通过审核,无法提供服务");
+            }
+            if(driver.getState() == 1){
+                return ResultUtil.error("司机还未上线,无法提供服务");
+            }
+            if(driver.getState() == 3){
+                return ResultUtil.error("司机正在服务中,无法提供服务");
+            }
+            List<DriverService> query = driverServiceService.query(driverId, 1);
+            if(query.size() == 0){
+                return ResultUtil.error("该司机不能服务此业务");
+            }
+
+            orderPrivateCar.setDriverId(driverId);
+            orderPrivateCar.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
+                    driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
+            orderPrivateCar.setState(2);
+            orderPrivateCar.setCarId(driver.getCarId());
+            CarService query1 = carServiceMapper.query(1, driver.getCarId());
+            orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
+            orderPrivateCar.setSnatchOrderTime(new Date());
+
+            //调用高德创建轨迹
+//            String s = gdFalconUtil.selectTerminal(driver.getPhone());
+//            String track = gdFalconUtil.createTrack(s);
+//            orderPrivateCar.setTrackId(track);
+
+            //调用移动的小号接口
+//            Map<String, String> geocode1 = gdMapGeocodingUtil.geocode(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
+//            Region region = regionMapper.query(geocode1.get("districtCode"));
+//            Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderPrivateCar.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1)));
+//            if(String.valueOf(map.get("code")).equals("200")){
+//                orderPrivateCar.setTelX(map.get("telX"));
+//                orderPrivateCar.setBindId(map.get("bindId"));
+//            }
+
+            driver.setState(3);
+            driverService.updateById(driver);
+        }
+
+        orderPrivateCar.setIsReassign(1);
+        orderPrivateCar.setIsDelete(1);
+        this.insert(orderPrivateCar);
+
+        if(orderSource == 2){//扫码下单
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 7, 2, 0);
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 7, 2, 0);
+                    pushUtil.pushDriverPosition(orderPrivateCar.getId(), 7);
+                }
+            }).start();
+        }
+
+        //推单操作
+        if(orderPrivateCar.getState() == 1){
+            this.pushOrder(orderPrivateCar);
+        }
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您的专车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
+
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setId(orderPrivateCar.getId());
+        return ResultUtil.success(baseWarpper);
+    }
+
+    /**
+     * 下单后继续等待
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil pushOrderPrivateCar(Integer id) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(id);
+        if(null == orderPrivateCar){
+            return ResultUtil.error("推送订单失败,订单信息有误");
+        }
+        if(orderPrivateCar.getState() != 1){
+            return ResultUtil.error("订单已被司机接单,不能重复推送");
+        }
+        //处理摆渡订单的继续推单操作
+
+            this.pushOrder(orderPrivateCar);
+
+        return ResultUtil.success();
+    }
+
+    @Override
+    public ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(id);
+        if(null == orderPrivateCar){
+            return ResultUtil.error("获取数据失败,订单信息有误");
+        }
+        double amount = 0;
+        CancleOrder query = cancleOrderService.query(orderPrivateCar.getType(), 7, orderPrivateCar.getCompanyId());
+        if(null != orderPrivateCar.getDriverId() &&
+                (orderPrivateCar.getSnatchOrderTime().getTime()-8L * 60 * 60 * 1000 + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况
+            if(null != query){
+                amount += query.getMoney();
+            }
+        }
+        BaseWarpper baseWarpper = new BaseWarpper();
+        baseWarpper.setAmount(amount);
+        return ResultUtil.success(baseWarpper);
+    }
+
+    @Override
+    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(remark)){
+            if(ToolUtil.isNotEmpty(remark)){
+                List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
+                for(SensitiveWords s : sensitiveWords){
+                    remark = remark.replaceAll(s.getContent(), "***");
+                }
+            }
+        }
+
+        OrderTransferCar orderPrivateCar = this.selectById(id);
+        Integer integer = null;
+        if(null == orderPrivateCar){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderPrivateCar.getState() > 5 && orderPrivateCar.getState() != 11){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+        if(null == orderPrivateCar.getDriverId()){//没有接单的情况
+                integer = orderCancelService.saveData(id, 7, "无司机接单", "无司机接单", null, null, 2, 1, uid);
+                orderPrivateCar.setState(10);
+                this.updateById(orderPrivateCar);
+        }else {
+            CancleOrder query = cancleOrderService.query(1, 7, orderPrivateCar.getCompanyId());
+            if (null != query) {
+
+                long snatchTimeMs = orderPrivateCar.getSnatchOrderTime().getTime() - 8 * 60 * 60 * 1000;
+                long futureTimeMs = snatchTimeMs + query.getMinuteNum() * 60 * 1000;
+                long currentTimeMs = System.currentTimeMillis();
+
+                if (futureTimeMs < currentTimeMs){
+                    System.out.printf("1111111111");
+                }
+                if (query.getMoney().compareTo(0D) > 0){
+                    System.out.printf("22222222222");
+                }
+
+
+
+                if ((orderPrivateCar.getSnatchOrderTime().getTime() - 8 * 60 * 60 * 1000 + query.getMinuteNum() * 60 * 1000) < System.currentTimeMillis() && query.getMoney().compareTo(0D) > 0) {//收费的情况
+                    orderPrivateCar.setState(12);
+                    this.updateById(orderPrivateCar);
+                    integer = orderCancelService.saveData(id, 7, reason, remark, null, query.getMoney(), 1, 1, uid);
+                } else {
+                    integer = orderCancelService.saveData(id, 7, reason, remark, null, null, 2, 1, uid);
+
+                    orderPrivateCar.setState(10);
+                    this.updateById(orderPrivateCar);
+                }
+                this.deleteTask(id);//删除定时任务
+
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 7, orderPrivateCar.getState(), 0);
+                        System.err.println("推送取消操作---------------------");
+                    }
+                }).start();
+
+                //修改司机为空闲
+                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+                driver.setState(2);
+                driverService.updateById(driver);
+            }else{
+                return ResultUtil.error("请完善后台取消规则设置");
+            }
+
+        }
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){
+                    //上传数据
+                    pushMinistryOfTransportUtil.transOrderCancel(orderPrivateCar.getId());
+                }
+            }
+        }).start();
+
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "您已成功取消出行订单,谢谢使用!", orderPrivateCar.getUserId(), 1);
+        Map<String, Object> map = new HashMap<>();
+        map.put("id", integer);
+        return ResultUtil.success(map);
+    }
+
+
+    /**
+     * 取消订单操作
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil cancleOrderPrivateCar(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(id);
+        Integer uid = orderPrivateCar.getUserId();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+
+        if(null == orderPrivateCar){
+            return ResultUtil.error("取消订单失败,订单信息有误");
+        }
+        if(orderPrivateCar.getState() != 12){
+            return ResultUtil.error("取消订单失败,不合法的操作");
+        }
+        OrderCancel orderCancel = null;
+        if(null == cancleId){
+            orderCancel = orderCancelService.query(id, 7, null, null, 1);
+        }else{
+            orderCancel = orderCancelService.selectById(cancleId);
+        }
+
+        CancleOrder query = cancleOrderService.query(orderPrivateCar.getType(), 7, orderPrivateCar.getCompanyId());
+        if(null != query){
+            if(payType == 1){//微信支付
+
+                String value = redisUtil.getValue("appletOpenId");
+                String appletsOpenId = null;
+                if(ToolUtil.isNotEmpty(value)){
+                    JSONObject jsonObject = JSON.parseObject(value);
+                    appletsOpenId = jsonObject.getString(uid.toString());
+                }else{
+                    appletsOpenId = userInfo.getAppletsOpenId();
+                }
+                orderCancel.setPayType(1);
+                orderCancelService.updateById(orderCancel);
+                String app = type == 1 ? "APP" : "JSAPI";
+                resultUtil = payMoneyUtil.weixinpay("订单取消", "", id + "_7_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/wxCancelOrderTaxi", app, userInfo.getAppletsOpenId());
+                paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 7, 1, query.getMoney(), "", 1);//添加预支付数据
+
+
+//                String value = redisUtil.getValue("appletOpenId");
+//                String appletsOpenId = null;
+//                if(ToolUtil.isNotEmpty(value)){
+//                    JSONObject jsonObject = JSON.parseObject(value);
+//                    appletsOpenId = jsonObject.getString(uid.toString());
+//                }else{
+//                    appletsOpenId = userInfo.getAppletsOpenId();
+//                }
+//                orderCancel.setPayType(1);
+//                orderCancelService.updateById(orderCancel);
+//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",1", 9, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/wxCancelOrderTaxi", "", type, appletsOpenId);
+//                if(map.get("code").equals("200")){
+//                    paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 1, query.getMoney(), map.get("order_id"), 1);//添加预支付数据
+//                    resultUtil = ResultUtil.success(map.get("data"));
+//                }else{
+//                    resultUtil = ResultUtil.error(map.get("msg"), "");
+//                }
+            }
+            if(payType == 2){//支付宝支付
+                orderCancel.setPayType(2);
+                orderCancelService.updateById(orderCancel);
+
+                resultUtil = payMoneyUtil.alipay("订单取消", "订单取消", "", id + "_7_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/aliCancelOrderTaxi");
+                paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 7, 2, query.getMoney(), "", 1);//添加预支付数据
+
+//                orderCancel.setPayType(2);
+//                orderCancelService.updateById(orderCancel);
+//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",1", 10, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/aliCancelOrderTaxi", "", type, null);
+//                if(map.get("code").equals("200")){
+//                    paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 2, query.getMoney(), map.get("order_id"), 1);//添加预支付数据
+//                    resultUtil = ResultUtil.success(map.get("data"));
+//                }else{
+//                    resultUtil = ResultUtil.error(map.get("msg"), "");
+//                }
+            }
+            if(payType == 3){//余额支付
+                if(userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()){
+                    return ResultUtil.error("余额不足,无法完成支付");
+                }
+
+                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                //添加交易明细
+                transactionDetailsService.saveData(uid, "取消订单", query.getMoney(), 2, 1, 1, 7, id);
+                userInfoService.updateById(userInfo);
+
+                //解除小号绑定
+                if(orderPrivateCar.getBindId() != null){
+                    chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId());
+                }
+
+                orderPrivateCar.setState(10);
+                orderPrivateCar.setTelX("");
+                orderPrivateCar.setBindId("");
+                this.updateById(orderPrivateCar);
+
+                orderCancel.setState(2);
+                orderCancel.setPayType(3);
+                orderCancelService.updateById(orderCancel);
+
+                //添加已收入明细
+                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 7, query.getMoney());
+
+                this.deleteTask(id);//删除定时任务
+
+//                new Thread(new Runnable() {
+//                    @Override
+//                    public void run() {
+//                        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+//                    }
+//                }).start();
+
+                //添加消息
+                systemNoticeService.addSystemNotice(1, "您已使用余额成功支付取消订单费用,谢谢使用!", orderPrivateCar.getUserId(), 1);
+            }
+        }
+        return resultUtil;
+    }
+
+
+    /**
+     * 推送抢单数据
+     * @param orderPrivateCar
+     * @throws Exception
+     */
+    public void pushOrder(OrderTransferCar orderPrivateCar) throws Exception{
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    orderIds.add(orderPrivateCar.getId());//添加记录,防止调用接口重复提醒无人接单
+                    String vehicle = redisUtil.getValue("VEHICLE");
+                    List<Integer> integers = new ArrayList<>();
+                    if(ToolUtil.isNotEmpty(vehicle)){
+                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
+                    }
+                    Company query = companyCityService.query(String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司
+                    List<PushOrder> querys = pushOrderService.querys(null, 7, query.getId());//获取需要推送的次数
+                    for(int i = 1; i <= querys.size(); i++){
+                        PushOrder pushOrder = pushOrderService.querys(i, 7, query.getId()).get(0);
+                        //获取空闲司机
+                        List<Driver> list = driverService.queryIdleDriver(7, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+                        if(list.size() > 0){
+                            double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
+                            int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
+                            list = list.subList(0, lastIndex);//获取空闲司机中占比数据
+                            for(Driver driver : list){//开始进行推送
+                                boolean bo = false;
+                                for(Integer integer : integers){
+                                    if(integer.compareTo(driver.getId()) == 0){
+                                        bo = true;
+                                        break;
+                                    }
+                                }
+                                if(bo){
+                                    continue;
+                                }
+                                pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 7, orderPrivateCar.getState(), pushOrder.getPushTime());
+                            }
+                        }
+                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
+//                        Integer state = orderPrivateCarMapper.selectById(orderPrivateCar.getId()).getState();
+                        Integer state  = orderTransferMapper.selectById(orderPrivateCar.getId()).getState();
+                        if(state > 1){
+                            break;
+                        }
+                        if(i == 3 && state == 1){
+                            pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 7);
+                            orderIds.remove(orderPrivateCar.getId());
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+    }
+
+    @Override
+    public synchronized String getOrderNum() throws Exception{
+        int size = this.selectCount(null);
+        return "TRANSFER" + String.valueOf(1000000 + size + 1).substring(1);
+    }
+
+    /**
+     * 删除定时任务
+     * @param orderId
+     */
+    @Override
+    public void deleteTask(Integer orderId){
+        //发送验证码短信
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("orderId", orderId + "");
+        params.add("orderType", "7");
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = internalRestTemplate.postForObject("http://driver-server/base/netty/deleteTask", requestEntity, String.class);
+        JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+        if(jsonObject.getIntValue("code") != 200){
+            System.err.println("调用driver-server出错了");
+        }
+    }
+
+    @Override
+    public Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        map.put("balance", userInfo.getBalance());
+        OrderTransferCar orderPrivateCar = this.selectById(orderId);
+        int i = userCouponRecordService.queryAvailable(uid, orderPrivateCar.getCompanyId(), 1, 7, orderPrivateCar.getOrderMoney());
+        i = i + userCouponRecordService.queryAvailable(uid, orderPrivateCar.getCompanyId(), 1, 0, orderPrivateCar.getOrderMoney());
+        map.put("coupon", i);
+        return map;
+    }
+
+    @Override
+    public List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(orderId);
+        List<Map<String, Object>> list = userCouponRecordService.queryCoupon(uid, orderPrivateCar.getCompanyId(), 1, 7, orderPrivateCar.getOrderMoney(), pageNum, size);
+        List<Map<String, Object>> list1 = userCouponRecordService.queryCoupon(uid, orderPrivateCar.getCompanyId(), 1, 0, orderPrivateCar.getOrderMoney(), pageNum, size);
+        list.addAll(list1);
+        return list;
+    }
+
+    @Override
+    public ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(orderId);
+        if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){
+            return ResultUtil.error("订单已完成支付,不允许重复支付");
+        }
+        if(orderPrivateCar.getState() != 7){
+            return ResultUtil.error("订单不在待支付状态,不允许支付");
+        }
+        Integer uid = orderPrivateCar.getUserId();
+        Double orderMoney = orderPrivateCar.getOrderMoney();
+        UserInfo userInfo = userInfoService.selectById(uid);
+        ResultUtil resultUtil = ResultUtil.success();
+        orderPrivateCar.setCouponMoney(0D);//初始化历史数据
+        orderPrivateCar.setCouponId(null);
+
+        //计算优惠券
+        UserCouponRecord userCouponRecord = null;
+        if(null != couponId){
+            userCouponRecord = userCouponRecordService.selectById(couponId);
+            if(userCouponRecord.getCompanyId() != orderPrivateCar.getCompanyId()){
+                return ResultUtil.error("优惠券不能用于此订单");
+            }
+            if(userCouponRecord.getState() == 2){
+                return ResultUtil.error("优惠券已使用");
+            }
+            if(userCouponRecord.getState() == 3){
+                return ResultUtil.error("优惠券已过期");
+            }
+            if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 7){
+                return ResultUtil.error("优惠券不能用于此类型订单");
+            }
+            if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){
+                return ResultUtil.error("优惠券不能用于此订单");
+            }
+            orderMoney = orderMoney - userCouponRecord.getMoney();
+            orderPrivateCar.setCouponMoney(userCouponRecord.getMoney());
+            orderPrivateCar.setCouponId(couponId);
+        }
+
+
+        //计算红包
+        UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderPrivateCar.getCompanyId(), 1, 7, orderMoney);
+        if(null != query && query.getMoney().compareTo(orderMoney) < 0){
+            orderMoney = orderMoney - query.getMoney();
+            orderPrivateCar.setRedPacketMoney(query.getMoney());
+            orderPrivateCar.setRedPacketId(query.getId());
+        }
+
+        //计算折扣
+        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderPrivateCar.getCompanyId());
+        if(null != query2){
+            Double special = query2.getTaxi();
+            orderPrivateCar.setDiscount(special);
+            double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+            if(orderMoney.compareTo(v) > 0){
+                orderPrivateCar.setDiscountMoney(orderMoney - v);
+                orderPrivateCar.setActivityId(query2.getId());
+                orderMoney = v;
+            }
+        }
+        if(payType == 1){//微信支付
+            String app = type == 1 ? "APP" : "JSAPI";
+            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_7_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
+            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 7, 1, orderMoney, "", 1);//添加预支付数据
+        }
+        if(payType == 2) {//支付宝支付
+            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_7_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
+            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 7, 2, orderMoney, "", 1);//添加预支付数据
+        }
+
+
+//        if(payType == 1){//微信支付
+//            String value = redisUtil.getValue("appletOpenId");
+//            String appletsOpenId = null;
+//            if(ToolUtil.isNotEmpty(value)){
+//                JSONObject jsonObject = JSON.parseObject(value);
+//                appletsOpenId = jsonObject.getString(uid.toString());
+//            }else{
+//                appletsOpenId = userInfo.getAppletsOpenId();
+//            }
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",1", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId);
+//            if(map.get("code").equals("200")){
+//                paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            }else{
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+//        if(payType == 2) {//支付宝支付
+//            Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",1", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null);
+//            if (map.get("code").equals("200")) {
+//                paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据
+//                resultUtil = ResultUtil.success(map.get("data"));
+//            } else {
+//                resultUtil = ResultUtil.error(map.get("msg"), "");
+//            }
+//        }
+        if(payType == 3){//余额支付
+            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
+                return ResultUtil.error("余额不足,无法完成支付");
+            }
+
+            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+
+            SysIntegral query1 = sysIntegralMapper.query(orderPrivateCar.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
+
+            //添加交易明细
+            transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 7, orderId);
+            userInfoService.updateById(userInfo);
+
+            orderPrivateCar.setState(8);
+            orderPrivateCar.setPayType(3);
+            orderPrivateCar.setPayMoney(orderMoney);
+
+            //处理优惠券和红包
+            if(null != userCouponRecord){
+                userCouponRecord.setState(2);
+                userCouponRecord.setEndTime(new Date());
+                userCouponRecordService.updateById(userCouponRecord);
+            }
+            if(null != query){
+                query.setState(2);
+                query.setEndTime(new Date());
+                userRedPacketRecordService.updateById(query);
+            }
+
+            //添加已收入明细
+            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
+            Double speMoney = company.getTransferMoney();
+            BigDecimal d = null;//企业收入
+            BigDecimal c = null;//司机收入
+            if(company.getIsTransferFixedOrProportional()!=null&&company.getIsTransferFixedOrProportional() == 2){//固定
+                d = new BigDecimal(speMoney);
+                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
+            }
+            if(company.getIsTransferFixedOrProportional()!=null&&company.getIsTransferFixedOrProportional() == 1){//比例
+                Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
+                d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 7, d.doubleValue());
+            incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 7, c.doubleValue());
+            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 7, orderPrivateCar.getState(), 0);
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 7, orderPrivateCar.getState(), 0);
+                }
+            }).start();
+
+            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1);
+
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){//上传数据
+                        pushMinistryOfTransportUtil.operatePayTransfer(orderId);
+                    }
+                }
+            }).start();
+        }
+
+        this.updateAllColumnById(orderPrivateCar);
+        return resultUtil;
+    }
+
+    @Override
+    public synchronized ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(orderId);
+        Integer companyId = orderPrivateCar.getCompanyId();
+
+        Map<String, Object> query = userActivityRedenvelopeService.query(companyId, orderPrivateCar.getTravelTime());
+        Double money = 0D;
+        BaseWarpper baseWarpper = new BaseWarpper();
+        if(null != query){
+            Integer type = Integer.valueOf(String.valueOf(query.get("type")));
+            if(type == 1){//固定金额
+                money = Double.valueOf(String.valueOf(query.get("money")));
+            }else{//随机金额
+                Double startMoney = Double.valueOf(String.valueOf(query.get("startMoney")));
+                Double endMoney = Double.valueOf(String.valueOf(query.get("endMoney")));
+                int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue();
+                Random random = new Random();
+                int num = random.nextInt(i);
+                money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+            }
+            //判断当前红包是否大于剩余可领取总金额
+            if(money.compareTo(Double.valueOf(query.get("lavePrice").toString())) > 0){
+                baseWarpper.setAmount(0D);
+                return ResultUtil.success(baseWarpper);
+            }
+        }
+        baseWarpper.setAmount(money);
+
+        if(money > 0){
+            //添加临时红包数据
+            UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
+            userRedPacketRecord.setMoney(money);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(new Date());
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(query.get("effective"))));
+            userRedPacketRecord.setExpirationTime(calendar.getTime());
+            userRedPacketRecord.setInsertTime(new Date());
+            userRedPacketRecord.setCompanyId(Integer.valueOf(String.valueOf(query.get("companyId"))));
+            userRedPacketRecord.setState(0);
+            userRedPacketRecord.setOrderId(orderPrivateCar.getId());
+            userRedPacketRecord.setOrderType(7);
+            userRedPacketRecord.setUserId(orderPrivateCar.getUserId());
+            userRedPacketRecordService.insert(userRedPacketRecord);
+        }
+
+        return ResultUtil.success(baseWarpper);
+    }
+
+    @Override
+    public synchronized ResultUtil shareRedEnvelope(Integer orderId) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(orderId);
+        UserRedPacketRecord query = userRedPacketRecordService.query_(orderPrivateCar.getUserId(), orderPrivateCar.getCompanyId(), 0, 7, null);
+        if(null != query){
+            Double money = query.getMoney();
+            Map<String, Object> map = userActivityRedenvelopeService.query(orderPrivateCar.getCompanyId(), orderPrivateCar.getTravelTime());
+            Double laveMoney = Double.valueOf(String.valueOf(map.get("laveMoney")));
+            if(money.compareTo(laveMoney) > 0){
+                return ResultUtil.error("手速太慢了,红包已派发完啦!");
+            }
+            //判断当前红包是否大于剩余可领取总金额
+            if(money.compareTo(Double.valueOf(map.get("lavePrice").toString())) > 0){
+                return ResultUtil.error("手速太慢了,红包已派发完啦!");
+            }
+            double v = new BigDecimal(laveMoney).subtract(new BigDecimal(money)).doubleValue();
+
+            UserActivityRedenvelope id = userActivityRedenvelopeService.selectById(String.valueOf(map.get("id")));
+            id.setLaveMoney(v);
+            id.setLavePrice(new BigDecimal(id.getLavePrice() - money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            userActivityRedenvelopeService.updateById(id);
+
+            query.setState(1);
+            query.setRedPacketActivityId(id.getId());
+            userRedPacketRecordService.updateById(query);
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 取消订单支付后的处理
+     * @param id            订单=id
+     * @param order_id      工行支付单号
+     * @param type          1=微信,2=支付宝
+     * @throws Exception
+     */
+    @Override
+    public void payCancelOrderPrivateCar(Integer id, String order_id, Integer type) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(id);
+        PaymentRecord query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 7, type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "取消订单", query.getAmount(), 2, 1, 1, 7, query.getOrderId());
+            orderPrivateCar.setState(10);
+            //解除小号绑定
+            if(orderPrivateCar.getBindId() != null){
+                chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId());
+            }
+            orderPrivateCar.setBindId("");
+            orderPrivateCar.setTelX("");
+            this.updateById(orderPrivateCar);
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            OrderCancel query1 = orderCancelService.query(query.getOrderId(), query.getOrderType(), query.getAmount(), query.getPayType(), 1);
+            if (null != query1){
+                query1.setState(2);
+                orderCancelService.updateById(query1);
+            }
+
+            //添加已收入明细
+            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 7, query.getAmount());
+
+            this.deleteTask(orderPrivateCar.getId());//删除定时任务
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+//            new Thread(new Runnable() {
+//                @Override
+//                public void run() {
+//                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+//                }
+//            }).start();
+
+            //添加消息
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功支付取消订单费用,谢谢使用!", orderPrivateCar.getUserId(), 1);
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+
+    @Override
+    public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(id);
+        PaymentRecord query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 7, type, 1);
+        if(null != query){
+            //添加交易明细
+            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, 7, query.getOrderId());
+            orderPrivateCar.setState(8);
+            orderPrivateCar.setPayType(type);
+            orderPrivateCar.setPayMoney(query.getAmount());
+            this.updateById(orderPrivateCar);
+
+            UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
+            SysIntegral query1 = sysIntegralMapper.query(orderPrivateCar.getCompanyId());
+            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
+            userInfoService.updateById(userInfo);
+
+            //处理优惠券和红包
+            if(null != orderPrivateCar.getCouponId()){
+                UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
+                userCouponRecord.setState(2);
+                userCouponRecord.setEndTime(new Date());
+                userCouponRecordService.updateById(userCouponRecord);
+            }
+            if(null != orderPrivateCar.getRedPacketId()){
+                UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
+                userRedPacketRecord.setState(2);
+                userRedPacketRecord.setEndTime(new Date());
+                userRedPacketRecordService.updateById(userRedPacketRecord);
+            }
+
+
+            query.setState(2);
+            query.setCode(order_id);
+            paymentRecordService.updateById(query);
+
+            //添加已收入明细
+            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
+            Double taxi = company.getSpeMoney();
+            BigDecimal d = null;//企业收入
+            BigDecimal c = null;//司机收入
+            if(company.getIsSpeFixedOrProportional() == 2){//固定
+                d = new BigDecimal(taxi);
+                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            if(company.getIsSpeFixedOrProportional() == 1){//比例
+                Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
+                d = new BigDecimal(price).multiply(new BigDecimal(taxi).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            }
+            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 7, d.doubleValue());
+            incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 7, c.doubleValue());
+            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+            driverService.updateById(driver);
+
+            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 7, orderPrivateCar.getState(), 0);
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 7, orderPrivateCar.getState(), 0);
+                }
+            }).start();
+
+            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成出行订单支付,谢谢使用!", orderPrivateCar.getUserId(), 1);
+
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){//上传数据
+                        pushMinistryOfTransportUtil.operatePayTransfer(orderPrivateCar.getId());
+                    }
+                }
+            }).start();
+
+        }else{
+            System.err.println("预支付数据异常(orderId = "  + id + ")");
+        }
+    }
+
+    @Override
+    public List<OrderTransferCar> queryOrder(Integer uid, Integer... state) throws Exception {
+        return orderTransferMapper.queryByState_(uid, state);
+    }
+
+    @Override
+    public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception {
+        pageNum = (pageNum - 1) * size;
+        List<Map<String, Object>> maps = orderTransferMapper.queryMyOrderList(uid, pageNum, size);
+        for(Map<String, Object> map : maps){
+            if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
+                map.put("state", map.get("oldState"));
+            }
+        }
+        return maps;
+    }
+
+    @Override
+    public List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney, Double endMoney, Integer uid) throws Exception {
+        startTime = dateUtil.getStartOrEndDate(startTime, "start");
+        endTime = dateUtil.getStartOrEndDate(endTime, "end");
+        return orderTransferMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
+    }
+
+    @Override
+    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
+        Map<String, Object> map = orderTransferMapper.queryOrderInfo(orderId);
+        if(null != map.get("reassignNotice") && Integer.valueOf(String.valueOf(map.get("reassignNotice"))) == 2){//改派完成,重新获取了新的司机数据,开始修改数据防止继续调用
+            OrderTransferCar orderPrivateCar = this.selectById(orderId);
+            orderPrivateCar.setReassignNotice(0);
+            this.updateById(orderPrivateCar);
+        }
+        if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
+            map.put("state", map.get("oldState"));
+        }
+        if(Integer.valueOf(String.valueOf(map.get("state"))) != 8 && Integer.valueOf(String.valueOf(map.get("state"))) != 9){
+            map.put("redPacketMoney", null);
+            map.put("couponMoney", null);
+        }
+
+        String driverId = redisUtil.getValue("DEVICE_" + map.get("driverId"));
+        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
+        map.put("orderType", 7);
+        return map;
+    }
+
+    @Override
+    public List<Map<String, Object>> queryMyTravelRecord(Integer uid) throws Exception {
+        return orderTransferMapper.queryMyTravelRecord(uid);
+    }
+
+
+
+    /**
+     * 获取服务中的订单数据
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception {
+        OrderTransferCar orderPrivateCar = this.selectById(orderId);
+        //计算预计距离和剩余时间
+        String value = redisUtil.getValue("DRIVER" + String.valueOf(orderPrivateCar.getDriverId()));
+        if(null == value || "".equals(value)){
+            System.err.println("司机没有上传位置信息");
+
+            //调用获取轨迹中的数据
+            List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 7);
+            if(list.size() > 0){
+                Map<String, Object> map = list.get(list.size() - 1);
+                value = map.get("lon") + "," + map.get("lat");
+            }
+
+        }
+        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), 1);
+        String d = "0";
+        String t = "0";
+        if(null == distance){
+            System.err.println("查询距离出错了");
+        }else{
+            d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
+            t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + "";
+        }
+        OrderServerWarpper orderServerWarpper = new OrderServerWarpper();
+        orderServerWarpper.setOrderId(orderPrivateCar.getId());
+        orderServerWarpper.setOrderType(1);
+        orderServerWarpper.setState(orderPrivateCar.getState());
+        orderServerWarpper.setLon(null != value ? value.split(",")[0] : "0.0");
+        orderServerWarpper.setLat(null != value ? value.split(",")[1] : "0.0");
+        orderServerWarpper.setReassignNotice(orderPrivateCar.getReassignNotice());
+        if(orderPrivateCar.getState() == 2 || orderPrivateCar.getState() == 3){//前往预约地
+            orderServerWarpper.setReservationMileage(d);
+            orderServerWarpper.setReservationTime(t);
+            orderServerWarpper.setServedMileage("0");
+            orderServerWarpper.setServedTime("0");
+            orderServerWarpper.setLaveMileage("0");
+            orderServerWarpper.setLaveTime("0");
+        }
+        if(orderPrivateCar.getState() == 5 || orderPrivateCar.getState() == 6){//服务中
+            distance = gdMapElectricFenceUtil.getDistance(value, orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), 1);
+            if(null == distance){
+                System.err.println("查询距离出错了");
+            }else{
+                d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
+                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + "";
+            }
+            orderServerWarpper.setReservationMileage("0");
+            orderServerWarpper.setReservationTime("0");
+            orderServerWarpper.setServedMileage(String.valueOf((null == orderPrivateCar.getMileage() ? 0 : orderPrivateCar.getMileage()) / 1000));
+            orderServerWarpper.setServedTime(Long.valueOf((new Date().getTime() - orderPrivateCar.getStartServiceTime().getTime()) / 60000).intValue() + "");
+            orderServerWarpper.setLaveMileage(d);
+            orderServerWarpper.setLaveTime(t);
+        }
+
+        return orderServerWarpper;
+    }
+
+
+    /**
+     * 获取红包使用记录
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception {
+        return orderTransferMapper.queryRedEnvelope(uid);
+    }
+
+
+
+    /**
+     * 获取下单推送完后没有司机接单的提醒
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public EndPushWarpper queryEndPush(Integer uid) throws Exception {
+        List<OrderTransferCar> list = orderTransferMapper.queryByState(uid, null, null, 1);
+        EndPushWarpper endPushWarpper = new EndPushWarpper();
+        if(list.size() > 0){
+            OrderTransferCar orderPrivateCar = list.get(0);
+            if(!orderIds.contains(orderPrivateCar.getId())){
+                endPushWarpper.setOrderId(orderPrivateCar.getId());
+                endPushWarpper.setOrderType(7);
+                endPushWarpper.setState(1);
+                List<PushOrder> querys = pushOrderService.querys(null, 2, orderPrivateCar.getCompanyId());//获取需要推送的次数
+                int time = 0;
+                for(int i = 1; i <= querys.size(); i++){
+                    PushOrder pushOrder = pushOrderService.querys(i, 2, orderPrivateCar.getCompanyId()).get(0);
+                    time += pushOrder.getPushTime() * 1000;
+                }
+                //当前时间减去推单总时间大于下单时间
+                if((System.currentTimeMillis() - time) > orderPrivateCar.getInsertTime().getTime()){
+                    endPushWarpper.setState(2);
+                }
+            }
+        }
+        return endPushWarpper;
+    }
+}
diff --git a/UserNTTravel/guns-admin/src/main/resources/META-INF/spring-devtools.properties b/UserNTTravel/guns-admin/src/main/resources/META-INF/spring-devtools.properties
new file mode 100644
index 0000000..3e72835
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/resources/META-INF/spring-devtools.properties
@@ -0,0 +1 @@
+restart.include.beetl=/beetl-2.8.5.jar
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/resources/application.yml b/UserNTTravel/guns-admin/src/main/resources/application.yml
new file mode 100644
index 0000000..a73d8cc
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/resources/application.yml
@@ -0,0 +1,122 @@
+server:
+  port: 8006
+
+guns:
+  swagger-open: true              #是否开启swagger (true/false)
+  kaptcha-open: false             #是否开启登录时验证码 (true/false)
+#  file-upload-path: d:/tmp       #文件上传目录(不配置的话为java.io.tmpdir目录)
+  spring-session-open: false      #是否开启spring session,如果是多机环境需要开启(true/false)
+  session-invalidate-time: 1800     #session失效时间(只在单机环境下生效,多机环境在SpringSessionConfig类中配置) 单位:秒
+  session-validation-interval: 900  #多久检测一次失效的session(只在单机环境下生效) 单位:秒
+
+spring:
+  application:
+    name: user-server
+  profiles:
+    active: dev
+  mvc:
+    static-path-pattern: /static/**
+    view:
+      prefix: /WEB-INF/view
+  devtools:
+    restart:
+      enabled: false
+      additional-paths: src/main/java
+      exclude: static/**,WEB-INF/view/**
+  servlet:
+    multipart:
+      max-request-size: 100MB
+      max-file-size: 100MB
+
+mybatis-plus:
+  typeAliasesPackage: com.stylefeng.guns.modular
+  configuration:
+    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
+
+
+logging:
+  level.root: error
+
+
+eureka:
+  client:
+    service-url: #注册中心地址
+      defaultZone: http://sinata:sinata@127.0.0.1:8000/eureka #启用身份验证的方式连接
+    register-with-eureka: true #在注册中心进行注册
+    fetch-registry: true #从Eureka中获取注册信息。
+
+---
+
+
+#配置Swagger接口扫描范围
+swagger:
+  base-package: com.stylefeng.guns.modular
+
+
+spring:
+  datasource:
+    url: jdbc:mysql://127.0.0.1:10633/hqtravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
+    username: root
+    password: HuanQiu@2024!
+    db-name: guns #用来搜集数据库的所有表
+    filters: wall,mergeStat
+#    url: jdbc:mysql://1.95.90.13:10633/hqtravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
+#    username: huanqiu
+#    password: HuanQiu@2024!
+#    db-name: guns #用来搜集数据库的所有表
+#    filters: wall,mergeStat
+
+#多数据源情况的配置
+guns:
+  muti-datasource:
+    open: false
+    url: jdbc:mysql://127.0.0.1:3306/guns_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
+    username: root
+    password: root
+    dataSourceNames:
+      - dataSourceGuns
+      - dataSourceBiz
+
+---
+
+
+
+wx:
+  grantType: authorization_code #填authorization_code
+  appid: wx66a25427a9e6f21e #应用唯一标识,在微信开放平台提交应用审核通过后获得
+  appSecret: 5ccdfc37576afe86b2a5532b88bfd147 #应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
+  appletsAppid: wx66a25427a9e6f21e #小程序APPid
+  appletsAppSecret: 5ccdfc37576afe86b2a5532b88bfd147 #
+  mchId: 1698002603 #微信支付分配的商户号
+  key: tX14preXrEwrBG4BSxi7RH4kbGfaf9Xk #key为商户平台设置的密钥key:
+
+---
+
+alipay:
+  appid: 2021003183602081  #应用程序唯一标识
+  appPrivateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCh2Oi+GQ1MolFx3+urEOPlYOFpUJhZlVHC2hooRsarMvI/XTnA/yR84QwkgqbZVSKLNyNuJ2MOcyuGGnNThlcgi6hq1sZCEOvxZrraLi85Zu295HPAcZdVNwWyOLSwiEQsS759fayDvVj0aVVIg88sy6NptpXgYtEpWj1NJkxrmb39fZeebPFnerDNDLeim5r6tnMcICTx41Cvkv23uXOeG79WY3F8e4DwsId/lc2VO8c0hQ2e3c2XXEYONSNSnnlLKtQT/gOu34ttKAeEc4SVeIKCsAG4XV4JxnnaJ7Muhvfpawf8jbOv+lYKd+JWUmbj6v0JXnD+uUBhWsojbWv7AgMBAAECggEBAJDmtYG0xi5tSMPOOZ2/knoD4ew7JxtVT41HXZHfw/D0vOQ0IAgFpnJTvl5VxvHfgfzoEcWGZ+5A+J+owMXwCcNupgt5XKk7ozJOyk2aeddHquSPS37pdBbsGyJ0GHnQllCeQ97wjGqqNKEmSR+SOwMdEqILwWXSsvb1/to6xsKxxlxSrTfCAGImmdbJ3latr5PWOcLwxxRArEuDb8j68pvbuwtGVueJu8q/hcoZ9ne8935wy/85HO91gl5CbJuqk/6YN39w/sazcHHsMo01j1TQlCSIV315nM1kNt4dmWcLWPFvG7TcOZNPSDA1BXTxEry6wimBBh0tETJY1mjxOckCgYEA24xF+/r7xdbenlB/uhw21i+gNLPEeJb2Ng6V6CwhX96g7QPdiymaSJn6sEeJTc0MPm0KCohtPdM+qDXCGq+5hLo0pI52ZCNYEUAZIuJrZLeZoK3b7RUAZjD3A2/LiTvMtZaomyovH9wLgDsn26oqUSLxw901FyL+9pxpBWg0z08CgYEAvLgcmTlLFJasoCOOIgTrxtvt0nqejKu691lEInQhg5KrjFSwljBSZ2043BgVA2Xl6oWopbXVUyOz/RvOdzdw8Jl6M430/FNu1rJRwRcMH31lYG66NTRZoRV9vN42qVYyXCGoaYPFHpmZnDdCs+/Pwu+V+VGQmnyfMlIWfRrKTZUCgYA4iaYYHukpaI0Jvfc2iT+B5t/d0pF88HtVLmpiUMMDekR85OrvhHYrziNls/Zi57QIe3IDhmCDdFwFW1qyHqCq0nzuB5XrccKjJpuShTZcyH8yhrNFGYxxxJhH9Uk3/QNZnAOtea6LCNKZYiKAihC9tj8GTnf2jleUUHEnKE+5NwKBgDD3oMwNNrMP6ZjfwOiI2FjQBiSAFpWvlaLKscgy0+Nc8lBGRU+jGC6oA4Hwabto/EBfEAR3avPYpsI9LdR3OUHkwPWRlwjF6VOiD16HyWh+VAiyknRtsff/KJISIqLLr+OCBD3kqAgpmNcU66Tey8zr98Eqbdf4ECKxdA5gHjAFAoGBAJISdjODKJgNDVKRzk5+EGoZ9buFyOuMxmTA0MbTScFidvVMt8jGc27b+AWcs54ZQcgGeNtl3c//K6vdrEBUTnR5tlLnlnFKzgOxlwI+i9eSOlWgz8T3+Ra3L5TIZ11kBO1I0/tB+ERLokZcgnNTERHapxr0Xu86zKjz548e/oqo #开发者应用私钥
+  alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAodjovhkNTKJRcd/rqxDj5WDhaVCYWZVRwtoaKEbGqzLyP105wP8kfOEMJIKm2VUiizcjbidjDnMrhhpzU4ZXIIuoatbGQhDr8Wa62i4vOWbtveRzwHGXVTcFsji0sIhELEu+fX2sg71Y9GlVSIPPLMujabaV4GLRKVo9TSZMa5m9/X2XnmzxZ3qwzQy3opua+rZzHCAk8eNQr5L9t7lznhu/VmNxfHuA8LCHf5XNlTvHNIUNnt3Nl1xGDjUjUp55SyrUE/4Drt+LbSgHhHOElXiCgrABuF1eCcZ52iezLob36WsH/I2zr/pWCnfiVlJm4+r9CV5w/rlAYVrKI21r+wIDAQAB #应用公钥
+  alipay_public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsi4M2NzIx0UQVa7pSXZnAqzNWgGaFmfjOrkwtlxnCdnqcl/9TnXNc86N+EBnBa7xKeb6hrGn/ZE+Ex6imZMp5V41+lJZ6Ynqk3zAvaPLgiq2DU4PHRBTaJZlcoBONemHgggGq2NqQRUUNfty9ZHZejDJic1WOX+BypEZgph1yZ6z4CcxeXXCHYlWViKvwGFRZtuvcypP3Uv7juIA460C1y/+etDxaUC4LPIxQJeCI9rPCTQb54rkJd0Htbvv525tVovhJxXvF9J/XE2LzYier7T8tQJ/TYGvVvZoMmyWWIO3SBuWwjp1nSh9tfbfXTRIUJjWVFTMS04WR6oG9tDS+QIDAQAB #支付宝公钥
+
+---
+
+juhe: #聚合数据
+  appKey: 75897e3a893ed777055efc44b7b68914 #
+
+
+---
+
+filePath: /usr/local/server/orderPostionFile/ #存储订单轨迹文件路径
+#filePath: C:/orderPostionFile/  #存储订单轨迹文件路径
+
+#支付回调地址
+#正式环境
+callbackPath: https://weilaigo.cn/user
+#测试环境
+#callbackPath: http://121.37.97.220:81/user
+
+
+---
+
+#交通部推送数据功能开关
+pushMinistryOfTransport: false
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/resources/ehcache.xml b/UserNTTravel/guns-admin/src/main/resources/ehcache.xml
new file mode 100644
index 0000000..1e47379
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/resources/ehcache.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="ehcache.xsd"
+         updateCheck="false" monitoring="autodetect"
+         dynamicConfig="true" >
+         
+    <diskStore path="java.io.tmpdir/ehcache"/>
+
+    <defaultCache
+            maxElementsInMemory="50000"
+            eternal="false"
+            timeToIdleSeconds="3600"
+            timeToLiveSeconds="3600"
+            overflowToDisk="true"
+            diskPersistent="false"
+            diskExpiryThreadIntervalSeconds="120"
+    />
+
+    <!-- 全局变量:永不过期-->
+    <cache name="CONSTANT"
+    	   maxElementsInMemory="50000"
+           eternal="true"
+    	   clearOnFlush="false"
+           overflowToDisk="true"
+           diskSpoolBufferSizeMB="1024"
+           maxElementsOnDisk="100000"
+           diskPersistent="false"
+           diskExpiryThreadIntervalSeconds="120"
+           memoryStoreEvictionPolicy="LFU"
+           transactionalMode="off">
+    </cache>
+
+</ehcache>
+
+    <!--
+	    maxElementsInMemory="10000" 	//Cache中最多允许保存的数据对象的数量
+		external="false" 				//缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期 	
+		timeToLiveSeconds="3600"  		//缓存的存活时间,从开始创建的时间算起
+		timeToIdleSeconds="3600"  		//多长时间不访问该缓存,那么ehcache 就会清除该缓存  
+		
+		这两个参数很容易误解,看文档根本没用,我仔细分析了ehcache的代码。结论如下:
+		1、timeToLiveSeconds的定义是:以创建时间为基准开始计算的超时时长;
+		2、timeToIdleSeconds的定义是:在创建时间和最近访问时间中取出离现在最近的时间作为基准计算的超时时长;
+		3、如果仅设置了timeToLiveSeconds,则该对象的超时时间=创建时间+timeToLiveSeconds,假设为A;
+		4、如果没设置timeToLiveSeconds,则该对象的超时时间=min(创建时间,最近访问时间)+timeToIdleSeconds,假设为B;
+		5、如果两者都设置了,则取出A、B最少的值,即min(A,B),表示只要有一个超时成立即算超时。
+		
+		overflowToDisk="true"    		//内存不足时,是否启用磁盘缓存  	
+		diskSpoolBufferSizeMB	//设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
+		maxElementsOnDisk		//硬盘最大缓存个数
+		diskPersistent			//是否缓存虚拟机重启期数据The default value is false	
+		diskExpiryThreadIntervalSeconds	//磁盘失效线程运行时间间隔,默认是120秒。
+		memoryStoreEvictionPolicy="LRU" //当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
+        clearOnFlush	//内存数量最大时是否清除
+        maxEntriesLocalHeap="0"  //堆内存中最大缓存对象数,0没有限制
+        maxEntriesLocalDisk="1000" //硬盘最大缓存个数。
+    -->
diff --git a/UserNTTravel/guns-admin/src/main/resources/logback-spring.xml b/UserNTTravel/guns-admin/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..e71e7aa
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/resources/logback-spring.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
+scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
+debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
+-->
+<!--文件名称需要采取官方规定的方式  带后缀-->
+<configuration scan="false" scanPeriod="60 seconds" debug="false">
+
+    <!-- 定义日志的根目录 -->
+    <property name="LOG_HOME" value="/usr/local/server/logs" />
+    <!--<property name="LOG_HOME" value="d:/logs/" />-->
+    <!-- 定义日志文件名称 -->
+    <property name="LOG_FILE_NAME" value="user_log"></property>
+
+    <!--按照官方规定  采用带后缀的命名方式,可以使用其高级Profile功能-->
+    <springProfile name="dev">
+        <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
+        <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+            <!--
+            日志输出格式:
+                %d表示日期时间,
+                %thread表示线程名,
+                %-5level:级别从左显示5个字符宽度
+                %logger{50} 表示logger名字最长50个字符,否则按照句点分割。
+                %msg:日志消息,
+                %n是换行符
+            -->
+            <layout class="ch.qos.logback.classic.PatternLayout">
+                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
+            </layout>
+        </appender>
+        <!--
+            logger主要用于存放日志对象,也可以定义日志类型、级别
+            name:表示匹配的logger类型前缀,也就是包的前半部分
+            level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
+            additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
+            false:表示只用当前logger的appender-ref,true:
+            表示当前logger的appender-ref和rootLogger的appender-ref都有效
+        -->
+        <!-- hibernate logger -->
+        <!-- <logger name="xxxx" level="debug" /> -->
+        <!-- Spring framework logger -->
+        <logger name="org.springframework" level="debug" additivity="false"></logger>
+        <!-- mybatis日志打印-->
+        <logger name="org.apache.ibatis" level="debug" />
+        <logger name="java.sql" level="debug" />
+        <logger name="com.stylefeng.guns.modular.system.dao" level="debug"></logger>
+
+        <!--
+        root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
+        要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。
+        -->
+        <root level="info">
+            <appender-ref ref="stdout" />
+        </root>
+    </springProfile>
+
+    <springProfile name="produce">
+        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
+        <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+            <!-- 指定日志文件的名称 -->
+            <file>${LOG_HOME}/${LOG_FILE_NAME}.log</file>
+            <!--
+            当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
+            TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。
+            -->
+            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                <!--
+                滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动
+                %i:当文件大小超过maxFileSize时,按照i进行文件滚动
+                -->
+                <fileNamePattern>${LOG_HOME}/${LOG_FILE_NAME}/%d{yyyy-MM-dd}/${LOG_FILE_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+                <!--
+                可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
+                且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
+                那些为了归档而创建的目录也会被删除。
+                -->
+                <MaxHistory>10</MaxHistory>
+                <!--
+                当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动
+                注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
+                -->
+                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                    <maxFileSize>100MB</maxFileSize>
+                </timeBasedFileNamingAndTriggeringPolicy>
+            </rollingPolicy>
+            <!-- 日志输出格式: -->
+            <layout class="ch.qos.logback.classic.PatternLayout">
+                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+            </layout>
+        </appender>
+
+        <!--
+            logger主要用于存放日志对象,也可以定义日志类型、级别
+            name:表示匹配的logger类型前缀,也就是包的前半部分
+            level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR < FATAL
+            additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
+            false:表示只用当前logger的appender-ref,true:
+            表示当前logger的appender-ref和rootLogger的appender-ref都有效
+        -->
+        <!-- hibernate logger -->
+        <!-- <logger name="xxxx" level="debug" /> -->
+        <!-- Spring framework logger -->
+        <logger name="org.springframework" level="debug" additivity="false"></logger>
+        <!-- mybatis日志打印-->
+        <logger name="org.apache.ibatis" level="debug" />
+        <logger name="java.sql" level="debug" />
+        <logger name="com.stylefeng.guns.modular.system.dao" level="debug"></logger>
+
+        <!--
+        root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
+        要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。
+        -->
+        <root level="debug">
+            <appender-ref ref="appLogAppender" />
+        </root>
+    </springProfile>
+</configuration>
\ No newline at end of file
diff --git a/UserNTTravel/guns-admin/src/main/resources/redis.properties b/UserNTTravel/guns-admin/src/main/resources/redis.properties
new file mode 100644
index 0000000..71487f8
--- /dev/null
+++ b/UserNTTravel/guns-admin/src/main/resources/redis.properties
@@ -0,0 +1,23 @@
+#redis���ÿ�ʼ
+# Redis���ݿ�������Ĭ��Ϊ0��
+spring.redis.database=0
+# Redis��������ַ
+spring.redis.host=1.95.90.13
+# Redis���������Ӷ˿�
+spring.redis.port=6379
+# Redis�������������루Ĭ��Ϊ�գ�
+spring.redis.password=HuanQiu@2024!
+#spring.redis.password=123456
+#spring.redis.password=
+# ���ӳ������������ʹ�ø�ֵ��ʾû�����ƣ�
+spring.redis.jedis.pool.max-active=1024
+# ���ӳ���������ȴ�ʱ�䣨ʹ�ø�ֵ��ʾû�����ƣ�
+spring.redis.jedis.pool.max-wait=10000
+# ���ӳ��е�����������
+spring.redis.jedis.pool.max-idle=200
+# ���ӳ��е���С��������
+spring.redis.jedis.pool.min-idle=0
+# ���ӳ�ʱʱ�䣨���룩
+spring.redis.timeout=10000
+#redis���ý���
+spring.redis.block-when-exhausted=true
\ No newline at end of file

--
Gitblit v1.7.1