From 9149cd0c048dc8fbf39c9ac9cc8133e64d9f9a15 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期三, 25 十二月 2024 11:20:17 +0800
Subject: [PATCH] 调度端

---
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java                              |  123 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java                                    |   50 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java                                |  126 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java                      |   50 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TransactionDetails.java                      |  164 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java                                |   45 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java                      |   73 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java                                       |   70 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PaymentRecordMapper.java                       |   21 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/MenuController.java                     |  244 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineSiteMapper.java                            |   23 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java                                              |   74 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java                                |   53 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java                                   |   15 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DispatchServiceImpl.java              |  173 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JGPushUtil.java                               |   60 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemNotice.java                            |  147 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java                   |   10 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java                              |   65 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java                                 |  172 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCancelService.java                   |   11 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CarInfoWarpper.java                        |   97 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LinePriceMapper.xml                    |   23 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCrossCityMapper.xml               |  607 +
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java                                  |   47 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShiftDriver.java                         |  134 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Site.java                                    |  176 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java                |   10 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java                          |   48 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPrivateCarService.java               |   43 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java                 |   20 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftDriverMapper.xml              |   61 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Location.java                                |  190 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LogController.java                      |   84 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java                                    |  232 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java                |  201 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java                                           |  211 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/LineSiteController.java                               |   73 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java                                  |  259 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml                  |   18 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java                                      |   36 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java                            |   33 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java                            |   19 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml                     |   74 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java                                |   31 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java                     |   38 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthIntercepter.java                          |   37 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ReassignListWarpper.java                   |  133 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java                             |  105 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java                            |   19 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderTaxiServiceImpl.java             |   22 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LocationWarpper.java                       |  128 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml                 |   46 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineSiteService.java                      |   32 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java         |   71 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java                              |   22 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java                          |   31 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java                            |  154 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java                                          |  186 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java              |  120 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java                                        |   16 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java                           |   36 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DictController.java                     |  142 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DispatchMapper.xml                     |   36 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SystemException.java                          |   19 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java                             |  809 +
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/UrlEncoderUtils.java                          |   44 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java                                  |  134 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java                  |  101 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml                       |   23 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java                              |   25 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml                       |   26 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java                      |  276 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/KaptchaController.java                  |  114 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CarListWarpper.java                        |   73 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Expense.java                                 |  123 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserInfoService.java                      |   22 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TransactionDetailsServiceImpl.java    |   48 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java                                         |   39 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPrivateCarMapper.java                     |   34 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java                |  116 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java                              |  102 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemNoticeMapper.xml                 |   19 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java                                    |  208 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml                         |   77 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java                          |   94 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ReassignMapper.xml                     |   91 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java                          |   15 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml                         |  177 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java                  |   96 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPositionMapper.java                       |   17 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginLogController.java                 |   69 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineSiteServiceImpl.java              |  155 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java                                    |  127 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/VersionManagement.java                       |  120 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java            |   53 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java                        |   23 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java                         |   22 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LinePriceMapper.java                           |   19 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverServiceMapper.java                       |   19 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftDriverMapper.java                     |   31 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java                          |   97 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java                  |   90 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java              |   30 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DispatchController.java                               |   76 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ExpenseMapper.xml                      |   20 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCrossCityServiceImpl.java        |  670 +
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml                       |   16 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java                          |   78 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PaymentRecordServiceImpl.java         |   63 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCrossCityMapper.java                      |   77 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java                                  |  878 +
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java                  |   73 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml                  |   52 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPrivateCarServiceImpl.java       |  155 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VersionManagementMapper.xml            |   26 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LocationMapper.java                            |   18 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemNoticeMapper.java                        |   12 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java                                |  105 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java                                  |  115 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java                      |   34 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DispatchMapper.java                            |   16 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java                                 |   78 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java                             |   15 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java                         |   26 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java                       |  100 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java                  |   48 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java                       |   61 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverService.java                           |   62 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java                        |   27 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ICBCPayUtil.java                              |  647 +
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPosition.java                           |  148 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml                       |  194 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineSite.java                                |  121 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java                                       |  214 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LocationMapper.xml                     |   34 
 DispatchOKTravel/guns-admin/doc/Guns 技术文档 v1.0.pdf                                                                             |    0 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java                                          |   33 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java                                 |   27 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java                        |   76 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VersionManagementWarpper.java              |   84 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java                    |   50 
 DispatchOKTravel/guns-admin/sql/guns.sql                                                                                       |  384 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PaymentRecordMapper.xml                |   55 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java                             |   62 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java                                    |  140 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java                      |   24 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java                |   37 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPrivateCarMapper.xml              |  141 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java                       |   60 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java              |   28 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftMapper.java                           |   28 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dispatch.java                                |  177 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java                        |   26 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISiteService.java                          |   39 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Line.java                                    |  106 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IReassignService.java                      |   74 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java                                       |   46 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java                                         |  174 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java                                     |  201 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java                                |   34 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RosterWarpper.java                         |   87 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java                                         |   81 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/CarController.java                                    |  109 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineMapper.java                                |   29 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCrossCityService.java                |  108 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java                      |   16 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/LineController.java                                   |  170 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LinePrice.java                               |  120 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPaymentRecordService.java                 |   33 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java                       |   22 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java                              |    7 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverServiceMapper.xml                |   26 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthService.java                              |   50 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPrivateCar.java                         |  951 +
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java                   |  406 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineMapper.xml                         |   38 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java                                       |   18 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ExpenseMapper.java                             |   16 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Car.java                                     |  272 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiApiUtil.java                               |   51 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java                             |  178 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LineShiftWarpper.java                      |   87 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java                                     |   34 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShift.java                               |  117 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITransactionDetailsService.java            |   23 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineShiftServiceImpl.java             |   71 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderCrossCityWarpper.java                 |  250 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LineSiteWarpper.java                       |  224 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.xml                     |   28 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.java                            |   19 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java                           |   29 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HashKit.java                                  |  109 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ReassignMapper.java                            |   30 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/SiteWarpper.java                           |   43 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java                                    |   80 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginController.java                    |  134 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java                                |   80 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CarServiceImpl.java                   |   83 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java                      |   52 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SiteServiceImpl.java                  |  144 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/BlackboardController.java               |   35 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java                |   27 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java                           |   27 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java                            |   44 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/UserMgrController.java                  |  373 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Reassign.java                                |  275 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java                     |   61 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java                        |   69 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineShiftService.java                     |   27 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiSendSms.java                               |  123 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftMapper.xml                    |   34 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java                         |   24 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineSiteMapper.xml                     |   57 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml                     |   12 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java                           |   28 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java                            |   16 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java                        |   19 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java                              |   98 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java                       |  138 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderListWarpper.java                      |  121 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java                        |   50 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml                     |   41 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java              |   20 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WeChatUtil.java                               |   61 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVersionManagementService.java             |   18 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java                             |   91 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java           |   39 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JuHeUtil.java                                 |   44 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java                                   |   36 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml                          |   61 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java                        |   51 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/BaseWarpper.java                           |  146 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java                              |  153 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java                        |   31 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/VersionManagementController.java                      |   47 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TransactionDetailsMapper.java                  |    7 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java          |   28 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPositionService.java                 |   32 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java                                  |  104 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java                           |   33 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VersionManagementServiceImpl.java     |   31 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java                                       |  127 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DeptController.java                     |  164 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java                                 |  133 
 DispatchOKTravel/guns-admin/src/test/sql/test.sql                                                                              |   35 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java                              |   12 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderTaxiMapper.xml                    |  397 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCancelServiceImpl.java           |   26 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java              |  578 +
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java                                 |  315 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HMACSHA1.java                                 |   63 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ReassignInfoWarpper.java                   |  178 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDispatchService.java                      |   40 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpClientUtil.java                           |  253 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDFalconUtil.java                             |  224 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java                                          |  290 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICarService.java                           |   40 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java                        |   36 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java                                |  356 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java                        |   28 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java                         |   22 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java                        |   34 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java                               |  188 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java                  |   61 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VersionManagementMapper.java                   |   17 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml                         |   42 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java                                |  128 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java                          |   68 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/NoticeController.java                   |  138 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPositionMapper.xml                |   32 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java                         |   12 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java                            |   27 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ReassignController.java                               |  202 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java                            |  103 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java                 |  333 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java                           |   30 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java                             |   26 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java                           |   54 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java                                    |  116 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SiteMapper.java                                |   19 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineServiceImpl.java                  |   77 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCrossCity.java                          |  881 +
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java                                         |   48 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java                      |   31 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java                                |   75 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java                                 |   54 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderTaxiService.java                     |    8 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISystemNoticeService.java                  |   20 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java                      |  125 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java                                              |  105 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java                          |   33 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java                  |   47 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SiteController.java                                   |  106 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SiteMapper.xml                         |   46 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java                          |   46 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderTaxi.java                               |  910 +
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/BaseBean.java                                |  107 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ChinaMobileUtil.java                          |  128 
 DispatchOKTravel/guns-admin/pom.xml                                                                                            |  281 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.java                                |  120 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java                  |   24 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthenticationKit.java                        |  232 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java                                |   71 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SystemNoticeServiceImpl.java          |   36 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java |   33 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java                            |   29 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PaymentRecord.java                           |  176 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java                     |   49 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderTaxiMapper.java                           |   92 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineService.java                          |   30 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/RoleController.java                     |  230 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/Configuration.java                            |   26 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java                                      |   78 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MD5AndKL.java                                 |  112 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TransactionDetailsMapper.xml           |   18 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml                         |   79 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml                         |   37 
 DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java                                      |   32 
 319 files changed, 32,748 insertions(+), 0 deletions(-)

diff --git "a/DispatchOKTravel/guns-admin/doc/Guns \346\212\200\346\234\257\346\226\207\346\241\243 v1.0.pdf" "b/DispatchOKTravel/guns-admin/doc/Guns \346\212\200\346\234\257\346\226\207\346\241\243 v1.0.pdf"
new file mode 100644
index 0000000..49bafc9
--- /dev/null
+++ "b/DispatchOKTravel/guns-admin/doc/Guns \346\212\200\346\234\257\346\226\207\346\241\243 v1.0.pdf"
Binary files differ
diff --git a/DispatchOKTravel/guns-admin/pom.xml b/DispatchOKTravel/guns-admin/pom.xml
new file mode 100644
index 0000000..38d809d
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/pom.xml
@@ -0,0 +1,281 @@
+<?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>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>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>
+        <!-- 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>cn.jpush.api</groupId>
+            <artifactId>jpush-client</artifactId>
+            <version>3.3.10</version>
+        </dependency>
+
+        <!--引入本地工行支付jar start-->
+        <dependency>
+            <groupId>com.icbc</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/icbc-api-sdk-cop.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.icbc.api</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/icbc-api-sdk-cop-io.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.infosec</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/icbc-ca.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.infosecCrypto</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/InfosecCrypto_Java1_02_JDK14+.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>proguard</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/proguard.jar</systemPath>
+        </dependency>
+        <!--引入本地工行支付jar end-->
+    </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/DispatchOKTravel/guns-admin/sql/guns.sql b/DispatchOKTravel/guns-admin/sql/guns.sql
new file mode 100644
index 0000000..4da462e
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/sql/guns.sql
@@ -0,0 +1,384 @@
+/*
+Navicat MySQL Data Transfer
+
+Source Server         : localhost
+Source Server Version : 50721
+Source Host           : localhost:3306
+Source Database       : guns
+
+Target Server Type    : MYSQL
+Target Server Version : 50721
+File Encoding         : 65001
+
+Date: 2018-06-26 23:10:40
+*/
+
+DROP DATABASE IF EXISTS guns;
+CREATE DATABASE IF NOT EXISTS guns DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
+
+USE guns;
+
+SET FOREIGN_KEY_CHECKS=0;
+
+-- ----------------------------
+-- Table structure for sys_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dept`;
+CREATE TABLE `sys_dept` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
+  `num` int(11) DEFAULT NULL COMMENT '排序',
+  `pid` int(11) DEFAULT NULL COMMENT '父部门id',
+  `pids` varchar(255) DEFAULT NULL COMMENT '父级ids',
+  `simplename` varchar(45) DEFAULT NULL COMMENT '简称',
+  `fullname` varchar(255) DEFAULT NULL COMMENT '全称',
+  `tips` varchar(255) DEFAULT NULL COMMENT '提示',
+  `version` int(11) DEFAULT NULL COMMENT '版本(乐观锁保留字段)',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT='部门表';
+
+-- ----------------------------
+-- Records of sys_dept
+-- ----------------------------
+INSERT INTO `sys_dept` VALUES ('24', '1', '0', '[0],', '总公司', '总公司', '', null);
+INSERT INTO `sys_dept` VALUES ('25', '2', '24', '[0],[24],', '开发部', '开发部', '', null);
+INSERT INTO `sys_dept` VALUES ('26', '3', '24', '[0],[24],', '运营部', '运营部', '', null);
+INSERT INTO `sys_dept` VALUES ('27', '4', '24', '[0],[24],', '战略部', '战略部', '', null);
+
+-- ----------------------------
+-- Table structure for sys_dict
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dict`;
+CREATE TABLE `sys_dict` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
+  `num` int(11) DEFAULT NULL COMMENT '排序',
+  `pid` int(11) DEFAULT NULL COMMENT '父级字典',
+  `name` varchar(255) DEFAULT NULL COMMENT '名称',
+  `tips` varchar(255) DEFAULT NULL COMMENT '提示',
+  `code` varchar(255) DEFAULT NULL COMMENT '值',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=69 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='字典表';
+
+-- ----------------------------
+-- Records of sys_dict
+-- ----------------------------
+INSERT INTO `sys_dict` VALUES ('50', '0', '0', '性别', null, 'sys_sex');
+INSERT INTO `sys_dict` VALUES ('51', '1', '50', '男', null, '1');
+INSERT INTO `sys_dict` VALUES ('52', '2', '50', '女', null, '2');
+INSERT INTO `sys_dict` VALUES ('53', '0', '0', '状态', null, 'sys_state');
+INSERT INTO `sys_dict` VALUES ('54', '1', '53', '启用', null, '1');
+INSERT INTO `sys_dict` VALUES ('55', '2', '53', '禁用', null, '2');
+INSERT INTO `sys_dict` VALUES ('56', '0', '0', '账号状态', null, 'account_state');
+INSERT INTO `sys_dict` VALUES ('57', '1', '56', '启用', null, '1');
+INSERT INTO `sys_dict` VALUES ('58', '2', '56', '冻结', null, '2');
+INSERT INTO `sys_dict` VALUES ('59', '3', '56', '已删除', null, '3');
+
+-- ----------------------------
+-- Table structure for sys_expense
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_expense`;
+CREATE TABLE `sys_expense` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `money` decimal(20,2) DEFAULT NULL COMMENT '报销金额',
+  `desc` varchar(255) DEFAULT '' COMMENT '描述',
+  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
+  `state` int(11) DEFAULT NULL COMMENT '状态: 1.待提交  2:待审核   3.审核通过 4:驳回',
+  `userid` int(11) DEFAULT NULL COMMENT '用户id',
+  `processId` varchar(255) DEFAULT NULL COMMENT '流程定义id',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COMMENT='报销表';
+
+-- ----------------------------
+-- Records of sys_expense
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_login_log
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_login_log`;
+CREATE TABLE `sys_login_log` (
+  `id` int(65) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `logname` varchar(255) DEFAULT NULL COMMENT '日志名称',
+  `userid` int(65) DEFAULT NULL COMMENT '管理员id',
+  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
+  `succeed` varchar(255) DEFAULT NULL COMMENT '是否执行成功',
+  `message` text COMMENT '具体消息',
+  `ip` varchar(255) DEFAULT NULL COMMENT '登录ip',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=217 DEFAULT CHARSET=utf8 COMMENT='登录记录';
+
+-- ----------------------------
+-- Records of sys_login_log
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_menu`;
+CREATE TABLE `sys_menu` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
+  `code` varchar(255) DEFAULT NULL COMMENT '菜单编号',
+  `pcode` varchar(255) DEFAULT NULL COMMENT '菜单父编号',
+  `pcodes` varchar(255) DEFAULT NULL COMMENT '当前菜单的所有父菜单编号',
+  `name` varchar(255) DEFAULT NULL COMMENT '菜单名称',
+  `icon` varchar(255) DEFAULT NULL COMMENT '菜单图标',
+  `url` varchar(255) DEFAULT NULL COMMENT 'url地址',
+  `num` int(65) DEFAULT NULL COMMENT '菜单排序号',
+  `levels` int(65) DEFAULT NULL COMMENT '菜单层级',
+  `ismenu` int(11) DEFAULT NULL COMMENT '是否是菜单(1:是  0:不是)',
+  `tips` varchar(255) DEFAULT NULL COMMENT '备注',
+  `status` int(65) DEFAULT NULL COMMENT '菜单状态 :  1:启用   0:不启用',
+  `isopen` int(11) DEFAULT NULL COMMENT '是否打开:    1:打开   0:不打开',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=171 DEFAULT CHARSET=utf8 COMMENT='菜单表';
+
+-- ----------------------------
+-- Records of sys_menu
+-- ----------------------------
+INSERT INTO `sys_menu` VALUES ('105', 'system', '0', '[0],', '系统管理', 'fa-user', '#', '4', '1', '1', null, '1', '1');
+INSERT INTO `sys_menu` VALUES ('106', 'mgr', 'system', '[0],[system],', '用户管理', '', '/mgr', '1', '2', '1', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('107', 'mgr_add', 'mgr', '[0],[system],[mgr],', '添加用户', null, '/mgr/add', '1', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('108', 'mgr_edit', 'mgr', '[0],[system],[mgr],', '修改用户', null, '/mgr/edit', '2', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('109', 'mgr_delete', 'mgr', '[0],[system],[mgr],', '删除用户', null, '/mgr/delete', '3', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('110', 'mgr_reset', 'mgr', '[0],[system],[mgr],', '重置密码', null, '/mgr/reset', '4', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('111', 'mgr_freeze', 'mgr', '[0],[system],[mgr],', '冻结用户', null, '/mgr/freeze', '5', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('112', 'mgr_unfreeze', 'mgr', '[0],[system],[mgr],', '解除冻结用户', null, '/mgr/unfreeze', '6', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('113', 'mgr_setRole', 'mgr', '[0],[system],[mgr],', '分配角色', null, '/mgr/setRole', '7', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('114', 'role', 'system', '[0],[system],', '角色管理', null, '/role', '2', '2', '1', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('115', 'role_add', 'role', '[0],[system],[role],', '添加角色', null, '/role/add', '1', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('116', 'role_edit', 'role', '[0],[system],[role],', '修改角色', null, '/role/edit', '2', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('117', 'role_remove', 'role', '[0],[system],[role],', '删除角色', null, '/role/remove', '3', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('118', 'role_setAuthority', 'role', '[0],[system],[role],', '配置权限', null, '/role/setAuthority', '4', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('119', 'menu', 'system', '[0],[system],', '菜单管理', null, '/menu', '4', '2', '1', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('120', 'menu_add', 'menu', '[0],[system],[menu],', '添加菜单', null, '/menu/add', '1', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('121', 'menu_edit', 'menu', '[0],[system],[menu],', '修改菜单', null, '/menu/edit', '2', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('122', 'menu_remove', 'menu', '[0],[system],[menu],', '删除菜单', null, '/menu/remove', '3', '3', '0', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('128', 'log', 'system', '[0],[system],', '业务日志', null, '/log', '6', '2', '1', null, '1', '0');
+INSERT INTO `sys_menu` VALUES ('130', 'druid', 'system', '[0],[system],', '监控管理', null, '/druid', '7', '2', '1', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('131', 'dept', 'system', '[0],[system],', '部门管理', null, '/dept', '3', '2', '1', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('132', 'dict', 'system', '[0],[system],', '字典管理', null, '/dict', '4', '2', '1', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('133', 'loginLog', 'system', '[0],[system],', '登录日志', null, '/loginLog', '6', '2', '1', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('134', 'log_clean', 'log', '[0],[system],[log],', '清空日志', null, '/log/delLog', '3', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('135', 'dept_add', 'dept', '[0],[system],[dept],', '添加部门', null, '/dept/add', '1', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('136', 'dept_update', 'dept', '[0],[system],[dept],', '修改部门', null, '/dept/update', '1', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('137', 'dept_delete', 'dept', '[0],[system],[dept],', '删除部门', null, '/dept/delete', '1', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('138', 'dict_add', 'dict', '[0],[system],[dict],', '添加字典', null, '/dict/add', '1', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('139', 'dict_update', 'dict', '[0],[system],[dict],', '修改字典', null, '/dict/update', '1', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('140', 'dict_delete', 'dict', '[0],[system],[dict],', '删除字典', null, '/dict/delete', '1', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('141', 'notice', 'system', '[0],[system],', '通知管理', null, '/notice', '9', '2', '1', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('142', 'notice_add', 'notice', '[0],[system],[notice],', '添加通知', null, '/notice/add', '1', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('143', 'notice_update', 'notice', '[0],[system],[notice],', '修改通知', null, '/notice/update', '2', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('144', 'notice_delete', 'notice', '[0],[system],[notice],', '删除通知', null, '/notice/delete', '3', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('145', 'hello', '0', '[0],', '通知', 'fa-rocket', '/notice/hello', '1', '1', '1', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('148', 'code', '0', '[0],', '代码生成', 'fa-code', '/code', '3', '1', '1', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('149', 'api_mgr', '0', '[0],', '接口文档', 'fa-leaf', '/swagger-ui.html', '2', '1', '1', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('150', 'to_menu_edit', 'menu', '[0],[system],[menu],', '菜单编辑跳转', '', '/menu/menu_edit', '4', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('151', 'menu_list', 'menu', '[0],[system],[menu],', '菜单列表', '', '/menu/list', '5', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('152', 'to_dept_update', 'dept', '[0],[system],[dept],', '修改部门跳转', '', '/dept/dept_update', '4', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('153', 'dept_list', 'dept', '[0],[system],[dept],', '部门列表', '', '/dept/list', '5', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('154', 'dept_detail', 'dept', '[0],[system],[dept],', '部门详情', '', '/dept/detail', '6', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('155', 'to_dict_edit', 'dict', '[0],[system],[dict],', '修改菜单跳转', '', '/dict/dict_edit', '4', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('156', 'dict_list', 'dict', '[0],[system],[dict],', '字典列表', '', '/dict/list', '5', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('157', 'dict_detail', 'dict', '[0],[system],[dict],', '字典详情', '', '/dict/detail', '6', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('158', 'log_list', 'log', '[0],[system],[log],', '日志列表', '', '/log/list', '2', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('159', 'log_detail', 'log', '[0],[system],[log],', '日志详情', '', '/log/detail', '3', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('160', 'del_login_log', 'loginLog', '[0],[system],[loginLog],', '清空登录日志', '', '/loginLog/delLoginLog', '1', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('161', 'login_log_list', 'loginLog', '[0],[system],[loginLog],', '登录日志列表', '', '/loginLog/list', '2', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('162', 'to_role_edit', 'role', '[0],[system],[role],', '修改角色跳转', '', '/role/role_edit', '5', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('163', 'to_role_assign', 'role', '[0],[system],[role],', '角色分配跳转', '', '/role/role_assign', '6', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('164', 'role_list', 'role', '[0],[system],[role],', '角色列表', '', '/role/list', '7', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('165', 'to_assign_role', 'mgr', '[0],[system],[mgr],', '分配角色跳转', '', '/mgr/role_assign', '8', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('166', 'to_user_edit', 'mgr', '[0],[system],[mgr],', '编辑用户跳转', '', '/mgr/user_edit', '9', '3', '0', null, '1', null);
+INSERT INTO `sys_menu` VALUES ('167', 'mgr_list', 'mgr', '[0],[system],[mgr],', '用户列表', '', '/mgr/list', '10', '3', '0', null, '1', null);
+
+-- ----------------------------
+-- Table structure for sys_notice
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_notice`;
+CREATE TABLE `sys_notice` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `title` varchar(255) DEFAULT NULL COMMENT '标题',
+  `type` int(11) DEFAULT NULL COMMENT '类型',
+  `content` text COMMENT '内容',
+  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
+  `creater` int(11) DEFAULT NULL COMMENT '创建人',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='通知表';
+
+-- ----------------------------
+-- Records of sys_notice
+-- ----------------------------
+INSERT INTO `sys_notice` VALUES ('6', '世界', '10', '欢迎使用Guns管理系统', '2017-01-11 08:53:20', '1');
+INSERT INTO `sys_notice` VALUES ('8', '你好', null, '你好', '2017-05-10 19:28:57', '1');
+
+-- ----------------------------
+-- Table structure for sys_operation_log
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_operation_log`;
+CREATE TABLE `sys_operation_log` (
+  `id` int(65) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `logtype` varchar(255) DEFAULT NULL COMMENT '日志类型',
+  `logname` varchar(255) DEFAULT NULL COMMENT '日志名称',
+  `userid` int(65) DEFAULT NULL COMMENT '用户id',
+  `classname` varchar(255) DEFAULT NULL COMMENT '类名称',
+  `method` text COMMENT '方法名称',
+  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
+  `succeed` varchar(255) DEFAULT NULL COMMENT '是否成功',
+  `message` text COMMENT '备注',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=554 DEFAULT CHARSET=utf8 COMMENT='操作日志';
+
+-- ----------------------------
+-- Records of sys_operation_log
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_relation
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_relation`;
+CREATE TABLE `sys_relation` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `menuid` bigint(11) DEFAULT NULL COMMENT '菜单id',
+  `roleid` int(11) DEFAULT NULL COMMENT '角色id',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3792 DEFAULT CHARSET=utf8 COMMENT='角色和菜单关联表';
+
+-- ----------------------------
+-- Records of sys_relation
+-- ----------------------------
+INSERT INTO `sys_relation` VALUES ('3377', '105', '5');
+INSERT INTO `sys_relation` VALUES ('3378', '106', '5');
+INSERT INTO `sys_relation` VALUES ('3379', '107', '5');
+INSERT INTO `sys_relation` VALUES ('3380', '108', '5');
+INSERT INTO `sys_relation` VALUES ('3381', '109', '5');
+INSERT INTO `sys_relation` VALUES ('3382', '110', '5');
+INSERT INTO `sys_relation` VALUES ('3383', '111', '5');
+INSERT INTO `sys_relation` VALUES ('3384', '112', '5');
+INSERT INTO `sys_relation` VALUES ('3385', '113', '5');
+INSERT INTO `sys_relation` VALUES ('3386', '114', '5');
+INSERT INTO `sys_relation` VALUES ('3387', '115', '5');
+INSERT INTO `sys_relation` VALUES ('3388', '116', '5');
+INSERT INTO `sys_relation` VALUES ('3389', '117', '5');
+INSERT INTO `sys_relation` VALUES ('3390', '118', '5');
+INSERT INTO `sys_relation` VALUES ('3391', '119', '5');
+INSERT INTO `sys_relation` VALUES ('3392', '120', '5');
+INSERT INTO `sys_relation` VALUES ('3393', '121', '5');
+INSERT INTO `sys_relation` VALUES ('3394', '122', '5');
+INSERT INTO `sys_relation` VALUES ('3395', '150', '5');
+INSERT INTO `sys_relation` VALUES ('3396', '151', '5');
+INSERT INTO `sys_relation` VALUES ('3737', '105', '1');
+INSERT INTO `sys_relation` VALUES ('3738', '106', '1');
+INSERT INTO `sys_relation` VALUES ('3739', '107', '1');
+INSERT INTO `sys_relation` VALUES ('3740', '108', '1');
+INSERT INTO `sys_relation` VALUES ('3741', '109', '1');
+INSERT INTO `sys_relation` VALUES ('3742', '110', '1');
+INSERT INTO `sys_relation` VALUES ('3743', '111', '1');
+INSERT INTO `sys_relation` VALUES ('3744', '112', '1');
+INSERT INTO `sys_relation` VALUES ('3745', '113', '1');
+INSERT INTO `sys_relation` VALUES ('3746', '165', '1');
+INSERT INTO `sys_relation` VALUES ('3747', '166', '1');
+INSERT INTO `sys_relation` VALUES ('3748', '167', '1');
+INSERT INTO `sys_relation` VALUES ('3749', '114', '1');
+INSERT INTO `sys_relation` VALUES ('3750', '115', '1');
+INSERT INTO `sys_relation` VALUES ('3751', '116', '1');
+INSERT INTO `sys_relation` VALUES ('3752', '117', '1');
+INSERT INTO `sys_relation` VALUES ('3753', '118', '1');
+INSERT INTO `sys_relation` VALUES ('3754', '162', '1');
+INSERT INTO `sys_relation` VALUES ('3755', '163', '1');
+INSERT INTO `sys_relation` VALUES ('3756', '164', '1');
+INSERT INTO `sys_relation` VALUES ('3757', '119', '1');
+INSERT INTO `sys_relation` VALUES ('3758', '120', '1');
+INSERT INTO `sys_relation` VALUES ('3759', '121', '1');
+INSERT INTO `sys_relation` VALUES ('3760', '122', '1');
+INSERT INTO `sys_relation` VALUES ('3761', '150', '1');
+INSERT INTO `sys_relation` VALUES ('3762', '151', '1');
+INSERT INTO `sys_relation` VALUES ('3763', '128', '1');
+INSERT INTO `sys_relation` VALUES ('3764', '134', '1');
+INSERT INTO `sys_relation` VALUES ('3765', '158', '1');
+INSERT INTO `sys_relation` VALUES ('3766', '159', '1');
+INSERT INTO `sys_relation` VALUES ('3767', '130', '1');
+INSERT INTO `sys_relation` VALUES ('3768', '131', '1');
+INSERT INTO `sys_relation` VALUES ('3769', '135', '1');
+INSERT INTO `sys_relation` VALUES ('3770', '136', '1');
+INSERT INTO `sys_relation` VALUES ('3771', '137', '1');
+INSERT INTO `sys_relation` VALUES ('3772', '152', '1');
+INSERT INTO `sys_relation` VALUES ('3773', '153', '1');
+INSERT INTO `sys_relation` VALUES ('3774', '154', '1');
+INSERT INTO `sys_relation` VALUES ('3775', '132', '1');
+INSERT INTO `sys_relation` VALUES ('3776', '138', '1');
+INSERT INTO `sys_relation` VALUES ('3777', '139', '1');
+INSERT INTO `sys_relation` VALUES ('3778', '140', '1');
+INSERT INTO `sys_relation` VALUES ('3779', '155', '1');
+INSERT INTO `sys_relation` VALUES ('3780', '156', '1');
+INSERT INTO `sys_relation` VALUES ('3781', '157', '1');
+INSERT INTO `sys_relation` VALUES ('3782', '133', '1');
+INSERT INTO `sys_relation` VALUES ('3783', '160', '1');
+INSERT INTO `sys_relation` VALUES ('3784', '161', '1');
+INSERT INTO `sys_relation` VALUES ('3785', '141', '1');
+INSERT INTO `sys_relation` VALUES ('3786', '142', '1');
+INSERT INTO `sys_relation` VALUES ('3787', '143', '1');
+INSERT INTO `sys_relation` VALUES ('3788', '144', '1');
+INSERT INTO `sys_relation` VALUES ('3789', '145', '1');
+INSERT INTO `sys_relation` VALUES ('3790', '148', '1');
+INSERT INTO `sys_relation` VALUES ('3791', '149', '1');
+
+-- ----------------------------
+-- Table structure for sys_role
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role`;
+CREATE TABLE `sys_role` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
+  `num` int(11) DEFAULT NULL COMMENT '序号',
+  `pid` int(11) DEFAULT NULL COMMENT '父角色id',
+  `name` varchar(255) DEFAULT NULL COMMENT '角色名称',
+  `deptid` int(11) DEFAULT NULL COMMENT '部门名称',
+  `tips` varchar(255) DEFAULT NULL COMMENT '提示',
+  `version` int(11) DEFAULT NULL COMMENT '保留字段(暂时没用)',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='角色表';
+
+-- ----------------------------
+-- Records of sys_role
+-- ----------------------------
+INSERT INTO `sys_role` VALUES ('1', '1', '0', '超级管理员', '24', 'administrator', '1');
+INSERT INTO `sys_role` VALUES ('5', '2', '1', '临时', '26', 'temp', null);
+
+-- ----------------------------
+-- Table structure for sys_user
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user`;
+CREATE TABLE `sys_user` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
+  `avatar` varchar(255) DEFAULT NULL COMMENT '头像',
+  `account` varchar(45) DEFAULT NULL COMMENT '账号',
+  `password` varchar(45) DEFAULT NULL COMMENT '密码',
+  `salt` varchar(45) DEFAULT NULL COMMENT 'md5密码盐',
+  `name` varchar(45) DEFAULT NULL COMMENT '名字',
+  `birthday` datetime DEFAULT NULL COMMENT '生日',
+  `sex` int(11) DEFAULT NULL COMMENT '性别(1:男 2:女)',
+  `email` varchar(45) DEFAULT NULL COMMENT '电子邮件',
+  `phone` varchar(45) DEFAULT NULL COMMENT '电话',
+  `roleid` varchar(255) DEFAULT NULL COMMENT '角色id',
+  `deptid` int(11) DEFAULT NULL COMMENT '部门id',
+  `status` int(11) DEFAULT NULL COMMENT '状态(1:启用  2:冻结  3:删除)',
+  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
+  `version` int(11) DEFAULT NULL COMMENT '保留字段',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 COMMENT='管理员表';
+
+-- ----------------------------
+-- Records of sys_user
+-- ----------------------------
+INSERT INTO `sys_user` VALUES ('1', 'girl.gif', 'admin', 'ecfadcde9305f8891bcfe5a1e28c253e', '8pgby', '张三', '2017-05-05 00:00:00', '2', 'sn93@qq.com', '18200000000', '1', '27', '1', '2016-01-29 08:49:53', '25');
+INSERT INTO `sys_user` VALUES ('44', null, 'test', '45abb7879f6a8268f1ef600e6038ac73', 'ssts3', 'test', '2017-05-01 00:00:00', '1', 'abc@123.com', '', '5', '26', '3', '2017-05-16 20:33:37', null);
+INSERT INTO `sys_user` VALUES ('45', null, 'boss', '71887a5ad666a18f709e1d4e693d5a35', '1f7bf', '老板', '2017-12-04 00:00:00', '1', '', '', '1', '24', '1', '2017-12-04 22:24:02', null);
+INSERT INTO `sys_user` VALUES ('46', null, 'manager', 'b53cac62e7175637d4beb3b16b2f7915', 'j3cs9', '经理', '2017-12-04 00:00:00', '1', '', '', '1', '24', '1', '2017-12-04 22:24:24', null);
+
+
+DROP TABLE IF EXISTS `test`;
+CREATE TABLE `test` (
+  `aaa` int(11) NOT NULL AUTO_INCREMENT,
+  `bbb` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`aaa`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
+
+SET FOREIGN_KEY_CHECKS = 1;
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
new file mode 100644
index 0000000..4b29f76
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
@@ -0,0 +1,74 @@
+package com.stylefeng.guns;
+
+import org.apache.http.config.SocketConfig;
+import org.apache.http.impl.client.CloseableHttpClient;
+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.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.web.client.RestTemplate;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * SpringBoot方式启动类
+ *
+ * @author stylefeng
+ * @Date 2017/5/21 12:06
+ */
+@EnableEurekaClient//注册为服务提供者
+@SpringBootApplication
+public class GunsApplication {
+
+    private final static Logger logger = LoggerFactory.getLogger(GunsApplication.class);
+
+    public static void main(String[] args) {
+        SpringApplication.run(GunsApplication.class, args);
+        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); // 总的最大连接数
+        CloseableHttpClient 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); // 总的最大连接数
+        CloseableHttpClient 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;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java
new file mode 100644
index 0000000..18e63c5
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java
new file mode 100644
index 0000000..7c1358d
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java
new file mode 100644
index 0000000..ef9a5bc
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java
new file mode 100644
index 0000000..19c4b01
--- /dev/null
+++ b/DispatchOKTravel/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("OK出行 Doc")
+                .description("所有接口前需要加 /dispatch 前缀,例如:/dispatch/base/agreement/queryByType <br>" +
+                        "所有以 /api/*** 路径的接口需要上传签名参数sign")
+//                .termsOfServiceUrl("http://git.oschina.net/naan1993/guns")
+                .contact("stylefeng")
+                .version("1.0")
+                .build();
+    }
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java
new file mode 100644
index 0000000..d9e3fce
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java
new file mode 100644
index 0000000..6496133
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java
new file mode 100644
index 0000000..e1dc4cb
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java
new file mode 100644
index 0000000..b260140
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java
new file mode 100644
index 0000000..748ed06
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java
new file mode 100644
index 0000000..c1fdadf
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java
@@ -0,0 +1,214 @@
+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/**", "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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java
new file mode 100644
index 0000000..a2398a8
--- /dev/null
+++ b/DispatchOKTravel/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("/gunsApi/**");
+    }
+
+    /**
+     * 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java
new file mode 100644
index 0000000..5f4f745
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java
new file mode 100644
index 0000000..d5123f4
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java
new file mode 100644
index 0000000..13e9d6c
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java
new file mode 100644
index 0000000..fa53e22
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java
new file mode 100644
index 0000000..55e7234
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java
new file mode 100644
index 0000000..369be8b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java
new file mode 100644
index 0000000..bfb1500
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java
new file mode 100644
index 0000000..1b2b5d8
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java
new file mode 100644
index 0000000..b2b534f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java
new file mode 100644
index 0000000..75472c8
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java
new file mode 100644
index 0000000..a24800f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java
new file mode 100644
index 0000000..a7a93cd
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java
new file mode 100644
index 0000000..0436003
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java
new file mode 100644
index 0000000..eb44e1c
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java
new file mode 100644
index 0000000..a04927f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java
new file mode 100644
index 0000000..f7b7bf9
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java
new file mode 100644
index 0000000..4b60184
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java
new file mode 100644
index 0000000..a0a13c9
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java
new file mode 100644
index 0000000..08389af
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java
new file mode 100644
index 0000000..cc34eb5
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java b/DispatchOKTravel/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/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java b/DispatchOKTravel/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/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java b/DispatchOKTravel/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/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java
new file mode 100644
index 0000000..ccfc26b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java
new file mode 100644
index 0000000..fc0a07b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java
new file mode 100644
index 0000000..ae01578
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java
new file mode 100644
index 0000000..9fd65e0
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java
new file mode 100644
index 0000000..18c15a7
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java
new file mode 100644
index 0000000..d4cffc3
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java
new file mode 100644
index 0000000..2c2a823
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java
new file mode 100644
index 0000000..1c44232
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java
new file mode 100644
index 0000000..0de9d4f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java
new file mode 100644
index 0000000..f0c5841
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java
new file mode 100644
index 0000000..940fe84
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java
new file mode 100644
index 0000000..5856284
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java
new file mode 100644
index 0000000..2f1812b
--- /dev/null
+++ b/DispatchOKTravel/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(700, "token过期"),
+    TOKEN_ERROR(700, "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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java
new file mode 100644
index 0000000..78581cd
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java
new file mode 100644
index 0000000..5ff14b5
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java
new file mode 100644
index 0000000..1415e13
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java
new file mode 100644
index 0000000..acafeaf
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java
new file mode 100644
index 0000000..18089f5
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java
new file mode 100644
index 0000000..8d5e20e
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java
new file mode 100644
index 0000000..f43d81b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java
new file mode 100644
index 0000000..3094dd9
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java
new file mode 100644
index 0000000..2c29451
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java
new file mode 100644
index 0000000..2a95558
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java
new file mode 100644
index 0000000..eedfe1c
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java
new file mode 100644
index 0000000..4a91414
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java
new file mode 100644
index 0000000..b93a834
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java
new file mode 100644
index 0000000..89f602f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java
new file mode 100644
index 0000000..690f728
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java
new file mode 100644
index 0000000..c701170
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java
new file mode 100644
index 0000000..970a268
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java
new file mode 100644
index 0000000..a07afe1
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java
new file mode 100644
index 0000000..ffba2f2
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java
new file mode 100644
index 0000000..72facc7
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java
new file mode 100644
index 0000000..0b2eb41
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java
new file mode 100644
index 0000000..719de81
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java
new file mode 100644
index 0000000..c60adfa
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/CarController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/CarController.java
new file mode 100644
index 0000000..1f522e0
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/CarController.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.service.ICarService;
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.CarInfoWarpper;
+import com.stylefeng.guns.modular.system.warpper.CarListWarpper;
+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/car")
+public class CarController {
+
+    @Autowired
+    private ICarService carService;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+
+    /**
+     * 获取车辆管理
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryCarList")
+    @ApiOperation(value = "获取车辆列表", tags = {"调度端-车辆管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<CarListWarpper>> queryCarList(HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = carService.queryCarList(uid);
+            return ResultUtil.success(CarListWarpper.getCarListWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取车辆详情
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryCarInfo")
+    @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<CarInfoWarpper> queryCarInfo(Integer id){
+        try {
+            Map<String, Object> map = carService.queryCarInfo(id);
+            return ResultUtil.success(CarInfoWarpper.getCarInfoWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 重新绑定/解绑 车辆司机关系
+     * @param id
+     * @param driverId
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/rebindDriver")
+    @ApiOperation(value = "重新绑定/解绑 车辆司机关系", tags = {"调度端-车辆管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "车辆id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "司机id", name = "driverId", required = false, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil rebindDriver(Integer id, Integer driverId){
+        try {
+            return carService.rebindDriver(id, driverId);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DispatchController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DispatchController.java
new file mode 100644
index 0000000..88be5c7
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DispatchController.java
@@ -0,0 +1,76 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
+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;
+
+/**
+ * 调度控制器
+ */
+@Api
+@RestController
+@RequestMapping("")
+public class DispatchController {
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+
+    /**
+     * 账号密码登录
+     * @param account
+     * @param password
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/base/dispatch/dispatchLogin")
+    @ApiOperation(value = "账号密码登录", tags = {"调度端-登录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "登录账号", name = "account", required = true, dataType = "String"),
+            @ApiImplicitParam(value = "登录密码", name = "password", required = true, dataType = "String")
+    })
+    public ResultUtil<LoginWarpper> dispatchLogin(String account, String password){
+        try {
+            return dispatchService.dispatchLogin(account, password);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 修改推单配置
+     * @param pushOrder
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/api/dispatch/editPushOrder", method = RequestMethod.POST)
+    @ApiOperation(value = "修改推单配置", tags = {"调度端-设置"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "推单配置(1=接收,2=不接收)", name = "pushOrder", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil editPushOrder(Integer pushOrder, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return dispatchService.editPushOrder(pushOrder, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java
new file mode 100644
index 0000000..7eed9ec
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java
@@ -0,0 +1,172 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.service.IDriverService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.LineShiftWarpper;
+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.List;
+import java.util.Map;
+
+@Api
+@RestController
+@RequestMapping("/api/driver")
+public class DriverController {
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+
+
+
+
+
+    /**
+     * 获取排班管理中可更换的司机列表
+     * 1.司机必须预约了该班次,
+     * 2.司机的剩余座位数必须班次订单总人数
+     *
+     * @param lineShiftId
+     * @param time
+     * @param lineShiftDriverId
+     * @param driverId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryLineShiftDriver", method = RequestMethod.POST)
+    @ApiOperation(value = "获取可更换的司机列表", tags = {"调度端-排班管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "排班数据id", name = "lineShiftId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "查询日期(2020-10-13)", name = "time", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "排班详情数据id", name = "lineShiftDriverId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "司机id", name = "driverId", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<BaseWarpper>> queryLineShiftDriver(Integer lineShiftId, String time, Integer lineShiftDriverId, Integer driverId){
+        try {
+            List<Map<String, Object>> list = driverService.queryLineShiftDriver(lineShiftId, time, lineShiftDriverId, driverId);
+            return ResultUtil.success(BaseWarpper.getBaseWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取没有排班给定日期班次的司机
+     * @param lineShiftId
+     * @param time
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryNotInLineShiftDriver", method = RequestMethod.POST)
+    @ApiOperation(value = "获取没有排班给定日期班次的司机", tags = {"调度端-排班管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "排班数据id", name = "lineShiftId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "查询日期(2020-10-13)", name = "time", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<BaseWarpper>> queryNotInLineShiftDriver(Integer lineShiftId, String time){
+        try {
+            List<Map<String, Object>> list = driverService.queryNotInLineShiftDriver(lineShiftId, time);
+            return ResultUtil.success(BaseWarpper.getBaseWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 调度班次中添加司机操作
+     * @param lineShiftId
+     * @param time
+     * @param driverId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/addDriverForLineShift", method = RequestMethod.POST)
+    @ApiOperation(value = "调度班次中添加司机操作", tags = {"调度端-排班管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "排班数据id", name = "lineShiftId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "查询日期(2020-10-13)", name = "time", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "司机id", name = "driverId", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil addDriverForLineShift(Integer lineShiftId, String time, Integer driverId){
+        try {
+            return driverService.addDriverForLineShift(lineShiftId, time, driverId);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 获取改派可接单的司机列表
+     * @param reassignId
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryReassignDriver", method = RequestMethod.POST)
+    @ApiOperation(value = "获取改派可接单的司机列表", tags = {"调度端-新改派订单"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "改派订单id", name = "reassignId", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<BaseWarpper>> queryReassignDriver(Integer reassignId, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = driverService.queryReassignDriver(reassignId, uid);
+            return ResultUtil.success(BaseWarpper.getBaseWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 获取所以没有服务的司机列表
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryAllDriver", 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<BaseWarpper>> queryAllDriver(HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = driverService.queryAllDriver(uid);
+            return ResultUtil.success(BaseWarpper.getBaseWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/LineController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/LineController.java
new file mode 100644
index 0000000..c6f3166
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/LineController.java
@@ -0,0 +1,170 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.service.ILineService;
+import com.stylefeng.guns.modular.system.service.ILineShiftService;
+import com.stylefeng.guns.modular.system.service.IOrderCrossCityService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.RosterWarpper;
+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.List;
+import java.util.Map;
+
+/**
+ * 线路控制器
+ */
+@Api
+@RestController
+@RequestMapping("/api/line")
+public class LineController {
+
+    @Autowired
+    private ILineService lineService;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+    @Autowired
+    private ILineShiftService lineShiftService;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+
+
+
+
+    /**
+     * 获取所有线路
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryLine")
+    @ApiOperation(value = "获取所有线路", tags = {"调度端-订单管理", "调度端-排班管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<BaseWarpper>> queryLine(HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = lineService.queryLine(uid);
+            return ResultUtil.success(BaseWarpper.getBaseWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 根据选择的起点和终点获取线路
+     * @param startId
+     * @param endId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/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(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<BaseWarpper>> queryLines(Integer startId, Integer endId, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = lineService.queryLines(startId, endId, uid);
+            return ResultUtil.success(BaseWarpper.getBaseWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 获取线路排班数据
+     * @param lineId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryLineShiftByLineId", method = RequestMethod.POST)
+    @ApiOperation(value = "获取线路排班数据", tags = {"调度端-排班管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "线路id", name = "lineId", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<BaseWarpper>> queryByLineId(Integer lineId){
+        try {
+            List<Map<String, Object>> list = lineShiftService.queryByLineId(lineId);
+            return ResultUtil.success(BaseWarpper.getBaseWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取排班详情
+     * @param lineShiftId
+     * @param time
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryLineShiftInfo", method = RequestMethod.POST)
+    @ApiOperation(value = "获取排班详情", tags = {"调度端-排班管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "排班数据id", name = "lineShiftId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "查询日期(2020-10-13)", name = "time", required = true, dataType = "string"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<RosterWarpper>> queryLineShiftInfo(Integer lineShiftId, String time){
+        try {
+            List<Map<String, Object>> list = lineShiftService.queryLineShiftInfo(lineShiftId, time);
+            return ResultUtil.success(RosterWarpper.getRosterWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping(value = "/queryOrderMoney", method = RequestMethod.POST)
+    @ApiOperation(value = "获取跨城的支付金额", tags = {"调度端-添加订单"}, notes = "distance:距离数(米),price:支付金额")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "起点坐标(103.32123,30.6232)", name = "startLonLat", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "终点坐标(103.32123,30.6232)", name = "endLonLat", required = true, dataType = "int"),
+            @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();
+        }
+    }
+
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/LineSiteController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/LineSiteController.java
new file mode 100644
index 0000000..becf890
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/LineSiteController.java
@@ -0,0 +1,73 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.service.ILineSiteService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.LineSiteWarpper;
+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("/api/lineSite")
+public class LineSiteController {
+
+    @Autowired
+    private ILineSiteService lineSiteService;
+
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/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(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<LineSiteWarpper>> queryDriver(Integer lineId, String day){
+        try {
+            List<Map<String, Object>> list = lineSiteService.queryDriver(lineId, day);
+            return ResultUtil.success(LineSiteWarpper.getLineSiteWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/querySeat", method = RequestMethod.POST)
+    @ApiOperation(value = "根据司机的排班id获取剩余座位数据", 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<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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
new file mode 100644
index 0000000..2574128
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -0,0 +1,259 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.OrderCrossCity;
+import com.stylefeng.guns.modular.system.model.OrderPosition;
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.service.IOrderCrossCityService;
+import com.stylefeng.guns.modular.system.service.IOrderPositionService;
+import com.stylefeng.guns.modular.system.service.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.util.ICBCPayUtil;
+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 com.stylefeng.guns.modular.system.warpper.OrderCrossCityWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderInfoWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderListWarpper;
+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 javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单相关
+ */
+@Api
+@RestController
+@RequestMapping("")
+public class OrderController {
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+    @Autowired
+    private IOrderPositionService orderPositionService;
+
+    @Autowired
+    private ICBCPayUtil icbcPayUtil;
+
+
+
+    /**
+     * 获取订单列表
+     * @param type
+     * @param search
+     * @param orderSource
+     * @param state
+     * @param lineId
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/queryOrderList")
+    @ApiOperation(value = "获取订单列表", tags = {"调度端-订单管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "数据类型(1=专车,2=跨城)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "搜索条件", name = "search", required = false, dataType = "String"),
+            @ApiImplicitParam(value = "订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)多个以逗号分隔", name = "orderSource", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)多个以逗号分隔", name = "state", required = false, dataType = "string"),
+            @ApiImplicitParam(value = "线路id(多个以逗号分隔)", name = "lineId", required = false, dataType = "string"),
+            @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<OrderListWarpper>> queryOrderList(Integer type, String search, String orderSource, String state, String lineId, Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = null;
+            if(type == 1){//专车
+                list = orderPrivateCarService.queryOrderList(search, orderSource, state, pageNum, size, uid);
+            }
+            if(type == 2){//跨城
+                list = orderCrossCityService.queryOrderList(search, orderSource, state, lineId, pageNum, size, uid);
+            }
+            return ResultUtil.success(OrderListWarpper.getOrderListWarppers(list));
+        }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=跨城)", 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;
+            if(orderType == 1){//专车
+                map = orderPrivateCarService.queryOrderInfo(orderId);
+            }
+            if(orderType == 2){//跨城
+                map = orderCrossCityService.queryOrderInfo(orderId);
+            }
+            return ResultUtil.success(OrderInfoWarpper.getOrderInfoWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 取消订单
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/cancelOrder")
+    @ApiOperation(value = "取消订单", tags = {"调度端-订单管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,2=跨城)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil cancelOrder(Integer orderId, Integer orderType){
+        try {
+            if(orderType == 1){//专车
+                return orderPrivateCarService.cancelOrder(orderId);
+            }
+            if(orderType == 2){//跨城
+                return orderCrossCityService.cancelOrder(orderId);
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取订单坐标轨迹数据
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/api/order/queryOrderPosition")
+    @ApiOperation(value = "获取订单坐标", tags = {"调度端-订单管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单类型(1=专车,3=跨城)", name = "orderType", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<BaseWarpper>> queryOrderPosition(Integer orderId, Integer orderType){
+        try {
+            List<OrderPosition> orderPositions = orderPositionService.queryPosition(orderId, orderType);
+            List<BaseWarpper> list = new ArrayList<>();
+            for(OrderPosition orderPosition : orderPositions){
+                BaseWarpper baseWarpper = new BaseWarpper();
+                baseWarpper.setLon(Double.valueOf(orderPosition.getLon()));
+                baseWarpper.setLat(Double.valueOf(orderPosition.getLat()));
+                list.add(baseWarpper);
+            }
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 跨城下单操作
+     * @param orderCrossCityWarpper
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/api/order/orderCrossCity", 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<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.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 request
+     * @param response
+     */
+    @ResponseBody
+    @PostMapping("/base/order/generatePay")
+    public void generatePay(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = icbcPayUtil.generatePayCallback(request);
+            if(null != map){
+                String out_trade_no = map.get("out_trade_no");
+                String order_id = map.get("order_id");
+                String s = icbcPayUtil.queryGeneratePayState("", 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:
+                            break;
+                        case 2:
+                            break;
+                        case 3:
+                            orderCrossCityService.generatePayCallback(id, order_id);
+                            break;
+                    }
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ReassignController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ReassignController.java
new file mode 100644
index 0000000..b45c138
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ReassignController.java
@@ -0,0 +1,202 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.service.IReassignService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.ReassignInfoWarpper;
+import com.stylefeng.guns.modular.system.warpper.ReassignListWarpper;
+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/reassign")
+public class ReassignController {
+
+    @Autowired
+    private IReassignService reassignService;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+
+    /**
+     * 调度端修改司机执行改派操作
+     * @param lineShiftId
+     * @param time
+     * @param driverId
+     * @param orderIds
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/dispatchReassign")
+    @ApiOperation(value = "调度端修改司机执行改派操作", tags = {"调度端-排班管理"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "班次id", name = "lineShiftId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "班次日期(2020-10-13)", name = "time", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "新司机id", name = "driverId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "订单id,多个以逗号分隔", name = "orderIds", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil dispatchReassign(Integer lineShiftId, String time, Integer driverId, String orderIds, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return reassignService.dispatchReassign(lineShiftId, time, driverId, orderIds, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取改派的订单列表
+     * @param pageNum
+     * @param size
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryApplyReassignList")
+    @ApiOperation(value = "获取申请改派的订单列表", tags = {"调度端-新改派订单", "调度端-改派记录"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "页码(首页1)", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "查询状态(1=待处理,2=已处理)", name = "state", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<ReassignListWarpper>> queryApplyReassignList(Integer state, Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<Map<String, Object>> list = reassignService.queryApplyReassignList(state, uid, pageNum, size);
+            return ResultUtil.success(ReassignListWarpper.getReassignListWarppers(list));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取改派详情
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryReassignInfo")
+    @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<ReassignInfoWarpper> queryReassignInfo(Integer id){
+        try {
+            Map<String, Object> map = reassignService.queryReassignInfo(id);
+            return ResultUtil.success(ReassignInfoWarpper.getReassignInfoWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 取消改派操作
+     * @param id
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/cancelReassign")
+    @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 cancelReassign(Integer id, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return reassignService.cancelReassign(id, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 拒绝改派操作
+     * @param id
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/refuseReassign")
+    @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 refuseReassign(Integer id, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return reassignService.refuseReassign(id, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 执行改派操作
+     * @param id
+     * @param driverId
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/executeReassign")
+    @ApiOperation(value = "执行改派操作", tags = {"调度端-新改派订单"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "改派单id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "司机id", name = "driverId", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil executeReassign(Integer id, Integer driverId, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            return reassignService.executeReassign(id, driverId, uid);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SiteController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SiteController.java
new file mode 100644
index 0000000..e7c2062
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SiteController.java
@@ -0,0 +1,106 @@
+package com.stylefeng.guns.modular.api;
+
+
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.service.ISiteService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.LocationWarpper;
+import com.stylefeng.guns.modular.system.warpper.SiteWarpper;
+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.List;
+import java.util.Map;
+
+@Api
+@RestController
+@RequestMapping("/api/site")
+public class SiteController {
+
+    @Autowired
+    private ISiteService siteService;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+
+
+    /**
+     * 获取所有站点
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/querySite", method = RequestMethod.POST)
+    @ApiOperation(value = "获取起点和终点的站点", tags = {"调度端-添加订单"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "起点站点id", name = "startSiteId", required = false, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<SiteWarpper>> querySite(Integer startSiteId, HttpServletRequest request){
+        try {
+            Integer uid = dispatchService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<SiteWarpper> list = siteService.querySite(startSiteId, uid);
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/queryLocation", method = RequestMethod.POST)
+    @ApiOperation(value = "根据站点id获取站点的区域范围数据(设置上车点和下车点)", tags = {"调度端-添加订单"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "站点id", name = "siteId", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    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 = "/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"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil areaMonitoring(Integer siteId, Integer 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/VersionManagementController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/VersionManagementController.java
new file mode 100644
index 0000000..cf09c2f
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/VersionManagementController.java
@@ -0,0 +1,47 @@
+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.VersionManagementWarpper;
+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.Map;
+
+@Api
+@RestController
+@RequestMapping("/api/version")
+public class VersionManagementController {
+
+    @Autowired
+    private IVersionManagementService versionManagementService;
+
+
+    /**
+     * 获取最新版本
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryNewVersion", method = RequestMethod.POST)
+    @ApiOperation(value = "获取最新版本", tags = {"调度端-设置"}, notes = "", response = VersionManagementWarpper.class)
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "改派订单id", name = "reassignId", required = true, dataType = "int"),
+    })
+    public ResultUtil<Object> queryNewVersion(){
+        try {
+            Map<String, Object> map = versionManagementService.queryNewVersion(4);
+            return ResultUtil.success(VersionManagementWarpper.getVersionManagementWarpper(map));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java
new file mode 100644
index 0000000..725029b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java
new file mode 100644
index 0000000..1cebee4
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java
new file mode 100644
index 0000000..f8f9478
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthIntercepter.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthIntercepter.java
new file mode 100644
index 0000000..dd4d01d
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthService.java
new file mode 100644
index 0000000..1a8ae19
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthService.java
@@ -0,0 +1,50 @@
+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 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthenticationKit.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthenticationKit.java
new file mode 100644
index 0000000..5b77d6d
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/AuthenticationKit.java
@@ -0,0 +1,232 @@
+package com.stylefeng.guns.modular.system.auth;
+
+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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/Configuration.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/Configuration.java
new file mode 100644
index 0000000..cd4da6e
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HMACSHA1.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HMACSHA1.java
new file mode 100644
index 0000000..44b89ef
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HashKit.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/HashKit.java
new file mode 100644
index 0000000..9c42b0a
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/UrlEncoderUtils.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/auth/UrlEncoderUtils.java
new file mode 100644
index 0000000..0bb025b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/BlackboardController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/BlackboardController.java
new file mode 100644
index 0000000..49d2df0
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DeptController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DeptController.java
new file mode 100644
index 0000000..032b0eb
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DictController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/DictController.java
new file mode 100644
index 0000000..780a39f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/KaptchaController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/KaptchaController.java
new file mode 100644
index 0000000..59bab03
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LogController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LogController.java
new file mode 100644
index 0000000..a61f929
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginController.java
new file mode 100644
index 0000000..f32483a
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginLogController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/LoginLogController.java
new file mode 100644
index 0000000..9655379
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/MenuController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/MenuController.java
new file mode 100644
index 0000000..37c72fc
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/NoticeController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/NoticeController.java
new file mode 100644
index 0000000..7211823
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/RoleController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/RoleController.java
new file mode 100644
index 0000000..6e7893d
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/UserMgrController.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/UserMgrController.java
new file mode 100644
index 0000000..b84703f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java
new file mode 100644
index 0000000..6a7b86c
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarMapper.java
@@ -0,0 +1,27 @@
+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
+     */
+    List<Map<String, Object>> queryCarList(@Param("companyId") Integer companyId);
+
+
+    /**
+     * 获取车辆详情
+     * @param id
+     * @return
+     */
+    Map<String, Object> queryCarInfo(@Param("id") Integer id);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.java
new file mode 100644
index 0000000..8a7d0d0
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.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.CarModel;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface CarModelMapper extends BaseMapper<CarModel> {
+
+
+    /**
+     * 根据车辆id获取对应的车型
+     * @param carId
+     * @return
+     */
+    CarModel queryByCarId(@Param("carId") Integer carId);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java
new file mode 100644
index 0000000..a92fb85
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java
new file mode 100644
index 0000000..55677f1
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DispatchMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DispatchMapper.java
new file mode 100644
index 0000000..b369a9d
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DispatchMapper.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.Dispatch;
+import org.apache.ibatis.annotations.Param;
+
+public interface DispatchMapper extends BaseMapper<Dispatch> {
+
+
+    /**
+     * 根据账号获取数据
+     * @param account
+     * @return
+     */
+    Dispatch queryByAccount(@Param("account") String account);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java
new file mode 100644
index 0000000..ea0a2e4
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverMapper.java
@@ -0,0 +1,65 @@
+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.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface DriverMapper extends BaseMapper<Driver> {
+
+
+    /**
+     * 获取改派的司机列表(专车)
+     * 1.司机上班
+     * 2.司机设置了接单规则
+     * 3.给定企业下的司机
+     * 4.司机车辆服务车型匹配
+     * 5.司机设置了专车服务类型
+     * 6.司机处于空闲状态
+     * @param companyId
+     * @param serverCarModelId
+     * @return
+     */
+    List<Map<String, Object>> queryReassignDriverPrivateCar(@Param("companyId") Integer companyId, @Param("serverCarModelId") Integer serverCarModelId);
+
+
+
+
+    /**
+     * 获取改派的司机列表(跨城)
+     * 1.司机上班
+     * 2.司机设置了接单规则
+     * 3.给定企业下的司机
+     * 4.司机车辆服务车型匹配
+     * 5.司机设置了跨城服务类型
+     * 6.司机可经营给定线路
+     * 7.司机预约了给定班次
+     * 8.剩余座位数满足给定数量
+     * 9.司机不处于离线状态
+     * @param companyId
+     * @param serverCarModelId
+     * @return
+     */
+    List<Map<String, Object>> queryReassignDriverCrossCity(@Param("companyId") Integer companyId, @Param("serverCarModelId") Integer serverCarModelId,
+                                                           @Param("lineId") Integer lineId, @Param("lineShiftId") Integer lineShiftId,
+                                                           @Param("time") Date time, @Param("num") Integer num);
+
+
+    /**
+     * 获取所有没有服务的司机
+     * @param companyId
+     * @return
+     */
+    List<Map<String, Object>> queryAllDriver(@Param("companyId") Integer companyId);
+
+
+    /**
+     * 根据车辆id获取司机
+     * @param carId
+     * @return
+     */
+    List<Driver> queryByCarId(@Param("carId") Integer carId);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverServiceMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverServiceMapper.java
new file mode 100644
index 0000000..16ca189
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ExpenseMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ExpenseMapper.java
new file mode 100644
index 0000000..312d243
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java
new file mode 100644
index 0000000..67bfb34
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java
new file mode 100644
index 0000000..e8b8cfa
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineMapper.java
new file mode 100644
index 0000000..21be97d
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineMapper.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.Line;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface LineMapper extends BaseMapper<Line> {
+
+    /**
+     * 获取企业的所有线路
+     * @param companyId
+     * @return
+     */
+    List<Map<String, Object>> queryLine(@Param("companyId") Integer companyId);
+
+
+
+    /**
+     * 根据站点id获取匹配的线路数据
+     * @param siteId
+     * @param type
+     * @return
+     */
+    List<Map<String, Object>> queryLines(@Param("siteId") Integer siteId, @Param("type")Integer type,
+                                         @Param("companyId") Integer companyId);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LinePriceMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LinePriceMapper.java
new file mode 100644
index 0000000..5a4bc26
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LinePriceMapper.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.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftDriverMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftDriverMapper.java
new file mode 100644
index 0000000..ccd953c
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftDriverMapper.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.LineShiftDriver;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface LineShiftDriverMapper extends BaseMapper<LineShiftDriver> {
+
+    /**
+     * 获取预约数据
+     * @param lineShiftId
+     * @param driverId
+     * @param time
+     * @return
+     */
+    List<LineShiftDriver> query(@Param("lineShiftId") Integer lineShiftId, @Param("driverId") Integer driverId,
+                                @Param("time") Date time) ;
+
+
+    /**
+     * 获取没有预约给定日期班次的司机
+     * @param lineShiftId
+     * @param time
+     * @return
+     */
+    List<Map<String, Object>> queryNotInLineShiftDriver(@Param("lineShiftId") Integer lineShiftId, @Param("time") Date time);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftMapper.java
new file mode 100644
index 0000000..578cf0b
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftMapper.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.LineShift;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface LineShiftMapper extends BaseMapper<LineShift> {
+
+
+    /**
+     * 根据线路id获取排班数据
+     * @param lineId
+     * @return
+     */
+    List<Map<String, Object>> queryByLineId(@Param("lineId") Integer lineId);
+
+
+    /**
+     * 获取详情数据
+     * @param id
+     * @return
+     */
+    List<Map<String, Object>> queryInfo(@Param("id") Integer id, @Param("time") Date time);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineSiteMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineSiteMapper.java
new file mode 100644
index 0000000..06b8e5f
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineSiteMapper.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LocationMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LocationMapper.java
new file mode 100644
index 0000000..b351964
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LocationMapper.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.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java
new file mode 100644
index 0000000..2e55025
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java
new file mode 100644
index 0000000..ea0232d
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java
new file mode 100644
index 0000000..5638129
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java
new file mode 100644
index 0000000..eaf5760
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java
new file mode 100644
index 0000000..22cbb6b
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.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.OrderCancel;
+import org.apache.ibatis.annotations.Param;
+
+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);
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCrossCityMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCrossCityMapper.java
new file mode 100644
index 0000000..9a521a0
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCrossCityMapper.java
@@ -0,0 +1,77 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.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> {
+
+
+    /**
+     * 获取订单列表
+     * @param search
+     * @param orderSource
+     * @param state
+     * @param companyId
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryOrderList(@Param("search") String search, @Param("orderSource") List<String> orderSource,
+                                             @Param("state") List<String> state, @Param("lineId") List<String> lineId,
+                                             @Param("companyId") Integer companyId, @Param("pageNum") Integer pageNum,
+                                             @Param("size") Integer size);
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(@Param("id") Integer orderId);
+
+
+    /**
+     * 根据司机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> query(@Param("start") Date start, @Param("end") Date end);
+
+
+    /**
+     * 获取司机给定时间范围内的订单
+     * @param driverId
+     * @param start
+     * @param end
+     * @param state
+     * @return
+     */
+    List<OrderCrossCity> queryByDriver(@Param("driverId") Integer driverId, @Param("start") Date start,
+                                         @Param("end") Date end, @Param("state") Integer... state);
+
+
+    /**
+     * 获取排班数据对应的订单
+     * @param lineShiftDriverId
+     * @param state
+     * @return
+     */
+    List<OrderCrossCity> queryByLineShiftDriverId(@Param("lineShiftDriverId") Integer lineShiftDriverId, @Param("state") Integer... state);
+
+
+
+    List<OrderCrossCity> queryListOrder(@Param("driverId") Integer driverId, @Param("lineShiftId") Integer lineShiftId,
+                                        @Param("state") List<Integer> state, @Param("day") String day);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPositionMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPositionMapper.java
new file mode 100644
index 0000000..3f0c01b
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPositionMapper.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.OrderPosition;
+import org.apache.ibatis.annotations.Param;
+
+public interface OrderPositionMapper extends BaseMapper<OrderPosition> {
+
+
+    /**
+     * 获取最新的坐标位置
+     * @param orderId
+     * @param orderType
+     * @return
+     */
+    OrderPosition queryNew(@Param("orderId") Integer orderId, @Param("orderType") Integer orderType);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPrivateCarMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPrivateCarMapper.java
new file mode 100644
index 0000000..1d8007e
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderPrivateCarMapper.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.OrderPrivateCar;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface OrderPrivateCarMapper extends BaseMapper<OrderPrivateCar> {
+
+
+    /**
+     * 获取订单列表
+     * @param search
+     * @param orderSource
+     * @param state
+     * @param companyId
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryOrderList(@Param("search") String search, @Param("orderSource") List<String> orderSource,
+                                             @Param("state") List<String> state, @Param("companyId") Integer companyId,
+                                             @Param("pageNum") Integer pageNum, @Param("size") Integer size);
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String, Object> queryOrderInfo(@Param("orderId") Integer orderId);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderTaxiMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderTaxiMapper.java
new file mode 100644
index 0000000..1720dda
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderTaxiMapper.java
@@ -0,0 +1,92 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PaymentRecordMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PaymentRecordMapper.java
new file mode 100644
index 0000000..a15724a
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PaymentRecordMapper.java
@@ -0,0 +1,21 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.PaymentRecord;
+import org.apache.ibatis.annotations.Param;
+
+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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ReassignMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ReassignMapper.java
new file mode 100644
index 0000000..3083dd7
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/ReassignMapper.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.Reassign;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ReassignMapper extends BaseMapper<Reassign> {
+
+
+    /**
+     * 获取企业的改派申请数据(未处理的)
+     * @param companyId
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryApplyReassignList(@Param("companyId") Integer companyId, @Param("state") Integer state,
+                                                     @Param("pageNum") Integer pageNum, @Param("size") Integer size);
+
+
+    /**
+     * 获取改派详情
+     * @param id
+     * @return
+     */
+    Map<String, Object> queryReassignInfo(@Param("id") Integer id);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java
new file mode 100644
index 0000000..e216a29
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.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.Region;
+import org.apache.ibatis.annotations.Param;
+
+public interface RegionMapper extends BaseMapper<Region> {
+
+
+
+    Region query(@Param("code") String code);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java
new file mode 100644
index 0000000..828a596
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java
new file mode 100644
index 0000000..d95d87f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SiteMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SiteMapper.java
new file mode 100644
index 0000000..5a9fea9
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SiteMapper.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.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, @Param("companyId") Integer companyId);
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemNoticeMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemNoticeMapper.java
new file mode 100644
index 0000000..ac9368e
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemNoticeMapper.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.SystemNotice;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface SystemNoticeMapper extends BaseMapper<SystemNotice> {
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TransactionDetailsMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TransactionDetailsMapper.java
new file mode 100644
index 0000000..47dabfe
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TransactionDetailsMapper.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.TransactionDetails;
+
+public interface TransactionDetailsMapper extends BaseMapper<TransactionDetails> {
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java
new file mode 100644
index 0000000..1cbb2a4
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.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.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);
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java
new file mode 100644
index 0000000..c15c8fc
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VersionManagementMapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/VersionManagementMapper.java
new file mode 100644
index 0000000..89b007a
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.xml
new file mode 100644
index 0000000..ca4fd7a
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarMapper.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.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="queryCarList" resultType="map">
+        select
+        a.id as id,
+        a.carLicensePlate as name,
+        if((
+        (select count(id) from t_order_private_car where isDelete = 1 and state in (6,7,8,9,10,12) and carId = a.id) +
+        (select count(id) from t_order_taxi where isDelete = 1 and state in (6,7,8,9,10,12) and carId = a.id) +
+        (select count(id) from t_order_cross_city where isDelete = 1 and state in (6,8,9,10,12) and carId = a.id)
+        ) = 0, 1, 2) as state
+        from t_car a where a.state = 1 and if(a.franchiseeId is null or a.franchiseeId = 0, a.companyId = #{companyId}, a.franchiseeId = #{companyId})
+    </select>
+
+
+    <select id="queryCarInfo" resultType="map">
+        select
+        a.id as id,
+        CONCAT(b.`name`, '-', b.phone) as driver,
+        c.`name` as brand,
+        d.`name` as carModel,
+        a.carColor as color,
+        if((
+        (select count(id) from t_order_private_car where isDelete = 1 and state in (6,7,8,9,10,12) and carId = a.id) +
+        (select count(id) from t_order_taxi where isDelete = 1 and state in (6,7,8,9,10,12) and carId = a.id) +
+        (select count(id) from t_order_cross_city where isDelete = 1 and state in (6,8,9,10,12) and carId = a.id)
+        ) = 0, 1, 2) as state
+        from t_car a
+        left join t_driver b on (a.id = b.carId)
+        left join t_car_brand c on (a.carBrandId = c.id)
+        left join t_car_model d on (a.carModelId = d.id)
+        where a.id = #{id}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.xml
new file mode 100644
index 0000000..3bc8256
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.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.CarModelMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.CarModel">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="remark" property="remark"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="state" property="state"/>
+        <result column="seat" property="seat"/>
+        <result column="brandId" property="brandId"/>
+    </resultMap>
+
+
+    <select id="queryByCarId" resultType="CarModel">
+        select
+        id as id,
+        name as name,
+        remark as remark,
+        insertTime as insertTime,
+        state as state,
+        seat as seat,
+        brandId as brandId
+        from t_car_model where id in (select carModelId from t_car where id = #{carId})
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml
new file mode 100644
index 0000000..c89d952
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml
new file mode 100644
index 0000000..54742bd
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DispatchMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DispatchMapper.xml
new file mode 100644
index 0000000..5b5ee91
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DispatchMapper.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.system.dao.DispatchMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Dispatch">
+        <id column="id" property="id"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="name" property="name"/>
+        <result column="companyId" property="companyId"/>
+        <result column="franchiseeId" property="franchiseeId"/>
+        <result column="phone" property="phone"/>
+        <result column="account" property="account"/>
+        <result column="password" property="password"/>
+        <result column="insertUserId" property="insertUserId"/>
+        <result column="state" property="state"/>
+        <result column="pushOrder" property="pushOrder"/>
+    </resultMap>
+
+
+    <select id="queryByAccount" resultType="Dispatch">
+        select
+        id as id,
+        insertTime as insertTime,
+        `name` as `name`,
+        companyId as companyId,
+        franchiseeId as franchiseeId,
+        phone as phone,
+        account as account,
+        password as password,
+        insertUserId as insertUserId,
+        state as state,
+        pushOrder as pushOrder
+        from t_dispatch where state != 3 and account = #{account}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml
new file mode 100644
index 0000000..a9c2a6b
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml
@@ -0,0 +1,194 @@
+<?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="queryReassignDriverPrivateCar" resultType="map">
+        select
+        a.id as id,
+        CONCAT(a.`name`, '-', d.carLicensePlate) as `name`
+        from t_driver a
+        left join t_driver_service b on (a.id = b.driverId)
+        left join t_driver_orders c on (a.id = c.driverId)
+        left join t_car d on (a.carId = d.id)
+        left join t_car_service e on (d.id = e.carId)
+        where a.authState = 2 and a.state = 2 and a.flag != 3 and if(a.franchiseeId is null or a.franchiseeId = 0, a.companyId = #{companyId}, a.franchiseeId = #{companyId})
+        and a.id in (select driverId from t_driver_work where state = 1 and type like '%1%')
+        and b.type = 1 and c.type = 1 and e.type = 1 and e.serverCarModelId = #{serverCarModelId}
+    </select>
+
+
+    <select id="queryReassignDriverCrossCity" resultType="map">
+        select
+        a.id as id,
+        CONCAT(a.`name`, '-', d.carLicensePlate) as `name`
+        from t_driver a
+        left join t_driver_service b on (a.id = b.driverId)
+        left join t_driver_orders c on (a.id = c.driverId)
+        left join t_car d on (a.carId = d.id)
+        left join t_car_service e on (d.id = e.carId)
+        left join t_driver_line f on (a.id = f.driverId)
+        left join t_line_shift g on (f.lineId = g.lineId)
+        where a.authState = 2 and a.state != 1 and a.flag != 3 and if(a.franchiseeId is null or a.franchiseeId = 0, a.companyId = #{companyId}, a.franchiseeId = #{companyId})
+        and a.id in (select driverId from t_driver_work where state = 1 and type like '%3%')
+        and b.type = 3 and c.type = 3 and e.type = 3 and e.serverCarModelId = #{serverCarModelId} and f.lineId = #{lineId} and g.id = #{lineShiftId}
+        and a.id in (select driverId from t_line_shift_driver where lineShiftId = #{lineShiftId} and DATE_FORMAT(`day`, '%Y-%m-%d') = DATE_FORMAT(#{time}, '%Y-%m-%d') and laveSeat >= #{num})
+    </select>
+
+
+    <select id="queryAllDriver" resultType="map">
+        select
+        id as id,
+        CONCAT(`name`, '-', phone) as name
+        from t_driver where authState = 2 and state != 3 and flag != 3 and if(franchiseeId is null or franchiseeId = 0, companyId = #{companyId}, franchiseeId = #{companyId})
+    </select>
+
+
+
+    <select id="queryByCarId" 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,
+        activityMoney as activityMoney,
+        laveActivityMoney as laveActivityMoney,
+        businessMoney as businessMoney,
+        laveBusinessMoney as laveBusinessMoney,
+        laveBusinessMoney as laveBusinessMoney,
+        appletsOpenId as appletsOpenId,
+        flag as flag,
+        insertTime as insertTime,
+        insertUser as insertUser,
+        updateTime as updateTime,
+        updateUser as updateUser
+        from t_driver where flag != 3 and authState = 2 and carId = #{carId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverServiceMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverServiceMapper.xml
new file mode 100644
index 0000000..9995d25
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ExpenseMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ExpenseMapper.xml
new file mode 100644
index 0000000..74e8be4
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml
new file mode 100644
index 0000000..9f9cf25
--- /dev/null
+++ b/DispatchOKTravel/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}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml
new file mode 100644
index 0000000..c672369
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineMapper.xml
new file mode 100644
index 0000000..716f473
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineMapper.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.LineMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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
+        from t_line a
+        left join t_line_site b on (a.id = b.lineId)
+        left join t_line_company c on (b.lineId = c.lineId)
+        where a.state = 1 and b.siteId = #{siteId} and b.type = #{type} and c.companyId = #{companyId}
+    </select>
+
+
+    <select id="queryLine" resultType="map">
+        select
+        a.id as id,
+        a.`name` as `name`
+        from t_line a
+        left join t_line_company b on (a.id = b.lineId)
+        where a.state = 1
+        <if test="null != companyId">
+            and b.companyId = #{companyId}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LinePriceMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LinePriceMapper.xml
new file mode 100644
index 0000000..9da2f46
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/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.system.dao.LinePriceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftDriverMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftDriverMapper.xml
new file mode 100644
index 0000000..7bf58a9
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftDriverMapper.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.LineShiftDriverMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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>
+
+
+
+    <select id="query" resultType="LineShiftDriver">
+        select
+        id as id,
+        lineShiftId as lineShiftId,
+        driverId as driverId,
+        `day` as `day`,
+        laveSeat as laveSeat,
+        laveSeatNumber as laveSeatNumber,
+        totalSeat as totalSeat,
+        inserTime as inserTime
+        from t_line_shift_driver where 1 = 1
+        <if test="null != lineShiftId">
+            and lineShiftId = #{lineShiftId}
+        </if>
+        <if test="null != driverId">
+            and driverId = #{driverId}
+        </if>
+        <if test="null != time">
+            and DATE_FORMAT(`day`, '%Y-%m-%d') = DATE_FORMAT(#{time}, '%Y-%m-%d')
+        </if>
+        order by `day`
+    </select>
+
+
+    <select id="queryNotInLineShiftDriver" resultType="map">
+        select
+        d.id as id,
+        CONCAT(d.`name`, '-', d.phone) as `name`
+        from t_driver d
+        left join t_driver_line dl on (d.id = dl.driverId)
+        where d.authState = 2 and d.flag != 3 and dl.lineId in
+        (
+            select lineId from t_line_shift where id = #{lineShiftId}
+        )
+        and d.id not in
+        (
+            select lsd.driverId
+            from t_line_shift_driver lsd
+            left join t_line_shift ls on (lsd.lineShiftId = ls.id)
+            where ls.id = #{lineShiftId} and DATE_FORMAT(lsd.`day`, '%Y-%m-%d') = DATE_FORMAT(#{time}, '%Y-%m-%d')
+        )
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftMapper.xml
new file mode 100644
index 0000000..561c209
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftMapper.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.LineShiftMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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="map">
+        select
+        id as id,
+        CONCAT(startTime, '-', endTime) as content
+        from t_line_shift where state = 1 and lineId = #{lineId} order by startTime
+    </select>
+
+
+    <select id="queryInfo" resultType="map">
+        select
+        a.id as id,
+        b.id as driverId,
+        CONCAT(b.`name`, '-', b.phone) as driver
+        from t_line_shift_driver a
+        left join t_driver b on (a.driverId = b.id)
+        where b.flag != 3 and b.authState = 2 and DATE_FORMAT(a.`day`,'%Y-%m-%d') = DATE_FORMAT(#{time},'%Y-%m-%d') and a.lineShiftId = #{id}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineSiteMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineSiteMapper.xml
new file mode 100644
index 0000000..e7b101b
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineSiteMapper.xml
@@ -0,0 +1,57 @@
+<?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.LineSiteMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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 lineShiftId,
+        b.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((a.totalSeat - a.laveSeat), '/', a.totalSeat) as `number`,
+        (select sum(fraction)/count(fraction) from t_order_evaluate where driverId = a.driverId) as evaluate,
+        h.type as priceType,
+        h.content as content,
+        a.driverId as driverId,
+        c.carId as carId,
+        a.totalSeat as totalSeat,
+        g.serverCarModelId as serverCarModelId,
+        a.laveSeatNumber as laveSeatNumber,
+        a.laveSeat as laveSeat
+        from t_line_shift_driver a
+        left join t_line_shift b on (a.lineShiftId = b.id)
+        left join t_driver c on (a.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 b.lineId = h.lineId)
+        where 1 = 1
+        <if test="null != lineId">
+            and b.lineId = #{lineId}
+        </if>
+        <if test="null != day">
+            and a.day = #{day}
+        </if>
+        <if test="null != driverId">
+            and a.driverId = #{driverId}
+        </if>
+        order by b.startTime
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LocationMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LocationMapper.xml
new file mode 100644
index 0000000..4337177
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LocationMapper.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.LocationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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="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
+        from t_location where state = 1 and siteId = #{siteId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml
new file mode 100644
index 0000000..94423d9
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml
new file mode 100644
index 0000000..849dc3f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml
new file mode 100644
index 0000000..6d4ba33
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml
new file mode 100644
index 0000000..1d0d711
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml
new file mode 100644
index 0000000..df3d2d2
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml
@@ -0,0 +1,52 @@
+<?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
+        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>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCrossCityMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCrossCityMapper.xml
new file mode 100644
index 0000000..37cac7e
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCrossCityMapper.xml
@@ -0,0 +1,607 @@
+<?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.OrderCrossCityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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"/>
+    </resultMap>
+
+
+    <select id="queryOrderList" resultType="map">
+        select
+        a.id as id,
+        DATE_FORMAT(a.insertTime, '%Y年%m月%d日%H:%i') as orderTime,
+        CONCAT(b.nickName, '-', b.phone) as `user`,
+        a.startAddress as startAddress,
+        a.endAddress as endAddress,
+        a.state as state,
+        c.`name` as lineName
+        from t_order_cross_city a
+        left join t_user b on (a.userId = b.id)
+        left join t_line c on (a.lineId = c.id)
+        left join t_car d on (a.carId = d.id)
+        left join t_driver e on (a.driverId = e.id)
+        where a.isDelete = 1 and a.companyId = #{companyId}
+        <if test="null != search and '' != search">
+            and (a.passengersPhone = #{search} or c.name like CONCAT('%', #{search}, '%') or e.phone like CONCAT('%', #{search}, '%') or d.carLicensePlate like CONCAT('%', #{search}, '%'))
+        </if>
+        <if test="null != orderSource">
+            and a.orderSource in
+            <foreach collection="orderSource" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </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 != lineId">
+            and a.lineId in
+            <foreach collection="lineId" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        order by a.insertTime desc
+        <if test="null != pageNum and null != size">
+            limit #{pageNum}, #{size}
+        </if>
+    </select>
+
+
+    <select id="queryOrderInfo" resultType="map">
+        select
+        a.id as id,
+        DATE_FORMAT(a.insertTime, '%Y/%m/%d/%H:%i') as orderTime,
+        a.orderNum as orderNumber,
+        a.orderSource as orderSource,
+        DATE_FORMAT(a.travelTime, '%Y/%m/%d/%H:%i') as travelTime,
+        CONCAT(b.nickName, '-', b.phone) as `user`,
+        CONCAT(a.passengers, '-',a.passengersPhone) as passengers,
+        a.startAddress as startAddress,
+        a.endAddress as endAddress,
+        c.`name` as line,
+        a.peopleNumber as peopleNumber,
+        a.seatNumber as seatNumber,
+        a.remark as remark,
+        a.orderMoney as orderMoney,
+        a.travelMode as travelType,
+        CONCAT(d.`name`, '-',d.phone) as driver,
+        e.carLicensePlate as car,
+        a.state as state
+        from t_order_cross_city a
+        left join t_user b on (a.userId = b.id)
+        left join t_line c on (a.lineId = c.id)
+        left join t_driver d on (a.driverId = d.id)
+        left join t_car e on (a.carId = e.id)
+        where a.id = #{id}
+    </select>
+
+
+    <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
+        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
+        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="queryByDriver" 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
+        from t_order_cross_city where isDelete = 1
+        <if test="null != start and null != end">
+            and travelTime between #{start} and #{end}
+        </if>
+        <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="queryByLineShiftDriverId" 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
+        from t_order_cross_city where isDelete = 1
+        <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="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
+        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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPositionMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPositionMapper.xml
new file mode 100644
index 0000000..9febf05
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPositionMapper.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.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="queryNew" resultType="OrderPosition">
+        select
+        id as id,
+        orderType as orderType,
+        orderId as orderId,
+        driverId as driverId,
+        lon as lon,
+        lat as lat,
+        directionAngle as directionAngle,
+        altitude as altitude,
+        insertTime as insertTime
+        from t_order_position where orderId = #{orderId} and orderType = #{orderType} order by insertTime desc limit 0,1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPrivateCarMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPrivateCarMapper.xml
new file mode 100644
index 0000000..f5791aa
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderPrivateCarMapper.xml
@@ -0,0 +1,141 @@
+<?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.OrderPrivateCarMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OrderPrivateCar">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <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="queryOrderList" resultType="map">
+        select
+        a.id as id,
+        DATE_FORMAT(a.insertTime, '%Y年%m月%d日%H:%i') as orderTime,
+        CONCAT(b.nickName, '-', b.phone) as `user`,
+        a.startAddress as startAddress,
+        a.endAddress as endAddress,
+        a.state as state
+        from t_order_private_car a
+        left join t_user b on (a.userId = b.id)
+        left join t_driver c on (a.driverId = c.id)
+        left join t_car d on (a.carId = d.id)
+        where a.isDelete = 1 and a.companyId = #{companyId}
+        <if test="null != search and '' != search">
+            and (a.passengersPhone = #{search} or c.name like CONCAT('%', #{search}, '%') or c.phone like CONCAT('%', #{search}, '%') or d.carLicensePlate like CONCAT('%', #{search}, '%'))
+        </if>
+        <if test="null != orderSource">
+            and a.orderSource in
+            <foreach collection="orderSource" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != state">
+            and a.state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        order by a.insertTime desc
+        <if test="null != pageNum and null != size">
+            limit #{pageNum}, #{size}
+        </if>
+    </select>
+
+
+
+    <select id="queryOrderInfo" resultType="map">
+        select
+        a.id as id,
+        DATE_FORMAT(a.insertTime, '%Y/%m/%d/%H:%i') as orderTime,
+        a.orderNum as orderNumber,
+        DATE_FORMAT(a.travelTime, '%Y/%m/%d/%H:%i') as travelTime,
+        CONCAT(b.nickName, '-', b.phone) as `user`,
+        a.startAddress as startAddress,
+        a.endAddress as endAddress,
+        c.`name` as serverCarModel,
+        a.orderMoney as orderMoney,
+        CONCAT(d.`name`, '-',d.phone) as driver,
+        e.carLicensePlate as car,
+        CONCAT(g.`name`, '-',g.phone) as originalDriver,
+        a.state as state
+        from t_order_private_car a
+        left join t_user b on (a.userId = b.id)
+        left join t_server_carmodel c on (a.serverCarModelId = c.id)
+        left join t_driver d on (a.driverId = d.id)
+        left join t_car e on (a.carId = e.id)
+        left join (select * from t_reassign where orderType = 1 and orderId = #{orderId} order by insertTime desc limit 0, 1) as f on (a.id = f.orderId and f.orderType = 1)
+        left join t_driver g on (f.originalDriverId = g.id)
+        where a.id = #{orderId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderTaxiMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderTaxiMapper.xml
new file mode 100644
index 0000000..34b0ab0
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/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.system.dao.OrderTaxiMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PaymentRecordMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PaymentRecordMapper.xml
new file mode 100644
index 0000000..7a3b0f1
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/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.system.dao.PaymentRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ReassignMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ReassignMapper.xml
new file mode 100644
index 0000000..dc0bb98
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/ReassignMapper.xml
@@ -0,0 +1,91 @@
+<?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.ReassignMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Reassign">
+        <id column="id" property="id"/>
+        <result column="orderType" property="orderType"/>
+        <result column="orderId" property="orderId"/>
+        <result column="originalDriverId" property="originalDriverId"/>
+        <result column="originalCarId" property="originalCarId"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="nowDriverId" property="nowDriverId"/>
+        <result column="nowCarId" property="nowCarId"/>
+        <result column="money" property="money"/>
+        <result column="payType" property="payType"/>
+        <result column="payTime" property="payTime"/>
+        <result column="payOrder" property="payOrder"/>
+        <result column="state" property="state"/>
+        <result column="reason" property="reason"/>
+        <result column="remark" property="remark"/>
+        <result column="reviewer" property="reviewer"/>
+        <result column="reviewerType" property="reviewerType"/>
+        <result column="completeTime" property="completeTime"/>
+    </resultMap>
+
+
+
+    <select id="queryApplyReassignList" resultType="map">
+        select
+        a.id as id,
+        DATE_FORMAT(a.insertTime, '%Y年%m月%d日%H:%i') as applyTime,
+        if(a.orderType = 1, c.startAddress, b.startAddress) as startAddress,
+        if(a.orderType = 1, c.endAddress, b.endAddress) as endAddress,
+        CONCAT(d.`name`, '-', f.carLicensePlate) applyDriver,
+        CONCAT(e.`name`, '-', g.carLicensePlate) nowDriver,
+        a.state as state,
+        a.orderType as orderType
+        from t_reassign a
+        left join t_order_cross_city b on (a.orderId = b.id and a.orderType = 3)
+        left join t_order_private_car c on (a.orderId = c.id and a.orderType = 1)
+        left join t_driver d on (a.originalDriverId = d.id)
+        left join t_driver e on (a.nowDriverId = e.id)
+        left join t_car f on (d.carId = f.id)
+        left join t_car g on (e.carId = g.id)
+        where a.orderType in (1, 3)
+        <if test="null != companyId">
+            and if(d.franchiseeId is null or d.franchiseeId = 0, d.companyId = #{companyId}, d.franchiseeId = #{companyId})
+        </if>
+        <if test="state == 1">
+            and a.state in (2) and (b.state not in (10, 12) or c.state not in (10, 12))
+        </if>
+        <if test="state == 2">
+            and a.state in (3, 4, 5)
+        </if>
+        order by a.insertTime desc
+        <if test="null != pageNum and null != size">
+            limit #{pageNum}, #{size}
+        </if>
+    </select>
+
+
+    <select id="queryReassignInfo" resultType="map">
+        select
+        a.id as id,
+        DATE_FORMAT(a.insertTime, '%Y.%m.%d-%H:%i') as applyTime,
+        CONCAT(d.`name`, '-', e.carLicensePlate) as applyDriver,
+        a.reason as reason,
+        if(a.orderType = 1, f.nickName, g.nickName) as `user`,
+        if(a.orderType = 1, DATE_FORMAT(b.travelTime, '%Y.%m.%d-%H:%i'), DATE_FORMAT(c.travelTime, '%Y.%m.%d-%H:%i')) as travelTime,
+        if(a.orderType = 1, b.startAddress, c.startAddress) as startAddress,
+        if(a.orderType = 1, b.endAddress, c.endAddress) as endAddress,
+        if(a.orderType = 1, b.state, c.state) as state,
+        a.state as `status`,
+        if(a.reviewerType = 1, i.`name`, h.`name`) as reviewer,
+        CONCAT(j.`name`, '-', k.carLicensePlate) as nowDriver,
+        a.orderType as orderType
+        from t_reassign a
+        left join t_order_private_car b on (a.orderId = b.id and a.orderType = 1)
+        left join t_order_cross_city c on (a.orderId = c.id and a.orderType = 3)
+        left join t_driver d on (a.originalDriverId = d.id)
+        left join t_car e on (a.originalCarId = e.id)
+        left join t_user f on (b.userId = f.id)
+        left join t_user g on (c.userId = g.id)
+        left join sys_user h on (a.reviewer = h.id and a.reviewerType = 2)
+        left join t_dispatch i on (a.reviewer = i.id and a.reviewerType = 1)
+        left join t_driver j on (a.nowDriverId = j.id)
+        left join t_car k on (a.nowCarId = k.id)
+        where a.id = #{id}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml
new file mode 100644
index 0000000..21a5e70
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.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.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>
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml
new file mode 100644
index 0000000..2f4be0a
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml
new file mode 100644
index 0000000..ff4878c
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SiteMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SiteMapper.xml
new file mode 100644
index 0000000..6679bcc
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SiteMapper.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.SiteMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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 si.id as id, si.`name` as `name`, si.provinceCode as cityCode, si.province as cityName from t_site si
+        left join t_line_site ls on (si.id = ls.siteId)
+        left join t_line_company lc on (ls.lineId = lc.lineId)
+        where si.province like '%市' and si.state = 1
+        <if test="null != companyId">
+            and lc.companyId = #{companyId}
+        </if>
+        UNION ALL
+        select si.id as id, si.`name` as `name`, si.cityCode as cityCode, si.city as cityName from t_site si
+        left join t_line_site ls on (si.id = ls.siteId)
+        left join t_line_company lc on (ls.lineId = lc.lineId)
+        where si.province not like '%市' and si.state = 1
+        <if test="null != companyId">
+            and lc.companyId = #{companyId}
+        </if>
+        ) 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemNoticeMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemNoticeMapper.xml
new file mode 100644
index 0000000..9504df6
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemNoticeMapper.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.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>
+
+
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TransactionDetailsMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TransactionDetailsMapper.xml
new file mode 100644
index 0000000..391ca70
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/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.system.dao.TransactionDetailsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml
new file mode 100644
index 0000000..f1df670
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.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.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>
+
+
+</mapper>
\ No newline at end of file
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml
new file mode 100644
index 0000000..befd7d6
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VersionManagementMapper.xml b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/VersionManagementMapper.xml
new file mode 100644
index 0000000..a4d9d89
--- /dev/null
+++ b/DispatchOKTravel/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,
+        mandatory 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java
new file mode 100644
index 0000000..508b65d
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/BaseBean.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/BaseBean.java
new file mode 100644
index 0000000..a11c39e
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Car.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Car.java
new file mode 100644
index 0000000..bdc49e1
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.java
new file mode 100644
index 0000000..b923ded
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.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_car_model")
+public class CarModel {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 状态(1=正常,2=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 座位数
+     */
+    @TableField("seat")
+    private Integer seat;
+    /**
+     * 车辆品牌id
+     */
+    @TableField("brandId")
+    private Integer brandId;
+
+    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 getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    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 getSeat() {
+        return seat;
+    }
+
+    public void setSeat(Integer seat) {
+        this.seat = seat;
+    }
+
+    public Integer getBrandId() {
+        return brandId;
+    }
+
+    public void setBrandId(Integer brandId) {
+        this.brandId = brandId;
+    }
+
+    @Override
+    public String toString() {
+        return "CarModel{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", remark='" + remark + '\'' +
+                ", insertTime=" + insertTime +
+                ", state=" + state +
+                ", seat=" + seat +
+                ", brandId=" + brandId +
+                '}';
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java
new file mode 100644
index 0000000..0790865
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java
new file mode 100644
index 0000000..b021b4b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dispatch.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dispatch.java
new file mode 100644
index 0000000..2d972fe
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dispatch.java
@@ -0,0 +1,177 @@
+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_dispatch")
+public class Dispatch {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 调度姓名
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 所属分公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 加盟商id
+     */
+    @TableField("franchiseeId")
+    private Integer franchiseeId;
+    /**
+     * 联系电话
+     */
+    @TableField("phone")
+    private String phone;
+    /**
+     * 登录账号
+     */
+    @TableField("account")
+    private String account;
+    /**
+     * 登录密码
+     */
+    @TableField("password")
+    private String password;
+    /**
+     * 添加用户id
+     */
+    @TableField("insertUserId")
+    private Integer insertUserId;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 推单配置(1=接收,2=不接收)
+     * @return
+     */
+    @TableField("pushOrder")
+    private Integer pushOrder;
+
+    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 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 getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    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 Integer getInsertUserId() {
+        return insertUserId;
+    }
+
+    public void setInsertUserId(Integer insertUserId) {
+        this.insertUserId = insertUserId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getPushOrder() {
+        return pushOrder;
+    }
+
+    public void setPushOrder(Integer pushOrder) {
+        this.pushOrder = pushOrder;
+    }
+
+    @Override
+    public String toString() {
+        return "Dispatch{" +
+                "id=" + id +
+                ", insertTime=" + insertTime +
+                ", name='" + name + '\'' +
+                ", companyId=" + companyId +
+                ", franchiseeId=" + franchiseeId +
+                ", phone='" + phone + '\'' +
+                ", account='" + account + '\'' +
+                ", password='" + password + '\'' +
+                ", insertUserId=" + insertUserId +
+                ", state=" + state +
+                ", pushOrder=" + pushOrder +
+                '}';
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java
new file mode 100644
index 0000000..91afd07
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java
@@ -0,0 +1,878 @@
+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_driver")
+public class Driver extends BaseBean {
+    /**
+     * 账号
+     */
+    @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;
+
+    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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverService.java
new file mode 100644
index 0000000..7c58371
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Expense.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Expense.java
new file mode 100644
index 0000000..3a5b05e
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java
new file mode 100644
index 0000000..80dffbc
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java
@@ -0,0 +1,91 @@
+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_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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java
new file mode 100644
index 0000000..cae5522
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Line.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Line.java
new file mode 100644
index 0000000..f428278
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Line.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_line")
+public class Line {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 线路名称
+     */
+    @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;
+
+    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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LinePrice.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LinePrice.java
new file mode 100644
index 0000000..8478d8e
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LinePrice.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_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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShift.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShift.java
new file mode 100644
index 0000000..61d5867
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShift.java
@@ -0,0 +1,117 @@
+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_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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShiftDriver.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShiftDriver.java
new file mode 100644
index 0000000..1d89b94
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShiftDriver.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_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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineSite.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineSite.java
new file mode 100644
index 0000000..bb64216
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineSite.java
@@ -0,0 +1,121 @@
+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_line_shift")
+public class LineSite {
+    /**
+     * 主键
+     */
+    @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 "LineSite{" +
+                "id=" + id +
+                ", lineId=" + lineId +
+                ", startTime='" + startTime + '\'' +
+                ", endTime='" + endTime + '\'' +
+                ", carNum=" + carNum +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Location.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Location.java
new file mode 100644
index 0000000..84416c8
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Location.java
@@ -0,0 +1,190 @@
+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_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;
+    /**
+     * 状态(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 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java
new file mode 100644
index 0000000..10135f8
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java
new file mode 100644
index 0000000..6df6215
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java
new file mode 100644
index 0000000..6967223
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java
new file mode 100644
index 0000000..7851475
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java
new file mode 100644
index 0000000..e372cc1
--- /dev/null
+++ b/DispatchOKTravel/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=后台, 3=调度)
+     * @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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCrossCity.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCrossCity.java
new file mode 100644
index 0000000..18a6686
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCrossCity.java
@@ -0,0 +1,881 @@
+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_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;
+    /**
+     * 是否删除(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;
+    }
+
+    @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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPosition.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPosition.java
new file mode 100644
index 0000000..9b07899
--- /dev/null
+++ b/DispatchOKTravel/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;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    @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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPrivateCar.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPrivateCar.java
new file mode 100644
index 0000000..4bf92d8
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPrivateCar.java
@@ -0,0 +1,951 @@
+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_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("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("mileageMoney")
+    private Double mileageMoney;
+    /**
+     * 时长费
+     */
+    @TableField("durationMoney")
+    private Double durationMoney;
+    /**
+     * 等待费
+     */
+    @TableField("waitMoney")
+    private Double waitMoney;
+    /**
+     * 远途费
+     */
+    @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 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 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 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;
+    }
+
+    public Double getWaitMoney() {
+        return waitMoney;
+    }
+
+    public void setWaitMoney(Double waitMoney) {
+        this.waitMoney = waitMoney;
+    }
+
+    public Double getStartMileage() {
+        return startMileage;
+    }
+
+    public void setStartMileage(Double startMileage) {
+        this.startMileage = startMileage;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderPrivateCar{" +
+                "id=" + id +
+                ", type=" + type +
+                ", 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 +
+                ", mileageMoney=" + mileageMoney +
+                ", durationMoney=" + durationMoney +
+                ", waitMoney=" + waitMoney +
+                ", 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderTaxi.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderTaxi.java
new file mode 100644
index 0000000..3bc7725
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderTaxi.java
@@ -0,0 +1,910 @@
+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_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:调度下单)
+     */
+    @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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PaymentRecord.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PaymentRecord.java
new file mode 100644
index 0000000..e2bab92
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PaymentRecord.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_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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Reassign.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Reassign.java
new file mode 100644
index 0000000..0ad04e9
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Reassign.java
@@ -0,0 +1,275 @@
+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_reassign")
+public class Reassign {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 申请改派司机id
+     */
+    @TableField("originalDriverId")
+    private Integer originalDriverId;
+    /**
+     * 原始车辆id
+     */
+    @TableField("originalCarId")
+    private Integer originalCarId;
+    /**
+     * 申请时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 改派后的司机id
+     */
+    @TableField("nowDriverId")
+    private Integer nowDriverId;
+    /**
+     * 改派后的车辆id
+     */
+    @TableField("nowCarId")
+    private Integer nowCarId;
+    /**
+     * 改派支付的金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 改派支付方式(1=微信,2=支付宝,3=余额)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 支付完成时间
+     */
+    @TableField("payTime")
+    private Date payTime;
+    /**
+     * 第三方支付订单id
+     */
+    @TableField("payOrder")
+    private String payOrder;
+    /**
+     * 改派状态(1=提交申请,2=已支付,3=已改派,4=已取消,5=已拒绝)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 改派原因
+     */
+    @TableField("reason")
+    private String reason;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 处理人
+     */
+    @TableField("reviewer")
+    private Integer reviewer;
+    /**
+     * 处理人类型(1=调度,2=后台管理员)
+     */
+    @TableField("reviewerType")
+    private Integer reviewerType;
+    /**
+     * 改派完成时间
+     */
+    @TableField("completeTime")
+    private Date completeTime;
+
+    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 getOriginalDriverId() {
+        return originalDriverId;
+    }
+
+    public void setOriginalDriverId(Integer originalDriverId) {
+        this.originalDriverId = originalDriverId;
+    }
+
+    public Integer getOriginalCarId() {
+        return originalCarId;
+    }
+
+    public void setOriginalCarId(Integer originalCarId) {
+        this.originalCarId = originalCarId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getNowDriverId() {
+        return nowDriverId;
+    }
+
+    public void setNowDriverId(Integer nowDriverId) {
+        this.nowDriverId = nowDriverId;
+    }
+
+    public Integer getNowCarId() {
+        return nowCarId;
+    }
+
+    public void setNowCarId(Integer nowCarId) {
+        this.nowCarId = nowCarId;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    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 String getPayOrder() {
+        return payOrder;
+    }
+
+    public void setPayOrder(String payOrder) {
+        this.payOrder = payOrder;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    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 getReviewer() {
+        return reviewer;
+    }
+
+    public void setReviewer(Integer reviewer) {
+        this.reviewer = reviewer;
+    }
+
+    public Integer getReviewerType() {
+        return reviewerType;
+    }
+
+    public void setReviewerType(Integer reviewerType) {
+        this.reviewerType = reviewerType;
+    }
+
+    public Date getCompleteTime() {
+        return completeTime;
+    }
+
+    public void setCompleteTime(Date completeTime) {
+        this.completeTime = completeTime;
+    }
+
+    @Override
+    public String toString() {
+        return "Reassign{" +
+                "id=" + id +
+                ", orderType=" + orderType +
+                ", orderId=" + orderId +
+                ", originalDriverId=" + originalDriverId +
+                ", originalCarId=" + originalCarId +
+                ", insertTime=" + insertTime +
+                ", nowDriverId=" + nowDriverId +
+                ", nowCarId=" + nowCarId +
+                ", money=" + money +
+                ", payType=" + payType +
+                ", payTime=" + payTime +
+                ", payOrder='" + payOrder + '\'' +
+                ", state=" + state +
+                ", reason='" + reason + '\'' +
+                ", remark='" + remark + '\'' +
+                ", reviewer=" + reviewer +
+                ", reviewerType=" + reviewerType +
+                ", completeTime=" + completeTime +
+                '}';
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java
new file mode 100644
index 0000000..a37c657
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java
new file mode 100644
index 0000000..48c2df6
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java
new file mode 100644
index 0000000..70ae563
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Site.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Site.java
new file mode 100644
index 0000000..bb40cf9
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Site.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_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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemNotice.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SystemNotice.java
new file mode 100644
index 0000000..d4d786b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TransactionDetails.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TransactionDetails.java
new file mode 100644
index 0000000..3f1ee5c
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TransactionDetails.java
@@ -0,0 +1,164 @@
+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_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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java
new file mode 100644
index 0000000..30a9617
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java
new file mode 100644
index 0000000..273005e
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/VersionManagement.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/VersionManagement.java
new file mode 100644
index 0000000..eaf5b73
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICarService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICarService.java
new file mode 100644
index 0000000..87fde4e
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ICarService.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.Car;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface ICarService extends IService<Car> {
+
+
+    /**
+     * 获取车辆列表
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryCarList(Integer uid) throws Exception;
+
+
+    /**
+     * 获取车辆详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryCarInfo(Integer id) throws Exception;
+
+
+    /**
+     * 重新绑定/解绑 车辆
+     * @param id
+     * @param driverId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil rebindDriver(Integer id, Integer driverId) throws Exception;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java
new file mode 100644
index 0000000..fb02331
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java
new file mode 100644
index 0000000..6e3c3c4
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDispatchService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDispatchService.java
new file mode 100644
index 0000000..c58de9d
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDispatchService.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.Dispatch;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import javax.servlet.http.HttpServletRequest;
+
+public interface IDispatchService extends IService<Dispatch> {
+
+
+    /**
+     * 账号密码登录
+     * @param account
+     * @param password
+     * @return
+     * @throws Exception
+     */
+    ResultUtil dispatchLogin(String account, String password) throws Exception;
+
+
+
+    /**
+     * 从redis中获取用户id
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    Integer getUserIdFormRedis(HttpServletRequest request) throws Exception;
+
+
+    /**
+     * 编辑推单配置
+     * @param pushOrder
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil editPushOrder(Integer pushOrder, Integer uid) throws Exception;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.java
new file mode 100644
index 0000000..dde3fa2
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverService.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.Driver;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IDriverService extends IService<Driver> {
+
+
+    /**
+     * 获取预约了改班次的司机列表
+     * @param lineShiftId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryLineShiftDriver(Integer lineShiftId, String time, Integer lineShiftDriverId, Integer driverId) throws Exception;
+
+
+    /**
+     * 获取没有预约给定日期班次的司机
+     * @param lineShiftId
+     * @param time
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryNotInLineShiftDriver(Integer lineShiftId, String time) throws Exception;
+
+
+    /**
+     * 调度端帮司机进行预约排班数据
+     * @param lineShiftId
+     * @param time
+     * @param driverId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil addDriverForLineShift(Integer lineShiftId, String time, Integer driverId) throws Exception;
+
+
+    /**
+     * 获取改派司机列表
+     * @param reassignId
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryReassignDriver(Integer reassignId, Integer uid) throws Exception;
+
+
+    /**
+     * 重新绑定/解绑 车辆司机关系
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryAllDriver(Integer uid) throws Exception;
+
+
+    /**
+     * 根据车辆id获取司机
+     * @param carId
+     * @return
+     * @throws Exception
+     */
+    List<Driver> queryByCarId(Integer carId) throws Exception;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java
new file mode 100644
index 0000000..e40f4c2
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java
new file mode 100644
index 0000000..e1a2fd3
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineService.java
new file mode 100644
index 0000000..b02fe33
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineService.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.Line;
+
+import java.util.List;
+import java.util.Map;
+
+
+public interface ILineService extends IService<Line> {
+
+    /**
+     * 获取企业的所有线路
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryLine(Integer uid) throws Exception;
+
+
+
+    /**
+     * 根据站点id获取线路数据
+     * @param startId
+     * @param endId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryLines(Integer startId, Integer endId, Integer uid) throws Exception;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineShiftService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineShiftService.java
new file mode 100644
index 0000000..a435fd3
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineShiftService.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.LineShift;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ILineShiftService extends IService<LineShift> {
+
+    /**
+     * 根据线路id获取排班数据
+     * @param lineId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryByLineId(Integer lineId) throws Exception;
+
+
+    /**
+     * 获取排班详情
+     * @param lineShiftId
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryLineShiftInfo(Integer lineShiftId, String time) throws Exception;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineSiteService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineSiteService.java
new file mode 100644
index 0000000..b128ca8
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILineSiteService.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.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) throws Exception;
+
+
+    /**
+     * 根据司机排班数据id获取数据(剩余座位号和总座位数)
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> querySeat(Integer id) throws Exception;
+
+
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java
new file mode 100644
index 0000000..d0f4290
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java
new file mode 100644
index 0000000..b976165
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java
new file mode 100644
index 0000000..ced40b4
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java
new file mode 100644
index 0000000..9c37b6b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCancelService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCancelService.java
new file mode 100644
index 0000000..4a57f4c
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCancelService.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OrderCancel;
+
+public interface IOrderCancelService extends IService<OrderCancel> {
+
+
+
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCrossCityService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCrossCityService.java
new file mode 100644
index 0000000..0fc140a
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderCrossCityService.java
@@ -0,0 +1,108 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OrderCrossCity;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
+import com.stylefeng.guns.modular.system.warpper.OrderCrossCityWarpper;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderCrossCityService extends IService<OrderCrossCity> {
+
+    /**
+     * 获取订单列表
+     * @param search
+     * @param orderSource
+     * @param state
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryOrderList(String search, String orderSource, String state, String lineId, Integer pageNum, Integer size, Integer uid) throws Exception;
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryOrderInfo(Integer orderId) throws Exception;
+
+    /**
+     * 取消订单
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil cancelOrder(Integer orderId) throws Exception;
+
+
+
+
+    /**
+     * 跨城下单操作
+     * @param orderCrossCityWarpper
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception;
+
+
+    /**
+     * 获取给定时间范围内的有效订单
+     * @param driverId
+     * @param start
+     * @param end
+     * @return
+     * @throws Exception
+     */
+    List<OrderCrossCity> queryByDriverId(Integer driverId, Date start, Date end, Integer...state) throws Exception;
+
+
+    /**
+     * 获取排班id对应的订单
+     * @param lineShiftDriverId
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    List<OrderCrossCity> queryByLineShiftDriverId(Integer lineShiftDriverId, Integer...state) throws Exception;
+
+
+    /**
+     * 扫码支付回调处理
+     * @param orderId       订单id
+     * @param order_id      工行订单号
+     * @throws Exception
+     */
+    void generatePayCallback(Integer orderId, String order_id) throws Exception;
+
+
+
+    String getOrderNum(Integer driverId, Integer lineShiftDriverId) throws Exception;
+
+
+
+    /**
+     * 计算支付金额
+     * @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;
+
+
+
+    List<OrderCrossCity> queryListOrder(Integer driverId, Integer lineShiftId, List<Integer> state, String day) throws Exception;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPositionService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPositionService.java
new file mode 100644
index 0000000..d7e882c
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPositionService.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.OrderPosition;
+
+import java.util.List;
+
+public interface IOrderPositionService extends IService<OrderPosition> {
+
+
+    /**
+     * 获取订单的最新坐标位置
+     * @param orderId
+     * @param orderType
+     * @return
+     * @throws Exception
+     */
+    OrderPosition queryNew(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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPrivateCarService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPrivateCarService.java
new file mode 100644
index 0000000..a9fc0a0
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderPrivateCarService.java
@@ -0,0 +1,43 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IOrderPrivateCarService extends IService<OrderPrivateCar> {
+
+
+    /**
+     * 获取订单列表
+     * @param search
+     * @param orderSource
+     * @param state
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryOrderList(String search, String orderSource, String state, Integer pageNum, Integer size, Integer uid) throws Exception;
+
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryOrderInfo(Integer orderId) throws Exception;
+
+
+    /**
+     * 取消订单
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    ResultUtil cancelOrder(Integer orderId) throws Exception;
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderTaxiService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderTaxiService.java
new file mode 100644
index 0000000..8f0bbb6
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOrderTaxiService.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.OrderTaxi;
+
+public interface IOrderTaxiService extends IService<OrderTaxi> {
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPaymentRecordService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPaymentRecordService.java
new file mode 100644
index 0000000..cd8dedc
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPaymentRecordService.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.PaymentRecord;
+
+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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IReassignService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IReassignService.java
new file mode 100644
index 0000000..3a6bbb6
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IReassignService.java
@@ -0,0 +1,74 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Reassign;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IReassignService extends IService<Reassign> {
+
+
+    /**
+     * 调度端更换司机执行改派操作
+     * @param driverId
+     * @param orderIds
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil dispatchReassign(Integer lineShiftId, String time, Integer driverId, String orderIds, Integer uid) throws Exception;
+
+
+    /**
+     * 获取提交改派申请的数据
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryApplyReassignList(Integer state, Integer uid, Integer pageNum, Integer size) throws Exception;
+
+
+    /**
+     * 获取改派详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryReassignInfo(Integer id) throws Exception;
+
+
+    /**
+     * 取消改派请求
+     * @param id
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil cancelReassign(Integer id, Integer uid) throws Exception;
+
+
+
+    /**
+     * 拒绝改派请求
+     * @param id
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil refuseReassign(Integer id, Integer uid) throws Exception;
+
+
+    /**
+     * 执行改派操作
+     * @param id
+     * @param driverId
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    ResultUtil executeReassign(Integer id, Integer driverId, Integer uid) throws Exception;
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java
new file mode 100644
index 0000000..4214359
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java
new file mode 100644
index 0000000..cc7332d
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISiteService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISiteService.java
new file mode 100644
index 0000000..4af75f4
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISiteService.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Site;
+import com.stylefeng.guns.modular.system.warpper.SiteWarpper;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ISiteService extends IService<Site> {
+
+
+    /**
+     * 获取所有站点
+     * @return
+     * @throws Exception
+     */
+    List<SiteWarpper> querySite(Integer startSiteId, Integer uid) 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, Integer code, String lonLat) throws Exception;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISystemNoticeService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISystemNoticeService.java
new file mode 100644
index 0000000..b17c690
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISystemNoticeService.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.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;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITransactionDetailsService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITransactionDetailsService.java
new file mode 100644
index 0000000..04ed3d9
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITransactionDetailsService.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.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=余额提现)
+     * @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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserInfoService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserInfoService.java
new file mode 100644
index 0000000..04d703d
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserInfoService.java
@@ -0,0 +1,22 @@
+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
+     * @throws Exception
+     */
+    UserInfo queryByPhone(String phone) throws Exception;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java
new file mode 100644
index 0000000..3869242
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVersionManagementService.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVersionManagementService.java
new file mode 100644
index 0000000..af8a2e1
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IVersionManagementService.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.VersionManagement;
+
+import java.util.Map;
+
+public interface IVersionManagementService extends IService<VersionManagement> {
+
+
+    /**
+     * 获取最新版本数据
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryNewVersion(Integer type) throws Exception;
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CarServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CarServiceImpl.java
new file mode 100644
index 0000000..1494553
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CarServiceImpl.java
@@ -0,0 +1,83 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.CarMapper;
+import com.stylefeng.guns.modular.system.model.Car;
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.service.ICarService;
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.service.IDriverService;
+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.List;
+import java.util.Map;
+
+
+@Service
+public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements ICarService {
+
+    @Resource
+    private CarMapper carMapper;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+    @Autowired
+    private IDriverService driverService;
+
+
+    /**
+     * 获取车辆列表
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryCarList(Integer uid) throws Exception {
+        Integer companyId = dispatchService.selectById(uid).getCompanyId();
+        return carMapper.queryCarList(companyId);
+    }
+
+
+    /**
+     * 获取车辆详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryCarInfo(Integer id) throws Exception {
+        return carMapper.queryCarInfo(id);
+    }
+
+
+    /**
+     * 重新绑定/解绑 车辆司机关系
+     * @param id
+     * @param driverId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil rebindDriver(Integer id, Integer driverId) throws Exception {
+        if(null == driverId){//解除绑定
+            List<Driver> drivers = driverService.queryByCarId(id);
+            if(drivers.size() == 0){
+                return ResultUtil.error("车辆还未绑定司机");
+            }
+            for(Driver driver : drivers){
+                driver.setCarId(null);
+            }
+            driverService.updateAllColumnBatchById(drivers);
+            return ResultUtil.success();
+        }
+
+        Driver driver = driverService.selectById(driverId);
+        driver.setCarId(id);
+        driverService.updateById(driver);
+        return ResultUtil.success();
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java
new file mode 100644
index 0000000..0463d01
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java
new file mode 100644
index 0000000..6757882
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DispatchServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DispatchServiceImpl.java
new file mode 100644
index 0000000..1371bab
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DispatchServiceImpl.java
@@ -0,0 +1,173 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+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.JwtTokenUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.DispatchMapper;
+import com.stylefeng.guns.modular.system.dao.VersionManagementMapper;
+import com.stylefeng.guns.modular.system.model.Dispatch;
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.util.RedisUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.util.UUIDUtil;
+import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
+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.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+
+@Service
+public class DispatchServiceImpl extends ServiceImpl<DispatchMapper, Dispatch> implements IDispatchService {
+
+    @Resource
+    private DispatchMapper dispatchMapper;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Resource
+    private VersionManagementMapper versionManagementMapper;
+
+    private final String SALT = "WL:x9#";
+
+
+    /**
+     * 账号密码登录
+     * @param account
+     * @param password
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil dispatchLogin(String account, String password) throws Exception {
+        Dispatch dispatch = this.queryByAccount(account);
+        if(null == dispatch){
+            return ResultUtil.error("账号无效");
+        }
+        if(dispatch.getState() == 2){
+            return ResultUtil.error("账号被冻结");
+        }
+        if(!ShiroKit.md5(password, SALT).equals(dispatch.getPassword())){
+            return ResultUtil.error("密码错误");
+        }
+
+        //调用单点登录的逻辑
+        this.singlePointLogin(dispatch.getId());
+
+        String token = this.getToken(dispatch, password);
+        LoginWarpper loginWarpper = new LoginWarpper();
+        loginWarpper.setId(dispatch.getId());
+        loginWarpper.setToken(token);
+        loginWarpper.setAppid(UUIDUtil.getRandomCode());
+        loginWarpper.setPushOrder(dispatch.getPushOrder());
+        return ResultUtil.success(loginWarpper);
+    }
+
+
+    /**
+     * 从redis中获取用户id
+     * @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 pushOrder
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil editPushOrder(Integer pushOrder, Integer uid) throws Exception {
+        Dispatch dispatch = this.selectById(uid);
+        if(pushOrder == dispatch.getPushOrder()){
+            return ResultUtil.error("不允许重复配置");
+        }
+        dispatch.setPushOrder(pushOrder);
+        this.updateById(dispatch);
+        return ResultUtil.success();
+    }
+
+    public Dispatch queryByAccount(String account){
+        return dispatchMapper.queryByAccount(account);
+    }
+
+
+
+    /**
+     * 获取token
+     * @param dispatch
+     * @param password
+     * @return
+     */
+    private String getToken(Dispatch dispatch, String password) throws Exception{
+        //封装请求账号密码为shiro可验证的token
+        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(dispatch.getAccount(), password.toCharArray());
+        String credentials = dispatch.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(dispatch.getId()));
+        redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(dispatch.getId()), 7 * 24 * 60 * 60);
+        redisUtil.setStrValue(dispatch.getPhone(), s.substring(s.length() - 32));
+        redisUtil.setStrValue("DISPATCH_" + dispatch.getId(), s);
+        return s;
+    }
+
+
+
+    /**
+     * 单点登录
+     * @param id
+     */
+    private void singlePointLogin(Integer id) throws Exception{
+        //开始验证当前账号是否在别处登录
+        String value = redisUtil.getValue("DISPATCH_" + id);
+        if(ToolUtil.isNotEmpty(value)){//将另外设备上的强迫下线
+            //开始清除redis中无效的数据
+            Dispatch dispatch = dispatchMapper.selectById(id);
+            String key = redisUtil.getValue(dispatch.getPhone());
+            redisUtil.remove(key);//删除个人信息数据
+            redisUtil.remove(dispatch.getPhone());//删除后台冻结相关缓存
+            redisUtil.remove("DISPATCH_" + id);//清除存储的token
+        }
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
new file mode 100644
index 0000000..3998f97
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -0,0 +1,201 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.CarModelMapper;
+import com.stylefeng.guns.modular.system.dao.DriverMapper;
+import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
+import com.stylefeng.guns.modular.system.dao.LineShiftMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.DateUtil;
+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.*;
+
+
+@Service
+public class DriverServiceImpl extends ServiceImpl<DriverMapper, Driver> implements IDriverService {
+
+    @Resource
+    private DriverMapper driverMapper;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Resource
+    private LineShiftMapper lineShiftMapper;
+
+    @Resource
+    private LineShiftDriverMapper lineShiftDriverMapper;
+
+    @Resource
+    private CarModelMapper carModelMapper;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private IReassignService reassignService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+
+
+
+    /**
+     * 获取预约了给定排班的司机列表
+     * @param lineShiftId
+     * @param time
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryLineShiftDriver(Integer lineShiftId, String time, Integer lineShiftDriverId, Integer driverId) throws Exception {
+        List<Map<String, Object>> datas = new ArrayList<>();
+        Map<String, Date> date = dateUtil.getStartAndEndDate(time);
+        List<Map<String, Object>> list = lineShiftMapper.queryInfo(lineShiftId, date.get("startTime"));
+        int num = 0;
+        List<OrderCrossCity> orderCrossCities = orderCrossCityService.queryByLineShiftDriverId(lineShiftDriverId, 2, 3, 4, 5, 11);
+        for(OrderCrossCity occ : orderCrossCities){
+            num += occ.getPeopleNumber();
+        }
+        for(Map<String, Object> map : list){
+            if(null != driverId && Integer.valueOf(map.get("driverId").toString()).compareTo(driverId) == 0){
+                continue;
+            }
+            LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(map.get("id").toString());
+            if(lineShiftDriver.getLaveSeat() < num){
+                continue;
+            }
+            Map<String, Object> map1 = new HashMap<>();
+            map1.put("id", map.get("driverId"));
+            map1.put("name", map.get("driver"));
+            datas.add(map1);
+        }
+        return datas;
+    }
+
+
+    /**
+     * 获取没有预约给定日期班次的司机
+     * @param lineShiftId
+     * @param time
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryNotInLineShiftDriver(Integer lineShiftId, String time) throws Exception {
+        Map<String, Date> date = dateUtil.getStartAndEndDate(time);
+        return lineShiftDriverMapper.queryNotInLineShiftDriver(lineShiftId, date.get("startTime"));
+    }
+
+
+    /**
+     * 调度端帮司机进行预约排班数据
+     * @param lineShiftId
+     * @param time
+     * @param driverId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil addDriverForLineShift(Integer lineShiftId, String time, Integer driverId) throws Exception {
+        Map<String, Date> date = dateUtil.getStartAndEndDate(time);
+        LineShift lineShift = lineShiftMapper.selectById(lineShiftId);
+        List<LineShiftDriver> lineShiftDrivers = lineShiftDriverMapper.query(lineShiftId, null, date.get("startTime"));
+        if(lineShift.getCarNum() == lineShiftDrivers.size()){
+            return ResultUtil.error("班次已经预约满了");
+        }
+        List<LineShiftDriver> startTime = lineShiftDriverMapper.query(lineShiftId, driverId, date.get("startTime"));
+        if(startTime.size() > 0){
+            return ResultUtil.runErr("司机已经预约了该班次");
+        }
+
+        //添加预约班次数据
+        Driver driver = driverService.selectById(driverId);
+        if(driver.getCarId() == null){
+            return ResultUtil.error("司机还没绑定车辆");
+        }
+        CarModel carModel = carModelMapper.queryByCarId(driver.getCarId());
+        LineShiftDriver lineShiftDriver = new LineShiftDriver();
+        lineShiftDriver.setLineShiftId(lineShiftId);
+        lineShiftDriver.setDriverId(driverId);
+        lineShiftDriver.setDay(date.get("startTime"));
+        lineShiftDriver.setLaveSeat(carModel.getSeat() - 1);
+        String seat = "";
+        for(int i = 1; i < carModel.getSeat(); i++){
+            seat += i + ",";
+        }
+        lineShiftDriver.setLaveSeatNumber(seat.substring(0, seat.length() - 1));
+        lineShiftDriver.setTotalSeat(carModel.getSeat() - 1);
+        lineShiftDriver.setInserTime(new Date());
+        lineShiftDriverMapper.insert(lineShiftDriver);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取改派司机列表
+     * @param reassignId
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryReassignDriver(Integer reassignId, Integer uid) throws Exception {
+        Reassign reassign = reassignService.selectById(reassignId);
+        Integer companyId = dispatchService.selectById(uid).getCompanyId();
+        List<Map<String, Object>> list = null;
+        if(reassign.getOrderType() == 1){//专车
+            OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId());
+            list = driverMapper.queryReassignDriverPrivateCar(companyId, orderPrivateCar.getServerCarModelId());
+        }
+        if(reassign.getOrderType() == 3){//跨城
+            OrderCrossCity orderCrossCity = orderCrossCityService.selectById(reassign.getOrderId());
+            LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
+            list = driverMapper.queryReassignDriverCrossCity(companyId, orderCrossCity.getServerCarModelId(), orderCrossCity.getLineId(),
+                    lineShiftDriver.getLineShiftId(), orderCrossCity.getTravelTime(), orderCrossCity.getPeopleNumber());
+        }
+        for(int i = 0; i < list.size(); i++){
+            if(Integer.valueOf(list.get(i).get("id").toString()).compareTo(reassign.getOriginalDriverId()) == 0){
+                list.remove(i);
+            }
+        }
+        return list;
+    }
+
+
+    /**
+     * 获取所有没有服务的司机
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryAllDriver(Integer uid) throws Exception {
+        Integer companyId = dispatchService.selectById(uid).getCompanyId();
+        return driverMapper.queryAllDriver(companyId);
+    }
+
+
+    /**
+     * 根据车辆id获取司机
+     * @param carId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Driver> queryByCarId(Integer carId) throws Exception {
+        return driverMapper.queryByCarId(carId);
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java
new file mode 100644
index 0000000..95e4438
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java
new file mode 100644
index 0000000..2fa2538
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineServiceImpl.java
new file mode 100644
index 0000000..063cb12
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineServiceImpl.java
@@ -0,0 +1,77 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.LineMapper;
+import com.stylefeng.guns.modular.system.model.Dispatch;
+import com.stylefeng.guns.modular.system.model.Line;
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.service.ILineService;
+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 LineServiceImpl extends ServiceImpl<LineMapper, Line> implements ILineService {
+
+    @Resource
+    private LineMapper lineMapper;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+
+    /**
+     * 获取企业拥有的所有线路
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryLine(Integer uid) throws Exception {
+        Integer companyId = null;
+        Dispatch dispatch = dispatchService.selectById(uid);
+        if(dispatch.getFranchiseeId() == null || dispatch.getFranchiseeId().compareTo(0) == 0){
+            companyId = dispatch.getCompanyId();
+        }else{
+            companyId = dispatch.getFranchiseeId();
+        }
+        return lineMapper.queryLine(companyId);
+    }
+
+
+    /**
+     * 根据站点id获取线路
+     * @param startId
+     * @param endId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryLines(Integer startId, Integer endId, Integer uid) throws Exception {
+        Integer companyId = null;
+        Dispatch dispatch = dispatchService.selectById(uid);
+        if(dispatch.getFranchiseeId() == null || dispatch.getFranchiseeId().compareTo(0) == 0){
+            companyId = dispatch.getCompanyId();
+        }else{
+            companyId = dispatch.getFranchiseeId();
+        }
+        List<Map<String, Object>> list1 = lineMapper.queryLines(startId, 1, companyId);
+        List<Map<String, Object>> list2 = lineMapper.queryLines(endId, 2, companyId);
+        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 == id2){
+                    list.add(map1);
+                }
+            }
+        }
+        return list;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineShiftServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineShiftServiceImpl.java
new file mode 100644
index 0000000..d396c52
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineShiftServiceImpl.java
@@ -0,0 +1,71 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.LineShiftMapper;
+import com.stylefeng.guns.modular.system.model.LineShift;
+import com.stylefeng.guns.modular.system.model.OrderCrossCity;
+import com.stylefeng.guns.modular.system.service.ILineShiftService;
+import com.stylefeng.guns.modular.system.service.IOrderCrossCityService;
+import com.stylefeng.guns.modular.system.util.DateUtil;
+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 LineShiftServiceImpl extends ServiceImpl<LineShiftMapper, LineShift> implements ILineShiftService {
+
+    @Resource
+    private LineShiftMapper lineShiftMapper;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+
+
+    /**
+     * 根据线路id获取排班数据
+     * @param lineId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryByLineId(Integer lineId) throws Exception {
+        return lineShiftMapper.queryByLineId(lineId);
+    }
+
+
+    /**
+     * 获取排班详情
+     * @param lineShiftId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryLineShiftInfo(Integer lineShiftId, String time) throws Exception {
+        Map<String, Date> date = dateUtil.getStartAndEndDate(time);
+        List<Map<String, Object>> list = lineShiftMapper.queryInfo(lineShiftId, (null != date ? date.get("startTime") : null));
+        for(Map<String, Object> map : list){
+            List<OrderCrossCity> orderCrossCities = orderCrossCityService.queryByDriverId(Integer.valueOf(map.get("driverId").toString()), (null != date ? date.get("startTime") : null), (null != date ? date.get("endTime") : null), 2, 3, 4, 5, 6, 11);
+            List<Map<String, Object>> ms = new ArrayList<>();
+            for(OrderCrossCity orderCrossCity : orderCrossCities){
+                if(Integer.valueOf(map.get("id").toString()).compareTo(orderCrossCity.getLineShiftDriverId()) == 0){
+                    Map<String, Object> map1 = new HashMap<>();
+                    map1.put("name", orderCrossCity.getPassengers() + "-" + orderCrossCity.getPassengersPhone());
+                    map1.put("number", orderCrossCity.getPeopleNumber());
+                    map1.put("id", orderCrossCity.getId());
+                    ms.add(map1);
+                }
+            }
+            map.put("users", JSON.toJSONString(ms));
+        }
+        return list;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineSiteServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineSiteServiceImpl.java
new file mode 100644
index 0000000..70d364c
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LineSiteServiceImpl.java
@@ -0,0 +1,155 @@
+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.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
+import com.stylefeng.guns.modular.system.dao.LineShiftMapper;
+import com.stylefeng.guns.modular.system.dao.LineSiteMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.ILineSiteService;
+import com.stylefeng.guns.modular.system.service.IOrderCrossCityService;
+import com.stylefeng.guns.modular.system.service.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.service.IOrderTaxiService;
+import com.stylefeng.guns.modular.system.util.RedisUtil;
+import com.stylefeng.guns.modular.system.util.SystemException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+@Service
+public class LineSiteServiceImpl extends ServiceImpl<LineSiteMapper, LineSite> implements ILineSiteService {
+
+    @Resource
+    private LineSiteMapper lineSiteMapper;
+
+    @Resource
+    private LineShiftMapper lineShiftMapper;
+
+    @Resource
+    private LineShiftDriverMapper lineShiftDriverMapper;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IOrderTaxiService orderTaxiService;
+
+
+
+
+    /**
+     * 根据线路id获取排班数据
+     * @param lineId
+     * @param day
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryDriver(Integer lineId, String day) 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.selectList(new EntityWrapper<LineShift>().eq("lineId", lineId).eq("state", 1).orderBy("startTime"));
+        List<Map<String, Object>> s = lineSiteMapper.queryDriver(lineId, sdf.parse(day), null);
+        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("lineShiftId").toString()).intValue()){
+                    b = false;
+                    String content = map.get("content").toString();
+                    JSONObject jsonObject = JSON.parseObject(content);
+                    map.put("price", jsonObject.getString("num1"));
+                    map.put("evaluate", new BigDecimal(map.get("evaluate").toString()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                    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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java
new file mode 100644
index 0000000..f4d7b6f
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java
new file mode 100644
index 0000000..fd40c3e
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java
new file mode 100644
index 0000000..68b1b52
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java
new file mode 100644
index 0000000..8b58018
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCancelServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCancelServiceImpl.java
new file mode 100644
index 0000000..715aa33
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCancelServiceImpl.java
@@ -0,0 +1,26 @@
+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;
+
+
+@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;
+
+
+
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCrossCityServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCrossCityServiceImpl.java
new file mode 100644
index 0000000..4d6d71b
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderCrossCityServiceImpl.java
@@ -0,0 +1,670 @@
+package com.stylefeng.guns.modular.system.service.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.system.dao.LinePriceMapper;
+import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
+import com.stylefeng.guns.modular.system.dao.OrderCrossCityMapper;
+import com.stylefeng.guns.modular.system.dao.RegionMapper;
+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.OrderCrossCityWarpper;
+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 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.math.MathContext;
+import java.math.RoundingMode;
+import java.util.*;
+
+
+@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 LineShiftDriverMapper lineShiftDriverMapper;
+
+    @Resource
+    private LinePriceMapper linePriceMapper;
+
+    @Resource
+    private RegionMapper regionMapper;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private GDFalconUtil gdFalconUtil;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private ChinaMobileUtil chinaMobileUtil;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Autowired
+    private ICBCPayUtil icbcPayUtil;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private ILineService lineService;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Value("${callbackPath}")
+    private String callbackPath;
+
+
+
+    /**
+     * 获取订单列表
+     * @param search
+     * @param orderSource
+     * @param state
+     * @param lineId
+     * @param pageNum
+     * @param size
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryOrderList(String search, String orderSource, String state, String lineId, Integer pageNum, Integer size, Integer uid) throws Exception {
+        Dispatch dispatch = dispatchService.selectById(uid);
+        Integer companyId = null != dispatch.getFranchiseeId() ? dispatch.getFranchiseeId() : dispatch.getCompanyId();
+        pageNum = (pageNum - 1) * size;
+        List<String> orderSources = null;
+        if(ToolUtil.isNotEmpty(orderSource)){
+            orderSources = Arrays.asList(orderSource.split(","));
+        }
+        List<String> states = null;
+        if(ToolUtil.isNotEmpty(state)){
+            states = Arrays.asList(state.split(","));
+        }
+        List<String> lineIds = null;
+        if(ToolUtil.isNotEmpty(lineId)){
+            lineIds = Arrays.asList(lineId.split(","));
+        }
+        return orderCrossCityMapper.queryOrderList(search, orderSources, states, lineIds, companyId, pageNum, size);
+    }
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
+        return orderCrossCityMapper.queryOrderInfo(orderId);
+    }
+
+    /**
+     * 取消订单
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil cancelOrder(Integer orderId) throws Exception {
+        OrderCrossCity orderCrossCity = this.selectById(orderId);
+        if(orderCrossCity.getState() == 10 || orderCrossCity.getState() == 12){
+            return ResultUtil.error("不允许重复取消");
+        }
+        if(orderCrossCity.getState() == 8 || orderCrossCity.getState() == 9){
+            return ResultUtil.error("订单已完成,不允许取消");
+        }
+        orderCrossCity.setState(10);
+        this.updateById(orderCrossCity);
+
+
+        if(null != orderCrossCity.getDriverId()){
+            //修改司机信息
+            LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
+            lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ?
+                    lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
+            String seat = "";
+            String[] split = orderCrossCity.getSeatNumber().split(",");
+            for(String s : split){
+                seat += s + ",";
+            }
+            seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1);
+
+            //总和大于总座位数的情况
+            if(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){
+                seat = "";
+                for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){
+                    seat += i + ",";
+                }
+                seat = seat.substring(0, seat.length() - 1);
+            }
+            lineShiftDriver.setLaveSeatNumber(seat);
+            lineShiftDriverMapper.updateById(lineShiftDriver);
+            if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){
+                Driver driver = driverService.selectById(orderCrossCity.getDriverId());
+                driver.setState(2);
+                driverService.updateById(driver);
+            }
+
+            //已支付的情况下进行退款操作
+            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, orderId);
+                }else{
+                    PaymentRecord query = paymentRecordService.query(1, null, null, orderId, 3, null, 2);
+                    if(null == query){
+                        return ResultUtil.error("订单还未进行支付");
+                    }
+                    Map<String, Object> merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), orderId + "_3", orderCrossCity.getOrderNum());
+                    if(Integer.valueOf(merrefund.get("code").toString()) == 0){
+                        boolean b = true;
+                        while (b){
+                            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, orderId);
+                            }
+                            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", orderId).eq("orderType", 3));
+                for(Income income : incomes){
+                    if(income.getUserType() == 2){//处理司机的收入
+                        Driver driver = driverService.selectById(income.getObjectId());
+                        driver.setBalance(driver.getBalance() + income.getMoney());
+                        driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
+                        driver.setBusinessMoney(driver.getBusinessMoney() - 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);
+                }
+            }
+        }
+
+        //添加取消记录
+        OrderCancel orderCancel = new OrderCancel();
+        orderCancel.setOrderId(orderId);
+        orderCancel.setOrderType(3);
+        orderCancel.setReason("调度端取消");
+        orderCancel.setRemark("调度端取消");
+        orderCancel.setState(2);
+        orderCancel.setInsertTime(new Date());
+        orderCancel.setUserType(2);
+        orderCancelService.insert(orderCancel);
+
+        new Thread(new Runnable() {//发送消息提醒
+            @Override
+            public void run() {
+                pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderId, 3, 10, 0);
+                if(null != orderCrossCity.getDriverId()){
+                    pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderId, 3, 10, 0);
+                    //修改司机为空闲
+                    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);
+                    }
+                }
+            }
+        }).start();
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "调度已成功取消出行订单,谢谢使用!", orderCrossCity.getUserId(), 1);
+        return ResultUtil.success();
+    }
+
+
+
+    /**
+     * 跨城下单操作
+     * @param orderCrossCityWarpper
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception {
+        /**
+         * 先判断司机座位数是否符合出行人数
+         */
+        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("司机处于离线状态");
+        }
+        OrderCrossCity orderCrossCity = new OrderCrossCity();
+        UserInfo userInfo = userInfoService.queryByPhone(orderCrossCityWarpper.getPassengersPhone());
+        if(userInfo == null){//添加用户信息
+            userInfo = new UserInfo();
+            userInfo.setNickName(orderCrossCityWarpper.getPassengers());
+            userInfo.setName(orderCrossCityWarpper.getPassengers());
+            userInfo.setPhone(orderCrossCityWarpper.getPassengersPhone());
+            userInfo.setState(1);
+            userInfo.setFlag(1);
+            userInfo.setInsertTime(new Date());
+            userInfo.setInsertUser(uid);
+            userInfoService.insert(userInfo);
+        }
+        orderCrossCity.setUserId(userInfo.getId());
+        orderCrossCity.setPassengers(orderCrossCityWarpper.getPassengers());
+        orderCrossCity.setPassengersPhone(orderCrossCityWarpper.getPassengersPhone());
+        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());
+        orderCrossCity.setPlacementAddress(orderCrossCityWarpper.getPlacementAddress());
+        orderCrossCity.setStartLon(orderCrossCityWarpper.getStartLon());
+        orderCrossCity.setStartLat(orderCrossCityWarpper.getStartLat());
+        orderCrossCity.setStartAddress(orderCrossCityWarpper.getStartAddress());
+        orderCrossCity.setEndLon(orderCrossCityWarpper.getEndLon());
+        orderCrossCity.setEndLat(orderCrossCityWarpper.getEndLat());
+        orderCrossCity.setEndAddress(orderCrossCityWarpper.getEndAddress());
+        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);
+        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.setIsReassign(1);
+        //调用高德创建轨迹
+        String s = gdFalconUtil.selectTerminal(driver.getPhone());
+        String track = gdFalconUtil.createTrack(s);
+        orderCrossCity.setTrackId(track);
+
+        //调用移动的小号接口
+        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"));
+        }
+        if(orderCrossCityWarpper.getTravelMode() == 2){//包车
+            orderCrossCity.setSeatNumber(lineShiftDriver.getLaveSeatNumber());
+            orderCrossCity.setPeopleNumber(lineShiftDriver.getLaveSeat());
+        }
+        this.insert(orderCrossCity);
+
+        if(driver.getState() == 2){
+            driver.setState(3);
+            driverService.updateById(driver);
+        }
+
+        //修改预约班次的数据
+        if(orderCrossCity.getTravelMode() == 2){//包车
+            lineShiftDriver.setLaveSeat(0);
+            lineShiftDriver.setLaveSeatNumber("");
+        }else{//拼车
+            lineShiftDriver.setLaveSeat(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.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 driverId
+     * @param start
+     * @param end
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<OrderCrossCity> queryByDriverId(Integer driverId, Date start, Date end, Integer... state) throws Exception {
+        return orderCrossCityMapper.queryByDriver(driverId, start, end, state);
+    }
+
+
+    /**
+     * 获取排班数据对应的订单
+     * @param lineShiftDriverId
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<OrderCrossCity> queryByLineShiftDriverId(Integer lineShiftDriverId, Integer... state) throws Exception {
+        return orderCrossCityMapper.queryByLineShiftDriverId(lineShiftDriverId, state);
+    }
+
+    /**
+     * 扫码支付回调处理
+     * @param orderId       订单id
+     * @param order_id      工行订单号
+     * @throws Exception
+     */
+    @Override
+    public void generatePayCallback(Integer orderId, String order_id) throws Exception {
+        OrderCrossCity orderCrossCity = orderCrossCityMapper.selectById(order_id);
+        orderCrossCity.setPayManner(1);
+        orderCrossCity.setPayMoney(orderCrossCity.getOrderMoney());
+        orderCrossCity.setState(2);
+        orderCrossCityMapper.updateById(orderCrossCity);
+
+        //添加交易明细
+        transactionDetailsService.saveData(orderCrossCity.getUserId(), "完成订单", orderCrossCity.getOrderMoney(), 2, 1, 1, 3, orderId);
+
+        //添加已收入明细
+        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))).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(), 1, d.doubleValue());
+        incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 1, 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, "您已使用余额成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId(), 1);
+    }
+
+    /**
+     * 获取订单编号
+     * @return
+     * @throws Exception
+     */
+    @Override
+    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++;
+        }
+    }
+
+
+    @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("计算行程距离出错啦!");
+    }
+
+
+    @Override
+    public List<OrderCrossCity> queryListOrder(Integer driverId, Integer lineShiftId, List<Integer> state, String day) throws Exception {
+        return orderCrossCityMapper.queryListOrder(driverId, lineShiftId, state, day);
+    }
+
+
+    /**
+     * 计算价格
+     * @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("5"))){
+                        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);
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java
new file mode 100644
index 0000000..0a96afe
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java
@@ -0,0 +1,71 @@
+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.*;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@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 OrderPosition queryNew(Integer orderId, Integer orderType) throws Exception {
+        List<OrderPosition> orderPositions = this.queryPosition(orderId, orderType);
+        return orderPositions.size() > 0 ? orderPositions.get(orderPositions.size() - 1) : null;
+    }
+
+
+    /**
+     * 获取坐标文件中的坐标数据
+     * @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);
+        }
+        return list;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPrivateCarServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPrivateCarServiceImpl.java
new file mode 100644
index 0000000..44a1879
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPrivateCarServiceImpl.java
@@ -0,0 +1,155 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.OrderCrossCityMapper;
+import com.stylefeng.guns.modular.system.dao.OrderPrivateCarMapper;
+import com.stylefeng.guns.modular.system.model.Dispatch;
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.model.OrderCancel;
+import com.stylefeng.guns.modular.system.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+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.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+
+
+@Service
+public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
+
+    @Resource
+    private OrderPrivateCarMapper orderPrivateCarMapper;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+    @Value("${callbackPath}")
+    private String callbackPath;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+
+    /**
+     * 获取订单列表
+     * @param search
+     * @param orderSource
+     * @param state
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryOrderList(String search, String orderSource, String state, Integer pageNum, Integer size, Integer uid) throws Exception {
+        Dispatch dispatch = dispatchService.selectById(uid);
+        Integer companyId = null != dispatch.getFranchiseeId() ? dispatch.getFranchiseeId() : dispatch.getCompanyId();
+        pageNum = (pageNum - 1) * size;
+        List<String> orderSources = null;
+        if(ToolUtil.isNotEmpty(orderSource)){
+            orderSources = Arrays.asList(orderSource.split(","));
+        }
+        List<String> states = null;
+        if(ToolUtil.isNotEmpty(state)){
+            states = Arrays.asList(state.split(","));
+        }
+        return orderPrivateCarMapper.queryOrderList(search, orderSources, states, companyId, pageNum, size);
+    }
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
+        return orderPrivateCarMapper.queryOrderInfo(orderId);
+    }
+
+
+    /**
+     * 取消订单
+     * @param orderId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil cancelOrder(Integer orderId) throws Exception {
+        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
+        if(orderPrivateCar.getState() == 10 || orderPrivateCar.getState() == 12){
+            return ResultUtil.error("不允许重复取消");
+        }
+        if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){
+            return ResultUtil.error("订单已完成,不允许取消");
+        }
+        orderPrivateCar.setState(10);
+        this.updateById(orderPrivateCar);
+
+        //添加取消记录
+        OrderCancel orderCancel = new OrderCancel();
+        orderCancel.setOrderId(orderId);
+        orderCancel.setOrderType(1);
+        orderCancel.setReason("调度端取消");
+        orderCancel.setRemark("调度端取消");
+        orderCancel.setState(2);
+        orderCancel.setInsertTime(new Date());
+        orderCancel.setUserType(2);
+        orderCancelService.insert(orderCancel);
+
+        new Thread(new Runnable() {//发送消息提醒
+            @Override
+            public void run() {
+                pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderId, 1, 10, 0);
+                if(null != orderPrivateCar.getDriverId()){
+                    //修改司机为空闲
+                    Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+                    driver.setState(2);
+                    driverService.updateById(driver);
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderId, 1, 10, 0);
+                }
+            }
+        }).start();
+        //添加消息
+        systemNoticeService.addSystemNotice(1, "调度已成功取消出行订单,谢谢使用!", orderPrivateCar.getUserId(), 1);
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){//上传数据
+                    pushMinistryOfTransportUtil.orderCancel(orderId);
+                }
+            }
+        }).start();
+
+        return ResultUtil.success();
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderTaxiServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderTaxiServiceImpl.java
new file mode 100644
index 0000000..a78d7bf
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderTaxiServiceImpl.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.OrderTaxiMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+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;
+
+@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;
+
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PaymentRecordServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PaymentRecordServiceImpl.java
new file mode 100644
index 0000000..0fd97c6
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PaymentRecordServiceImpl.java
@@ -0,0 +1,63 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.PaymentRecordMapper;
+import com.stylefeng.guns.modular.system.model.PaymentRecord;
+import com.stylefeng.guns.modular.system.service.IPaymentRecordService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+
+@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 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java
new file mode 100644
index 0000000..020e34c
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java
@@ -0,0 +1,578 @@
+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.LineShiftDriverMapper;
+import com.stylefeng.guns.modular.system.dao.OrderCrossCityMapper;
+import com.stylefeng.guns.modular.system.dao.ReassignMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.DateUtil;
+import com.stylefeng.guns.modular.system.util.ICBCPayUtil;
+import com.stylefeng.guns.modular.system.util.PushUtil;
+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.math.BigDecimal;
+import java.util.*;
+
+
+@Service
+public class ReassignServiceImpl extends ServiceImpl<ReassignMapper, Reassign> implements IReassignService {
+
+    @Resource
+    private ReassignMapper reassignMapper;
+
+    @Resource
+    private LineShiftDriverMapper lineShiftDriverMapper;
+
+    @Resource
+    private OrderCrossCityMapper orderCrossCityMapper;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private DateUtil dateUtil;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IOrderCancelService orderCancelService;
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+    @Autowired
+    private ICBCPayUtil icbcPayUtil;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+
+
+
+    /**
+     * 调度端更换司机执行改派操作
+     * @param driverId
+     * @param orderIds
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil dispatchReassign(Integer lineShiftId, String time, Integer driverId, String orderIds, Integer uid) throws Exception {
+        if(ToolUtil.isNotEmpty(orderIds)){
+            Dispatch dispatch = dispatchService.selectById(uid);
+            Driver driver2 = driverService.selectById(driverId);
+            Date date = dateUtil.getStartAndEndDate(time).get("startTime");
+            List<LineShiftDriver> newLineShiftDriver = lineShiftDriverMapper.query(lineShiftId, driverId, date);
+            if(newLineShiftDriver.size() == 0){
+                return ResultUtil.error("司机没有预约该班次");
+            }
+
+            String[] split = orderIds.split(",");
+            List<OrderCrossCity> orderCrossCities = orderCrossCityService.selectBatchIds(Arrays.asList(split));
+            Integer oldDriver = null;
+            Integer num = 0;
+            String seat = "";
+            List<Reassign> list = new ArrayList<>();
+            for(OrderCrossCity occ : orderCrossCities){
+                oldDriver = occ.getDriverId();
+                occ.setDriverId(driverId);
+                occ.setLineShiftDriverId(newLineShiftDriver.get(0).getId());
+                num += occ.getPeopleNumber();
+                seat += occ.getSeatNumber() + ",";
+
+                //添加改派记录
+                Reassign reassign = new Reassign();
+                reassign.setOrderType(3);
+                reassign.setOrderId(occ.getId());
+                reassign.setOriginalDriverId(occ.getDriverId());
+                reassign.setOriginalCarId(occ.getCarId());
+                reassign.setInsertTime(new Date());
+                reassign.setNowDriverId(driverId);
+                reassign.setNowCarId(driver2.getCarId());
+                reassign.setState(3);
+                reassign.setReason("调度改派");
+                reassign.setRemark("调度“" + dispatch.getName() + "-" + uid + "”执行改派操作");
+                reassign.setCompleteTime(new Date());
+                list.add(reassign);
+
+                //修改收入明细,转给新司机(因为是先支付金额)
+                Driver driver1 = driverService.selectById(oldDriver);
+                Driver driver3 = driverService.selectById(driverId);
+                List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("userType", 2).eq("objectId", oldDriver).eq("type", 2).eq("incomeId", reassign.getOrderId()).eq("orderType", 3));
+                if(incomes.size() > 0){
+                    Income income = incomes.get(0);
+                    income.setObjectId(driverId);
+                    incomeService.updateById(income);
+
+                    driver1.setBusinessMoney(driver1.getBusinessMoney() - income.getMoney());
+                    driver1.setLaveBusinessMoney(driver1.getLaveBusinessMoney() - income.getMoney());
+                    driver1.setBalance(driver1.getBalance() - income.getMoney());
+
+                    driver3.setBusinessMoney(driver3.getBusinessMoney() + income.getMoney());
+                    driver3.setLaveBusinessMoney(driver3.getLaveBusinessMoney() + income.getMoney());
+                    driver3.setBalance(driver3.getBalance() + income.getMoney());
+                }
+
+                driverService.updateById(driver1);
+                driverService.updateById(driver3);
+            }
+            if(num > newLineShiftDriver.get(0).getLaveSeat()){
+                return ResultUtil.error("司机车辆剩余座位数不足");
+            }
+            if(orderCrossCities.size() > 0){
+                orderCrossCityService.updateBatchById(orderCrossCities);
+            }
+            if(list.size() > 0){//存储改派记录数据
+                this.insertBatch(list);
+            }
+
+            //修改原司机座位数据(还原)
+            List<LineShiftDriver> query = lineShiftDriverMapper.query(lineShiftId, oldDriver, date);
+            if(query.size() > 0){
+                LineShiftDriver lineShiftDriver = query.get(0);
+                lineShiftDriver.setLaveSeat((lineShiftDriver.getLaveSeat() + num) > lineShiftDriver.getTotalSeat() ? lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + num);
+                lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1));
+                lineShiftDriverMapper.updateById(lineShiftDriver);
+            }
+            //修改原司机为空闲
+            Driver driver1 = driverService.selectById(oldDriver);
+            if(null != driver1){
+                driver1.setState(2);
+                driverService.updateById(driver1);
+            }
+
+            //修改新司机的座位数据
+            LineShiftDriver lineShiftDriver = newLineShiftDriver.get(0);
+            lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() - num);
+            String[] split1 = lineShiftDriver.getLaveSeatNumber().split(",");
+            seat = "";
+            for(int i = num; i < split1.length; i++){
+                seat += split1[i] + ",";
+            }
+            lineShiftDriver.setLaveSeatNumber(seat.substring(0, seat.length() - 1));
+            lineShiftDriverMapper.updateById(lineShiftDriver);
+            //修改新司机为服务中
+            if(null != driver2){
+                driver2.setState(3);
+                driverService.updateById(driver2);
+            }
+
+
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取提交改派申请的数据
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryApplyReassignList(Integer state, Integer uid, Integer pageNum, Integer size) throws Exception {
+        Integer companyId = dispatchService.selectById(uid).getCompanyId();
+        pageNum = (pageNum - 1) * size;
+        return reassignMapper.queryApplyReassignList(companyId, state, pageNum, size);
+    }
+
+
+    /**
+     * 获取改派详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryReassignInfo(Integer id) throws Exception {
+        return reassignMapper.queryReassignInfo(id);
+    }
+
+
+
+    /**
+     * 取消改派申请
+     * @param id
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil cancelReassign(Integer id, Integer uid) throws Exception {
+        Reassign reassign = this.selectById(id);
+        if(reassign.getState() == 3){
+            return ResultUtil.error("改派已同意了");
+        }
+        if(reassign.getState() == 4){
+            return ResultUtil.error("改派已取消了");
+        }
+        if(reassign.getState() == 5){
+            return ResultUtil.error("改派已拒绝了");
+        }
+        if(reassign.getOrderType() == 1){//专车
+            OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId());
+            if(orderPrivateCar.getState() > 5 && orderPrivateCar.getState() != 11){
+                return ResultUtil.error("订单状态不在可取消范围内");
+            }
+            orderPrivateCar.setState(10);//取消
+            orderPrivateCarService.updateById(orderPrivateCar);
+
+            new Thread(new Runnable() {//发送消息提醒
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), reassign.getOrderId(), 1, 10, 0);
+                    if(null != orderPrivateCar.getDriverId()){
+                        //修改司机为空闲
+                        Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+                        driver.setState(2);
+                        driverService.updateById(driver);
+                        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), reassign.getOrderId(), 1, 10, 0);
+                    }
+                }
+            }).start();
+            //添加消息
+            systemNoticeService.addSystemNotice(1, "调度已成功取消出行订单,谢谢使用!", orderPrivateCar.getUserId(), 1);
+        }
+        if(reassign.getOrderType() == 3){//跨城
+            OrderCrossCity orderCrossCity = orderCrossCityService.selectById(reassign.getOrderId());
+            if(orderCrossCity.getState() > 5 && orderCrossCity.getState() != 11){
+                return ResultUtil.error("订单状态不在可取消范围内");
+            }
+            orderCrossCity.setState(10);
+            orderCrossCityService.updateById(orderCrossCity);
+
+            //修改司机信息
+            LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
+            lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ?
+                    lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
+            String seat = "";
+            String[] split = orderCrossCity.getSeatNumber().split(",");
+            for(String s : split){
+                seat += s + ",";
+            }
+            seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1);
+
+            //总和大于总座位数的情况
+            if(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){
+                seat = "";
+                for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){
+                    seat += i + ",";
+                }
+                seat = seat.substring(0, seat.length() - 1);
+            }
+            lineShiftDriver.setLaveSeatNumber(seat);
+            lineShiftDriverMapper.updateById(lineShiftDriver);
+            if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){
+                Driver driver = driverService.selectById(reassign.getOriginalDriverId());
+                driver.setState(2);
+                driverService.updateById(driver);
+            }
+
+            //已支付的情况下进行退款操作
+            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, null, null, id, 3, null, 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){
+                        boolean b = true;
+                        while (b){
+                            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", reassign.getOrderId()).eq("orderType", 3));
+                for(Income income : incomes){
+                    if(income.getUserType() == 2){//处理司机的收入
+                        Driver driver = driverService.selectById(income.getObjectId());
+                        driver.setBalance(driver.getBalance() + income.getMoney());
+                        driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
+                        driver.setBusinessMoney(driver.getBusinessMoney() - 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);
+                }
+            }
+
+            new Thread(new Runnable() {//发送消息提醒
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(1, orderCrossCity.getUserId(), reassign.getOrderId(), 3, 10, 0);
+                    if(null != orderCrossCity.getDriverId()){
+                        pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), reassign.getOrderId(), 3, 10, 0);
+                        //修改司机为空闲
+                        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);
+                        }
+                    }
+                }
+            }).start();
+            //添加消息
+            systemNoticeService.addSystemNotice(1, "调度已成功取消出行订单,谢谢使用!", orderCrossCity.getUserId(), 1);
+        }
+
+        //添加取消记录
+        Dispatch dispatch = dispatchService.selectById(uid);
+        OrderCancel orderCancel = new OrderCancel();
+        orderCancel.setOrderId(reassign.getOrderId());
+        orderCancel.setOrderType(reassign.getOrderType());
+        orderCancel.setReason("调度端取消订单");
+        orderCancel.setRemark("调度“" + dispatch.getName() + "-" + uid + "”执行取消操作");
+        orderCancel.setState(2);
+        orderCancel.setInsertTime(new Date());
+        orderCancel.setUserType(3);
+        orderCancel.setUserId(uid);
+        orderCancelService.insert(orderCancel);
+
+        reassign.setState(4);//取消
+        reassign.setReviewer(uid);
+        reassign.setReviewerType(1);
+        reassign.setCompleteTime(new Date());
+        this.updateById(reassign);
+        return ResultUtil.success();
+    }
+
+
+
+
+    /**
+     * 拒绝改派申请
+     * @param id
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil refuseReassign(Integer id, Integer uid) throws Exception {
+        Reassign reassign = this.selectById(id);
+        if(reassign.getState() == 3){
+            return ResultUtil.error("改派已同意了");
+        }
+        if(reassign.getState() == 4){
+            return ResultUtil.error("改派已取消了");
+        }
+        if(reassign.getState() == 5){
+            return ResultUtil.error("改派已拒绝了");
+        }
+        if(reassign.getOrderType() == 1){//专车
+            OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId());
+            if(orderPrivateCar.getState() != 11){
+                return ResultUtil.error("订单状态不在可改派范围内");
+            }
+            orderPrivateCar.setState(orderPrivateCar.getOldState());
+            orderPrivateCar.setOldState(null);
+            orderPrivateCarService.updateAllColumnById(orderPrivateCar);
+        }
+        if(reassign.getOrderType() == 3){//跨城
+            OrderCrossCity orderCrossCity = orderCrossCityService.selectById(reassign.getOrderId());
+            if(orderCrossCity.getState() != 11){
+                return ResultUtil.error("订单状态不在可改派范围内");
+            }
+            orderCrossCity.setState(orderCrossCity.getOldState());
+            orderCrossCity.setOldState(null);
+            orderCrossCityService.updateAllColumnById(orderCrossCity);
+        }
+        reassign.setState(5);//拒绝
+        reassign.setReviewer(uid);
+        reassign.setReviewerType(1);
+        reassign.setCompleteTime(new Date());
+        this.updateById(reassign);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 执行改派操作
+     * @param id
+     * @param driverId
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public ResultUtil executeReassign(Integer id, Integer driverId, Integer uid) throws Exception {
+        Driver nowDriver = driverService.selectById(driverId);
+        Reassign reassign = this.selectById(id);
+        if(reassign.getState() == 3){
+            return ResultUtil.error("改派已同意了");
+        }
+        if(reassign.getState() == 4){
+            return ResultUtil.error("改派已取消了");
+        }
+        if(reassign.getState() == 5){
+            return ResultUtil.error("改派已拒绝了");
+        }
+
+        reassign.setNowDriverId(driverId);
+        reassign.setNowCarId(nowDriver.getCarId());
+        reassign.setState(3);//同意
+        reassign.setReviewer(uid);
+        reassign.setReviewerType(1);
+        reassign.setCompleteTime(new Date());
+        this.updateById(reassign);
+
+        if(reassign.getOrderType() == 1){//专车
+            //修改原司机信息
+            Driver driver = driverService.selectById(reassign.getOriginalDriverId());
+            driver.setState(2);
+            driverService.updateById(driver);
+
+            //修改新司机信息
+            nowDriver.setState(3);
+            driverService.updateById(nowDriver);
+
+            //修改订单数据
+            OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId());
+            orderPrivateCar.setDriverId(driverId);
+            orderPrivateCar.setCarId(nowDriver.getCarId());
+            orderPrivateCar.setState(orderPrivateCar.getOldState());
+            orderPrivateCar.setOldState(null);
+            orderPrivateCarService.updateAllColumnById(orderPrivateCar);
+        }
+
+        if(reassign.getOrderType() == 3){//跨陈
+            //修改原司机信息
+            OrderCrossCity orderCrossCity = orderCrossCityService.selectById(reassign.getOrderId());
+            LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
+            lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ?
+                    lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
+            String seat = "";
+            String[] split = orderCrossCity.getSeatNumber().split(",");
+            for(String s : split){
+                seat += s + ",";
+            }
+            seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1);
+
+            //总和大于总座位数的情况
+            if(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){
+                seat = "";
+                for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){
+                    seat += i + ",";
+                }
+                seat = seat.substring(0, seat.length() - 1);
+            }
+            lineShiftDriver.setLaveSeatNumber(seat);
+            lineShiftDriverMapper.updateById(lineShiftDriver);
+            Driver oldDriver = driverService.selectById(reassign.getOriginalDriverId());
+            if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){
+                oldDriver.setState(2);
+            }
+
+            //修改新司机数据
+            List<LineShiftDriver> query = lineShiftDriverMapper.query(lineShiftDriver.getLineShiftId(), driverId, orderCrossCity.getTravelTime());
+            if(query.size() == 0){
+                return ResultUtil.error("司机没有预约班次");
+            }
+            LineShiftDriver lineShiftDriver1 = query.get(0);
+            if(lineShiftDriver1.getLaveSeat() < orderCrossCity.getPeopleNumber()){
+                return ResultUtil.runErr("司机车辆剩余座位数不足");
+            }
+            lineShiftDriver1.setLaveSeat(lineShiftDriver1.getLaveSeat() - orderCrossCity.getPeopleNumber());
+            String[] split1 = lineShiftDriver1.getLaveSeatNumber().split(",");
+            String seat1 = "";//使用
+            String seat2 = "";//未使用
+            for(int i = 0; i < orderCrossCity.getPeopleNumber(); i++){
+                seat1 += split1[i] + ",";
+            }
+            for(int i = orderCrossCity.getPeopleNumber(); i < split1.length; i++){
+                seat2 += split1[i] + ",";
+            }
+            lineShiftDriver1.setLaveSeatNumber(seat2.substring(0, seat2.length() - 1));
+            lineShiftDriverMapper.updateById(lineShiftDriver1);
+            Driver driver = driverService.selectById(driverId);
+            if(driver.getState() == 1){
+                return ResultUtil.error("司机还未上班呢");
+            }
+            if(driver.getState() == 2){
+                driver.setState(3);
+            }
+
+            //修改订单数据
+            orderCrossCity.setDriverId(driverId);
+            orderCrossCity.setCarId(nowDriver.getCarId());
+            orderCrossCity.setSeatNumber(seat1.substring(0, seat1.length() - 1));
+            orderCrossCity.setState(orderCrossCity.getOldState());
+            orderCrossCity.setOldState(null);
+            orderCrossCity.setIsReassign(2);
+            orderCrossCity.setLineShiftDriverId(lineShiftDriver1.getId());
+            orderCrossCity.setOrderNum(orderCrossCityService.getOrderNum(driverId, orderCrossCity.getLineShiftDriverId()));
+            orderCrossCityService.updateAllColumnById(orderCrossCity);
+
+            //修改收入明细,转给新司机(因为是先支付金额)
+            List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("userType", 2).eq("objectId", reassign.getOriginalDriverId()).eq("type", 2).eq("incomeId", reassign.getOrderId()).eq("orderType", 3));
+            if(incomes.size() > 0){
+                Income income = incomes.get(0);
+                income.setObjectId(driverId);
+                incomeService.updateById(income);
+
+                oldDriver.setBusinessMoney(oldDriver.getBusinessMoney() - income.getMoney());
+                oldDriver.setLaveBusinessMoney(oldDriver.getLaveBusinessMoney() - income.getMoney());
+                oldDriver.setBalance(oldDriver.getBalance() - income.getMoney());
+
+                driver.setBusinessMoney(driver.getBusinessMoney() + income.getMoney());
+                driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() + income.getMoney());
+                driver.setBalance(driver.getBalance() + income.getMoney());
+            }
+
+            driverService.updateById(oldDriver);
+            driverService.updateById(driver);
+        }
+        return ResultUtil.success();
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java
new file mode 100644
index 0000000..4b72cc4
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java
new file mode 100644
index 0000000..d8d9d37
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SiteServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SiteServiceImpl.java
new file mode 100644
index 0000000..e6d0e05
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SiteServiceImpl.java
@@ -0,0 +1,144 @@
+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.system.dao.LocationMapper;
+import com.stylefeng.guns.modular.system.dao.SiteMapper;
+import com.stylefeng.guns.modular.system.model.Dispatch;
+import com.stylefeng.guns.modular.system.model.Site;
+import com.stylefeng.guns.modular.system.service.IDispatchService;
+import com.stylefeng.guns.modular.system.service.ISiteService;
+import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
+import com.stylefeng.guns.modular.system.warpper.SiteWarpper;
+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;
+
+    @Autowired
+    private IDispatchService dispatchService;
+
+
+
+
+
+
+    /**
+     * 获取站点
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<SiteWarpper> querySite(Integer startSiteId, Integer uid) throws Exception {
+        List<Map<String, Object>> sites = null;
+        Integer companyId = null;
+        Dispatch dispatch = dispatchService.selectById(uid);
+        if(dispatch.getFranchiseeId() == null || dispatch.getFranchiseeId().compareTo(0) == 0){
+            companyId = dispatch.getCompanyId();
+        }else{
+            companyId = dispatch.getFranchiseeId();
+        }
+        if(null == startSiteId){
+            sites = siteMapper.querySite(null, companyId);
+        }else{
+            sites = siteMapper.querySite(startSiteId, companyId);
+        }
+        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;
+    }
+
+
+    /**
+     * 根据站点id获取地点区域
+     * @param siteId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Map<String, Object>> queryLocation(Integer siteId) throws Exception {
+        return locationMapper.queryLocation(siteId);
+    }
+
+
+
+    /**
+     * 判断点是都在区域范围内
+     * @param siteId
+     * @param code
+     * @param lonLat
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean areaMonitoring(Integer siteId, Integer code, String lonLat) throws Exception {
+        List<Map<String, Object>> list = this.queryLocation(siteId);
+        String province = code.toString().substring(0, 2) + "0000";
+        String city = code.toString().substring(0, 4) + "00";
+        for(Map<String, Object> map : list){
+            if(Integer.valueOf(map.get("type").toString()) == 1){//行政区域
+                if(null != map.get("districtCode")){
+                    if(code.toString().equals(map.get("districtCode").toString())){
+                        return true;
+                    }
+                    continue;
+                }
+                if(null != map.get("cityCode")){
+                    if(city.equals(map.get("cityCode").toString())){
+                        return true;
+                    }
+                    continue;
+                }
+                if(null != map.get("provinceCode")){
+                    if(province.equals(map.get("provinceCode").toString())){
+                        return true;
+                    }
+                    continue;
+                }
+            }
+            if(Integer.valueOf(map.get("type").toString()) == 2){//电子围栏
+                List<String> list1 = gdMapElectricFenceUtil.monitorElectricFenc("", lonLat);
+                return list1.size() > 0 ? true : false;
+            }
+        }
+        return false;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SystemNoticeServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SystemNoticeServiceImpl.java
new file mode 100644
index 0000000..e9f0339
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SystemNoticeServiceImpl.java
@@ -0,0 +1,36 @@
+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.model.SystemNotice;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+
+@Service
+public class SystemNoticeServiceImpl extends ServiceImpl<SystemNoticeMapper, SystemNotice> implements ISystemNoticeService {
+
+
+    /**
+     * 添加系统消息
+     * @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);
+    }
+
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TransactionDetailsServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TransactionDetailsServiceImpl.java
new file mode 100644
index 0000000..85d7001
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TransactionDetailsServiceImpl.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.TransactionDetailsMapper;
+import com.stylefeng.guns.modular.system.model.TransactionDetails;
+import com.stylefeng.guns.modular.system.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java
new file mode 100644
index 0000000..aaa844a
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java
@@ -0,0 +1,30 @@
+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.system.dao.UserInfoMapper;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+
+@Service
+public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {
+
+    @Resource
+    private UserInfoMapper userInfoMapper;
+
+
+    /**
+     * 根据电话查询用户
+     * @param phone
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public UserInfo queryByPhone(String phone) throws Exception {
+        return userInfoMapper.queryByPhone(phone);
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..d958f91
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VersionManagementServiceImpl.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VersionManagementServiceImpl.java
new file mode 100644
index 0000000..fc4a5c6
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/VersionManagementServiceImpl.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.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;
+
+
+
+    /**
+     * 获取最新版本数据
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryNewVersion(Integer type) throws Exception {
+        return versionManagementMapper.queryNewVersion(type);
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java
new file mode 100644
index 0000000..0e16e16
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java
new file mode 100644
index 0000000..6e28801
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java
new file mode 100644
index 0000000..394d4b4
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java
new file mode 100644
index 0000000..d45f320
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiApiUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiApiUtil.java
new file mode 100644
index 0000000..157f7d5
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiSendSms.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ALiSendSms.java
new file mode 100644
index 0000000..0d72534
--- /dev/null
+++ b/DispatchOKTravel/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
+            "LTAI4G9Zez9H4B36vakPXGy4",// 您的AccessKey ID
+            "BOVPUeZndKVbrPOq6Ef5j6oiydB3XZ");// 您的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", "咸宁95128");
+        // 短信模板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("156xxxxxxxx", templateCode, "{\"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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ChinaMobileUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ChinaMobileUtil.java
new file mode 100644
index 0000000..5ef83bd
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java
new file mode 100644
index 0000000..9519160
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDFalconUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDFalconUtil.java
new file mode 100644
index 0000000..471b914
--- /dev/null
+++ b/DispatchOKTravel/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 = "3491db7ed190e5e4757fcb838e012130";
+
+    @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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java
new file mode 100644
index 0000000..c1a77ff
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java
@@ -0,0 +1,406 @@
+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.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.*;
+
+//import com.stylefeng.guns.modular.system.model.GDFence;
+//import com.stylefeng.guns.modular.system.service.IGDFenceService;
+
+/**
+ * 电子围栏工具类
+ */
+@Component
+public class GDMapElectricFenceUtil {
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private IGDInterfaceService gdInterfaceService;
+
+    private String key = "3491db7ed190e5e4757fcb838e012130";
+
+    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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java
new file mode 100644
index 0000000..606c0af
--- /dev/null
+++ b/DispatchOKTravel/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 = "3491db7ed190e5e4757fcb838e012130";
+
+    @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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpClientUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpClientUtil.java
new file mode 100644
index 0000000..1770fbf
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpClientUtil.java
@@ -0,0 +1,253 @@
+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.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.util.EntityUtils;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.*;
+
+/**
+ * http工具类
+ */
+@Component
+public class HttpClientUtil {
+
+    private CloseableHttpClient httpClient;
+
+    private CloseableHttpResponse httpResponse;
+
+    private RequestConfig requestConfig;
+
+
+    /**
+     * 创建一个httpClient对象
+     */
+    private void getHttpCline(){
+        this.httpClient = HttpClients.createDefault();
+    }
+
+    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;
+    }
+
+
+
+    /**
+     * 关闭资源
+     */
+    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();
+            }
+        }
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ICBCPayUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ICBCPayUtil.java
new file mode 100644
index 0000000..ca8d6d0
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ICBCPayUtil.java
@@ -0,0 +1,647 @@
+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 ResultUtil 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级唯一
+        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();//商户订单号
+
+
+                return ResultUtil.success(response.getWx_data_package());
+            }
+            if(pay_mode == 10){//支付宝
+                return ResultUtil.success(response.getZfb_data_package());
+            }
+        } else {
+            // 失败
+            System.err.println("response:" + JSON.toJSONString(response));
+            System.err.println("ReturnCode:"+response.getReturnCode());
+            System.err.println("ReturnMsg:"+response.getReturnMsg());
+            return ResultUtil.error("支付失败");
+        }
+        return ResultUtil.success();
+    }
+
+
+
+
+    /**
+     * 查询交易(商户订单号和工行订单号二选其一)
+     * @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");
+        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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JGPushUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JGPushUtil.java
new file mode 100644
index 0000000..d29534e
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JGPushUtil.java
@@ -0,0 +1,60 @@
+package com.stylefeng.guns.modular.system.util;
+
+import cn.jiguang.common.ClientConfig;
+import cn.jiguang.common.resp.APIConnectionException;
+import cn.jiguang.common.resp.APIRequestException;
+import cn.jpush.api.JPushClient;
+import cn.jpush.api.push.PushResult;
+import cn.jpush.api.push.model.Platform;
+import cn.jpush.api.push.model.PushPayload;
+import cn.jpush.api.push.model.audience.Audience;
+import cn.jpush.api.push.model.notification.Notification;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * 极光推送工具类
+ */
+@Component
+public class JGPushUtil {
+
+    @Value("${jiguang.masterSecret}")
+    private String masterSecret;
+
+    @Value("${jiguang.appKey}")
+    private String appKey;
+
+
+    private PushPayload buildPushObject_all_all_alert(String content, String...tags) {
+        return PushPayload.newBuilder()
+                .setPlatform(Platform.all())//设置推送平台为全部平台
+                .setAudience(Audience.alias(tags))//通过别名的方式发送(用户owner_id,员工user_id)
+                .setNotification(Notification.alert(content))
+                .build();
+    }
+
+
+    /**
+     * 推送
+     * @param tags
+     * @param content
+     */
+    public void push(String content, String...tags){
+        JPushClient jpushClient = new JPushClient(masterSecret, appKey, null, ClientConfig.getInstance());
+        PushPayload payload = this.buildPushObject_all_all_alert(content, tags);
+        try {
+            PushResult result = jpushClient.sendPush(payload);
+            System.err.println(result.statusCode);
+        } catch (APIConnectionException e) {
+            e.printStackTrace();
+        } catch (APIRequestException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    public static void main(String[] args) {
+        JGPushUtil jgPushUtil = new JGPushUtil();
+        jgPushUtil.push("owner", "消息内容", "owner_id");
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JuHeUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JuHeUtil.java
new file mode 100644
index 0000000..88b32ab
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MD5AndKL.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MD5AndKL.java
new file mode 100644
index 0000000..c97abd6
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java
new file mode 100644
index 0000000..093b38d
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java
@@ -0,0 +1,809 @@
+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.DefaultAlipayClient;
+import com.alipay.api.domain.AlipayTradeAppPayModel;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipayTradeAppPayRequest;
+import com.alipay.api.request.AlipayTradePrecreateRequest;
+import com.alipay.api.request.AlipayTradeQueryRequest;
+import com.alipay.api.request.AlipayTradeRefundRequest;
+import com.alipay.api.response.AlipayTradeAppPayResponse;
+import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.alipay.api.response.AlipayTradeQueryResponse;
+import com.alipay.api.response.AlipayTradeRefundResponse;
+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.mchId}")
+    private String mchId;//微信商户号
+
+    @Value("${wx.key}")
+    private String key;//微信商户号
+
+    @Value("${callbackPath}")
+    private String callbackPath;//支付回调网关地址
+
+    @Autowired
+    private HttpClientUtil httpClientUtil;
+
+    private Map<String, JSONObject> order = new HashMap<>();//存储支付订单用于主动查询支付结果
+
+
+    /**
+     * 支付宝支付
+     */
+    public ResultUtil alipay(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", alipayPublicKey, "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");
+        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, alipayPublicKey, "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");
+                map.put("out_trade_no", out_trade_no);//商家订单号
+                map.put("subject", subject);
+                map.put("total_amount", total_amount);
+                map.put("trade_no", trade_no);//支付宝交易号
+                return map;
+            }
+
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 支付宝查询订单支付状态
+     * @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) throws Exception{
+        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", appid);
+        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);
+        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() / 1000);
+                        String s1 = this.weixinSignature(map2);
+                        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 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").split("_")[1]);//存储的订单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);
+        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 = 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");
+        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"));
+                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 {
+        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());
+        AlipayTradeRefundResponse response = alipayClient.execute(request);
+        Map<String, String> map = new HashMap<>();
+        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 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 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java
new file mode 100644
index 0000000..cecf943
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java
@@ -0,0 +1,120 @@
+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.modular.system.dao.OrderCancelMapper;
+import com.stylefeng.guns.modular.system.model.Driver;
+import com.stylefeng.guns.modular.system.model.OrderCancel;
+import com.stylefeng.guns.modular.system.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.system.service.IDriverService;
+import com.stylefeng.guns.modular.system.service.IOrderPositionService;
+import com.stylefeng.guns.modular.system.service.IOrderPrivateCarService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * 上传安全平台数据
+ */
+@Component
+public class PushMinistryOfTransportUtil {
+
+    @Resource
+    private OrderCancelMapper orderCancelMapper;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private IDriverService driverService;
+
+    @Autowired
+    private HttpClientUtil httpClientUtil;
+
+    private String path = "http://120.77.11.218:8868/";
+
+
+
+
+    /**
+     * 订单撤销接口
+     * @param orderId
+     */
+    public void orderCancel(Integer orderId){
+        OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+        Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+        OrderCancel query = orderCancelMapper.query(orderId, 1, null, null, 2);
+        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", "3");//撤销发起方(1:乘客,2:驾驶员,3:平台公司)
+        jsonObject.put("CancelTypeCode", null != driver ? 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);
+    }
+
+
+
+
+
+
+
+    private int phoneExp(String phone){
+        /**
+         * 中国移动号码正则
+         * 139、138、137、136、135、134、147、150、151、152、157、158、159、178、182、183、184、187、188、198、195
+         * 虚拟运营商号段: 1703、1705、1706、165
+         **/
+         String MOBILE_PATTERN = "(^1(3[4-9]|47|5[0-27-9]|65|78|8[2-478]|98)\\d{8}$)|(^170[356]\\d{7}$)";
+
+        /**
+         * 中国电信号码正则
+         * 133、149、153、173、177、180、181、189、199、191
+         * 虚拟运营商号段: 162、1700、1701、1702
+         **/
+         String TELECOM_PATTERN = "(^1(33|49|53|62|7[37]|8[019]|9[19])\\d{8}$)|(^170[012]\\d{7}$)";
+
+        /**
+         * 中国联通号码正则
+         * 130、131、132、155、156、185、186、145、175、176、166、140
+         * 虚拟运营商号段: 171、1707、1708、1709、167
+         **/
+         String UNICOM_PATTERN = "(^1(3[0-2]|4[05]|5[56]|6[67]|7[156]|8[56])\\d{8}$)|(^170[7-9]\\d{7}$)";
+        if(Pattern.matches(UNICOM_PATTERN, phone)){
+           return 1;
+        }
+        if(Pattern.matches(MOBILE_PATTERN, phone)){
+            return 2;
+        }
+        if(Pattern.matches(TELECOM_PATTERN, phone)){
+            return 3;
+        }
+        return 4;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
new file mode 100644
index 0000000..1f693a5
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
@@ -0,0 +1,315 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.modular.system.model.OrderCrossCity;
+import com.stylefeng.guns.modular.system.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.system.service.IOrderCrossCityService;
+import com.stylefeng.guns.modular.system.service.IOrderPrivateCarService;
+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.util.*;
+
+/**
+ * socket推单处理类
+ */
+@Component
+public class PushUtil {
+
+    @Autowired
+    private RestTemplate internalRestTemplate;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private IOrderCrossCityService orderCrossCityService;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+
+    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=包车)
+     * @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 3:
+                OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
+                userId = orderCrossCity.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;
+        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();
+                startServiceTime = null != orderPrivateCar.getStartServiceTime() ? orderPrivateCar.getStartServiceTime().getTime() : null;
+                servedMileage = orderPrivateCar.getMileage();
+                endLonLat = orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat();
+                break;
+            case 3:
+                OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
+                driverId = orderCrossCity.getDriverId();
+                startLonLat = orderCrossCity.getStartLon() + "," + orderCrossCity.getStartLat();
+                state = orderCrossCity.getState();
+                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)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
+            t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60)).setScale(2, BigDecimal.ROUND_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){//前往预约地
+            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){//服务中
+            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)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
+                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60)).setScale(2, BigDecimal.ROUND_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 orderId
+     */
+    public void removeTask(Integer orderId, Integer orderType){
+        Timer timer = taskMap.get(orderId + "_" + orderType);
+        if (null != timer){
+            timer.cancel();
+        }
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
new file mode 100644
index 0000000..533a93d
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
@@ -0,0 +1,126 @@
+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;
+
+
+/**
+ * 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java
new file mode 100644
index 0000000..0a9e5a4
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SystemException.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SystemException.java
new file mode 100644
index 0000000..7017207
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java
new file mode 100644
index 0000000..0f9b2be
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WeChatUtil.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WeChatUtil.java
new file mode 100644
index 0000000..ba45b47
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WeChatUtil.java
@@ -0,0 +1,61 @@
+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 org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 微信工具类
+ */
+@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;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/BaseWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/BaseWarpper.java
new file mode 100644
index 0000000..9394d0c
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CarInfoWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CarInfoWarpper.java
new file mode 100644
index 0000000..4c99796
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CarInfoWarpper.java
@@ -0,0 +1,97 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Map;
+
+@ApiModel("车辆详情")
+public class CarInfoWarpper {
+    @ApiModelProperty("车辆id")
+    private Integer id;
+    @ApiModelProperty("司机")
+    private String driver;
+    @ApiModelProperty("品牌")
+    private String brand;
+    @ApiModelProperty("类型")
+    private String carModel;
+    @ApiModelProperty("颜色")
+    private String color;
+    @ApiModelProperty("状态(1=空闲, 2=服务中)")
+    private Integer state;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getDriver() {
+        return driver;
+    }
+
+    public void setDriver(String driver) {
+        this.driver = driver;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public String getCarModel() {
+        return carModel;
+    }
+
+    public void setCarModel(String carModel) {
+        this.carModel = carModel;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "CarInfoWarpper{" +
+                "id=" + id +
+                ", driver='" + driver + '\'' +
+                ", brand='" + brand + '\'' +
+                ", carModel='" + carModel + '\'' +
+                ", color='" + color + '\'' +
+                ", state=" + state +
+                '}';
+    }
+
+
+    public static CarInfoWarpper getCarInfoWarpper(Map<String, Object> map){
+        CarInfoWarpper carInfoWarpper = new CarInfoWarpper();
+        if(null != map){
+            carInfoWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            carInfoWarpper.setDriver(null != map.get("driver") ? map.get("driver").toString() : "");
+            carInfoWarpper.setBrand(null != map.get("brand") ? map.get("brand").toString() : "");
+            carInfoWarpper.setCarModel(null != map.get("carModel") ? map.get("carModel").toString() : "");
+            carInfoWarpper.setColor(null != map.get("color") ? map.get("color").toString() : "");
+            carInfoWarpper.setState(null != map.get("state") ? Integer.valueOf(map.get("state").toString()) : 0);
+        }
+        return carInfoWarpper;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CarListWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CarListWarpper.java
new file mode 100644
index 0000000..3e3fada
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CarListWarpper.java
@@ -0,0 +1,73 @@
+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 CarListWarpper {
+    @ApiModelProperty("车辆id")
+    private Integer id;
+    @ApiModelProperty("名称")
+    private String name;
+    @ApiModelProperty("状态(1=空闲,2=服务中)")
+    private Integer state;
+
+    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 getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "CarListWarpper{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", state=" + state +
+                '}';
+    }
+
+
+    public static CarListWarpper getCarListWarpper(Map<String, Object> map){
+        CarListWarpper carListWarpper = new CarListWarpper();
+        if(null != map){
+            carListWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            carListWarpper.setName(null != map.get("name") ? map.get("name").toString() : "");
+            carListWarpper.setState(null != map.get("state") ? Integer.valueOf(map.get("state").toString()) : 0);
+        }
+        return carListWarpper;
+    }
+
+    public static List<CarListWarpper> getCarListWarppers(List<Map<String, Object>> maps){
+        List<CarListWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                list.add(CarListWarpper.getCarListWarpper(map));
+            }
+        }
+        return list;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java
new file mode 100644
index 0000000..d1cb1a8
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java
new file mode 100644
index 0000000..c56a1e4
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LineShiftWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LineShiftWarpper.java
new file mode 100644
index 0000000..798a71f
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LineShiftWarpper.java
@@ -0,0 +1,87 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.alibaba.fastjson.JSONArray;
+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 LineShiftWarpper {
+    @ApiModelProperty("排班id")
+    private Integer id;
+    @ApiModelProperty("司机id")
+    private Integer driverId;
+    @ApiModelProperty("司机姓名")
+    private String driver;
+    @ApiModelProperty("用户列表")
+    private List<BaseWarpper> user;
+
+    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 String getDriver() {
+        return driver;
+    }
+
+    public void setDriver(String driver) {
+        this.driver = driver;
+    }
+
+    public List<BaseWarpper> getUser() {
+        return user;
+    }
+
+    public void setUser(List<BaseWarpper> user) {
+        this.user = user;
+    }
+
+    @Override
+    public String toString() {
+        return "LineShiftWarpper{" +
+                "id=" + id +
+                ", driverId=" + driverId +
+                ", driver='" + driver + '\'' +
+                ", user=" + user +
+                '}';
+    }
+
+
+
+    public static LineShiftWarpper getLineShiftWarpper(Map<String, Object> map){
+        LineShiftWarpper lineShiftWarpper = new LineShiftWarpper();
+        if(null != map){
+            lineShiftWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            lineShiftWarpper.setDriverId(null != map.get("driverId") ? Integer.valueOf(map.get("driverId").toString()) : 0);
+            lineShiftWarpper.setDriver(null != map.get("driver") ? map.get("driver").toString() : "");
+            lineShiftWarpper.setUser(null != map.get("user") ? JSONArray.parseArray(map.get("user").toString(), BaseWarpper.class) : new ArrayList<>());
+        }
+        return lineShiftWarpper;
+    }
+
+
+    public static List<LineShiftWarpper> getLineShiftWarppers(List<Map<String, Object>> maps){
+        List<LineShiftWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                list.add(LineShiftWarpper.getLineShiftWarpper(map));
+            }
+        }
+        return list;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LineSiteWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LineSiteWarpper.java
new file mode 100644
index 0000000..2eb6a0c
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LineSiteWarpper.java
@@ -0,0 +1,224 @@
+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 LineSiteWarpper {
+    @ApiModelProperty("排班id")
+    private Integer id;
+    @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 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.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LocationWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LocationWarpper.java
new file mode 100644
index 0000000..7aa3b3f
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LocationWarpper.java
@@ -0,0 +1,128 @@
+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 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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java
new file mode 100644
index 0000000..6cf266b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java
new file mode 100644
index 0000000..e8362ba
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginWarpper.java
@@ -0,0 +1,78 @@
+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;
+    @ApiModelProperty("推单配置(1=接收,2=不接收)")
+    private Integer pushOrder;
+
+    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;
+    }
+
+    public Integer getPushOrder() {
+        return pushOrder;
+    }
+
+    public void setPushOrder(Integer pushOrder) {
+        this.pushOrder = pushOrder;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java
new file mode 100644
index 0000000..3503f3e
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java
new file mode 100644
index 0000000..6e5cc76
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderCrossCityWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderCrossCityWarpper.java
new file mode 100644
index 0000000..f999241
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderCrossCityWarpper.java
@@ -0,0 +1,250 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+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 = "车辆总座位数", 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;
+    @ApiModelProperty(value = "乘车人电话", required = true, dataType = "string")
+    private String passengersPhone;
+    @ApiModelProperty(value = "乘车人姓名", required = true, dataType = "string")
+    private String passengers;
+
+    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 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;
+    }
+
+    public String getPassengersPhone() {
+        return passengersPhone;
+    }
+
+    public void setPassengersPhone(String passengersPhone) {
+        this.passengersPhone = passengersPhone;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java
new file mode 100644
index 0000000..1119552
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderInfoWarpper.java
@@ -0,0 +1,276 @@
+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 id;
+    @ApiModelProperty("订单类型(1=专车,2=跨城)")
+    private Integer orderType;
+    @ApiModelProperty("下单时间")
+    private String orderTime;
+    @ApiModelProperty("订单编号")
+    private String orderNumber;
+    @ApiModelProperty("乘车时间")
+    private String travelTime;
+    @ApiModelProperty("下单用户")
+    private String user;
+    @ApiModelProperty("订单类型(1=拼车,2=包车)")
+    private Integer travelType;
+    @ApiModelProperty("起点")
+    private String startAddress;
+    @ApiModelProperty("终点")
+    private String endAddress;
+    @ApiModelProperty("车型")
+    private String serverCarModel;
+    @ApiModelProperty("接单司机")
+    private String driver;
+    @ApiModelProperty("车辆")
+    private String car;
+    @ApiModelProperty("订单金额")
+    private Double orderMoney;
+    @ApiModelProperty("改派申请司机")
+    private String originalDriver;
+    @ApiModelProperty("订单来源(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)")
+    private Integer orderSource;
+    @ApiModelProperty("乘车用户")
+    private String passengers;
+    @ApiModelProperty("线路")
+    private String line;
+    @ApiModelProperty("乘车人数")
+    private Integer peopleNumber;
+    @ApiModelProperty("座位号")
+    private String seatNumber;
+    @ApiModelProperty("备注")
+    private String remark;
+    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)")
+    private Integer state;
+
+    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 String getOrderTime() {
+        return orderTime;
+    }
+
+    public void setOrderTime(String orderTime) {
+        this.orderTime = orderTime;
+    }
+
+    public String getOrderNumber() {
+        return orderNumber;
+    }
+
+    public void setOrderNumber(String orderNumber) {
+        this.orderNumber = orderNumber;
+    }
+
+    public String getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(String travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public Integer getTravelType() {
+        return travelType;
+    }
+
+    public void setTravelType(Integer travelType) {
+        this.travelType = travelType;
+    }
+
+    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 String getServerCarModel() {
+        return serverCarModel;
+    }
+
+    public void setServerCarModel(String serverCarModel) {
+        this.serverCarModel = serverCarModel;
+    }
+
+    public String getDriver() {
+        return driver;
+    }
+
+    public void setDriver(String driver) {
+        this.driver = driver;
+    }
+
+    public String getCar() {
+        return car;
+    }
+
+    public void setCar(String car) {
+        this.car = car;
+    }
+
+    public Double getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(Double orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public String getOriginalDriver() {
+        return originalDriver;
+    }
+
+    public void setOriginalDriver(String originalDriver) {
+        this.originalDriver = originalDriver;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+
+    public String getLine() {
+        return line;
+    }
+
+    public void setLine(String line) {
+        this.line = line;
+    }
+
+    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 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 "OrderInfoWarpper{" +
+                "id=" + id +
+                ", orderType=" + orderType +
+                ", orderTime='" + orderTime + '\'' +
+                ", orderNumber='" + orderNumber + '\'' +
+                ", travelTime='" + travelTime + '\'' +
+                ", user='" + user + '\'' +
+                ", travelType=" + travelType +
+                ", startAddress='" + startAddress + '\'' +
+                ", endAddress='" + endAddress + '\'' +
+                ", serverCarModel='" + serverCarModel + '\'' +
+                ", driver='" + driver + '\'' +
+                ", car='" + car + '\'' +
+                ", orderMoney=" + orderMoney +
+                ", originalDriver='" + originalDriver + '\'' +
+                ", orderSource=" + orderSource +
+                ", passengers='" + passengers + '\'' +
+                ", line='" + line + '\'' +
+                ", peopleNumber=" + peopleNumber +
+                ", seatNumber='" + seatNumber + '\'' +
+                ", remark='" + remark + '\'' +
+                ", state=" + state +
+                '}';
+    }
+
+
+    public static OrderInfoWarpper getOrderInfoWarpper(Map<String, Object> map){
+        OrderInfoWarpper orderInfoWarpper = new OrderInfoWarpper();
+        if(null != map){
+            orderInfoWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            orderInfoWarpper.setOrderType(null != map.get("orderType") ? Integer.valueOf(map.get("orderType").toString()) : 0);
+            orderInfoWarpper.setOrderTime(null != map.get("orderTime") ? map.get("orderTime").toString() : "");
+            orderInfoWarpper.setOrderNumber(null != map.get("orderNumber") ? map.get("orderNumber").toString() : "");
+            orderInfoWarpper.setTravelTime(null != map.get("travelTime") ? map.get("travelTime").toString() : "");
+            orderInfoWarpper.setUser(null != map.get("user") ? map.get("user").toString() : "");
+            orderInfoWarpper.setTravelType(null != map.get("travelType") ? Integer.valueOf(map.get("travelType").toString()) : 0);
+            orderInfoWarpper.setStartAddress(null != map.get("startAddress") ? map.get("startAddress").toString() : "");
+            orderInfoWarpper.setEndAddress(null != map.get("endAddress") ? map.get("endAddress").toString() : "");
+            orderInfoWarpper.setServerCarModel(null != map.get("serverCarModel") ? map.get("serverCarModel").toString() : "");
+            orderInfoWarpper.setDriver(null != map.get("driver") ? map.get("driver").toString() : "");
+            orderInfoWarpper.setCar(null != map.get("car") ? map.get("car").toString() : "");
+            orderInfoWarpper.setOrderMoney(null != map.get("orderMoney") ? Double.valueOf(map.get("orderMoney").toString()) : 0);
+            orderInfoWarpper.setOriginalDriver(null != map.get("originalDriver") ? map.get("originalDriver").toString() : "");
+            orderInfoWarpper.setOrderSource(null != map.get("orderSource") ? Integer.valueOf(map.get("orderSource").toString()) : 0);
+            orderInfoWarpper.setPassengers(null != map.get("passengers") ? map.get("passengers").toString() : "");
+            orderInfoWarpper.setLine(null != map.get("line") ? map.get("line").toString() : "");
+            orderInfoWarpper.setPeopleNumber(null != map.get("peopleNumber") ? Integer.valueOf(map.get("peopleNumber").toString()) : 0);
+            orderInfoWarpper.setSeatNumber(null != map.get("seatNumber") ? map.get("seatNumber").toString() : "");
+            orderInfoWarpper.setRemark(null != map.get("remark") ? map.get("remark").toString() : "");
+            orderInfoWarpper.setState(null != map.get("state") ? Integer.valueOf(map.get("state").toString()) : 0);
+        }
+        return orderInfoWarpper;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderListWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderListWarpper.java
new file mode 100644
index 0000000..e213995
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/OrderListWarpper.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 OrderListWarpper {
+    @ApiModelProperty("订单id")
+    private Integer id;
+    @ApiModelProperty("下单时间")
+    private String orderTime;
+    @ApiModelProperty("下单用户")
+    private String user;
+    @ApiModelProperty("起点")
+    private String startAddress;
+    @ApiModelProperty("终点")
+    private String endAddress;
+    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)")
+    private Integer state;
+    @ApiModelProperty("线路")
+    private String lineName;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getOrderTime() {
+        return orderTime;
+    }
+
+    public void setOrderTime(String orderTime) {
+        this.orderTime = orderTime;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getLineName() {
+        return lineName;
+    }
+
+    public void setLineName(String lineName) {
+        this.lineName = lineName;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderListWarpper{" +
+                "id=" + id +
+                ", orderTime='" + orderTime + '\'' +
+                ", user='" + user + '\'' +
+                ", startAddress='" + startAddress + '\'' +
+                ", endAddress='" + endAddress + '\'' +
+                ", state=" + state +
+                ", lineName='" + lineName + '\'' +
+                '}';
+    }
+
+
+    public static List<OrderListWarpper> getOrderListWarppers(List<Map<String, Object>> list){
+        List<OrderListWarpper> data = new ArrayList<>();
+        if(list != null){
+            for(Map<String, Object> map : list){
+                data.add(OrderListWarpper.getOrderListWarpper(map));
+            }
+        }
+        return data;
+    }
+
+    public static OrderListWarpper getOrderListWarpper(Map<String, Object> map){
+        OrderListWarpper orderListWarpper = new OrderListWarpper();
+        if(null != map){
+            orderListWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            orderListWarpper.setOrderTime(null != map.get("orderTime") ? map.get("orderTime").toString() : "");
+            orderListWarpper.setUser(null != map.get("user") ? map.get("user").toString() : "");
+            orderListWarpper.setStartAddress(null != map.get("startAddress") ? map.get("startAddress").toString() : "");
+            orderListWarpper.setEndAddress(null != map.get("endAddress") ? map.get("endAddress").toString() : "");
+            orderListWarpper.setState(null != map.get("state") ? Integer.valueOf(map.get("state").toString()) : 0);
+            orderListWarpper.setLineName(null != map.get("lineName") ? map.get("lineName").toString() : "");
+        }
+        return orderListWarpper;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ReassignInfoWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ReassignInfoWarpper.java
new file mode 100644
index 0000000..469b23b
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ReassignInfoWarpper.java
@@ -0,0 +1,178 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Map;
+
+@ApiModel("改派详情")
+public class ReassignInfoWarpper {
+    @ApiModelProperty("改派单id")
+    private Integer id;
+    @ApiModelProperty("申请时间")
+    private String applyTime;
+    @ApiModelProperty("申请司机")
+    private String applyDriver;
+    @ApiModelProperty("申请原因")
+    private String reason;
+    @ApiModelProperty("下单用户")
+    private String user;
+    @ApiModelProperty("出发时间")
+    private String travelTime;
+    @ApiModelProperty("起点")
+    private String startAddress;
+    @ApiModelProperty("终点")
+    private String endAddress;
+    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)")
+    private Integer state;
+    @ApiModelProperty("改派状态(1=提交申请,2=已支付,3=已改派,4=已取消,5=已拒绝)")
+    private Integer status;
+    @ApiModelProperty("改派人")
+    private String reviewer;
+    @ApiModelProperty("新司机")
+    private String nowDriver;
+    @ApiModelProperty("订单类型(1=专车,2=出租车,3=跨城,4=同城小件,5=跨城小件)")
+    private Integer orderType;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getApplyTime() {
+        return applyTime;
+    }
+
+    public void setApplyTime(String applyTime) {
+        this.applyTime = applyTime;
+    }
+
+    public String getApplyDriver() {
+        return applyDriver;
+    }
+
+    public void setApplyDriver(String applyDriver) {
+        this.applyDriver = applyDriver;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    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 getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getReviewer() {
+        return reviewer;
+    }
+
+    public void setReviewer(String reviewer) {
+        this.reviewer = reviewer;
+    }
+
+    public String getNowDriver() {
+        return nowDriver;
+    }
+
+    public void setNowDriver(String nowDriver) {
+        this.nowDriver = nowDriver;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    @Override
+    public String toString() {
+        return "ReassignInfoWarpper{" +
+                "id=" + id +
+                ", applyTime='" + applyTime + '\'' +
+                ", applyDriver='" + applyDriver + '\'' +
+                ", reason='" + reason + '\'' +
+                ", user='" + user + '\'' +
+                ", travelTime='" + travelTime + '\'' +
+                ", startAddress='" + startAddress + '\'' +
+                ", endAddress='" + endAddress + '\'' +
+                ", state=" + state +
+                ", status=" + status +
+                ", reviewer='" + reviewer + '\'' +
+                ", nowDriver='" + nowDriver + '\'' +
+                '}';
+    }
+
+    public static ReassignInfoWarpper getReassignInfoWarpper(Map<String, Object> map){
+        ReassignInfoWarpper reassignInfoWarpper = new ReassignInfoWarpper();
+        if(null != map){
+            reassignInfoWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            reassignInfoWarpper.setApplyTime(null != map.get("applyTime") ? map.get("applyTime").toString() : "");
+            reassignInfoWarpper.setApplyDriver(null != map.get("applyDriver") ? map.get("applyDriver").toString() : "");
+            reassignInfoWarpper.setReason(null != map.get("reason") ? map.get("reason").toString() : "");
+            reassignInfoWarpper.setUser(null != map.get("user") ? map.get("user").toString() : "");
+            reassignInfoWarpper.setTravelTime(null != map.get("travelTime") ? map.get("travelTime").toString() : "");
+            reassignInfoWarpper.setStartAddress(null != map.get("startAddress") ? map.get("startAddress").toString() : "");
+            reassignInfoWarpper.setEndAddress(null != map.get("endAddress") ? map.get("endAddress").toString() : "");
+            reassignInfoWarpper.setState(null != map.get("state") ? Integer.valueOf(map.get("state").toString()) : 0);
+            reassignInfoWarpper.setStatus(null != map.get("status") ? Integer.valueOf(map.get("status").toString()) : 0);
+            reassignInfoWarpper.setReviewer(null != map.get("reviewer") ? map.get("reviewer").toString() : "");
+            reassignInfoWarpper.setNowDriver(null != map.get("nowDriver") ? map.get("nowDriver").toString() : "");
+            reassignInfoWarpper.setOrderType(null != map.get("orderType") ? Integer.valueOf(map.get("orderType").toString()) : 0);
+        }
+        return reassignInfoWarpper;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ReassignListWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ReassignListWarpper.java
new file mode 100644
index 0000000..50f0e21
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/ReassignListWarpper.java
@@ -0,0 +1,133 @@
+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 ReassignListWarpper {
+    @ApiModelProperty("改派单id")
+    private Integer id;
+    @ApiModelProperty("申请时间")
+    private String applyTime;
+    @ApiModelProperty("申请司机")
+    private String applyDriver;
+    @ApiModelProperty("新司机")
+    private String nowDriver;
+    @ApiModelProperty("起点")
+    private String startAddress;
+    @ApiModelProperty("终点")
+    private String endAddress;
+    @ApiModelProperty("状态(1=提交申请,2=已支付,3=已改派,4=已取消,5=已拒绝)")
+    private Integer state;
+    @ApiModelProperty("订单类型(1=专车,2=出租车,3=跨城,4=同城小件,5=跨城小件)")
+    private Integer orderType;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getApplyTime() {
+        return applyTime;
+    }
+
+    public void setApplyTime(String applyTime) {
+        this.applyTime = applyTime;
+    }
+
+    public String getApplyDriver() {
+        return applyDriver;
+    }
+
+    public void setApplyDriver(String applyDriver) {
+        this.applyDriver = applyDriver;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getNowDriver() {
+        return nowDriver;
+    }
+
+    public void setNowDriver(String nowDriver) {
+        this.nowDriver = nowDriver;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    @Override
+    public String toString() {
+        return "ReassignListWarpper{" +
+                "id=" + id +
+                ", applyTime='" + applyTime + '\'' +
+                ", applyDriver='" + applyDriver + '\'' +
+                ", startAddress='" + startAddress + '\'' +
+                ", endAddress='" + endAddress + '\'' +
+                ", state=" + state +
+                '}';
+    }
+
+    public static ReassignListWarpper getReassignListWarpper(Map<String, Object> map){
+        ReassignListWarpper reassignListWarpper = new ReassignListWarpper();
+        if(null != map){
+            reassignListWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            reassignListWarpper.setApplyTime(null != map.get("applyTime") ? map.get("applyTime").toString() : "");
+            reassignListWarpper.setApplyDriver(null != map.get("applyDriver") ? map.get("applyDriver").toString() : "");
+            reassignListWarpper.setNowDriver(null != map.get("nowDriver") ? map.get("nowDriver").toString() : "");
+            reassignListWarpper.setStartAddress(null != map.get("startAddress") ? map.get("startAddress").toString() : "");
+            reassignListWarpper.setEndAddress(null != map.get("endAddress") ? map.get("endAddress").toString() : "");
+            reassignListWarpper.setState(null != map.get("state") ? Integer.valueOf(map.get("state").toString()) : 0);
+            reassignListWarpper.setOrderType(null != map.get("orderType") ? Integer.valueOf(map.get("orderType").toString()) : 0);
+        }
+        return reassignListWarpper;
+    }
+
+
+    public static List<ReassignListWarpper> getReassignListWarppers(List<Map<String, Object>> maps){
+        List<ReassignListWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                list.add(ReassignListWarpper.getReassignListWarpper(map));
+            }
+        }
+        return list;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java
new file mode 100644
index 0000000..172961b
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RosterWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RosterWarpper.java
new file mode 100644
index 0000000..eb14566
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RosterWarpper.java
@@ -0,0 +1,87 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.alibaba.fastjson.JSONArray;
+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 RosterWarpper {
+    @ApiModelProperty("排班详情数据id")
+    private Integer id;
+    @ApiModelProperty("司机id")
+    private Integer driverId;
+    @ApiModelProperty("司机姓名")
+    private String driver;
+    @ApiModelProperty("乘客列表")
+    private List<BaseWarpper> users;
+
+    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 String getDriver() {
+        return driver;
+    }
+
+    public void setDriver(String driver) {
+        this.driver = driver;
+    }
+
+    public List<BaseWarpper> getUsers() {
+        return users;
+    }
+
+    public void setUsers(List<BaseWarpper> users) {
+        this.users = users;
+    }
+
+    @Override
+    public String toString() {
+        return "RosterWarpper{" +
+                "id=" + id +
+                ", driverId=" + driverId +
+                ", driver='" + driver + '\'' +
+                ", users=" + users +
+                '}';
+    }
+
+    public static RosterWarpper getRosterWarpper(Map<String, Object> map){
+        RosterWarpper rosterWarpper = new RosterWarpper();
+        if(null != map){
+            rosterWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+            rosterWarpper.setDriverId(null != map.get("driverId") ? Integer.valueOf(map.get("driverId").toString()) : 0);
+            rosterWarpper.setDriver(null != map.get("driver") ? map.get("driver").toString() : "");
+            rosterWarpper.setUsers(null != map.get("users") ? JSONArray.parseArray(map.get("users").toString(), BaseWarpper.class) : new ArrayList<>());
+        }
+        return rosterWarpper;
+    }
+
+    public static List<RosterWarpper> getRosterWarppers(List<Map<String, Object>> maps){
+        List<RosterWarpper> list = new ArrayList<>();
+        if(null != maps){
+            for(Map<String, Object> map : maps){
+                list.add(RosterWarpper.getRosterWarpper(map));
+            }
+        }
+        return list;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/SiteWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/SiteWarpper.java
new file mode 100644
index 0000000..c28b894
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/SiteWarpper.java
@@ -0,0 +1,43 @@
+package com.stylefeng.guns.modular.system.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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java
new file mode 100644
index 0000000..643677e
--- /dev/null
+++ b/DispatchOKTravel/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/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VersionManagementWarpper.java b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VersionManagementWarpper.java
new file mode 100644
index 0000000..bdbfcf9
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/VersionManagementWarpper.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 VersionManagementWarpper {
+    @ApiModelProperty("数据id")
+    private Integer id;
+    @ApiModelProperty("下载链接")
+    private String url;
+    @ApiModelProperty("版本说明")
+    private String content;
+    @ApiModelProperty("是否强制升级(1=是  2=否)")
+    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 "VersionManagementWarpper{" +
+                "id=" + id +
+                ", url='" + url + '\'' +
+                ", content='" + content + '\'' +
+                ", mandatory=" + mandatory +
+                ", version='" + version + '\'' +
+                '}';
+    }
+
+    public static Object getVersionManagementWarpper(Map<String, Object> map){
+        if(null == map){
+            return new Object();
+        }
+        VersionManagementWarpper versionManagementWarpper = new VersionManagementWarpper();
+        versionManagementWarpper.setId(null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : 0);
+        versionManagementWarpper.setUrl(null != map.get("url") ? map.get("url").toString() : "");
+        versionManagementWarpper.setContent(null != map.get("content") ? map.get("content").toString() : "");
+        versionManagementWarpper.setMandatory(null != map.get("mandatory") ? Integer.valueOf(map.get("mandatory").toString()) : 0);
+        versionManagementWarpper.setVersion(null != map.get("version") ? map.get("version").toString() : "");
+        return versionManagementWarpper;
+    }
+}
diff --git a/DispatchOKTravel/guns-admin/src/test/sql/test.sql b/DispatchOKTravel/guns-admin/src/test/sql/test.sql
new file mode 100644
index 0000000..04b15ca
--- /dev/null
+++ b/DispatchOKTravel/guns-admin/src/test/sql/test.sql
@@ -0,0 +1,35 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50719
+ Source Host           : localhost:3306
+ Source Schema         : guns
+
+ Target Server Type    : MySQL
+ Target Server Version : 50719
+ File Encoding         : 65001
+
+ Date: 10/07/2018 14:09:19
+*/
+
+DROP DATABASE IF EXISTS guns_test;
+CREATE DATABASE IF NOT EXISTS guns_test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
+
+use guns_test;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for test
+-- ----------------------------
+DROP TABLE IF EXISTS `test`;
+CREATE TABLE `test` (
+  `aaa` int(11) NOT NULL AUTO_INCREMENT,
+  `bbb` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`aaa`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
+
+SET FOREIGN_KEY_CHECKS = 1;

--
Gitblit v1.7.1