From ddba15cfd1d654dc41de5dfdc587e12d96d84f4f Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期一, 04 八月 2025 17:44:54 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/QianYunTong

---
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayUtil.java              |  298 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/DriverRideMapper.xml           |   32 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ParamMapper.xml                |   17 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Complaints.java                      |  151 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Param.java                           |   73 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/TimeTaskMapper.java                    |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/PayInfoController.java          |  173 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ParamRideServiceImpl.java     |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_key.pem      |   28 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/UserApplyMapper.java                   |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineDetailVo.java                 |  285 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/ApiUtil.java                          |  257 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IFinancialService.java             |   48 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/ParamRide.java                       |  109 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/OrderRideServiceImpl.java     |   37 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IOrderTravelService.java           |   31 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/EvaluateMapper.xml             |   24 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/CouponUserVo.java                 |   78 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IComplaintsService.java            |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/TimeTaskServiceImpl.java      |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayConfigImpl.java       |   90 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/DriverRideServiceImpl.java    |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/TimeJobType.java                 |   31 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/SiteVo.java                       |  164 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/OrderTravel.java                     |  245 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/DateUtil.java                         | 1102 ++++
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/UserApply.java                       |  155 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MethodModel.java                  |   26 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/WXPayRequest.java         |  328 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/EvaluateServiceImpl.java      |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Configure.java              |  235 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/BaseService.java           |   50 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/BrandMapper.java                       |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_cert.pem     |   24 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/DriverOrderVo.java                |   90 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/IWXPayDomain.java           |   42 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/PayUtil.java                    |  449 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/MD5.java                    |   59 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IOrderRideService.java             |   37 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/UserSetVo.java                    |   51 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/ApiJson.java                      |  175 
 DriverQYTTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java                                  |   82 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderRideVo.java                  |  226 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/OrderTravelMapper.java                 |   32 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/OrderRide.java                       |  431 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IParamService.java                 |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayDomainSimpleImpl.java |  100 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IEvaluateService.java              |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/UserApplyMapper.xml            |   23 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java                          |   43 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/TestJob.java                          |   13 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/HttpsRequest_2.java         |  181 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiListVo.java              |   98 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IDriverRideService.java            |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/DriverTaxiVo.java                 |  139 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineRecommendedVo.java            |  184 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ParamServiceImpl.java         |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/rideCommentController.java      | 1375 +++++
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/DriverRide.java                      |  343 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/AbstractJob.java                 |   38 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/证书使用说明.txt             |   18 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/EvaluateMapper.java                    |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/WXPay.java                         |  307 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/ShiftVo.java                      |  108 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/UnifiedorderReqData.java  |  297 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Brand.java                           |   77 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderRideInfoVo.java              |  283 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiDriverVo.java            |  209 
 UserQYTTravel/guns-admin/src/main/resources/conf/param.properties                                                     |   47 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/OrderRideMapper.java                   |   39 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/OrderTravelMapper.xml          |   69 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiVo.java                  |  302 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/BannerVo.java                     |   55 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/BrandMapper.xml                |   17 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/OrderTravelServiceImpl.java   |   32 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/ThreadTes.java                        |   25 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/OrderUtil.java                        |   81 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/jobs/CourseExamineRide.java           |   43 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/ParamUtil.java                        |   36 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java               |   43 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/SensitiveWordUtil.java                |  252 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ParamRideMapper.xml            |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayConfig.java            |  103 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Util.java                   |  127 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ParamMapper.java                       |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/UnifiedorderService.java   |   28 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_cert.p12     |    0 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/RandomStringGenerator.java  |   28 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/FinancialMapper.java                   |   49 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IParamRideService.java             |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ComplaintsMapper.xml           |   22 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/exceptions/TimeException.java         |   37 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/ITimeTaskService.java              |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineRecommendedBcVo.java          |  476 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Log.java                    |   59 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/RefundService.java         |   33 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/HttpsRequest.java           |  181 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/NtteyModel.java                   |   98 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/SiteLineVo.java                   |   91 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Signature.java              |  128 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ComplaintsServiceImpl.java    |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayPerformance.java      |  149 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/DriverRideMapper.java                  |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiListDriverVo.java        |  109 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IBrandService.java                 |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/FinancialServiceImpl.java     |   46 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/UserApplyServiceImpl.java     |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/FinancialMapper.xml            |  165 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Evaluate.java                        |  168 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderVo.java                      |  107 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/RefundReqData.java        |  209 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/TimeTask.java                        |  123 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MechanismVo.java                  |   75 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/IServiceRequest.java       |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ComplaintsMapper.java                  |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ParamRideMapper.java                   |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/TimeTaskMapper.xml             |   21 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/BrandServiceImpl.java         |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayConstants.java         |   52 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/AppPayReqData.java        |  125 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IUserApplyService.java             |   16 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/QuartzManager.java               |  132 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/XMLParser.java              |   43 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Financial.java                       |  197 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineVo.java                       |   88 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/WXPayReport.java          |  268 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/OrderRideMapper.xml            |   89 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MessageVo.java                    |   47 
 128 files changed, 14,733 insertions(+), 38 deletions(-)

diff --git a/DriverQYTTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java b/DriverQYTTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java
index 49643d3..66223bd 100644
--- a/DriverQYTTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java
+++ b/DriverQYTTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java
@@ -1,36 +1,48 @@
-package com.stylefeng.guns;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class GunsApplicationTest {
-	
-	@Autowired
-	private MongoTemplate mongoTemplate;
-
-
-	@Test
-	public void test(){
-//		GeoJsonPoint point = new GeoJsonPoint(new Point(Double.parseDouble("104.043149"),
-//				Double.parseDouble("30.642483")));
-//		DriverPosition position = mongoTemplate.findOne(Query.query(Criteria.where("driverId")
-//				.is(14)), DriverPosition.class);
-//		if(null == position){
-//			position = new DriverPosition();
+//package com.stylefeng.guns;
+//
+//import com.stylefeng.guns.modular.system.model.Driver;
+//import com.stylefeng.guns.modular.system.service.IDriverService;
+//import com.stylefeng.guns.modular.system.util.zhenglian.TokenUtil;
+//import com.stylefeng.guns.modular.system.util.zhenglian.model.TokenRequest;
+//import com.stylefeng.guns.modular.system.util.zhenglian.model.TradeTerminalInfo;
+//import org.junit.Test;
+//import org.junit.runner.RunWith;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.boot.test.context.SpringBootTest;
+//import org.springframework.data.mongodb.core.MongoTemplate;
+//import org.springframework.test.context.junit4.SpringRunner;
+//
+//@RunWith(SpringRunner.class)
+//@SpringBootTest
+//public class GunsApplicationTest {
+//
+//	@Autowired
+//	private MongoTemplate mongoTemplate;
+//	@Autowired
+//	private IDriverService driverService;
+//
+//
+//	@Test
+//	public void test() {
+//
+//		Driver driver = driverService.selectById(driverId);
+//		TokenRequest tokenRequest = new TokenRequest();
+//		tokenRequest.setAppUserId(driver.getEmpId().toString());
+//		tokenRequest.setUserName(driver.getName());
+//		tokenRequest.setCertNo(driver.getIdCard());
+//		tokenRequest.setPhone(driver.getPhone());
+//		TradeTerminalInfo tradeTerminalInfo = new TradeTerminalInfo();
+//		tradeTerminalInfo.setIp("127.0.0.1");
+//		tradeTerminalInfo.setTerminal("1");
+//		tradeTerminalInfo.setMac("");
+//		tokenRequest.setTradeTerminalInfo(tradeTerminalInfo);
+//		tokenRequest.setType(type);
+//		String token = null;
+//		try {
+//			token = TokenUtil.getToken(tokenRequest);
+//		} catch (Exception e) {
+//			throw new RuntimeException(e);
 //		}
-//		position.setDriverId(14);
-//		position.setPoint(point);
-//		mongoTemplate.save(position);
-		
-		
-//		Query query = Query.query(Criteria.where("point").nearSphere(new Point(Double.parseDouble("104.043149"), Double.parseDouble("30.642483"))).maxDistance(5000));
-//		List<DriverPosition> driverPositions = mongoTemplate.find(query, DriverPosition.class);
-//		System.err.println(driverPositions);
-	}
-}
+//		System.err.println(token);
+//	}
+//}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/PayInfoController.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/PayInfoController.java
new file mode 100644
index 0000000..fd573ea
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/PayInfoController.java
@@ -0,0 +1,173 @@
+package com.stylefeng.guns.modular.shunfeng.controller;
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.shunfeng.model.OrderRide;
+import com.stylefeng.guns.modular.shunfeng.model.vo.ApiJson;
+import com.stylefeng.guns.modular.shunfeng.service.IOrderRideService;
+import com.stylefeng.guns.modular.shunfeng.service.IParamService;
+import com.stylefeng.guns.modular.shunfeng.service.ITimeTaskService;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import io.swagger.annotations.Api;
+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.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+
+/**
+ * 支付相关接口
+ */
+@Api(tags = "顺风车支付相关接口")
+@Controller
+@RequestMapping("/api/payInfo")
+public class PayInfoController {
+
+    @Autowired
+    private IParamService paramService;
+    @Autowired
+    private IOrderRideService orderRideService;
+    @Autowired
+    private ITimeTaskService timeTaskService;
+    @Autowired
+    private IUserInfoService userInfoService;
+    @Autowired
+    private ISystemNoticeService systemNoticeService;
+
+
+
+
+
+
+    /**
+     * 顺风车支付
+     * @param orderId
+     * @param couponId
+     * @return
+     */
+    public Object payBalanceRide(Integer orderId,Integer couponId){
+        try {
+            OrderRide orderRide=orderRideService.selectById(orderId);
+            if(orderRide.getState() == 6){
+                return ApiJson.returnNG("超出支付时间,订单已自动取消");
+            }
+            if(orderRide.getState() == 2){
+                return ApiJson.returnNG("该订单已支付");
+            }
+            orderRide.setPayTime(new Date());
+            orderRide.setPayType(1);//1余额
+            orderRide.setState(2);//已支付
+            Double couponMoney=0d;
+            Integer cid=0;//优惠券id
+            String couponName="";
+            /*todo 如果使用了优惠券*/
+            if(couponId!= null && couponId>0){
+//            orderRide.setCouponId(couponId);
+//            CouponUser couponUser=couponUserService.selectById(couponId);
+//            if(couponUser!=null){
+//                couponMoney=couponUser.getUsableMoney();
+//                cid=couponUser.getCouponId();
+//                couponName=couponUser.getCouponName();
+//                //标记优惠券已使用
+//                couponUser.setState(3);
+//                couponUserService.updateById(couponUser);
+//            }
+            }
+            /*支付金额=订单金额-优惠券*/
+            Double money=orderRide.getMoney()-couponMoney<0?0:orderRide.getMoney()-couponMoney;
+            //减去用户余额
+            UserInfo userInfo = userInfoService.selectById(orderRide.getUserId());
+            if((userInfo.getBalance() == null ?0 : userInfo.getBalance()) < money){
+                return ApiJson.returnNG("用户余额不足");
+            }
+            if(cid>0){
+                //todo 优惠券总额
+//            Coupon coupon=couponService.selectById(cid);
+//            //优惠券类型(1注册、2分享、3活动、4验票)
+//            coupon.setUseNumber(coupon.getUseNumber()+1);
+//            coupon.setUseMoney(coupon.getUseMoney()+couponMoney);
+//            couponService.updateById(coupon);
+//            orderRide.setCouponName(couponName);
+//            orderRide.setCouponMoney(couponMoney);
+            }
+            orderRideService.updateById(orderRide);
+            //系统消息
+            systemNoticeService.addSystemNotice(1, "您成功支付从"+orderRide.getStartName()+"到"+orderRide.getEndName()+"的顺风车订单",
+                    orderRide.getUserId(),1);
+            /*修改用户余额*/
+            userInfo.setBalance(userInfo.getBalance() - money);
+            userInfoService.updateById(userInfo);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return ApiJson.returnOK("支付成功");
+    }
+
+    /**
+     * 线上支付
+     * @param orderId 订单ID
+     * @param type (1:订单支付,2:充值 3:出租车红包支付,4:服务费用缴费,5顺风车支付)
+     * @param  payType (1:支付宝,2:微信 3:银行卡 ,4:小程序)
+     * @param isBalance (是否开启余额支付 1否,2是)
+     * @param  code 微信小程序支付需要
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/payOnline")
+    public Object payOnline(Integer orderId,Integer type,String code,Integer payType,Integer isBalance,HttpServletRequest request,Integer couponId){
+        try {
+            if(orderId == null || orderId == 0){
+                return ApiJson.returnNG("订单ID不能为空");
+            }
+            if(type == null || type == 0){
+                return ApiJson.returnNG("type不能为空");
+            }
+            if(payType == null || payType == 0){
+                return ApiJson.returnNG("payType不能为空");
+            }
+            Object info=new Object();
+            String openId=null;
+            if(ToolUtil.isNotEmpty(code)){
+                /*根据微信端的code获取openId*/
+//                openId=new JsapiTicketUtilX().getOpenId(code);
+            }
+    
+            OrderRide orderRide=orderRideService.selectById(orderId);
+            if(orderRide.getState()==6){
+                return ApiJson.returnNG("该订单已取消");
+            }
+            if(orderRide.getState()==2){//已支付
+                return ApiJson.returnNG("该订单不需要支付");
+            }
+            info = new PayUtil().getPayInfo(payType,orderRide.getOrderNum(),openId,request);
+            return ApiJson.returnOK(info);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("购票失败");
+    }
+    /**
+     * 支付宝回调
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/alipay/notify")
+    public void notifyUrl(HttpServletRequest request, HttpServletResponse response) {
+        new PayUtil().notifyUrl(request,response);
+    }
+
+    /**
+     * 微信回调
+     * @param request
+     * @param response
+     */
+    @ResponseBody
+    @RequestMapping("/wxpay/notify")
+    public void wxnotify(HttpServletRequest request, HttpServletResponse response) {
+        new PayUtil().wxnotify(request,response);
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/PayUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/PayUtil.java
new file mode 100644
index 0000000..e7c1fd1
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/PayUtil.java
@@ -0,0 +1,449 @@
+package com.stylefeng.guns.modular.shunfeng.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import com.stylefeng.guns.modular.shunfeng.model.Financial;
+import com.stylefeng.guns.modular.shunfeng.model.OrderRide;
+import com.stylefeng.guns.modular.shunfeng.service.IFinancialService;
+import com.stylefeng.guns.modular.shunfeng.service.IOrderRideService;
+import com.stylefeng.guns.modular.shunfeng.tencent.WXPay;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Configure;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Signature;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.XMLParser;
+import com.stylefeng.guns.modular.shunfeng.tencent.protocol.AppPayReqData;
+import com.stylefeng.guns.modular.shunfeng.tencent.protocol.RefundReqData;
+import com.stylefeng.guns.modular.shunfeng.tencent.protocol.UnifiedorderReqData;
+import com.stylefeng.guns.modular.shunfeng.util.ApiUtil;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * <b>支付处理工具类</b>
+ * <p>
+ * 封装【支付宝支付、微信支付、余额支付】
+ * </p>
+ *
+ * @author tzj
+ * @version 1.0
+ * @data 2017年6月17日
+ */
+
+public class PayUtil {
+	
+	/**
+	 * 日志记录(记录打印报文)
+	 */
+	Logger log = LoggerFactory.getLogger(getClass());
+	
+	private ISystemNoticeService systemNoticeService = SpringContextHolder.getBean(ISystemNoticeService.class);
+	private IOrderRideService orderRideService = SpringContextHolder.getBean(IOrderRideService.class);
+	
+	private IFinancialService financialService = SpringContextHolder.getBean(IFinancialService.class);
+	
+	/**
+	 * 获取支付信息
+	 *
+	 * @param userId   用户ID
+	 * @param type     支付类型 1=支付宝,2 = 微信 3:银行卡 4:小程序
+	 * @param ordernum 订单编号
+	 * @param price    金额
+	 * @return
+	 */
+	
+	public Object getPayInfo(Integer type, String orderNum, String openId,
+	                         HttpServletRequest request) {
+		Double price = 0.0;
+		String subject = "";
+		String body = "";
+		try {
+			if (orderNum.contains("ride")) {
+				//顺风车支付
+				OrderRide orderRide = orderRideService.selectOne(new EntityWrapper<OrderRide>().eq("orderNum", orderNum));
+				price = Double.valueOf(orderRide.getMoney());
+				body = "全客通-顺风车支付";
+				subject = "全客通-顺风车支付";
+			}
+			Map<String, Object> map = new HashMap<String, Object>();
+			if (type == 1) {
+			} else if (type == 2) {
+				// 微信下单
+				return wxpay(1, orderNum, body, price, request);
+			} else if (type == 4) {
+				//小程序
+				return wxpayX(orderNum, body, price, "JSAPI", openId);
+				
+			}
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return ApiUtil.putFailObj("获取异常");
+	}
+	
+	/**
+	 * 小程序
+	 */
+	private Map<String, Object> wxpayX(String orderNo, String body, Double price, String trade_type, String openId)
+			throws Exception {// JSAPI
+		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> appPayMap = new HashMap<String, Object>();
+		// 构建接口请求参数
+		UnifiedorderReqData unifiedorderReqData = new UnifiedorderReqData(orderNo, body, price, Configure.wx_notify_url,
+				trade_type, openId);
+		
+		// 请求接口获取返回接口
+		String result = WXPay.requestUnifiedorderService(2, unifiedorderReqData);
+		System.out.println("WxpayController.createOrder__result:\n" + result);
+		
+		// 获取预支付接口返回参数
+		map = XMLParser.getMapFromXML(result);
+		System.out.println("WxpayController.createOrder__result:\n" + result);
+		
+		// 捕获预支付接口错误提示
+		if ("FAIL".equals(map.get("result_code")) || "FAIL".equals(map.get("return_code"))) {
+			return ApiUtil.putFailObj(String.valueOf(map.get("return_msg")));
+		}
+		
+		// 对获取预支付返回接口参数进行封装(生成支付订单接口数据)
+		AppPayReqData appPay = new AppPayReqData(1, (String) map.get("appid"), (String) map.get("mch_id"),
+				(String) map.get("prepay_id"), unifiedorderReqData.getNonce_str());
+		
+		// 对获取预支付返回接口参数进行封装(生成支付订单接口数据)
+		appPayMap.put("appId", appPay.getAppid());// 公众账号ID
+		appPayMap.put("nonceStr", appPay.getNoncestr());// 随机字符串(32位)
+		appPayMap.put("package", "prepay_id=" + appPay.getPrepayid());
+		appPayMap.put("signType", "MD5");// 签名类型
+		appPayMap.put("timeStamp", appPay.getTimestamp());// 时间戳
+		// 公众号参与签名的参数: appId, timeStamp, nonceStr, package, signType
+		appPayMap.put("paySign", Signature.getSign(2, appPayMap));// 根据API给的签名规则进行签名
+		return appPayMap;
+	}
+	
+
+	
+
+	
+	/**
+	 * 服务器异步通知处理支付宝
+	 *
+	 * @param request
+	 * @param res
+	 */
+	
+	public void notifyUrl(HttpServletRequest request, HttpServletResponse res) {
+		HttpServletResponse response = (HttpServletResponse) res;
+		response.setContentType("text/html;charset=UTF-8");
+		PrintWriter out;
+		try {
+			out = response.getWriter();
+			// 获取支付宝POST过来反馈信息
+			Map<String, String> params = new HashMap<String, String>();
+			Map requestParams = request.getParameterMap();
+			log.debug("AlipayController.notifyUrl__requestParams:\n" + requestParams);
+			System.out.println("支付宝回调:=================" + requestParams);
+			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] + ",";
+				}
+				// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
+				valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
+				params.put(name, valueStr);
+			}
+			
+			Financial financial = getPayLog_alipay(request);
+			// 验证成功
+			if ("TRADE_FINISHED".equals(financial.getTradeStatus())) {
+				System.out.println("AlipayController.notifyUrl__验证成功:success");
+				// 支付失败
+			} else if ("TRADE_SUCCESS".equals(financial.getTradeStatus())) {
+				// 支付成功
+				try {
+					if (financial.getOrderNum().contains("ride")) {
+						//顺风车支付
+						//修改订单表中的订单流水和支付方式
+						OrderRide order = orderRideService.selectOne(new EntityWrapper<OrderRide>().eq("orderNum", financial.getOrderNum()));
+						
+						order.setOutNum(financial.getLsType());//流水
+						order.setPayTime(new Date());
+						order.setPayType(3);//支付宝
+						order.setState(2);
+						financial.setPwType(8);//顺风车
+						financial.setUserId(order.getUserId());
+						financial.setLx(1);//1=用户 2=司机
+						financial.setOrderType(4);//顺风车
+						financialService.insert(financial);
+						orderRideService.updateById(order);
+						/*添加系统消息*/
+						try {
+							systemNoticeService.addSystemNotice(1, "您成功支付从" + order.getStartName() + "到" + order.getEndName() + "的顺风车订单", order.getUserId(), 1);
+						} catch (Exception e) {
+							throw new RuntimeException(e);
+						}
+						
+					}
+					// ——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
+					log.debug("AlipayController.notifyUrl__回调处理:success");
+					out.println("success"); // 请不要修改或删除
+				} catch (Exception e) {
+					log.debug("AlipayController.notifyUrl__回调逻辑代码处理异常!fail");
+					// 返回失败
+					out.println("fail");
+					e.printStackTrace();
+				}
+				// ////////////////////////////////////////////////////////////////////////////////////////
+			} else {// 验证失败
+				log.debug("AlipayController.notifyUrl__回调处理失败!fail");
+				out.println("fail");
+			}
+		} catch (IOException e) {
+			log.debug("AlipayController.notifyUrl__支付宝服务器异步通知数据处理失败!");
+			e.printStackTrace();
+		}
+	}
+	
+	///////////////////////////////////////////////////////////////////////////////////////////////////
+	
+	/**
+	 * 统一下单
+	 *
+	 * @param apptype
+	 * @param outTradeNo
+	 * @param body
+	 * @param price
+	 * @param request
+	 * @return
+	 */
+	public static Map<String, Object> wxpay(Integer apptype, String outTradeNo, String body, Double price,
+	                                        HttpServletRequest request) {
+		// 获取预支付接口返回参数
+		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> appPayMap = new HashMap<String, Object>();
+		try {
+			// 构建接口请求参数
+			UnifiedorderReqData unifiedorderReqData = new UnifiedorderReqData(apptype, outTradeNo, body, price,
+					Configure.wx_notify_url);
+			// 请求接口获取返回接口
+			String result = WXPay.requestUnifiedorderService(apptype, unifiedorderReqData);
+			System.out.println(result);
+			System.out.println("WxpayController.createOrder__result:\n" + result);
+			// 获取预支付接口返回参数
+			map = XMLParser.getMapFromXML(result);
+			System.out.println("WxpayController.createOrder__result:\n" + result);
+			// 捕获预支付接口错误提示
+			if ("FAIL".equals(map.get("result_code")) || "FAIL".equals(map.get("return_code"))) {
+				return ApiUtil.putFailObj(String.valueOf(map.get("return_msg")));
+			}
+			
+			// 对获取预支付返回接口参数进行封装(生成支付订单接口数据)
+			AppPayReqData appPay = new AppPayReqData(apptype, (String) map.get("appid"), (String) map.get("mch_id"),
+					(String) map.get("prepay_id"), unifiedorderReqData.getNonce_str());
+			
+			// 对获取预支付返回接口参数进行封装(生成支付订单接口数据)
+			appPayMap.put("appid", appPay.getAppid());// 公众账号ID
+			appPayMap.put("nonceStr", appPay.getNoncestr());// 随机字符串(32位)
+			appPayMap.put("package", appPay.get_package());// 扩展字段(暂填写固定值Sign=WXPay)
+			appPayMap.put("partnerId", appPay.getPartnerid());// 商户号
+			appPayMap.put("prepayId", appPay.getPrepayid());// 预支付编号(微信返回的支付交易会话ID)
+			appPayMap.put("timeStamp", appPay.getTimestamp());// 时间戳
+			appPayMap.put("sign", appPay.getSign());// 根据API给的签名规则进行签名
+			return appPayMap;
+		} catch (Exception e) {
+			System.out.println("统一下单_API_处理异常!");
+			e.printStackTrace();
+		}
+		return ApiUtil.putFailObj("统一下单失败");
+	}
+	
+	/**
+	 * 微信支付回调(参考财付通回调接口)
+	 *
+	 * @param request
+	 * @param response
+	 */
+	public void wxnotify(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			System.out.println("微信支付回调!!!!!!!!!!!!!!!!!!!!!!!!!");
+			// 异步通知返回报文
+			StringBuffer notityXml = new StringBuffer();
+			String inputLine;
+			while ((inputLine = request.getReader().readLine()) != null) {
+				notityXml.append(inputLine);
+			}
+			request.getReader().close();
+			// log.debug("WxpayController.notify__notityXml:\n" + notityXml);
+			System.out.println("WxpayController.notify__notityXml:\n" + notityXml);
+			
+			// 验证签名
+			if (Signature.checkIsSignValidFromResponseString(1, notityXml.toString())
+					|| Signature.checkIsSignValidFromResponseString(2, notityXml.toString())) {
+				Map<String, Object> map = XMLParser.getMapFromXML(notityXml.toString());
+				// log.debug("WxpayController.notify__map:\n" + map);
+				// 接口返回状态
+				String result_code = (String) map.get("result_code");
+				if ("SUCCESS".equals(result_code)) {
+					// // 商户订单号
+					String out_trade_no = (String) map.get("out_trade_no");
+					// // 微信支付交易号
+					String trade_no = (String) map.get("transaction_id");
+					// // 金额,以分为单位
+					String total_fee = (String) map.get("total_fee");
+					// // 优惠金额
+					// String discount = (String) map.get("discount");
+					// // 支付完成时间
+					String time_end = (String) map.get("time_end");
+					// // 支付者唯一Id(对应买家账号的一个加密串 )
+					String buyer_id = (String) map.get("buyer_id");
+					
+					///////////////////////////// 这里程序处理支付回调逻辑
+					///////////////////////////// ////////////////////
+					String orderNum = out_trade_no;
+					Financial financial = new Financial();
+					financial.setType(1);//类型 1=收入 2=支出
+					financial.setPayType("2");//支付类型 1=余额 2=微信 3=支付宝
+					financial.setMoney(Double.parseDouble(total_fee) / 100);//支付金额
+					financial.setOrderNum(out_trade_no);//我们本地的订单号
+					financial.setLsType(trade_no);//流水号
+					financial.setAddTime(new Date());
+					financial.setTradeStatus(result_code);
+					if (orderNum.contains("ride")) {
+						//顺风车支付
+						//修改订单表中的订单流水和支付方式
+						OrderRide order = orderRideService.selectOne(new EntityWrapper<OrderRide>().eq("orderNum", orderNum));
+						order.setOutNum(financial.getLsType());//流水
+						order.setPayTime(new Date());
+						order.setPayType(2);
+						order.setState(2);
+						financial.setPwType(8);//顺风车
+						financial.setUserId(order.getUserId());
+						financial.setLx(1);//1=用户 2=司机
+						financial.setOrderType(4);//顺风车
+						financialService.insert(financial);
+						orderRideService.updateById(order);
+						/*添加系统消息*/
+						try {
+							systemNoticeService.addSystemNotice(1, "您成功支付从" + order.getStartName() + "到" + order.getEndName() + "的顺风车订单", order.getUserId(), 1);
+						} catch (Exception e) {
+							throw new RuntimeException(e);
+						}
+						
+					}
+					log.debug("WxpayController.notify__回调处理成功:SUCCESS");
+					response.getOutputStream().print("success");
+				} else {
+					log.debug("WxpayController.notify__回调处理:验证状态错误!" + result_code);
+					System.out.println("验证状态错误!" + result_code);
+				}
+			} else {
+				log.debug("WxpayController.notify__回调处理:通知签名验证失败!");
+				System.out.println("通知签名验证失败!");
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * 微信退款
+	 *
+	 * @param transactionID    【支付交易号】是微信系统为每一笔支付交易分配的订单号,通过这个订单号可以标识这笔交易,
+	 *                         它由支付订单API支付成功时返回的数据里面获取到。建议优先使用
+	 * @param outTradeNo       【商品订单编号】商户系统内部的订单号,transaction_id
+	 *                         、out_trade_no二选一,如果同时存在优先级:transaction_id>out_trade_no
+	 * @param outRefundNo      【退款编号】商户系统内部的退款单号,商户系统内部唯一,同一退款单号多次请求只退一笔
+	 * @param totalFeetotalFee 订单总金额,单位为分
+	 * @param refundFee        退款总金额,单位为分,可以做部分退款
+	 * @return
+	 */
+	public static boolean refundForWxpay(Integer apptype, String transactionID, String outTradeNo, String outRefundNo,
+	                                     Integer totalFee, Integer refundFee, String pay_type) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		try {
+			// 构建接口请求参数
+			RefundReqData refundReqData = new RefundReqData(transactionID, outTradeNo, outRefundNo, totalFee, refundFee,
+					pay_type);
+			
+			// 请求接口返回结果
+			String result = WXPay.requestRefundService(apptype, refundReqData);
+			System.out.println("微信退款返回内容:" + result);
+			// 获取预支付接口返回参数
+			map = XMLParser.getMapFromXML(result);
+			System.out.println("微信退款返回参数:" + map);
+			// 退款成功处理
+			if ("SUCCESS".equals(map.get("result_code"))) {
+				return true;
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			return false;
+		}
+		return false;
+	}
+	
+	/**
+	 * 获取支付宝
+	 *
+	 * @param request
+	 * @return
+	 * @throws Exception
+	 */
+	private Financial getPayLog_alipay(HttpServletRequest request) throws IOException {
+		//////// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)////////
+		// 商户订单号
+		String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
+		// 支付宝交易号
+		String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
+		// 交易状态
+		String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
+		// 支付者唯一Id
+		String buyer_id = new String(request.getParameter("buyer_id").getBytes("ISO-8859-1"), "UTF-8");
+		// 支付帐号
+		String buyer_email = "";
+		if (request.getParameter("buyer_logon_id") != null && !request.getParameter("buyer_logon_id").equals("")) {
+			buyer_email = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"), "UTF-8");
+		}
+		// 支付金额
+		String total_fee = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");
+		// 支付时间
+		String notify_time = new String(request.getParameter("notify_time").getBytes("ISO-8859-1"), "UTF-8");
+		
+		//////// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)////////
+		Financial financial = new Financial();
+		financial.setType(1);//类型 1=收入 2=支出
+		financial.setPayType("3");//支付类型 1=余额 2=微信 3=支付宝
+		financial.setMoney(Double.parseDouble(total_fee));//支付金额
+		financial.setOrderNum(out_trade_no);//我们本地的订单号
+		financial.setLsType(trade_no);//流水号
+		financial.setAddTime(new Date());
+		financial.setTradeStatus(trade_status);
+		return financial;
+	}
+	
+	
+	public boolean judgeContainsStr(String cardNum) {
+		String regex = ".*[a-zA-Z]+.*";
+		Matcher m = Pattern.compile(regex).matcher(cardNum);
+		return m.matches();
+	}
+	
+	public static void main(String[] args) {
+		//模拟退款
+		refundForWxpay(1, "4200000680202009309013911024", "ride20093008510001", "ride200930085100012", 25753, 25753, "2");
+		
+	}
+	
+}
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/rideCommentController.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/rideCommentController.java
new file mode 100644
index 0000000..da1f191
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/controller/rideCommentController.java
@@ -0,0 +1,1375 @@
+package com.stylefeng.guns.modular.shunfeng.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.shunfeng.model.*;
+import com.stylefeng.guns.modular.shunfeng.model.vo.ApiJson;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideInfoVo;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo;
+import com.stylefeng.guns.modular.shunfeng.service.*;
+import com.stylefeng.guns.modular.shunfeng.task.base.QuartzManager;
+import com.stylefeng.guns.modular.shunfeng.task.base.TimeJobType;
+import com.stylefeng.guns.modular.shunfeng.task.jobs.CourseExamineRide;
+import com.stylefeng.guns.modular.shunfeng.util.DateUtil;
+import com.stylefeng.guns.modular.shunfeng.util.OrderUtil;
+import com.stylefeng.guns.modular.shunfeng.util.SensitiveWordUtil;
+import com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper;
+import com.stylefeng.guns.modular.system.model.SensitiveWords;
+import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.service.ISystemNoticeService;
+import com.stylefeng.guns.modular.system.service.IUserInfoService;
+import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
+import com.stylefeng.guns.modular.system.util.PushUtil;
+import com.stylefeng.guns.modular.system.util.qianyuntong.UserUtil;
+import io.swagger.annotations.Api;
+import net.sf.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * 顺风车相关接口
+ */
+@Api(tags = "顺风车相关接口")
+@Controller
+@RequestMapping("/api/rideComment")
+public class rideCommentController {
+        /*顺风车订单*/
+        @Autowired
+        private IOrderRideService orderRideService;
+        /*顺风车行程*/
+        @Autowired
+        private IOrderTravelService orderTravelService;
+        /*顺风车设置*/
+        @Autowired
+        private IParamRideService paramRideService;
+        /*系统设置*/
+        @Autowired
+        private IParamService paramService;
+        /*定时任务*/
+        @Autowired
+        private ITimeTaskService timeTaskService;
+        /*顺风车司机*/
+        @Autowired
+        private IDriverRideService driverRideService;
+        /*顺风车品牌*/
+        @Autowired
+        private IBrandService brandService;
+        /*评价*/
+        @Autowired
+        private IEvaluateService evaluateService;
+        /*投诉*/
+        @Autowired
+        private IComplaintsService complaintsService;
+        /*实名认证*/
+        @Autowired
+        private IUserApplyService applyService;
+        @Autowired
+        private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+        
+        @Autowired
+        private IUserInfoService userInfoService;
+        
+        @Autowired
+        private PushUtil pushUtil;
+        
+        @Autowired
+        private ISystemNoticeService systemNoticeService;
+        
+        @Resource
+        private SensitiveWordsMapper sensitiveWordsMapper;
+        
+        @Autowired
+        private IFinancialService financialService;
+        
+
+
+    /**
+     * 发布顺风车行程实名认证
+     * @param userId
+     * @param type:1用户身份申请,2司机身份申请
+     *
+     * @param
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/authentication")
+    public Object authentication(Integer userId,String name,String  identity,Integer type) {
+        try {
+            if (userId == null || userId == 0) {
+                return ApiJson.returnNG("userId不能为空");
+            }
+            /*发布顺风车行程实名认证*/
+            UserApply apply=new UserApply();
+            apply.setUserId(userId);
+            apply.setApplyTime(new Date());
+            apply.setApplyState(1);
+            apply.setType(type);//司机申请
+            apply.setApplyType(3);//3发布顺风车行程实名认证
+            apply.setName(name);
+            apply.setIdentity(identity);
+            apply.setApplyState(1);
+            Boolean aBoolean = UserUtil.idCardAuth(name, identity);
+            if(aBoolean){
+                apply.setApplyState(2);
+                /*修改用户实名认证通过*/
+                UserInfo userInfo=new UserInfo();
+                userInfo.setId(userId);
+                String sex = identity.substring(16, 17); //取指定位置的值(16位之后,17位结束;)
+                int b = Integer.parseInt(sex);//强制类型转换
+                if (b % 2 == 0) {
+                    userInfo.setSex(2);
+                } else {
+                    userInfo.setSex(1);
+                }
+                userInfo.setName(name);
+                userInfo.setIdCard(identity);
+                userInfoService.updateById(userInfo);
+            }else {
+                apply.setApplyState(3);
+            }
+            applyService.insert(apply);
+            Map<String,Object> reMap=new HashMap<>();
+            reMap.put("auditState", aBoolean);
+            return ApiJson.returnOK(reMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 人脸识别
+     * @param userId
+     * @param headImg
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/faceAuthentication")
+    public Object authentication(Integer userId,String headImg) {
+//        try {
+//            if (userId == null || userId == 0) {
+//                return ApiJson.returnNG("userId不能为空");
+//            }
+//            /*查询实名认证信息*/
+//            UserApply apply=applyService.selectOne(new EntityWrapper<UserApply>().eq("userId",userId)
+//                    .eq("applyState",2)
+//                    .eq("applyType",3));
+//            /*是否验证成功*/
+//            Integer auditState=0;
+//            if(apply!=null){
+//                String name=apply.getName();
+//                String identity=apply.getIdentity();
+//                apply.setHeadImg(headImg);
+//                applyService.updateById(apply);
+//                /*todo 第三方实名认证*/
+//                String urlBase64=RealNameAuthenticationUtil.NetImageToBase64(headImg);
+//                Map<String, String> bodys = new HashMap<String, String>();
+//                bodys.put("base64Str", urlBase64);
+//	            bodys.put("liveChk", "0");
+//                bodys.put("name", name);
+//                bodys.put("number", identity);
+//                Boolean result=RealNameAuthenticationUtil.faceAuthentication(bodys);
+//                if(result){//认证通过
+//                    auditState=1;
+//                }
+//                if(auditState==1){//审核通过
+//                    UserInfo userInfo=new UserInfo();
+//                    userInfo.setId(userId);
+//                    userInfo.setIsFaceAuthenticationRide(1);
+//                    userInfo.setCertificationImg(headImg);
+//                    userInfoService.updateById(userInfo);
+//                }
+//            }
+//            Map<String,Object> reMap=new HashMap<>();
+//            reMap.put("auditState",auditState);
+//            return ApiJson.returnOK(reMap);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 获取车辆品牌列表
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/getBrandList")
+    public Object getBrandList(){
+        try {
+            List<Brand> brands=brandService.selectList(null);
+            return ApiJson.returnOK(brands);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 顺风车首页(待处理订单数)
+     * @param userId  用户id
+     * @param type 1= 用户,2顺风车司机
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/homeOrderCount")
+    public Object homeOrderCount(Integer userId,Integer type){
+        try {
+            if(ToolUtil.isEmpty(userId)){
+                return ApiJson.returnNG("userId不能为空");
+            }
+            if(ToolUtil.isEmpty(type)){
+                return ApiJson.returnNG("type不能为空");
+            }
+            Integer count=0;
+
+            if(type==1){//用户待处理订单:进行中的订单
+                EntityWrapper<OrderRide> entityWrapper=new EntityWrapper();
+                entityWrapper.eq("userId",userId);
+                entityWrapper.in("state","1,2,3,4");
+                count=orderRideService.selectCount(entityWrapper);
+            }else if(type==2){//司机待处理订单:进行中的订单
+                EntityWrapper<OrderTravel> entityWrapper=new EntityWrapper();
+                entityWrapper.eq("driverId",userId);
+                entityWrapper.in("state","2,3,4");
+                count=orderTravelService.selectCount(entityWrapper);
+            }
+            return ApiJson.returnOK(count);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("获取异常");
+    }
+
+    /**
+     * 顺风车首页(待处理订单列表)
+     * @param userId
+     * @param type 1用户待处理订单:进行中的订单 2司机待处理订单:进行中的订单 3我的顺风车行程
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/homeOrderList")
+    public Object homeOrderList(Integer userId,Integer type,Integer current,Integer size){
+        try {
+            if(ToolUtil.isEmpty(userId)){
+                return ApiJson.returnNG("userId不能为空");
+            }
+            if(ToolUtil.isEmpty(type)){
+                return ApiJson.returnNG("type不能为空");
+            }
+            List<OrderRideVo> rideVoList=new ArrayList<>();
+            OrderRideVo orderRideVo=new OrderRideVo();
+            orderRideVo.setCurrent(current > 0 ? (current - 1) * size : 0);
+            orderRideVo.setSize(size);
+            orderRideVo.setUserId(userId);
+            orderRideVo.setDriverId(userId);
+            if(type==1){//用户待处理订单:进行中的订单
+                orderRideVo.setType(1);//待处理订单
+                rideVoList=orderRideService.getOrderRide(orderRideVo);
+            }else if(type==2){//司机待处理订单:进行中的订单
+                orderRideVo.setType(1);//待处理订单
+                rideVoList=orderTravelService.getOrderTravel(orderRideVo);
+            }else if(type==3){//我的行程
+                UserInfo userInfo=userInfoService.selectById(userId);
+                orderRideVo.setDriverId(userInfo.getDriverId());
+                rideVoList=orderRideService.getOrderRideAndTravel(orderRideVo);
+            }
+            return ApiJson.returnOK(rideVoList);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("获取异常");
+    }
+
+    /**
+     * 根据输入的开始结束经纬度和人数获取订单价格
+     * @param num
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/orderPrice")
+    public Object orderPrice(Integer num,Double startLat,Double startLon,Double endLat,Double endLon){
+        try {
+            String locationS=startLon+","+startLat;
+            String locationE=endLon+","+endLat;
+            if(locationE==null){
+                return ApiJson.returnOK(null);
+            }
+            /*计算两个地址的距离*/
+            String strS=locationS;
+            String strE=locationE;
+            Map<String,String> map1= null;
+            try {
+                map1 = gdMapElectricFenceUtil.getDistance(strS,strE, 1);
+            } catch (Exception e1) {
+                e1.printStackTrace();
+            }
+            Double distance=Double.valueOf(map1.get("distance"))/1000;//距离公里
+            Integer distanceType=1;
+            //距离类型(1-100==1,100-200==2,200-500==3,500-800==4,800以上==5)
+            if(distance<100){
+                distanceType=1;
+            }else if(distance>=100 && distance<200){
+                distanceType=2;
+            }else if(distance>=200 && distance<500){
+                distanceType=3;
+            }else if(distance>=500 && distance<800){
+                distanceType=4;
+            }else {
+                distanceType=5;
+            }
+            ParamRide paramRide=paramRideService.selectOne(new EntityWrapper<ParamRide>().eq("type",1).eq("distanceType",distanceType));
+            Double price=0d;
+            if(paramRide!=null){
+                JSONObject jsonObject =JSONObject.fromObject(paramRide.getContext());
+                String priceStr=jsonObject.getString("person"+num+"");
+                if(priceStr!=null){
+                    price=Double.valueOf(priceStr)*distance;
+                }
+            }
+            return ApiJson.returnOK(price);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("获取异常");
+    }
+
+    /**
+     * 用户下单
+     * @param userId
+     * @param startTime
+     * @param num
+     * @param startName
+     * @param endName
+     * @param isDai
+     * @param lxPhone
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/userAddOrder")
+    public Object addOrder(Integer userId,String startTime,Integer num,String startName,Double startLat,Double startLon,Double endLat,Double endLon,
+                           String endName,Double money,Integer isDai,String lxPhone){
+        try {
+            if(ToolUtil.isEmpty(userId)){
+                return ApiJson.returnNG("userId不能为空");
+            }
+            if(ToolUtil.isEmpty(startTime)){
+                return ApiJson.returnNG("startTime不能为空");
+            }
+            if(ToolUtil.isEmpty(num)){
+                return ApiJson.returnNG("num不能为空");
+            }
+            if(ToolUtil.isEmpty(startName)){
+                return ApiJson.returnNG("startName不能为空");
+            }
+            if(ToolUtil.isEmpty(endName)){
+                return ApiJson.returnNG("endName不能为空");
+            }
+            if(ToolUtil.isEmpty(money)){
+                return ApiJson.returnNG("money不能为空");
+            }
+            /*用户只能发布一个进行中的行程*/
+            /*EntityWrapper<OrderRide> entityWrapper=new EntityWrapper();
+            entityWrapper.eq("userId",userId);
+            entityWrapper.in("state","1,2,3,4");
+            Integer count=orderRideService.selectCount(entityWrapper);
+            if(count>0){
+                return ApiJson.returnNG("还有进行中的订单");
+            }*/
+            /*用户可以发布多个订单*/
+            ParamRide paramRide=paramRideService.selectOne(new EntityWrapper<ParamRide>().eq("type",2));
+            Double platformMoney=0d;
+            if(paramRide!=null){
+                JSONObject jsonObject =JSONObject.fromObject(paramRide.getContext());
+                String priceStr=jsonObject.getString("commission"+num+"");
+                if(priceStr!=null){
+                    platformMoney=Double.valueOf(priceStr);
+                }
+            }
+            OrderRide orderRide=new OrderRide();
+            orderRide.setOrderNum(OrderUtil.getOrderNoForPrefix("ride"));
+            orderRide.setPlatformMoney(platformMoney);
+            orderRide.setAddTime(new Date());
+            orderRide.setUserId(userId);
+            orderRide.setStartTime(DateUtil.getDate(startTime,"yyyy-MM-dd HH:mm"));
+            orderRide.setNum(num);//乘车人数
+            orderRide.setStartName(startName);//出发地
+            orderRide.setStartLon(startLon);
+            orderRide.setStartLat(startLat);
+            orderRide.setEndName(endName);//目的地
+            orderRide.setEndLon(endLon);
+            orderRide.setEndLat(endLat);
+            orderRide.setIsDai(isDai);
+            orderRide.setLxPhone(lxPhone);
+            orderRide.setMoney(money);
+            orderRide.setState(1);//未支付状态
+            orderRideService.insert(orderRide);
+            //todo 定时人数  自动取消订单
+            Param param = paramService.selectOne(new EntityWrapper<Param>().eq("type", 21));//顺风车支付倒计时设置(分钟)
+            Integer time =10;
+            Map<String,Object> reMap=new HashMap<>();
+            if(param != null){
+                time=Integer.parseInt(param.getContext());
+                reMap.put("djs",time);
+            }else{
+                reMap.put("djs",time);
+            }
+            reMap.put("orderId",orderRide.getId());
+            reMap.put("addTime",orderRide.getAddTime());
+            // 添加定时任务信息
+            TimeTask timeTask=new TimeTask();
+            timeTask.setCreateDate(new Date());
+            timeTask.setExcuteDate(DateUtil.getDate_strYMdHms(System.currentTimeMillis() + 1000*60*time));
+            timeTask.setTaskName((CourseExamineRide.DSCE+orderRide.getId()).toUpperCase());
+            timeTask.setTypeName(CourseExamineRide.DSCE);
+            timeTask.setMap(orderRide.getId()+"");
+            timeTaskService.insert(timeTask);
+            //倒计时
+            Map<String,Object> maps=new HashMap<>();
+            maps.put("orderId",orderRide.getId());
+            maps.put("timeTaskId",timeTask.getId());
+            QuartzManager.addJob(CourseExamineRide.class,(CourseExamineRide.DSCE+orderRide.getId()).toUpperCase(), TimeJobType.UNLOCK, DateUtil.getDate_strYMdHms(System.currentTimeMillis() + 1000*60*time) , maps);
+            return ApiJson.returnOK(orderRide.getId());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+            return ApiJson.returnNG("异常");
+        }
+
+    /**
+     * 司机创建行程
+     * @param driverId
+     * @param startTime
+     * @param num
+     * @param startName
+     * @param endName
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/driverAddTravel")
+    public Object driverAddTravel(Integer driverId,String startTime,Integer num,String startName,String endName,Double startLat,Double startLon,Double endLat,Double endLon){
+        try {
+            if(ToolUtil.isEmpty(driverId)){
+                return ApiJson.returnNG("driverId不能为空");
+            }
+            if(ToolUtil.isEmpty(startTime)){
+                return ApiJson.returnNG("startTime不能为空");
+            }
+            if(ToolUtil.isEmpty(num)){
+                return ApiJson.returnNG("num不能为空");
+            }
+            if(ToolUtil.isEmpty(startName)){
+                return ApiJson.returnNG("startName不能为空");
+            }
+            if(ToolUtil.isEmpty(endName)){
+                return ApiJson.returnNG("endName不能为空");
+            }
+            /*用户的资料过期了不可以发布行程*/
+            DriverRide driverRide=driverRideService.selectById(driverId);
+            if(driverRide!=null){
+                if(driverRide!=null){
+                    if(DateUtil.getDate(driverRide.getComInsuranceTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                            || DateUtil.getDate(driverRide.getBusinessInsuranceTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                            || DateUtil.getDate(driverRide.getDutyInsuranceTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                            || DateUtil.getDate(driverRide.getAnnualInspectionTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                            ){
+                        return ApiJson.returnNG("您的证件已过期,请重新上传资料");
+                    }
+                }
+                /*1一个司机可以创建多个行程*/
+                OrderTravel orderTravel=new OrderTravel();
+                orderTravel.setOrderNum(OrderUtil.getOrderNoForPrefix("travel"));
+                orderTravel.setAddTime(new Date());
+                orderTravel.setDriverId(driverId);
+                orderTravel.setStartTime(DateUtil.getDate(startTime,"yyyy-MM-dd HH:mm"));
+                orderTravel.setNum(num);//乘车人数
+                orderTravel.setStartName(startName);//出发地
+                orderTravel.setEndName(endName);//目的地
+                orderTravel.setState(2);//待出行
+                orderTravel.setStartLon(startLon);
+                orderTravel.setStartLat(startLat);
+                orderTravel.setEndLon(endLon);
+                orderTravel.setEndLat(endLat);
+
+                orderTravelService.insert(orderTravel);
+                return ApiJson.returnOK(orderTravel.getId());
+            }
+            return ApiJson.returnOK("");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+
+    /**
+     * 用户申请顺风车司机/修改司机资料
+     * @param userId
+     * @param carType
+     * @param carNum
+     * @param inviteCodeRide
+     * @param license
+     * @param licenseImg
+     * @param comInsuranceTime
+     * @param comInsuranceImg
+     * @param businessInsuranceTime
+     * @param businessInsuranceImg
+     * @param dutyInsuranceTime
+     * @param dutyInsuranceImg
+     * @param annualInspectionTime
+     * @param annualInspectionImg
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/driverAudit")
+    public Object driverAudit(Integer userId,Integer brandId,Integer driverId,String carType,String carNum,String inviteCodeRide,String license,String licenseImg,String comInsuranceTime,String comInsuranceImg,
+                              String businessInsuranceTime,String businessInsuranceImg,String dutyInsuranceTime,String dutyInsuranceImg,String annualInspectionTime,String annualInspectionImg){
+        try {
+            if(ToolUtil.isEmpty(userId)){
+                return ApiJson.returnNG("userId不能为空");
+            }
+            if(ToolUtil.isEmpty(carType)){
+                return ApiJson.returnNG("carType不能为空");
+            }
+            if(ToolUtil.isEmpty(brandId)){
+                return ApiJson.returnNG("brandId不能为空");
+            }
+            if(ToolUtil.isEmpty(carNum)){
+                return ApiJson.returnNG("carNum不能为空");
+            }
+            if(ToolUtil.isEmpty(license)){
+                return ApiJson.returnNG("license不能为空");
+            }
+            if(ToolUtil.isEmpty(licenseImg)){
+                return ApiJson.returnNG("licenseImg不能为空");
+            }
+            if(ToolUtil.isEmpty(comInsuranceTime)){
+                return ApiJson.returnNG("comInsuranceTime不能为空");
+            }
+            if(ToolUtil.isEmpty(comInsuranceImg)){
+                return ApiJson.returnNG("comInsuranceImg不能为空");
+            }
+            if(ToolUtil.isEmpty(businessInsuranceTime)){
+                return ApiJson.returnNG("businessInsuranceTime不能为空");
+            }
+            if(ToolUtil.isEmpty(businessInsuranceImg)){
+                return ApiJson.returnNG("businessInsuranceImg不能为空");
+            }
+            if(ToolUtil.isEmpty(dutyInsuranceTime)){
+                return ApiJson.returnNG("dutyInsuranceTime不能为空");
+            }
+            if(ToolUtil.isEmpty(dutyInsuranceImg)){
+                return ApiJson.returnNG("dutyInsuranceImg不能为空");
+            }
+            if(ToolUtil.isEmpty(annualInspectionTime)){
+                return ApiJson.returnNG("annualInspectionTime不能为空");
+            }
+            if(ToolUtil.isEmpty(annualInspectionImg)){
+                return ApiJson.returnNG("annualInspectionImg不能为空");
+            }
+            DriverRide driverRide=new DriverRide();
+            driverRide.setBrandId(brandId);
+            driverRide.setUserId(userId);
+            driverRide.setByInviteCode(inviteCodeRide);
+            driverRide.setCarType(carType);
+            driverRide.setCarNum(carNum);
+            driverRide.setLicense(license);
+            driverRide.setLicenseImg(licenseImg);
+            if(ToolUtil.isNotEmpty(driverId)){
+                driverRide.setId(driverId);
+                driverRide.setState(1);//待审核状态
+                if(ToolUtil.isNotEmpty(comInsuranceTime)){
+                    driverRide.setComInsuranceTime(comInsuranceTime);
+                }
+                if(ToolUtil.isNotEmpty(comInsuranceImg)) {
+                    driverRide.setComInsuranceImg(comInsuranceImg);
+                }
+                if(ToolUtil.isNotEmpty(businessInsuranceTime)) {
+                    driverRide.setBusinessInsuranceTime(businessInsuranceTime);
+                }
+                if(ToolUtil.isNotEmpty(businessInsuranceImg)) {
+                    driverRide.setBusinessInsuranceImg(businessInsuranceImg);
+                }
+                if(ToolUtil.isNotEmpty(dutyInsuranceTime)) {
+                    driverRide.setDutyInsuranceTime(dutyInsuranceTime);
+                }
+                if(ToolUtil.isNotEmpty(dutyInsuranceImg)) {
+                    driverRide.setDutyInsuranceImg(dutyInsuranceImg);
+                }
+                if(ToolUtil.isNotEmpty(annualInspectionTime)) {
+                    driverRide.setAnnualInspectionTime(annualInspectionTime);
+                }
+                if(ToolUtil.isNotEmpty(annualInspectionImg)) {
+                    driverRide.setAnnualInspectionImg(annualInspectionImg);
+                }
+                driverRideService.updateById(driverRide);
+            }else {
+                driverRide.setAddTime(new Date());
+                /*获取司机品牌id*/
+                /*Brand b=brandService.selectById(driverRide.getBrandId());
+                if(b!=null){
+                    driverRide.setCarType(b.getName());
+                }*/
+                driverRide.setComInsuranceTime(comInsuranceTime);
+                driverRide.setComInsuranceImg(comInsuranceImg);
+                driverRide.setBusinessInsuranceTime(businessInsuranceTime);
+                driverRide.setBusinessInsuranceImg(businessInsuranceImg);
+                driverRide.setDutyInsuranceTime(dutyInsuranceTime);
+                driverRide.setDutyInsuranceImg(dutyInsuranceImg);
+                driverRide.setAnnualInspectionTime(annualInspectionTime);
+                driverRide.setAnnualInspectionImg(annualInspectionImg);
+                driverRideService.insert(driverRide);
+                /*绑定司机和用户的关系*/
+                UserInfo userInfo_=new UserInfo();
+                userInfo_.setId(userId);
+                userInfo_.setDriverId(driverRide.getId());
+                userInfoService.updateById(userInfo_);
+            }
+            return ApiJson.returnOK(driverRide);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 获取司机资料
+     * @param driverId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/driverInfo")
+    public Object driverInfo(Integer driverId){
+        try {
+            if(ToolUtil.isEmpty(driverId)){
+                return ApiJson.returnNG("driverId不能为空");
+            }
+            DriverRide driverRide=driverRideService.selectById(driverId);
+            /*获取司机品牌id*/
+            Brand b=brandService.selectById(driverRide.getBrandId());
+            if(b!=null){
+                driverRide.setCarType(b.getName());
+            }
+            return ApiJson.returnOK(driverRide);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 司机用户获取取消的服务费(同时计算退款金额)
+     * @param orderId 订单id
+     * @param type 1用户,2司机
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/cancelServiceMoney")
+    public Object cancelServiceMoney(Integer orderId,Integer type){
+        try {
+            if(ToolUtil.isEmpty(orderId)){
+                return ApiJson.returnNG("orderId不能为空");
+            }
+            if(ToolUtil.isEmpty(type)){
+                return ApiJson.returnNG("type不能为空");
+            }
+            Double serviceMoney=0d;
+            if(type==1){//用户
+                OrderRide orderRide=orderRideService.selectById(orderId);
+                if(orderRide.getState()>=3){//待出行状态取消才会有服务费
+                    EntityWrapper<ParamRide> rideEntityWrapper=new EntityWrapper<>();
+                    rideEntityWrapper.eq("type",3);//用户
+                    ParamRide paramRide=paramRideService.selectOne(rideEntityWrapper);//退单比例
+                    serviceMoney=Double.valueOf(paramRide.getContext())*orderRide.getPlatformMoney();//退单金额:退单比例*平台抽成
+                    orderRide.setServiceMoney(serviceMoney);//设置取消服务费
+                    /*计算退款金额*/
+                    if(orderRide.getState()==2){//已支付: 需要退款
+                        orderRide.setTuiMoney(orderRide.getMoney());
+                    }else if(orderRide.getState()>=3){//待出行,需要计算 然后 需要退款
+                        if(serviceMoney>orderRide.getMoney()){//退款金额大于了取消服务费,就直接全部扣完
+                            orderRide.setTuiMoney(0d);
+                        }else {
+                            orderRide.setTuiMoney(orderRide.getMoney()-serviceMoney);
+                        }
+                    }
+                }else{
+                    orderRide.setTuiMoney(orderRide.getMoney());
+                }
+                orderRideService.updateById(orderRide);//更新退款金额和取消服务器
+            }else if(type==2){//司机
+                OrderTravel orderTravel=orderTravelService.selectById(orderId);
+                if(orderTravel.getState()>=3){//待出行的状态取消才有服务费
+                    EntityWrapper<ParamRide> rideEntityWrapper=new EntityWrapper<>();
+                    rideEntityWrapper.eq("type",4);//司机
+                    ParamRide paramRide=paramRideService.selectOne(rideEntityWrapper);//司机退单比例
+                    /*查询订单(现在订单和行程时一对一关系)*/
+                    OrderRide orderRide=orderRideService.selectOne(new EntityWrapper<OrderRide>().eq("travelId",orderId));
+                    if(orderRide!=null){
+                        serviceMoney=Double.valueOf(paramRide.getContext())*orderRide.getPlatformMoney();
+                        orderTravel.setServiceMoney(serviceMoney);//司机退单比例*订单提成比例
+                        orderRide.setTuiMoney(orderRide.getMoney());
+                        orderRideService.updateById(orderRide);
+                    }
+                }
+                orderTravelService.updateById(orderTravel);//更新取消服务费
+            }
+            return ApiJson.returnOK(serviceMoney);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 用户订单取消 待出行之前才可以取消
+     * @param orderId
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/userCancel")
+    public Object userCancel(Integer orderId){
+        try {
+            if(ToolUtil.isEmpty(orderId)){
+                return ApiJson.returnNG("orderId不能为空");
+            }
+            /*查看这个订单是否在进行中*/
+            OrderRide orderRide=orderRideService.selectById(orderId);
+            if(orderRide!=null){
+                /*查询该订单是否已经取消*/
+                if(orderRide.getState()==6){
+                    return ApiJson.returnNG("该订单已取消");
+                }
+                //用户取消给司机推送
+                if(orderRide.getDriverId()!=null) {
+                    UserInfo userInfo1=userInfoService.selectOne(new EntityWrapper<UserInfo>().eq("driverId",orderRide.getDriverId()));
+                    pushUtil.pushOrderState(1, userInfo1.getDriverId(), orderRide.getId(), 8, 6, null);
+                }
+                //用户取消退款
+                userCancelTuik(orderRide);
+            }
+            //取消司机行程
+            if(orderRide.getTravelId()!=null){
+                OrderTravel orderTravel=orderTravelService.selectById(orderRide.getTravelId());
+                if(orderTravel.getState()!=6){
+                    orderTravel.setState(6);
+                    orderTravelService.updateById(orderTravel);
+                }
+            }
+            return ApiJson.returnOK("");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+    //用户取消退款
+    public void userCancelTuik(OrderRide orderRide){
+        if(orderRide.getState()==2){//用户已经支付了订单但司机没有接单
+            orderRide.setTuiMoney(orderRide.getMoney());
+        }
+        if(orderRide.getTuiMoney()>0){
+            Financial financial= financialService.selectOne(new EntityWrapper<Financial>().eq("orderNum",orderRide.getOrderNum()));
+            String finNum=OrderUtil.getOrderNoForPrefix("fin");
+            //todo 退款金额大于0需要退款
+            if(orderRide.getPayType()==1){//余额
+                UserInfo userInfo=userInfoService.selectById(orderRide.getUserId());
+                userInfo.setBalance(userInfo.getBalance()+orderRide.getTuiMoney());
+                userInfoService.updateById(userInfo);
+            }else if(orderRide.getPayType()==2){
+                //微信
+                Integer money = new Double(orderRide.getMoney() * 100).intValue();
+                Integer tMoney_ = new Double(orderRide.getTuiMoney()* 100).intValue();
+                PayUtil.refundForWxpay(1, financial.getLsType(), orderRide.getOrderNum(), finNum, money,tMoney_ , "2");
+            }else if(orderRide.getPayType()==3){
+            
+            }
+            /*财务明细*/
+            Financial f=new Financial();
+            f.setAddTime(new Date());
+            f.setType(2);//类型 1=收入 2=支出
+            f.setMoney(orderRide.getTuiMoney());
+            f.setPwType(9);//9=顺风车取消服务费
+            f.setOrderNum(orderRide.getOrderNum());
+            f.setLsType(finNum);
+            f.setUserId(orderRide.getUserId());
+            f.setOrderType(4);
+            f.setLx(1);
+            financialService.insert(f);
+        }
+        /*添加系统消息*/
+        try {
+            systemNoticeService.addSystemNotice(1, "您从"+orderRide.getStartName()+"到"+orderRide.getEndName()+"的顺风车订单已取消", orderRide.getUserId(), 1);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        orderRide.setState(6);//取消状态
+        orderRideService.updateById(orderRide);
+    }
+    /**
+     * 司机行程取消
+     * @param orderId
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/driverCancel")
+    public Object driverCancel(Integer orderId){
+        try {
+            if(ToolUtil.isEmpty(orderId)){
+                return ApiJson.returnNG("orderId不能为空");
+            }
+            OrderTravel orderTravel=orderTravelService.selectById(orderId);
+            if(orderTravel!=null){
+                if(orderTravel.getState()==6){
+                    return ApiJson.returnNG("该订单已取消");
+                }
+                DriverRide driverRide=driverRideService.selectById(orderTravel.getDriverId());
+                if(orderTravel.getServiceMoney()!=null && orderTravel.getServiceMoney()>0){
+                    /*todo 更新司机余额*/
+                    driverRide.setBalance(driverRide.getBalance()-orderTravel.getServiceMoney());
+                    driverRideService.updateById(driverRide);
+                    /* 更新司机用户余额(用户和司机用户一个账号余额)*/
+                    UserInfo userInfo=userInfoService.selectOne(new EntityWrapper<UserInfo>().eq("driverId",orderTravel.getDriverId()));
+                    if(userInfo!=null){
+                        //用户余额可以为负数
+                        userInfo.setBalance(userInfo.getBalance()-orderTravel.getServiceMoney());
+                        userInfoService.updateById(userInfo);
+                    }
+                    /*财务明细*/
+                    Financial f=new Financial();
+                    f.setAddTime(new Date());
+                    f.setType(1);//类型 1=收入 2=支出
+                    f.setMoney(orderTravel.getServiceMoney());
+                    f.setPwType(9);//9=顺风车取消服务费
+                    f.setOrderNum(orderTravel.getOrderNum());
+                    String finNum=OrderUtil.getOrderNoForPrefix("fin");
+                    f.setLsType(finNum);
+                    f.setUserId(driverRide.getUserId());
+                    f.setOrderType(4);
+                    f.setLx(1);
+                    financialService.insert(f);
+                    //司机取消给用户推送
+                }
+                /*添加系统消息*/
+                try {
+                    systemNoticeService.addSystemNotice(1, "您从"+orderTravel.getStartName()+"到"+orderTravel.getEndName()+"的顺风车行程已取消", driverRide.getUserId(), 1);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+                orderTravel.setState(6);//取消状态
+                orderTravelService.updateById(orderTravel);
+                //todo 推送
+                /*司机接单给用户发送消息*/
+                OrderRide orderRide=orderRideService.selectOne(new EntityWrapper<OrderRide>().eq("travelId",orderId));
+                if(orderRide!=null) {
+                    pushUtil.pushOrderState(1, orderRide.getUserId(), orderRide.getId(), 8, 6, null);
+                }
+                //取消乘客订单
+                if(orderRide!=null && orderRide.getState()!=6){
+                    orderRide.setTuiMoney(orderRide.getMoney());
+                    orderRideService.updateById(orderRide);
+                    userCancelTuik(orderRide);
+                }
+            }
+
+            return ApiJson.returnOK("");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 司机确认同行,接到乘客,送达乘客
+     * @param driverOrderId
+     * @param type 1确认同行 2接到乘客,3送达乘客
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/driverOperation")
+    @Transactional
+    public Object driverOperation(Integer userOrderId,Integer type,Integer driverOrderId){
+        try {
+            if(ToolUtil.isEmpty(driverOrderId)){
+                return ApiJson.returnNG("driverOrderId不能为空");
+            }
+            if(ToolUtil.isEmpty(type)){
+                return ApiJson.returnNG("type不能为空");
+            }
+            OrderTravel orderTravel=orderTravelService.selectById(driverOrderId);//司机行程
+            /*用户的资料过期了不可以发布行程*/
+            DriverRide driverRide=driverRideService.selectById(orderTravel.getDriverId());
+            if(driverRide!=null){
+                if(DateUtil.getDate(driverRide.getComInsuranceTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                        || DateUtil.getDate(driverRide.getBusinessInsuranceTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                        || DateUtil.getDate(driverRide.getDutyInsuranceTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                        || DateUtil.getDate(driverRide.getAnnualInspectionTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                        ){
+                    return ApiJson.returnNG("您的证件已过期,请重新上传资料");
+                }
+            }
+            OrderRide orderRide=orderRideService.selectById(userOrderId);
+            if(orderRide!=null && orderRide.getState()==6){
+                return  ApiJson.returnNG("用户已取消该行程");
+            }
+            if(orderTravel!=null){
+                if(type==1){//1确认同行 一个行程只能匹配一个订单
+                    if(orderTravel.getState()==3){
+                        return ApiJson.returnNG("该行程已经绑定了用户订单");
+                    }
+                    orderTravel.setState(3);
+                    //绑定司机行程、设置用户订单状态
+                    orderRide.setTravelId(driverOrderId);
+                    orderRide.setDriverId(orderTravel.getDriverId());
+                    orderRide.setState(3);
+                }else if(type==2){//2接到乘客
+                    orderTravel.setState(4);
+                    orderRide.setState(4);
+                }else if(type==3){//3送达乘客
+                    orderTravel.setState(5);
+                    orderRide.setState(5);
+                    /*修改司机的总接单数*/
+                    driverRide.setTotalOrders(driverRide.getTotalOrders()+1);
+                    driverRideService.updateById(driverRide);
+                    /*修改用户接单数和司机提成*/
+                    UserInfo userInfo=userInfoService.selectById(driverRide.getUserId());
+                    userInfo.setBalance(userInfo.getBalance()+(orderRide.getMoney()-orderRide.getPlatformMoney()));
+                    userInfoService.updateById(userInfo);
+                    Financial f=new Financial();
+                    f.setAddTime(new Date());
+                    f.setType(2);
+                    f.setPayType("1");//余额
+                    f.setMoney(orderRide.getMoney()-orderRide.getPlatformMoney());//司机提成
+                    f.setPwType(11);//顺风车司机提成
+                    f.setLsType(OrderUtil.getOrderNoForPrefix("finan"));
+                    f.setUserId(userInfo.getId());
+                    f.setOrderType(4);
+                    f.setLx(1);
+                    financialService.insert(f);
+                    /*如果司机有推荐人就需要算用户的提成*/
+                    if(ToolUtil.isNotEmpty(driverRide.getByInviteCode())){
+                        /*计算推广用户的提成*/
+                        UserInfo userInfo1=userInfoService.selectOne(new EntityWrapper<UserInfo>().eq("inviteCodeRide",driverRide.getByInviteCode()));
+                        Param param=paramService.selectOne(new EntityWrapper<Param>().eq("type",22));
+                        Double discount=100d;
+                        if(param!=null){
+                            discount=Double.valueOf(param.getContext());
+                        }
+                        Double money=orderRide.getMoney()*discount/100;//提成金额
+                        userInfoService.updateById(userInfo1);
+                        
+                        f.setAddTime(new Date());
+                        f.setType(2);
+                        f.setPayType("1");//余额
+                        f.setMoney(money);//邀请金额
+                        f.setPwType(10);//分享收益
+                        f.setLsType(OrderUtil.getOrderNoForPrefix("finan"));
+                        f.setUserId(userInfo1.getId());
+                        f.setOrderType(4);
+                        f.setLx(1);
+                        financialService.insert(f);
+                    }
+                }
+            }
+            orderRideService.updateById(orderRide);
+            orderTravelService.updateById(orderTravel);
+
+            if(type==1){//确认同行
+                String message="您发布的"+DateUtil.getDateToString(orderRide.getStartTime(),"MM月dd日")+"的行程有司机接单";
+                /*添加系统消息*/
+                try {
+                    systemNoticeService.addSystemNotice(1, message, driverRide.getUserId(), 1);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            }
+            pushUtil.pushOrderState(1, orderRide.getUserId(), orderRide.getId(), 8, orderRide.getState(), null);
+            return ApiJson.returnOK("");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+    /**
+     * 用户评价
+     * @param orderId
+     * @param driverId
+     * @param userId
+     * @param score
+     * @param content
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/evaluate")
+    public Object evaluate(Integer orderId,Integer driverId,Integer userId,Integer score,String  content){
+        try {
+            if(userId == null || userId == 0){
+                return ApiJson.returnNG("userId不能为空");
+            }
+            if(driverId == null || driverId == 0){
+                return ApiJson.returnNG("driverId不能为空");
+            }
+            if(orderId == null || orderId == 0){
+                return ApiJson.returnNG("orderId不能为空");
+            }
+            if(score == null || score == 0){
+                return ApiJson.returnNG("score不能为空");
+            }
+            Evaluate evaluate=new Evaluate();
+            evaluate.setAddTime(new Date());
+            evaluate.setType(8);
+            evaluate.setOrderId(orderId);
+            evaluate.setScore(score);
+            evaluate.setUserId(userId);
+            if(ToolUtil.isNotEmpty(content)){
+                /*判断评价内容是否包含敏感词*/
+                List<SensitiveWords> list = sensitiveWordsMapper.selectList(null);
+                Set<String> sensitiveWordSet = new HashSet<>();
+                for(SensitiveWords gs:list){
+                    sensitiveWordSet.add(gs.getContent());
+                }
+                SensitiveWordUtil.init(sensitiveWordSet);
+                boolean result = SensitiveWordUtil.contains(content);
+                if(result){
+                    return ApiJson.returnNG("评价内容包含敏感词");
+                }
+            }
+            evaluate.setContent(content);
+            evaluate.setDriverId(driverId);
+            /*查询用户手机号*/
+            UserInfo userInfo=userInfoService.selectById(userId);
+            if(userInfo!=null){
+                evaluate.setUserPhone(userInfo.getPhone());
+            }
+            /*查询司机电话*/
+            DriverRide driverRide=driverRideService.selectById(driverId);
+            if(driverRide!=null){
+                /*计算司机的评分*/
+                driverRide.setEvaluateNum(driverRide.getEvaluateNum()+1);
+                driverRide.setEvaluateScore(driverRide.getEvaluateScore()+score);
+                driverRideService.updateById(driverRide);
+            }
+            /*标记订单已评价*/
+            OrderRide orderTaxi=new OrderRide();
+            orderTaxi.setId(orderId);
+            orderTaxi.setIsEvaluate(2);
+            orderTaxi.setEvaluateScoreUser(score);
+            orderTaxi.setContent(content);
+            orderRideService.updateById(orderTaxi);
+            evaluateService.insert(evaluate);
+            /*需要反订单数据*/
+            return ApiJson.returnOK(orderId);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("");
+    }
+
+    /**
+     * 投诉
+     * @param  type 1:用户投诉司机,2司机投诉用户
+     * @param driverId
+     * @param userId
+     * @param content
+     * @param reMark
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/complaints")
+    public Object complaints(Integer driverId,Integer userId,String  content,String reMark,Integer type,Integer orderId) {
+        try {
+            if (userId == null || userId == 0) {
+                return ApiJson.returnNG("userId不能为空");
+            }
+            if (driverId == null || driverId == 0) {
+                return ApiJson.returnNG("driverId不能为空");
+            }
+            if (orderId == null || orderId == 0) {
+                return ApiJson.returnNG("orderId不能为空");
+            }
+            Complaints complaints=new Complaints();
+            complaints.setAddTime(new Date());
+            complaints.setUserId(userId);
+            complaints.setDriverId(driverId);
+            /*判断投诉内容是否包含敏感词*/
+            List<SensitiveWords> list = sensitiveWordsMapper.selectList(null);
+            Set<String> sensitiveWordSet = new HashSet<>();
+            for(SensitiveWords gs:list){
+                sensitiveWordSet.add(gs.getContent());
+            }
+            SensitiveWordUtil.init(sensitiveWordSet);
+            boolean result = SensitiveWordUtil.contains(content);
+            if(result){
+                return ApiJson.returnNG("投诉内容包含敏感词");
+            }
+            complaints.setContent(content);
+            complaints.setReMark(reMark);
+            if(type==1){
+                complaints.setType(4);//顺风车用户
+            }else if(type==2){
+                complaints.setType(3);//顺风车司机
+            }
+            /*查询用户手机号*/
+            UserInfo userInfo=userInfoService.selectById(userId);
+            if(userInfo!=null){
+                complaints.setPhone(userInfo.getPhone());
+            }
+            complaints.setState(1);
+            complaintsService.insert(complaints);
+            /*标记订单已投诉*/
+            if(type==2){//司机投诉
+                OrderRide orderTaxi=new OrderRide();
+                orderTaxi.setId(orderId);
+                orderTaxi.setIsComplaint(2);
+                orderRideService.updateById(orderTaxi);
+            }else{//用户投诉
+                OrderTravel orderTravel=new OrderTravel();
+                orderTravel.setId(orderId);
+                orderTravel.setIsComplaint(2);
+                orderTravelService.updateById(orderTravel);
+            }
+            return ApiJson.returnOK("投诉成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("");
+    }
+    /**
+     *  用户邀请司机接单(需要发送消息)
+     * @param orderId 司机订单
+     * @param  userId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/userInvite")
+    public Object myOrders(Integer orderId,Integer userId){
+        try {
+            if(ToolUtil.isEmpty(orderId)){
+                return ApiJson.returnNG("orderId不能为空");
+            }
+            if(ToolUtil.isEmpty(userId)){
+                return ApiJson.returnNG("userId不能为空");
+            }
+            OrderTravel orderTravel=orderTravelService.selectById(orderId);
+            UserInfo userInfo_=userInfoService.selectOne(new EntityWrapper<UserInfo>().eq("driverId",orderTravel.getDriverId()));//司机用户
+            OrderRide orderRide=orderRideService.selectOne(new EntityWrapper<OrderRide>().eq("userId",userId)
+                    .eq("state",2));
+            if(orderRide!=null){
+                String message="您发布的"+DateUtil.getDateToString(orderTravel.getStartTime(),"MM月dd日")+"的行程有乘客邀请您同行";
+                /*添加系统消息*/
+                try {
+                    systemNoticeService.addSystemNotice(1, message, userInfo_.getId(), 1);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            }
+            return ApiJson.returnOK("邀请成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+    /**
+     * 用户订单匹配列表页面,用户订单去匹配司机的行程
+     * @param  type  搜索条件:1默认排序(根据线路、时间,人数综合匹配排序721),2时间最早,3距离最近
+     * @param orderId
+     * @param  lon 司机当前经度
+     * @param  lat 司机当前纬度
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/userMatchingOrderList")
+    public Object userMatchingOrderList(Integer orderId,Integer current,Integer size,Integer type,Double lon,Double lat){
+        try {
+            if(ToolUtil.isEmpty(orderId)){
+                return ApiJson.returnNG("orderId不能为空");
+            }
+            if(ToolUtil.isEmpty(type)){
+                return ApiJson.returnNG("type不能为空");
+            }
+            if(ToolUtil.isEmpty(lon)){
+                return ApiJson.returnNG("lon不能为空");
+            }
+            if(ToolUtil.isEmpty(lat)){
+                return ApiJson.returnNG("lat不能为空");
+            }
+            OrderRide orderRide=orderRideService.selectById(orderId);
+            current=current==null?1:current;
+            size=size==null?10:size;
+            size=current*size;
+            current=(current-1)*size;
+            OrderRideVo orderRideVo=new OrderRideVo();
+            orderRideVo.setCurrent(current);
+            orderRideVo.setSize(size);
+            orderRideVo.setLon(lon);
+            orderRideVo.setLat(lat);
+            orderRideVo.setNum(orderRide.getNum());
+            orderRideVo.setType(type+1);//搜索条件:1默认排序(根据线路、时间,人数综合匹配排序721),2时间最早,3距离最近
+            List<OrderRideVo> orderRides=orderTravelService.getOrderTravel(orderRideVo);
+            return ApiJson.returnOK(orderRides);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 司机订单匹配列表页面(司机的订单去匹配乘客订单)
+     * @param orderId
+     * @param current
+     * @param size
+     * @param type 搜索条件:1默认排序(根据线路、时间,人数综合匹配排序721),2时间最早,3距离最近,4价格最低
+     * @param lon
+     * @param lat
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/driverMatchingOrderList")
+    public Object driverMatchingOrderList(Integer orderId,Integer current,Integer size,Integer type,Double lon,Double lat){
+        try {
+            try {
+                if(ToolUtil.isEmpty(orderId)){
+                    return ApiJson.returnNG("orderId不能为空");
+                }
+                if(ToolUtil.isEmpty(type)){
+                    return ApiJson.returnNG("type不能为空");
+                }
+                if(ToolUtil.isEmpty(lon)){
+                    return ApiJson.returnNG("lon不能为空");
+                }
+                if(ToolUtil.isEmpty(lat)){
+                    return ApiJson.returnNG("lat不能为空");
+                }
+                OrderTravel orderTravel=orderTravelService.selectById(orderId);
+                current=current==null?1:current;
+                size=size==null?10:size;
+                size=current*size;
+                current=(current-1)*size;
+                OrderRideVo orderRideVo=new OrderRideVo();
+                orderRideVo.setCurrent(current);
+                orderRideVo.setSize(size);
+                orderRideVo.setNum(orderTravel.getNum());
+                orderRideVo.setLon(lon);
+                orderRideVo.setLat(lat);
+                orderRideVo.setType(type+1);//搜索条件:1默认排序(根据线路、时间,人数综合匹配排序721),2时间最早,3距离最近,4价格最低
+                List<OrderRideVo> orderRides=orderRideService.getOrderRide(orderRideVo);
+                return ApiJson.returnOK(orderRides);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 订单详情
+     * @type 1用户订单,2司机端订单
+     * @param orderId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/orderInfo")
+    public Object orderInfo(Integer orderId,Integer type,Double lon,Double lat) {
+        try {
+            if(ToolUtil.isEmpty(orderId)){
+                return ApiJson.returnNG("orderId不能为空");
+            }
+            if(ToolUtil.isEmpty(type)){
+                return ApiJson.returnNG("type不能为空");
+            }
+            //取司机的经纬度
+            OrderRideInfoVo orderRideInfoVo=new OrderRideInfoVo();
+            orderRideInfoVo.setLon(lon);
+            orderRideInfoVo.setLat(lat);
+            if(type==1){//用户端订单详情 用户端看到的就是自己的订单信息
+                orderRideInfoVo.setUserOrderId(orderId);
+                orderRideInfoVo=orderRideService.getOrderInfo(orderRideInfoVo);
+            }else if(type==2){//司机端订单详情 司机端看到的就是用户端的订单信息
+                orderRideInfoVo.setDriverOrderId(orderId);
+                orderRideInfoVo=orderTravelService.getOrderInfo(orderRideInfoVo);
+            }
+            /*获取顺风车订单支付倒计时*/
+            Param param = paramService.selectOne(new EntityWrapper<Param>().eq("type", 21));//顺风车支付倒计时设置(分钟)
+            Integer time =10;
+            if(param != null){
+                time=Integer.parseInt(param.getContext());
+                orderRideInfoVo.setDjs(time);
+            }else{
+                orderRideInfoVo.setDjs(time);
+            }
+            return ApiJson.returnOK(orderRideInfoVo);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            return ApiJson.returnNG("异常");
+        }
+
+    /**
+     * 验证输入的邀请码是否正确
+     * @param  type 1:普通邀请码,2顺风车邀请码
+     * @param inviteCode
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/checkInviteCode")
+    public Object orderInfo(String inviteCode,Integer type) {
+        try {
+            if(ToolUtil.isEmpty(inviteCode)){
+                return ApiJson.returnNG("inviteCode不能为空");
+            }
+            if(ToolUtil.isEmpty(type)){
+                return ApiJson.returnNG("type不能为空");
+            }
+            Integer count=0;
+            if(type==1){
+                count=userInfoService.selectCount(new EntityWrapper<UserInfo>().eq("inviteCode",inviteCode));
+            }else {
+                count=userInfoService.selectCount(new EntityWrapper<UserInfo>().eq("inviteCodeRide",inviteCode));
+            }
+            return ApiJson.returnOK(count);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+    /**
+     * 验证司机证件是否过期
+     *
+     * @param driverId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/checkInsuranceTime")
+    public Object orderInfo(Integer driverId) {
+        try {
+            if(ToolUtil.isEmpty(driverId)){
+                return ApiJson.returnNG("driverId不能为空");
+            }
+            DriverRide driverRide=driverRideService.selectById(driverId);
+            Integer count=0;
+            if(driverRide!=null){
+                if(DateUtil.getDate(driverRide.getComInsuranceTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                        || DateUtil.getDate(driverRide.getBusinessInsuranceTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                        || DateUtil.getDate(driverRide.getDutyInsuranceTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                        || DateUtil.getDate(driverRide.getAnnualInspectionTime(), "yyyy-MM-dd").getTime()-new Date().getTime()<0
+                        ){
+                    count=1;
+                }
+            }
+            return ApiJson.returnOK(count);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ApiJson.returnNG("异常");
+    }
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/BrandMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/BrandMapper.java
new file mode 100644
index 0000000..8428b6c
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/BrandMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Brand;
+
+/**
+ * <p>
+ * 顺风车品牌 Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-27
+ */
+public interface BrandMapper extends BaseMapper<Brand> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ComplaintsMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ComplaintsMapper.java
new file mode 100644
index 0000000..b6daae7
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ComplaintsMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Complaints;
+
+/**
+ * <p>
+ * 投诉管理; InnoDB free: 6144 kB Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+public interface ComplaintsMapper extends BaseMapper<Complaints> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/DriverRideMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/DriverRideMapper.java
new file mode 100644
index 0000000..da93e31
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/DriverRideMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.DriverRide;
+
+/**
+ * <p>
+ * 顺风车司机 Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+public interface DriverRideMapper extends BaseMapper<DriverRide> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/EvaluateMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/EvaluateMapper.java
new file mode 100644
index 0000000..ff1b22b
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/EvaluateMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Evaluate;
+
+/**
+ * <p>
+ * 评价; InnoDB free: 10240 kB Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-08-29
+ */
+public interface EvaluateMapper extends BaseMapper<Evaluate> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/FinancialMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/FinancialMapper.java
new file mode 100644
index 0000000..884c5e7
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/FinancialMapper.java
@@ -0,0 +1,49 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Financial;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 财务管理; InnoDB free: 6144 kB Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+public interface FinancialMapper extends BaseMapper<Financial> {
+    /**
+     * 获取司机消费记录
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getOrderRecord(Map<String,Object> map);
+    /**
+     * 获取收入和支出总数据
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getOrderSum(Map<String,Object> map);
+    /**
+     * 获取司机消费记录(出租车)
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getOrderRecordTaxi(Map<String,Object> map);
+    /**
+     * 获取收入和支出总数据(出租车)
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getOrderSumTaxi(Map<String,Object> map);
+
+    /**
+     * 获取用户我的消费记录
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getFinancialUser(Map<String,Object> map);
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/OrderRideMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/OrderRideMapper.java
new file mode 100644
index 0000000..821ce64
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/OrderRideMapper.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.OrderRide;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideInfoVo;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 顺风车订单 Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+public interface OrderRideMapper extends BaseMapper<OrderRide> {
+    /**
+     *用户顺风车订单
+     * @param orderRideVo
+     * @return
+     */
+    List<OrderRideVo> getOrderRide(OrderRideVo orderRideVo);
+
+    /**
+     * 获取用户身份和司机身份的订单 只需要按照时间排序
+     * @param orderRideVo
+     * @return
+     */
+    List<OrderRideVo> getOrderRideAndTravel(OrderRideVo orderRideVo);
+
+    /**
+     * 根据订单id获取订单详情
+     * @param orderRideInfoVo
+     * @return
+     */
+    OrderRideInfoVo getOrderInfo(OrderRideInfoVo orderRideInfoVo);
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/OrderTravelMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/OrderTravelMapper.java
new file mode 100644
index 0000000..46adf4a
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/OrderTravelMapper.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.OrderTravel;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideInfoVo;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 顺风车司机行程 Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+public interface OrderTravelMapper extends BaseMapper<OrderTravel> {
+    /**
+     *顺风车司机订单行程
+     * @param orderRideVo
+     * @return
+     */
+    List<OrderRideVo> getOrderTravel(OrderRideVo orderRideVo);
+
+    /**
+     * 根据订单id获取订单详情
+     * @param orderRideInfoVo
+     * @return
+     */
+    OrderRideInfoVo getOrderInfo(OrderRideInfoVo orderRideInfoVo);
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ParamMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ParamMapper.java
new file mode 100644
index 0000000..0d07bb6
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ParamMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Param;
+
+/**
+ * <p>
+ * 系统设置; InnoDB free: 6144 kB Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+public interface ParamMapper extends BaseMapper<Param> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ParamRideMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ParamRideMapper.java
new file mode 100644
index 0000000..1a5fa7b
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/ParamRideMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.ParamRide;
+
+/**
+ * <p>
+ * 顺风车设置 Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+public interface ParamRideMapper extends BaseMapper<ParamRide> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/TimeTaskMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/TimeTaskMapper.java
new file mode 100644
index 0000000..68dff1d
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/TimeTaskMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.TimeTask;
+
+/**
+ * <p>
+ * 定时任务数据; InnoDB free: 11264 kB Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-08-10
+ */
+public interface TimeTaskMapper extends BaseMapper<TimeTask> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/UserApplyMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/UserApplyMapper.java
new file mode 100644
index 0000000..5572799
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/UserApplyMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.shunfeng.model.UserApply;
+
+/**
+ * <p>
+ * 用户和司机申请表 Mapper 接口
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-22
+ */
+public interface UserApplyMapper extends BaseMapper<UserApply> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/BrandMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/BrandMapper.xml
new file mode 100644
index 0000000..79ca86b
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/BrandMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.shunfeng.dao.BrandMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.Brand">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="addTime" property="addTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, addTime
+    </sql>
+
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ComplaintsMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ComplaintsMapper.xml
new file mode 100644
index 0000000..6105cb4
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ComplaintsMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.shunfeng.dao.ComplaintsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.Complaints">
+        <id column="id" property="id" />
+        <result column="addTime" property="addTime" />
+        <result column="userId" property="userId" />
+        <result column="context" property="context" />
+        <result column="reMark" property="reMark" />
+        <result column="phone" property="phone" />
+        <result column="driverId" property="driverId" />
+        <result column="state" property="state" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, addTime, userId, context, reMark, phone, driverId, state
+    </sql>
+
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/DriverRideMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/DriverRideMapper.xml
new file mode 100644
index 0000000..4fc4541
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/DriverRideMapper.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.shunfeng.dao.DriverRideMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.DriverRide">
+        <id column="id" property="id" />
+        <result column="addTime" property="addTime" />
+        <result column="companyId" property="companyId" />
+        <result column="carType" property="carType" />
+        <result column="carNum" property="carNum" />
+        <result column="license" property="license" />
+        <result column="licenseImg" property="licenseImg" />
+        <result column="comInsuranceTime" property="comInsuranceTime" />
+        <result column="comInsuranceImg" property="comInsuranceImg" />
+        <result column="businessInsuranceTime" property="businessInsuranceTime" />
+        <result column="businessInsuranceImg" property="businessInsuranceImg" />
+        <result column="dutyInsuranceTime" property="dutyInsuranceTime" />
+        <result column="dutyInsuranceImg" property="dutyInsuranceImg" />
+        <result column="annualInspectionTime" property="annualInspectionTime" />
+        <result column="annualInspectionImg" property="annualInspectionImg" />
+        <result column="userId" property="userId" />
+        <result column="state" property="state" />
+        <result column="byInviteCode" property="byInviteCode" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, addTime, companyId, carType, carNum, license, licenseImg, comInsuranceTime, comInsuranceImg, businessInsuranceTime, businessInsuranceImg, dutyInsuranceTime, dutyInsuranceImg, annualInspectionTime, annualInspectionImg, userId, state, byInviteCode
+    </sql>
+
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/EvaluateMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/EvaluateMapper.xml
new file mode 100644
index 0000000..3858c7d
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/EvaluateMapper.xml
@@ -0,0 +1,24 @@
+<?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.shunfeng.dao.EvaluateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.Evaluate">
+        <id column="id" property="id" />
+        <result column="addTime" property="addTime" />
+        <result column="userId" property="userId" />
+        <result column="driverId" property="driverId" />
+        <result column="score" property="score" />
+        <result column="centnet" property="centnet" />
+        <result column="type" property="type" />
+        <result column="userPhone" property="userPhone" />
+        <result column="driverPhone" property="driverPhone" />
+        <result column="orderId" property="orderId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, addTime, userId, driverId, score, centnet, type, userPhone, driverPhone, orderId
+    </sql>
+
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/FinancialMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/FinancialMapper.xml
new file mode 100644
index 0000000..ff948bc
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/FinancialMapper.xml
@@ -0,0 +1,165 @@
+<?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.rest.modular.system.dao.FinancialMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.Financial">
+        <id column="id" property="id" />
+        <result column="addTime" property="addTime" />
+        <result column="type" property="type" />
+        <result column="payType" property="payType" />
+        <result column="money" property="money" />
+        <result column="pwType" property="pwType" />
+        <result column="orderNum" property="orderNum" />
+        <result column="companyId" property="companyId" />
+        <result column="lsType" property="lsType" />
+        <result column="userId" property="userId" />
+        <result column="lx" property="lx" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, addTime, type, payType, money, pwType, orderNum, companyId, lsType,userId,lx
+    </sql>
+    <!--获取司机消费记录-->
+    <select id="getOrderRecord" resultType="map">
+        select ss.* from (
+        select oo.*,1 as type from (
+        select o.orderNum,o.busTime,z.busStartTime,o.checkNum*o.djMoney as money,s1.name as startName,s2.`name` as endName,o.num-o.tuiNum as num,DATE_FORMAT( o.addTime, '%Y-%m-%d' ) as addTime,o.id as orderId
+        from (select * from app_order od where od.driverId=#{driverId} and  od.checkNum*od.djMoney > 0 and od.state in (4,5)) o
+        left join (select CONCAT_WS(' ',zs.busTime,zs.startTime) as busStartTime,zs.id,zs.lineId,zs.bq from app_shift_zs zs) z on o.shiftId=z.id
+        left join app_line l on l.id=z.lineId
+        left join app_site s1 on s1.id = l.beginId
+        left join app_site s2 on s2.id = l.endId
+        WHERE
+          DATE_FORMAT(o.addTime, '%Y-%m') = #{searchDate}
+        ) oo
+        group by oo.orderId
+        UNION
+        select f.id  as orderNum,'' as busTime ,DATE_FORMAT(f.addTime, '%Y-%m-%d %H:%m') AS busStartTime,money
+        ,'' as startName,'' as endName,0 as  num, DATE_FORMAT( f.addTime, '%Y-%m-%d' ) as addTime,2 as type,f.id as orderId  from app_withdrawal f where f.driverId=#{driverId} and type=1
+      ) ss
+      <where>
+          <if test="searchDate!=null and searchDate!=''">
+              and DATE_FORMAT( ss.addTime, '%Y-%m' ) =#{searchDate}
+          </if>
+          <if test="type!=null">
+            and ss.type=#{type}
+          </if>
+      </where>
+    order by ss.busStartTime desc
+    <if test="start!=null">
+        LIMIT #{start},#{end}
+    </if>
+    </select>
+    <!--获取收入和支出总数据-->
+    <select id="getOrderSum" resultType="map">
+      select ss.* from (
+        select IFNULL(sum(oo.money),0) as moneys,oo.addTime,1 as type from (
+        select o.checkNum*o.djMoney as money,DATE_FORMAT( o.addTime, '%Y-%m-%d' ) as addTime
+        from (select * from app_order od where od.driverId=#{driverId} and od.checkNum*od.djMoney>0 and od.state in (4,5)) o
+        left join (select zs.id,zs.lineId,zs.bq from app_shift_zs zs ) z on o.shiftId=z.id
+        left join app_line l on l.id=z.lineId
+        left join app_site s1 on s1.id = l.beginId
+        left join app_site s2 on s2.id = l.endId
+        <where>
+            <if test="searchDate!=null and searchDate!=''">
+               and  DATE_FORMAT(o.addTime, '%Y-%m') =#{searchDate}
+            </if>
+        </where>
+        ) oo
+        UNION
+        select IFNULL(sum(f.money),0) as moneys, DATE_FORMAT( f.addTime, '%Y-%m-%d' ) as addTime,2 as type  from app_withdrawal f where f.driverId=#{driverId} and type=1
+        <if test="searchDate!=null and searchDate!=''">
+            and  DATE_FORMAT(f.addTime, '%Y-%m') =#{searchDate}
+        </if>
+      ) ss
+        <where>
+            <!--<if test="type!=null">
+                and ss.type=#{type}
+            </if>-->
+        </where>
+    </select>
+
+    <!--出租车司机记录-->
+    <select id="getOrderRecordTaxi" resultType="map">
+      select * from (
+        select DATE_FORMAT(t.addTime,'%Y-%m-%d %H:%i') as addTime,t.money,1 as type from app_order_taxi t
+        left join app_order_taxi_time i on t.id=i.orderId
+        where t.money>0 and t.driverId=#{driverId}  and  t.state=7
+        UNION
+        select DATE_FORMAT(reassignmentTime,'%Y-%m-%d %H:%i') as addTime,serviceMoney as money,2 as type from app_order_taxi
+        where driverId=#{driverId} and  isReassignment=2
+        UNION
+        select DATE_FORMAT(addTime,'%Y-%m-%d %H:%i') as addTime,money,3 as type  from app_withdrawal
+        where driverId=#{driverId} and  type=2
+        ) ss
+        <where>
+            <if test="searchDate!=null and searchDate!=''">
+                and DATE_FORMAT( ss.addTime, '%Y-%m' ) =#{searchDate}
+            </if>
+            <if test="type==1">
+                and ss.type=1
+            </if>
+            <if test="type==2">
+                and ss.type=3
+            </if>
+            <if test="type==3">
+                and ss.type=2
+            </if>
+        </where>
+        order by ss.addTime desc
+        <if test="start!=null">
+            LIMIT #{start},#{end}
+        </if>
+    </select>
+    <!--出租车司机记录-->
+    <select id="getOrderSumTaxi" resultType="map">
+        select IFNULL(sum(t.money),0) as moneys,1 as type from app_order_taxi t
+        left join app_order_taxi_time i on t.id=i.orderId
+        where t.money>0 and t.driverId=#{driverId} and  t.state=7
+        <if test="searchDate!=null and searchDate!=''">
+            and  DATE_FORMAT(t.addTime, '%Y-%m') =#{searchDate}
+        </if>
+        UNION
+        select IFNULL(sum(t.moneys),0),2 as type from(
+            select sum(money) as moneys,1 as type from app_withdrawal
+            where driverId=#{driverId} and  type=2
+            <if test="searchDate!=null and searchDate!=''">
+                and  DATE_FORMAT(addTime, '%Y-%m') =#{searchDate}
+            </if>
+            UNION
+            select sum(serviceMoney) as money,2 as type from app_order_taxi
+            where driverId=#{driverId} and  isReassignment=2
+            <if test="searchDate!=null and searchDate!=''">
+                and  DATE_FORMAT(addTime, '%Y-%m') =#{searchDate}
+            </if>
+        ) t
+        <where>
+            <!--<if test="type==1">
+                and t.type=1
+            </if>
+            <if test="type==2">
+                and t.type=2
+            </if>
+            <if test="type==3">
+                and t.type=2
+            </if>-->
+        </where>
+    </select>
+    <!--获取用户我的消费记录-->
+    <select id="getFinancialUser" resultType="map">
+        select id, DATE_FORMAT(addTime, '%Y-%m-%d') as addTime,type,payType,  money, pwType from app_financial f
+        <where>
+            and f.lx= 1
+            <if test="userId!=null">
+                and userId = #{userId}
+            </if>
+        </where>
+        order by f.addTime  desc
+        <if test="start!=null">
+            LIMIT #{start},#{end}
+        </if>
+    </select>
+
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/OrderRideMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/OrderRideMapper.xml
new file mode 100644
index 0000000..051501f
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/OrderRideMapper.xml
@@ -0,0 +1,89 @@
+<?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.shunfeng.dao.OrderRideMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.OrderRide">
+        <id column="id" property="id" />
+        <result column="addTime" property="addTime" />
+        <result column="userId" property="userId" />
+        <result column="startTime" property="startTime" />
+        <result column="num" property="num" />
+        <result column="startName" property="startName" />
+        <result column="endName" property="endName" />
+        <result column="lxPhone" property="lxPhone" />
+        <result column="isDai" property="isDai" />
+        <result column="money" property="money" />
+        <result column="state" property="state" />
+        <result column="isEvaluate" property="isEvaluate" />
+        <result column="isComplaint" property="isComplaint" />
+        <result column="startLon" property="startLon" />
+        <result column="startLat" property="startLat" />
+        <result column="endLon" property="endLon" />
+        <result column="endLat" property="endLat" />
+        <result column="travelId" property="travelId" />
+        <result column="payType" property="payType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, addTime, userId, startTime, num, startName, endName, lxPhone, isDai, money, state, isEvaluate, isComplaint, startLon, startLat, endLon, endLat, travelId, name, identity, payType
+    </sql>
+    <!--用户顺风车订单 type :1待处理的订单,2根据线路、时间,人数综合匹配排序 3按时间排序最早,4距离最近排序,5价格最高 and r.startTime>=now()-->
+    <select id="getOrderRide" resultType="com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo">
+        select r.*,_fnGetDistance(#{lon},#{lat}, r.startLon, r.startLat)  as distance,u.headImg,u.sex,u.totalOrders,u.nickName as name,
+        r.id as userOrderId,t.id as  driverOrderId from app_order_ride r
+        left join app_order_travel t on r.travelId=t.id
+        left join app_user_info u on r.userId=u.id
+        left join app_user_info u1 on r.driverId=u1.driverId
+        <where>
+            <if test="userId!=null">
+                and r.userId = #{userId}
+            </if>
+            <if test="type==1">
+                and r.state in (1,2,3,4)
+            </if>
+            <if test="type>1">
+                and r.state = 2
+            </if>
+        </where>
+        <if test="type==1">
+            order by r.startTime desc
+        </if>
+        <if test="type==2">
+            order by _fnGetDistance(#{lon},#{lat}, r.startLon, r.startLat) asc,r.startTime desc,(r.num-#{num}) asc
+        </if>
+        <if test="type==3">
+            order by r.startTime asc
+        </if>
+        <if test="type==4">
+            order by _fnGetDistance(#{lon},#{lat}, r.startLon, r.startLat) asc
+        </if>
+        <if test="type==5">
+            order by r.money desc
+        </if>
+        LIMIT #{current},#{size}
+    </select>
+    <!--获取用户身份和司机身份的订单 只需要按照时间排序-->
+    <select id="getOrderRideAndTravel" resultType="com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo">
+       select * from (
+         select r.addTime,r.startTime,1 as type,r.state,r.startName,r.endName,r.userId,t.driverId,r.num,r.id as userOrderId,t.id as driverOrderId,r.money from app_order_ride r
+				left join app_order_travel t on r.travelId=t.id where r.userId=#{userId}
+        UNION
+        select t.addTime,t.startTime,2 as type,t.state,t.startName,t.endName,0,t.driverId,r.num,r.id as userOrderId,t.id as driverOrderId,0 as money  from app_order_travel t
+				left join app_order_ride r on r.travelId=t.id where t.driverId=#{driverId}
+        ) o
+        order by o.addTime desc
+        LIMIT #{current},#{size}
+    </select>
+    <!--获取订单详情-->
+    <select id="getOrderInfo" resultType="com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideInfoVo">
+        select r.addTime,r.startTime,r.endName,r.startName,r.money,r.id as userOrderId,r.state,t.id as driverOrderId,r.isEvaluate,t.isComplaint,
+        r.num,r.userId,r.driverId ,u.headImg,CASE  when r.isDai=1 then r.lxPhone else u.phone end as phone,u.sex,u.nickName as name,u.totalOrders,
+        _fnGetDistance(#{lon},#{lat}, r.startLon, r.startLat) as distance
+        from (select * from app_order_ride where id=#{userOrderId}) r
+        left join app_order_travel t on r.travelId=t.id
+        left join app_driver_ride d on d.id=r.driverId
+        left join app_user_info u on r.userId=u.id
+    </select>
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/OrderTravelMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/OrderTravelMapper.xml
new file mode 100644
index 0000000..a88fcf9
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/OrderTravelMapper.xml
@@ -0,0 +1,69 @@
+<?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.shunfeng.dao.OrderTravelMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.OrderTravel">
+        <id column="id" property="id" />
+        <result column="addTime" property="addTime" />
+        <result column="driverId" property="driverId" />
+        <result column="startTime" property="startTime" />
+        <result column="num" property="num" />
+        <result column="startName" property="startName" />
+        <result column="endName" property="endName" />
+        <result column="money" property="money" />
+        <result column="state" property="state" />
+        <result column="startLon" property="startLon" />
+        <result column="startLat" property="startLat" />
+        <result column="endLon" property="endLon" />
+        <result column="endLat" property="endLat" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, addTime, driverId, startTime, num, startName, endName, money, state, startLon, startLat, endLon, endLat
+    </sql>
+    <!--顺风车司机订单行程 type :1待处理的订单,2根据线路、时间,人数综合匹配排序 3按时间排序,4距离最近排序 and r.startTime>=now()-->
+    <select id="getOrderTravel" resultType="com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo">
+        select r.*,_fnGetDistance(#{lon},#{lat}, r.startLon, r.startLat)  as distance,d.totalOrders,u.sex,u.headImg,u.realName as name,
+        r.id as driverOrderId,i.id as userOrderId
+        from app_order_travel r
+        left join app_order_ride i on i.travelId=r.id
+        left join app_user_info u on u.driverId = r.driverId
+        left join app_driver_ride d on d.id=r.driverId
+        <where>
+            <if test="driverId!=null">
+                and r.driverId = #{driverId}
+            </if>
+            <if test="type==1">
+                and r.state in (2,3,4)
+            </if>
+            <if test="type>1">
+                and r.state = 2
+            </if>
+        </where>
+        <if test="type==1">
+          order by r.startTime desc
+        </if>
+        <if test="type==2">
+            order by  _fnGetDistance(#{lon},#{lat}, r.startLon, r.startLat)  asc,r.startTime desc,(r.num-#{num}) asc
+        </if>
+        <if test="type==3">
+            order by r.startTime asc
+        </if>
+        <if test="type==4">
+            order by _fnGetDistance(#{lon},#{lat}, r.startLon, r.startLat)  asc
+        </if>
+        LIMIT #{current},#{size}
+    </select>
+    <!--根据订单id获取订单详情-->
+    <select id="getOrderInfo" resultType="com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideInfoVo">
+        select t.addTime,r.startTime,r.endName,r.startName,r.money,r.id as userOrderId,r.state,t.id as driverOrderId,r.isComplaint,r.num,
+        r.userId,r.driverId,u.headImg,u.phone,u.sex,u.realName as name,d.carNum,d.carType,d.totalOrders,IFNULL(format(d.evaluateScore/d.evaluateNum,2),0)as evaluateScore,r.evaluateScoreUser,r.isEvaluate
+        ,r.content
+        from (select * from app_order_travel where id= #{driverOrderId}) t
+        left join app_order_ride r on t.id=r.travelId
+        left join app_driver_ride d on d.id=t.driverId
+        left join app_user_info u on d.id=u.driverId
+    </select>
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ParamMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ParamMapper.xml
new file mode 100644
index 0000000..283bdee
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ParamMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.shunfeng.dao.ParamMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.Param">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="context" property="context" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, context
+    </sql>
+
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ParamRideMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ParamRideMapper.xml
new file mode 100644
index 0000000..da78318
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/ParamRideMapper.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.shunfeng.dao.ParamRideMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.ParamRide">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="distanceType" property="distanceType" />
+        <result column="context" property="context" />
+        <result column="remark" property="remark" />
+        <result column="openCityId" property="openCityId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, distanceType, context, remark, openCityId
+    </sql>
+
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/TimeTaskMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/TimeTaskMapper.xml
new file mode 100644
index 0000000..f56fc59
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/TimeTaskMapper.xml
@@ -0,0 +1,21 @@
+<?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.shunfeng.dao.TimeTaskMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.TimeTask">
+        <id column="id" property="id" />
+        <result column="taskName" property="taskName" />
+        <result column="typeName" property="typeName" />
+        <result column="state" property="state" />
+        <result column="createDate" property="createDate" />
+        <result column="excuteDate" property="excuteDate" />
+        <result column="map" property="map" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, taskName, typeName, state, createDate, excuteDate, map
+    </sql>
+
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/UserApplyMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/UserApplyMapper.xml
new file mode 100644
index 0000000..97fac94
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/dao/mapping/UserApplyMapper.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.shunfeng.dao.UserApplyMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.shunfeng.model.UserApply">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="applyTime" property="applyTime" />
+        <result column="type" property="type" />
+        <result column="applyState" property="applyState" />
+        <result column="applyType" property="applyType" />
+        <result column="name" property="name" />
+        <result column="identity" property="identity" />
+        <result column="headImg" property="headImg" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, applyTime, type, applyState, applyType, name, identity, headImg
+    </sql>
+
+</mapper>
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Brand.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Brand.java
new file mode 100644
index 0000000..b71bf80
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Brand.java
@@ -0,0 +1,77 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 顺风车品牌
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-27
+ */
+@TableName("app_brand")
+public class Brand extends Model<Brand> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 品牌名称
+     */
+    private String name;
+    /**
+     * 添加时间
+     */
+    private Date addTime;
+
+
+    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 Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Brand{" +
+        "id=" + id +
+        ", name=" + name +
+        ", addTime=" + addTime +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Complaints.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Complaints.java
new file mode 100644
index 0000000..f27a910
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Complaints.java
@@ -0,0 +1,151 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 投诉管理; InnoDB free: 10240 kB
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-08-29
+ */
+@TableName("app_complaints")
+public class Complaints extends Model<Complaints> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 时间
+     */
+    private Date addTime;
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+    /**
+     * 内容
+     */
+    private String content;
+    /**
+     * 备注
+     */
+    private String reMark;
+    /**
+     * 投诉用户电话
+     */
+    private String phone;
+    /**
+     * 投诉司机
+     */
+    private Integer driverId;
+    /**
+     * 1未处理,2已处理
+     */
+    private Integer state;
+    /**
+     * 1其他,2出租车司机
+     */
+    private Integer type;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getReMark() {
+        return reMark;
+    }
+
+    public void setReMark(String reMark) {
+        this.reMark = reMark;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    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;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Complaints{" +
+                "id=" + id +
+                ", addTime=" + addTime +
+                ", userId=" + userId +
+                ", content=" + content +
+                ", reMark=" + reMark +
+                ", phone=" + phone +
+                ", driverId=" + driverId +
+                ", state=" + state +
+                "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/DriverRide.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/DriverRide.java
new file mode 100644
index 0000000..30cf586
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/DriverRide.java
@@ -0,0 +1,343 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 顺风车司机
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+@TableName("app_driver_ride")
+public class DriverRide extends Model<DriverRide> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 申请时间
+     */
+    private Date addTime;
+    /**
+     * 所属公司
+     */
+    private Integer companyId;
+    /**
+     * 车辆品牌
+     */
+    private String carType;
+    /**
+     * 车牌
+     */
+    private String carNum;
+    /**
+     * 驾驶证号
+     */
+    private String license;
+    /**
+     * 驾驶证图片
+     */
+    private String licenseImg;
+    /**
+     * 交强险到期时间
+     */
+    private String comInsuranceTime;
+    /**
+     * 交强险照片
+     */
+    private String comInsuranceImg;
+    /**
+     * 商业险到期时间
+     */
+    private String businessInsuranceTime;
+    /**
+     * 商业险图片
+     */
+    private String businessInsuranceImg;
+    /**
+     * 驾乘人员责任险到期时间
+     */
+    private String dutyInsuranceTime;
+    /**
+     * 驾乘人员责任险照片
+     */
+    private String dutyInsuranceImg;
+    /**
+     * 年检到期时间
+     */
+    private String annualInspectionTime;
+    /**
+     * 年检图片
+     */
+    private String annualInspectionImg;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 1等待审核,2审核通过,3不通过
+     */
+    private Integer state;
+    /**
+     * 别人的邀请码
+     */
+    private String byInviteCode;
+    /**
+     * 司机余额
+     */
+    private Double balance;
+    /**
+     * 评价数量
+     */
+    private Integer  evaluateNum;
+    /**
+     * 总接单数
+     */
+    private Integer totalOrders;
+    /**
+     * 评价总分
+     */
+    private Integer evaluateScore;
+    /**
+     * 邀请id
+     */
+    private Integer yqId;
+    /**
+     * 品牌id
+     */
+    private Integer brandId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getCarType() {
+        return carType;
+    }
+
+    public void setCarType(String carType) {
+        this.carType = carType;
+    }
+
+    public String getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(String carNum) {
+        this.carNum = carNum;
+    }
+
+    public String getLicense() {
+        return license;
+    }
+
+    public void setLicense(String license) {
+        this.license = license;
+    }
+
+    public String getLicenseImg() {
+        return licenseImg;
+    }
+
+    public void setLicenseImg(String licenseImg) {
+        this.licenseImg = licenseImg;
+    }
+
+    public String getComInsuranceTime() {
+        return comInsuranceTime;
+    }
+
+    public void setComInsuranceTime(String comInsuranceTime) {
+        this.comInsuranceTime = comInsuranceTime;
+    }
+
+    public String getComInsuranceImg() {
+        return comInsuranceImg;
+    }
+
+    public void setComInsuranceImg(String comInsuranceImg) {
+        this.comInsuranceImg = comInsuranceImg;
+    }
+
+    public String getBusinessInsuranceTime() {
+        return businessInsuranceTime;
+    }
+
+    public void setBusinessInsuranceTime(String businessInsuranceTime) {
+        this.businessInsuranceTime = businessInsuranceTime;
+    }
+
+    public String getBusinessInsuranceImg() {
+        return businessInsuranceImg;
+    }
+
+    public void setBusinessInsuranceImg(String businessInsuranceImg) {
+        this.businessInsuranceImg = businessInsuranceImg;
+    }
+
+    public String getDutyInsuranceTime() {
+        return dutyInsuranceTime;
+    }
+
+    public void setDutyInsuranceTime(String dutyInsuranceTime) {
+        this.dutyInsuranceTime = dutyInsuranceTime;
+    }
+
+    public String getDutyInsuranceImg() {
+        return dutyInsuranceImg;
+    }
+
+    public void setDutyInsuranceImg(String dutyInsuranceImg) {
+        this.dutyInsuranceImg = dutyInsuranceImg;
+    }
+
+    public String getAnnualInspectionTime() {
+        return annualInspectionTime;
+    }
+
+    public void setAnnualInspectionTime(String annualInspectionTime) {
+        this.annualInspectionTime = annualInspectionTime;
+    }
+
+    public String getAnnualInspectionImg() {
+        return annualInspectionImg;
+    }
+
+    public void setAnnualInspectionImg(String annualInspectionImg) {
+        this.annualInspectionImg = annualInspectionImg;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getByInviteCode() {
+        return byInviteCode;
+    }
+
+    public void setByInviteCode(String byInviteCode) {
+        this.byInviteCode = byInviteCode;
+    }
+
+    public Double getBalance() {
+        return balance;
+    }
+
+    public void setBalance(Double balance) {
+        this.balance = balance;
+    }
+
+    public Integer getEvaluateNum() {
+        return evaluateNum;
+    }
+
+    public void setEvaluateNum(Integer evaluateNum) {
+        this.evaluateNum = evaluateNum;
+    }
+
+    public Integer getTotalOrders() {
+        return totalOrders;
+    }
+
+    public void setTotalOrders(Integer totalOrders) {
+        this.totalOrders = totalOrders;
+    }
+
+    public Integer getEvaluateScore() {
+        return evaluateScore;
+    }
+
+    public void setEvaluateScore(Integer evaluateScore) {
+        this.evaluateScore = evaluateScore;
+    }
+
+    public Integer getYqId() {
+        return yqId;
+    }
+
+    public void setYqId(Integer yqId) {
+        this.yqId = yqId;
+    }
+
+    public Integer getBrandId() {
+        return brandId;
+    }
+
+    public void setBrandId(Integer brandId) {
+        this.brandId = brandId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverRide{" +
+        "id=" + id +
+        ", addTime=" + addTime +
+        ", companyId=" + companyId +
+        ", carType=" + carType +
+        ", carNum=" + carNum +
+        ", license=" + license +
+        ", licenseImg=" + licenseImg +
+        ", comInsuranceTime=" + comInsuranceTime +
+        ", comInsuranceImg=" + comInsuranceImg +
+        ", businessInsuranceTime=" + businessInsuranceTime +
+        ", businessInsuranceImg=" + businessInsuranceImg +
+        ", dutyInsuranceTime=" + dutyInsuranceTime +
+        ", dutyInsuranceImg=" + dutyInsuranceImg +
+        ", annualInspectionTime=" + annualInspectionTime +
+        ", annualInspectionImg=" + annualInspectionImg +
+        ", userId=" + userId +
+        ", state=" + state +
+        ", byInviteCode=" + byInviteCode +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Evaluate.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Evaluate.java
new file mode 100644
index 0000000..dd8cf7c
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Evaluate.java
@@ -0,0 +1,168 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 评价; InnoDB free: 10240 kB
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-08-29
+ */
+@TableName("app_evaluate")
+public class Evaluate extends Model<Evaluate> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 时间
+     */
+    private Date addTime;
+    /**
+     * 评论用户ID
+     */
+    private Integer userId;
+    /**
+     * 被评司机
+     */
+    private Integer driverId;
+    /**
+     * 评论分数
+     */
+    private Integer score;
+    /**
+     * 评论内容
+     */
+    private String content;
+    /**
+     * 1出租车
+     */
+    private Integer type;
+    /**
+     * 评价用户手机
+     */
+    private String userPhone;
+    /**
+     * 被评司机电话
+     */
+    private String driverPhone;
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    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 getScore() {
+        return score;
+    }
+
+    public void setScore(Integer score) {
+        this.score = score;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getUserPhone() {
+        return userPhone;
+    }
+
+    public void setUserPhone(String userPhone) {
+        this.userPhone = userPhone;
+    }
+
+    public String getDriverPhone() {
+        return driverPhone;
+    }
+
+    public void setDriverPhone(String driverPhone) {
+        this.driverPhone = driverPhone;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Evaluate{" +
+        "id=" + id +
+        ", addTime=" + addTime +
+        ", userId=" + userId +
+        ", driverId=" + driverId +
+        ", score=" + score +
+        ", content=" + content +
+        ", type=" + type +
+        ", userPhone=" + userPhone +
+        ", driverPhone=" + driverPhone +
+        ", orderId=" + orderId +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Financial.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Financial.java
new file mode 100644
index 0000000..7f9046f
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Financial.java
@@ -0,0 +1,197 @@
+package com.stylefeng.guns.modular.shunfeng.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>
+ * 财务管理; InnoDB free: 6144 kB
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+@TableName("app_financial")
+public class Financial extends Model<Financial> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 添加时间
+     */
+    private Date addTime;
+    /**
+     * 类型 1=收入 2=支出
+     */
+    private Integer type;
+    /**
+     * 支付类型 1=余额 2=微信 3=支付宝
+     */
+    private String payType;
+    /**
+     * 金额
+     */
+    private Double money;
+    /**
+     * 购票类型 1=实时 2=城乡 3充值 4=司机提现 5=出租车用户红包 6=出租车用户取消服务费 7=司机改派费
+     */
+    private Integer pwType;
+    /**
+     * 订单号 
+     */
+    private String orderNum;
+    /**
+     * 所属公司ID
+     */
+    private Integer companyId;
+    /**
+     * 流水类型
+     */
+    private String lsType;
+
+    public Integer userId;
+    /**
+     * 1=用户 2=司机
+     */
+    private Integer lx;
+    /**
+     * 交易状态
+     */
+    private String tradeStatus;
+    /**
+     * 1实时,2城乡票务  3出租车
+     */
+    private Integer orderType;
+
+
+    public Integer getLx() {
+        return lx;
+    }
+
+    public void setLx(Integer lx) {
+        this.lx = lx;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getPayType() {
+        return payType;
+    }
+
+    public void setPayType(String payType) {
+        this.payType = payType;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getPwType() {
+        return pwType;
+    }
+
+    public void setPwType(Integer pwType) {
+        this.pwType = pwType;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getLsType() {
+        return lsType;
+    }
+
+    public void setLsType(String lsType) {
+        this.lsType = lsType;
+    }
+
+    public String getTradeStatus() {
+        return tradeStatus;
+    }
+
+    public void setTradeStatus(String tradeStatus) {
+        this.tradeStatus = tradeStatus;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Financial{" +
+        "id=" + id +
+        ", addTime=" + addTime +
+        ", type=" + type +
+        ", payType=" + payType +
+        ", money=" + money +
+        ", pwType=" + pwType +
+        ", orderNum=" + orderNum +
+        ", companyId=" + companyId +
+        ", lsType=" + lsType +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/OrderRide.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/OrderRide.java
new file mode 100644
index 0000000..796a657
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/OrderRide.java
@@ -0,0 +1,431 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 顺风车订单
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+@TableName("app_order_ride")
+public class OrderRide extends Model<OrderRide> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 添加时间
+     */
+    private Date addTime;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 出发时间
+     */
+    private Date startTime;
+    /**
+     * 同行人数
+     */
+    private Integer num;
+    /**
+     * 出发地
+     */
+    private String startName;
+    /**
+     * 目的地
+     */
+    private String endName;
+    /**
+     * 联系电话
+     */
+    private String lxPhone;
+    /**
+     * 是否代喊  1=是 2=否
+     */
+    private Integer isDai;
+    /**
+     * 金额
+     */
+    private Double money;
+    /**
+     * 状态(1未支付,2已支付,3待出行,4出行中,5完成,6取消)
+     */
+    private Integer state;
+    /**
+     * 是否评价(1未评价,2已评价)
+     */
+    private Integer isEvaluate;
+    /**
+     * 是否投诉(1未投诉,2已投诉)
+     */
+    private Integer isComplaint;
+    /**
+     * 出发地经度 
+     */
+    private Double startLon;
+    /**
+     * 出发地纬度 
+     */
+    private Double startLat;
+    /**
+     * 目的地经度 
+     */
+    private Double endLon;
+    /**
+     * 目的地纬度 
+     */
+    private Double endLat;
+    /**
+     * 司机订单id
+     */
+    private Integer travelId;
+    /**
+     * 1=余额 2=微信 3=支付宝  
+     */
+    private Integer payType;
+    /**
+     * 支付金额
+     */
+    private Double tuiMoney;
+    /**
+     * 取消服务费
+     */
+    private Double serviceMoney;
+    /**
+     * 平台抽成金额(下单的时候就需要计算)
+     */
+    private Double platformMoney;
+    /**
+     * 司机id
+     */
+    private Integer driverId;
+    /**
+     * 订单编号
+     */
+    private String orderNum;
+    /**
+     * 支付时间
+     */
+    private Date payTime;
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+    /**
+     * 优惠券名称
+     */
+    private String couponName;
+    /**
+     * 优惠券金额
+     */
+    private Double couponMoney;
+    /**
+     * 支付流水
+     */
+    private String outNum;
+    /**
+     * 用户评分
+     */
+    private Integer evaluateScoreUser;
+    /**
+     * 评价内容
+     */
+    private String content;
+
+
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public String getLxPhone() {
+        return lxPhone;
+    }
+
+    public void setLxPhone(String lxPhone) {
+        this.lxPhone = lxPhone;
+    }
+
+    public Integer getIsDai() {
+        return isDai;
+    }
+
+    public void setIsDai(Integer isDai) {
+        this.isDai = isDai;
+    }
+
+    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 getIsEvaluate() {
+        return isEvaluate;
+    }
+
+    public void setIsEvaluate(Integer isEvaluate) {
+        this.isEvaluate = isEvaluate;
+    }
+
+    public Integer getIsComplaint() {
+        return isComplaint;
+    }
+
+    public void setIsComplaint(Integer isComplaint) {
+        this.isComplaint = isComplaint;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public Integer getTravelId() {
+        return travelId;
+    }
+
+    public void setTravelId(Integer travelId) {
+        this.travelId = travelId;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getTuiMoney() {
+        return tuiMoney;
+    }
+
+    public void setTuiMoney(Double tuiMoney) {
+        this.tuiMoney = tuiMoney;
+    }
+
+    public Double getServiceMoney() {
+        return serviceMoney;
+    }
+
+    public void setServiceMoney(Double serviceMoney) {
+        this.serviceMoney = serviceMoney;
+    }
+
+    public Double getPlatformMoney() {
+        return platformMoney;
+    }
+
+    public void setPlatformMoney(Double platformMoney) {
+        this.platformMoney = platformMoney;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Date getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(Date payTime) {
+        this.payTime = payTime;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    public Double getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(Double couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public String getOutNum() {
+        return outNum;
+    }
+
+    public void setOutNum(String outNum) {
+        this.outNum = outNum;
+    }
+
+    public Integer getEvaluateScoreUser() {
+        return evaluateScoreUser;
+    }
+
+    public void setEvaluateScoreUser(Integer evaluateScoreUser) {
+        this.evaluateScoreUser = evaluateScoreUser;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderRide{" +
+        "id=" + id +
+        ", addTime=" + addTime +
+        ", userId=" + userId +
+        ", startTime=" + startTime +
+        ", num=" + num +
+        ", startName=" + startName +
+        ", endName=" + endName +
+        ", lxPhone=" + lxPhone +
+        ", isDai=" + isDai +
+        ", money=" + money +
+        ", state=" + state +
+        ", isEvaluate=" + isEvaluate +
+        ", isComplaint=" + isComplaint +
+        ", startLon=" + startLon +
+        ", startLat=" + startLat +
+        ", endLon=" + endLon +
+        ", endLat=" + endLat +
+        ", travelId=" + travelId +
+        ", payType=" + payType +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/OrderTravel.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/OrderTravel.java
new file mode 100644
index 0000000..8ab8166
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/OrderTravel.java
@@ -0,0 +1,245 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 顺风车司机行程
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+@TableName("app_order_travel")
+public class OrderTravel extends Model<OrderTravel> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 添加时间
+     */
+    private Date addTime;
+    /**
+     * 司机id
+     */
+    private Integer driverId;
+    /**
+     * 出发时间
+     */
+    private Date startTime;
+    /**
+     * 发布人数
+     */
+    private Integer num;
+    /**
+     * 出发地
+     */
+    private String startName;
+    /**
+     * 目的地
+     */
+    private String endName;
+    /**
+     * 金额(暂不用)
+     */
+    private Double money;
+    /**
+     * 状态(3待出行,4出行中,5完成,6取消)
+     */
+    private Integer state;
+    /**
+     * 出发地经度 
+     */
+    private Double startLon;
+    /**
+     * 出发地纬度 
+     */
+    private Double startLat;
+    /**
+     * 目的地经度 
+     */
+    private Double endLon;
+    /**
+     * 目的地纬度 
+     */
+    private Double endLat;
+    /**
+     * 取消服务费
+     */
+    private Double serviceMoney;
+    /**
+     * 是否投诉(1未投诉,2已投诉)
+     */
+    private Integer isComplaint;
+
+    /**
+     * 订单编号
+     */
+    private String orderNum;
+
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    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 Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public Double getServiceMoney() {
+        return serviceMoney;
+    }
+
+    public void setServiceMoney(Double serviceMoney) {
+        this.serviceMoney = serviceMoney;
+    }
+
+    public Integer getIsComplaint() {
+        return isComplaint;
+    }
+
+    public void setIsComplaint(Integer isComplaint) {
+        this.isComplaint = isComplaint;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderTravel{" +
+        "id=" + id +
+        ", addTime=" + addTime +
+        ", driverId=" + driverId +
+        ", startTime=" + startTime +
+        ", num=" + num +
+        ", startName=" + startName +
+        ", endName=" + endName +
+        ", money=" + money +
+        ", state=" + state +
+        ", startLon=" + startLon +
+        ", startLat=" + startLat +
+        ", endLon=" + endLon +
+        ", endLat=" + endLat +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Param.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Param.java
new file mode 100644
index 0000000..b2d2998
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/Param.java
@@ -0,0 +1,73 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置; InnoDB free: 6144 kB
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+@TableName("app_param")
+public class Param extends Model<Param> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 1=城乡票务支付倒计时设置(分钟)  2=实时班线支付倒计时设置(分钟)  3=全国客服电话 4=关于我们 5=常见问题 6=用户协议, 7=司机待接单自动取消时间(s) ,8=法律条款与平台规则, 9=出租车服务协议, 10=报警电话 , 11=监督电话 , 12=投诉电话,13=推单设置,14=出租车取消规则  ,15=司机改派费用
+     */
+    private Integer type;
+    /**
+     * 内容  
+     */
+    private String context;
+
+
+    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 getContext() {
+        return context;
+    }
+
+    public void setContext(String context) {
+        this.context = context;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Param{" +
+        "id=" + id +
+        ", type=" + type +
+        ", context=" + context +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/ParamRide.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/ParamRide.java
new file mode 100644
index 0000000..88e6f05
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/ParamRide.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 顺风车设置
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+@TableName("app_param_ride")
+public class ParamRide extends Model<ParamRide> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 1价格设置,2平台抽成,3乘客退单,4司机退单
+     */
+    private Integer type;
+    /**
+     * 距离类型(1-100,100-200,200-500,500-800,800以上)
+     */
+    private Integer distanceType;
+    /**
+     * 内容  
+     */
+    private String context;
+    /**
+     * 描述
+     */
+    private String remark;
+    private Integer openCityId;
+
+
+    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 getDistanceType() {
+        return distanceType;
+    }
+
+    public void setDistanceType(Integer distanceType) {
+        this.distanceType = distanceType;
+    }
+
+    public String getContext() {
+        return context;
+    }
+
+    public void setContext(String context) {
+        this.context = context;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getOpenCityId() {
+        return openCityId;
+    }
+
+    public void setOpenCityId(Integer openCityId) {
+        this.openCityId = openCityId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "ParamRide{" +
+        "id=" + id +
+        ", type=" + type +
+        ", distanceType=" + distanceType +
+        ", context=" + context +
+        ", remark=" + remark +
+        ", openCityId=" + openCityId +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/TimeTask.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/TimeTask.java
new file mode 100644
index 0000000..8c8fd68
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/TimeTask.java
@@ -0,0 +1,123 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 定时任务数据; InnoDB free: 11264 kB
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-08-10
+ */
+@TableName("app_time_task")
+public class TimeTask extends Model<TimeTask> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    private String taskName;
+    private String typeName;
+    /**
+     * 0有效,1无效
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date createDate;
+    /**
+     * 执行时间
+     */
+    private Date excuteDate;
+    /**
+     * 参数
+     */
+    private String map;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTaskName() {
+        return taskName;
+    }
+
+    public void setTaskName(String taskName) {
+        this.taskName = taskName;
+    }
+
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+    public Date getExcuteDate() {
+        return excuteDate;
+    }
+
+    public void setExcuteDate(Date excuteDate) {
+        this.excuteDate = excuteDate;
+    }
+
+    public String getMap() {
+        return map;
+    }
+
+    public void setMap(String map) {
+        this.map = map;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TimeTask{" +
+        "id=" + id +
+        ", taskName=" + taskName +
+        ", typeName=" + typeName +
+        ", state=" + state +
+        ", createDate=" + createDate +
+        ", excuteDate=" + excuteDate +
+        ", map=" + map +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/UserApply.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/UserApply.java
new file mode 100644
index 0000000..a225441
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/UserApply.java
@@ -0,0 +1,155 @@
+package com.stylefeng.guns.modular.shunfeng.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户和司机申请表
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-22
+ */
+@TableName("app_user_apply")
+public class UserApply extends Model<UserApply> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户id或者司机id
+     */
+    private Integer userId;
+    /**
+     * 申请时间
+     */
+    private Date applyTime;
+    /**
+     * 1用户,2司机
+     */
+    private Integer type;
+    /**
+     * 1等待审核,2审核通过,3不通过
+     */
+    private Integer applyState;
+    /**
+     * 1用户申请推广大使,2用户申请顺风车推广大使,3发布顺风车行程实名认证
+     */
+    private Integer applyType;
+    /**
+     * 真实姓名
+     */
+    private String name;
+    /**
+     * 身份证
+     */
+    private String identity;
+    /**
+     * 头像
+     */
+    private String headImg;
+
+
+    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 getApplyTime() {
+        return applyTime;
+    }
+
+    public void setApplyTime(Date applyTime) {
+        this.applyTime = applyTime;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getApplyState() {
+        return applyState;
+    }
+
+    public void setApplyState(Integer applyState) {
+        this.applyState = applyState;
+    }
+
+    public Integer getApplyType() {
+        return applyType;
+    }
+
+    public void setApplyType(Integer applyType) {
+        this.applyType = applyType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIdentity() {
+        return identity;
+    }
+
+    public void setIdentity(String identity) {
+        this.identity = identity;
+    }
+
+    public String getHeadImg() {
+        return headImg;
+    }
+
+    public void setHeadImg(String headImg) {
+        this.headImg = headImg;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "UserApply{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", applyTime=" + applyTime +
+        ", type=" + type +
+        ", applyState=" + applyState +
+        ", applyType=" + applyType +
+        ", name=" + name +
+        ", identity=" + identity +
+        ", headImg=" + headImg +
+        "}";
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/ApiJson.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/ApiJson.java
new file mode 100644
index 0000000..997a1b9
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/ApiJson.java
@@ -0,0 +1,175 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.Date;
+import java.util.Map;
+
+public class ApiJson {
+
+	public static final String eMsgProductInfoNotExist = "产品信息不存在!";
+
+	public static final String eMsgSmsError = "短信验证码错误";
+	public static final String eMsgSmsInvalid = "短信验证码无效";
+
+	public static final String eMsgUserLoginError = "用户名或密码错误!";
+	public static final String eMsgUserInfoNotExist = "用户名信息不存在!";
+	public static final String eMsgUserPhoneError = "用户手机号不正确!";
+	public static final String eMsgUserPwdError = "输入密码不正确!";
+
+	public static final String eMsgUserIdCardError = "实名身份信息验证失败!";
+	public static final String eMsgUserPhoneExist = "用户手机账号已存在!";
+	public static final String sMsgUserRegistSuccess = "用户注册成功!";
+
+	/** 接口请求消息 */
+	public static final String msgException = "接口请求异常";
+
+	/** 基础代码 */
+	public static final Integer codeOk = 0;
+	public static final String msgOk ="操作成功";
+	
+	public static final Integer codeNg = 1;
+	public static final String msgNg ="操作失败";
+
+	/** 基础参数 */
+	public Integer code;
+	public String msg;
+	public Long xtTime;
+
+	/** 扩展参数 */
+	public Object data;
+	
+	public ApiJson() {
+		this.code = ApiJson.codeOk;
+        this.msg = ApiJson.msgOk;
+	}
+	
+    public ApiJson(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+    
+    public ApiJson(ApiJson json) {
+        this.code = json.code;
+        this.msg = json.msg;
+        this.data = json.data;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+	
+	/**
+	 * 封装接口返回数据
+	 * @param params 可选返参集:params[0]设置data(默认:空集),params[1]设置msg(默认:操作成功!),params[2]设置code(默认:0)
+	 * @return
+	 */
+	public static Object returnOK(Object... params) {
+		ApiJson json = new ApiJson();
+		json.data = null;
+		json.msg = msgOk;
+		json.code = codeOk;
+		json.xtTime=new Date().getTime();
+
+		
+		if (params != null && params.length >= 1 && params[0] != null) {
+			json.data = params[0];
+		}
+		
+		if (params != null && params.length >= 2 && params[1] != null && !"".equals(params[1])) {
+			json.msg = params[1].toString();
+		}
+		
+		if (params != null && params.length >= 3 && params[2] != null) {
+			json.code = Integer.parseInt(params[2].toString());
+		}
+
+		return json;
+	}
+	
+	/**
+	 * 封装接口返回数据(失败)
+	 * @param params 可选返参集:params[0]设置msg(默认:操作失败!),params[1]设置code(默认:1),params[2]设置data(默认:空集)
+	 * @return
+	 */
+	public static Object returnNG(Object... params) {
+		ApiJson json = new ApiJson();
+		json.msg = msgNg;
+		json.code = codeNg;
+		json.data = null;
+
+		if (params != null && params.length >= 1 && params[0] != null && !"".equals(params[0])) {
+			json.msg = params[0].toString();
+		}
+
+		if (params != null && params.length >= 2 && params[1] != null) {
+			json.code = Integer.parseInt(params[1].toString());
+		}
+
+		if (params != null && params.length >= 3 && params[2] != null) {
+			json.data = params[2];
+		}
+		
+		return json;
+	}
+
+
+	/**
+	 * 返回一个正确数据
+	 *
+	 * @param method
+	 * @param data
+	 * @return
+	 * @author TaoNingBo
+	 */
+	public static String setMsg(String method, Map<String, Object> data) throws Exception{
+		StringBuffer json = new StringBuffer();
+		json.append(getHeader(0, "SUCCESS", method));
+		JSONObject dataJson = new JSONObject(data);
+		json.append(dataJson.toString());
+		json.append("}");
+		JSONObject jsonData = JSON.parseObject(json.toString());
+		return jsonData.toString();
+	}
+
+	/**
+	 * 生成一个返回JSON的头
+	 *
+	 * @param code
+	 * @param msg
+	 * @param method
+	 * @return
+	 * @author TaoNingBo
+	 */
+	private static String getHeader(int code, String msg, String method) {
+		StringBuffer header = new StringBuffer();
+		header.append("{");
+		header.append("\"code\":\"" + code);
+		header.append("\",\"msg\":\"" + msg);
+		header.append("\",\"method\":\"" + method);
+		header.append("\",\"con\":");
+		return header.toString();
+	}
+
+}
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/BannerVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/BannerVo.java
new file mode 100644
index 0000000..687571f
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/BannerVo.java
@@ -0,0 +1,55 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.util.*;
+
+public class BannerVo {
+    /**
+     * Banner图
+     */
+    private String imgUrl;
+    /**
+     * 跳转类型
+     */
+    private Integer urlType;
+    /**
+     * 跳转路径
+     */
+    private String urlHtml;
+
+    public BannerVo() {
+    }
+
+    public BannerVo(String imgUrl, Integer urlType, String urlHtml) {
+        this.imgUrl = imgUrl;
+        this.urlType = urlType;
+        this.urlHtml = urlHtml;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Integer getUrlType() {
+        return urlType;
+    }
+
+    public void setUrlType(Integer urlType) {
+        this.urlType = urlType;
+    }
+
+    public String getUrlHtml() {
+        return urlHtml;
+    }
+
+    public void setUrlHtml(String urlHtml) {
+        this.urlHtml = urlHtml;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/CouponUserVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/CouponUserVo.java
new file mode 100644
index 0000000..54008e0
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/CouponUserVo.java
@@ -0,0 +1,78 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+
+
+public class CouponUserVo {
+    /**
+     * 优惠券id
+     */
+    private Integer id;
+    /**
+     * 优惠券名称
+     */
+    private String couponName;
+    /**
+     * 使用条件金额
+     */
+    private Integer money;
+    /**
+     * 用户领取可用金额
+     */
+    private Double usableMoney;
+    /**
+     * 过期时间
+     */
+    private String pastTime;
+    /**
+     * 优惠券类型(1注册、2分享、3活动、4验票)
+     */
+    private Integer type;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    public Integer getMoney() {
+        return money;
+    }
+
+    public void setMoney(Integer money) {
+        this.money = money;
+    }
+
+    public Double getUsableMoney() {
+        return usableMoney;
+    }
+
+    public void setUsableMoney(Double usableMoney) {
+        this.usableMoney = usableMoney;
+    }
+
+    public String getPastTime() {
+        return pastTime;
+    }
+
+    public void setPastTime(String pastTime) {
+        this.pastTime = pastTime;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/DriverOrderVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/DriverOrderVo.java
new file mode 100644
index 0000000..af39ecf
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/DriverOrderVo.java
@@ -0,0 +1,90 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+import java.util.Date;
+
+public class DriverOrderVo {
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+    /**
+     * 订单购买数量
+     */
+    private Integer num;
+    /**
+     * 付款金额
+     */
+    private Double money;
+    /**
+     * 用户联系电话
+     */
+    private String lxPhone;
+    /**
+     * 购买开始站点
+     */
+    private String startName;
+    /**
+     * 购买结束站点
+     */
+    private String endName;
+    /**
+     * 付款时间
+     */
+    private Date payTime;
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public String getLxPhone() {
+        return lxPhone;
+    }
+
+    public void setLxPhone(String lxPhone) {
+        this.lxPhone = lxPhone;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public Date getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(Date payTime) {
+        this.payTime = payTime;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/DriverTaxiVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/DriverTaxiVo.java
new file mode 100644
index 0000000..856919f
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/DriverTaxiVo.java
@@ -0,0 +1,139 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+
+/**
+ * 出租车司机
+ */
+public class DriverTaxiVo {
+
+    /*司机id*/
+    private Integer id;
+    /*车辆id*/
+    private Integer carId;
+    /*车牌*/
+    private String carNum;
+    /*车辆品牌*/
+    private String carType;
+    /*我的评分*/
+    private Double evaluateScore=0d;
+    /*本周接单数*/
+    private Integer weekOrders;
+    /*今日接单*/
+    private Integer dayOrders;
+    /*是否上班 1休息,2上班中*/
+    private Integer isWork=1;
+    /*城市id*/
+    private Integer cityId;
+    /*1银行卡,2微信*/
+    private Integer payType;
+    /*银行卡号(微信号)*/
+    private String cardNumber;
+    /*银行开户行(银行卡时需要)*/
+    private String openingBank;
+    /*开户人姓名(银行卡时需要)*/
+    private String nameBank;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(String carNum) {
+        this.carNum = carNum;
+    }
+
+    public String getCarType() {
+        return carType;
+    }
+
+    public void setCarType(String carType) {
+        this.carType = carType;
+    }
+
+    public Double getEvaluateScore() {
+        return evaluateScore;
+    }
+
+    public void setEvaluateScore(Double evaluateScore) {
+        this.evaluateScore = evaluateScore;
+    }
+
+    public Integer getWeekOrders() {
+        return weekOrders;
+    }
+
+    public void setWeekOrders(Integer weekOrders) {
+        this.weekOrders = weekOrders;
+    }
+
+    public Integer getCityId() {
+        return cityId;
+    }
+
+    public void setCityId(Integer cityId) {
+        this.cityId = cityId;
+    }
+
+    public Integer getDayOrders() {
+        return dayOrders;
+    }
+
+    public void setDayOrders(Integer dayOrders) {
+        this.dayOrders = dayOrders;
+    }
+
+    public Integer getIsWork() {
+        return isWork;
+    }
+
+    public void setIsWork(Integer isWork) {
+        this.isWork = isWork;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public String getCardNumber() {
+        return cardNumber;
+    }
+
+    public void setCardNumber(String cardNumber) {
+        this.cardNumber = cardNumber;
+    }
+
+    public String getOpeningBank() {
+        return openingBank;
+    }
+
+    public void setOpeningBank(String openingBank) {
+        this.openingBank = openingBank;
+    }
+
+    public String getNameBank() {
+        return nameBank;
+    }
+
+    public void setNameBank(String nameBank) {
+        this.nameBank = nameBank;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineDetailVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineDetailVo.java
new file mode 100644
index 0000000..53428d5
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineDetailVo.java
@@ -0,0 +1,285 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+
+import java.util.List;
+
+/**
+ * 班线详情(画线路地图页面)
+ */
+public class LineDetailVo {
+
+    /**
+     * 班次id
+     */
+    private Integer shiftId;
+    /**
+     * 线路id
+     */
+    private Integer lineId;
+    /**
+     * 线路id
+     */
+    private Integer carId;
+
+    /**
+     * 起点站名称
+     */
+    private String startName;
+    /**
+     * 终点站名称
+     */
+    private String endName;
+
+    /**
+     * 车牌
+     */
+    private String carNum;
+
+    /**
+     * 车型
+     */
+    private String carModel;
+    /**
+     * 车辆品牌
+     */
+    private String carType;
+
+    /**
+     * 地图点击该站点的排序
+     */
+    private int sort=0;
+    /**
+     * 地图点击站点名称
+     */
+    private String siteName;
+
+    /**
+     * 距离最近站点距离
+     */
+    private Double distance=0d;
+    /**
+     * 终点站时间(选择终点)
+     */
+    private String endTime;
+
+    /**
+     * 起点站时间(选择起点)
+     */
+    private String startTime;
+
+    /**
+     * 两个站点的价格
+     */
+    private Double price;
+    /**
+     * 班次发车时期
+     */
+    private String busTime;
+    /**
+     * 班次发车时间
+     */
+    private String busStartTime;
+
+    /*确认界面*/
+    /**
+     * 距离出发站点(米 输入才有)
+     */
+    private Double jlStart=0d;
+    /**
+     * 距离目的地站点(米 输入才有)
+     */
+    private Double jsEnd=0d;
+    /**
+     * 是否途径车 1=途径车 2=非途径车
+     */
+    private Integer isTu;
+    /**
+     * 停止售票时间
+     */
+    private Integer stopTime;
+    /**
+     * 整个线路站点
+     */
+    private List<SiteVo> lineSites;
+    /**
+     * 剩余票数
+     */
+    private Integer surplusCount;
+
+
+    public int getSort() {
+        return sort;
+    }
+
+    public void setSort(int sort) {
+        this.sort = sort;
+    }
+
+    public Integer getShiftId() {
+        return shiftId;
+    }
+
+    public void setShiftId(Integer shiftId) {
+        this.shiftId = shiftId;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public String getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(String carNum) {
+        this.carNum = carNum;
+    }
+
+    public String getCarModel() {
+        return carModel;
+    }
+
+    public void setCarModel(String carModel) {
+        this.carModel = carModel;
+    }
+
+    public String getCarType() {
+        return carType;
+    }
+
+    public void setCarType(String carType) {
+        this.carType = carType;
+    }
+
+    public String getSiteName() {
+        return siteName;
+    }
+
+    public void setSiteName(String siteName) {
+        this.siteName = siteName;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getBusTime() {
+        return busTime;
+    }
+
+    public void setBusTime(String busTime) {
+        this.busTime = busTime;
+    }
+
+    public String getBusStartTime() {
+        return busStartTime;
+    }
+
+    public void setBusStartTime(String busStartTime) {
+        this.busStartTime = busStartTime;
+    }
+
+    public Double getJlStart() {
+        return jlStart;
+    }
+
+    public void setJlStart(Double jlStart) {
+        this.jlStart = jlStart;
+    }
+
+    public Double getJsEnd() {
+        return jsEnd;
+    }
+
+    public void setJsEnd(Double jsEnd) {
+        this.jsEnd = jsEnd;
+    }
+
+    public Integer getIsTu() {
+        return isTu;
+    }
+
+    public void setIsTu(Integer isTu) {
+        this.isTu = isTu;
+    }
+
+    public Integer getStopTime() {
+        return stopTime;
+    }
+
+    public void setStopTime(Integer stopTime) {
+        this.stopTime = stopTime;
+    }
+
+    public List<SiteVo> getLineSites() {
+        return lineSites;
+    }
+
+    public void setLineSites(List<SiteVo> lineSites) {
+        this.lineSites = lineSites;
+    }
+
+    public Integer getSurplusCount() {
+        return surplusCount;
+    }
+
+    public void setSurplusCount(Integer surplusCount) {
+        this.surplusCount = surplusCount;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineRecommendedBcVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineRecommendedBcVo.java
new file mode 100644
index 0000000..74e68d8
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineRecommendedBcVo.java
@@ -0,0 +1,476 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+/**
+ * 实时线路--推荐线路--线路
+ */
+public class LineRecommendedBcVo {
+    /**
+     * 班次id
+     */
+    private Integer shiftId;
+    /**
+     * 模板班次id
+     */
+    private Integer mbShiftId;
+
+    /**
+     * 线路id
+     */
+    private Integer lineId;
+    /**
+     * 车辆id
+     */
+    private Integer carId;
+    /**
+     * 起点站
+     */
+    private String startName;
+    /**
+     * 终点站
+     */
+    private String endName;
+    /**
+     * 车牌
+     */
+    private String carNum;
+    /**
+     * 距离
+     */
+    private Double distance=0d;
+
+    /**
+     * 车辆品牌
+     */
+    private String carType;
+
+
+    /**
+     * 终点id
+     */
+    private Integer endId;
+    /**
+     * 起点站id
+     */
+    private Integer startId;
+
+    /**
+     * 预计到站时间
+     */
+    private Integer duration;
+    /*剩余人数*/
+    private Integer remainingNum;
+    /*金额*/
+    private Double money=0d;
+    /*车型*/
+    private String vehicleType;
+    /*司机名称*/
+    private String driverName;
+
+    private Double beLon;
+
+    private Double beLat;
+
+    private Double enLon;
+
+    private Double enLat;
+
+    private Double lon;
+
+    private Double lat;
+
+    private Double siteIdEndLon;
+
+    private Double siteIdEndLat;
+
+    private String siteName;
+
+    private String siteNameEnd;
+
+    private Integer siteId;
+
+    private  Integer siteIdEnd;
+
+    private Long yjddsjc;
+
+    private String yjdd;
+
+    private String zdTime;
+
+    private Integer sort;
+
+    private Integer sortEnd;
+
+    private Integer stopTime;
+
+    private String tims;
+
+    private String busStartTime;
+
+    private String busTime;
+
+    private String startTime;
+
+    private Double jlStart=0d;
+
+    private Double  jsEnd=0d;
+
+    private Integer   driverId;
+
+    private Integer num;
+
+    private Integer nextSiteId;
+
+    private Integer shiftNum;
+
+    public Integer getShiftNum() {
+        return shiftNum;
+    }
+
+    public void setShiftNum(Integer shiftNum) {
+        this.shiftNum = shiftNum;
+    }
+
+    public Integer getShiftId() {
+        return shiftId;
+    }
+
+    public void setShiftId(Integer shiftId) {
+        this.shiftId = shiftId;
+    }
+
+    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 String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public String getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(String carNum) {
+        this.carNum = carNum;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
+    public String getCarType() {
+        return carType;
+    }
+
+    public void setCarType(String carType) {
+        this.carType = carType;
+    }
+
+    public String getSiteName() {
+        return siteName;
+    }
+
+    public void setSiteName(String siteName) {
+        this.siteName = siteName;
+    }
+
+    public Integer getEndId() {
+        return endId;
+    }
+
+    public void setEndId(Integer endId) {
+        this.endId = endId;
+    }
+
+    public Integer getStartId() {
+        return startId;
+    }
+
+    public void setStartId(Integer startId) {
+        this.startId = startId;
+    }
+
+    public Integer getDuration() {
+        return duration;
+    }
+
+    public void setDuration(Integer duration) {
+        this.duration = duration;
+    }
+
+    public Integer getRemainingNum() {
+        return remainingNum;
+    }
+
+    public void setRemainingNum(Integer remainingNum) {
+        this.remainingNum = remainingNum;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public String getVehicleType() {
+        return vehicleType;
+    }
+
+    public void setVehicleType(String vehicleType) {
+        this.vehicleType = vehicleType;
+    }
+
+    public String getDriverName() {
+        return driverName;
+    }
+
+    public void setDriverName(String driverName) {
+        this.driverName = driverName;
+    }
+
+    public Double getBeLon() {
+        return beLon;
+    }
+
+    public void setBeLon(Double beLon) {
+        this.beLon = beLon;
+    }
+
+    public Double getBeLat() {
+        return beLat;
+    }
+
+    public void setBeLat(Double beLat) {
+        this.beLat = beLat;
+    }
+
+    public Double getEnLon() {
+        return enLon;
+    }
+
+    public void setEnLon(Double enLon) {
+        this.enLon = enLon;
+    }
+
+    public Double getEnLat() {
+        return enLat;
+    }
+
+    public void setEnLat(Double enLat) {
+        this.enLat = enLat;
+    }
+
+    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;
+    }
+
+    public Double getSiteIdEndLon() {
+        return siteIdEndLon;
+    }
+
+    public void setSiteIdEndLon(Double siteIdEndLon) {
+        this.siteIdEndLon = siteIdEndLon;
+    }
+
+    public Double getSiteIdEndLat() {
+        return siteIdEndLat;
+    }
+
+    public void setSiteIdEndLat(Double siteIdEndLat) {
+        this.siteIdEndLat = siteIdEndLat;
+    }
+
+    public String getSiteNameEnd() {
+        return siteNameEnd;
+    }
+
+    public void setSiteNameEnd(String siteNameEnd) {
+        this.siteNameEnd = siteNameEnd;
+    }
+
+    public Integer getSiteId() {
+        return siteId;
+    }
+
+    public void setSiteId(Integer siteId) {
+        this.siteId = siteId;
+    }
+
+    public Integer getSiteIdEnd() {
+        return siteIdEnd;
+    }
+
+    public void setSiteIdEnd(Integer siteIdEnd) {
+        this.siteIdEnd = siteIdEnd;
+    }
+
+    public Long getYjddsjc() {
+        return yjddsjc;
+    }
+
+    public void setYjddsjc(Long yjddsjc) {
+        this.yjddsjc = yjddsjc;
+    }
+
+    public String getYjdd() {
+        return yjdd;
+    }
+
+    public void setYjdd(String yjdd) {
+        this.yjdd = yjdd;
+    }
+
+    public String getZdTime() {
+        return zdTime;
+    }
+
+    public void setZdTime(String zdTime) {
+        this.zdTime = zdTime;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Integer getStopTime() {
+        return stopTime;
+    }
+
+    public void setStopTime(Integer stopTime) {
+        this.stopTime = stopTime;
+    }
+
+    public String getTims() {
+        return tims;
+    }
+
+    public void setTims(String tims) {
+        this.tims = tims;
+    }
+
+    public String getBusStartTime() {
+        return busStartTime;
+    }
+
+    public void setBusStartTime(String busStartTime) {
+        this.busStartTime = busStartTime;
+    }
+
+    public String getBusTime() {
+        return busTime;
+    }
+
+    public void setBusTime(String busTime) {
+        this.busTime = busTime;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public Double getJlStart() {
+        return jlStart;
+    }
+
+    public void setJlStart(Double jlStart) {
+        this.jlStart = jlStart;
+    }
+
+    public Double getJsEnd() {
+        return jsEnd;
+    }
+
+    public void setJsEnd(Double jsEnd) {
+        this.jsEnd = jsEnd;
+    }
+
+    public Integer getSortEnd() {
+        return sortEnd;
+    }
+
+    public void setSortEnd(Integer sortEnd) {
+        this.sortEnd = sortEnd;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getMbShiftId() {
+        return mbShiftId;
+    }
+
+    public void setMbShiftId(Integer mbShiftId) {
+        this.mbShiftId = mbShiftId;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Integer getNextSiteId() {
+        return nextSiteId;
+    }
+
+    public void setNextSiteId(Integer nextSiteId) {
+        this.nextSiteId = nextSiteId;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineRecommendedVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineRecommendedVo.java
new file mode 100644
index 0000000..4c18fda
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineRecommendedVo.java
@@ -0,0 +1,184 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+/**
+ * 实时线路--推荐线路--线路
+ */
+public class LineRecommendedVo {
+    /**
+     * 班次id
+     */
+    private Integer shiftId;
+    /**
+     * 线路id
+     */
+    private Integer lineId;
+    /**
+     * 车辆id
+     */
+    private Integer carId;
+    /**
+     * 起点站
+     */
+    private String start;
+    /**
+     * 终点站
+     */
+    private String end;
+    /**
+     * 车牌
+     */
+    private String carNum;
+    /**
+     * 距离
+     */
+    private Double distance=0d;
+
+    /**
+     * 车型
+     */
+    private String carModel;
+    /**
+     * 车辆品牌
+     */
+    private String carType;
+    /**
+     * 当前选择的名称
+     */
+    private String siteName;
+    /**
+     * 当前选择的站点
+     */
+    private Integer siteId;
+    /**
+     * 终点id
+     */
+    private Integer endId;
+    /**
+     * 下一个站
+     */
+    private String nextName;
+
+    private Integer nextLon;
+
+    private Double nextLat;
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public String getStart() {
+        return start;
+    }
+
+    public void setStart(String start) {
+        this.start = start;
+    }
+
+    public String getEnd() {
+        return end;
+    }
+
+    public void setEnd(String end) {
+        this.end = end;
+    }
+
+    public String getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(String carNum) {
+        this.carNum = carNum;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getSiteName() {
+        return siteName;
+    }
+
+    public void setSiteName(String siteName) {
+        this.siteName = siteName;
+    }
+
+    public String getCarModel() {
+        return carModel;
+    }
+
+    public void setCarModel(String carModel) {
+        this.carModel = carModel;
+    }
+
+    public String getCarType() {
+        return carType;
+    }
+
+    public void setCarType(String carType) {
+        this.carType = carType;
+    }
+
+    public Integer getShiftId() {
+        return shiftId;
+    }
+
+    public void setShiftId(Integer shiftId) {
+        this.shiftId = shiftId;
+    }
+
+    public Integer getSiteId() {
+        return siteId;
+    }
+
+    public void setSiteId(Integer siteId) {
+        this.siteId = siteId;
+    }
+
+    public Integer getEndId() {
+        return endId;
+    }
+
+    public void setEndId(Integer endId) {
+        this.endId = endId;
+    }
+
+    public String getNextName() {
+        return nextName;
+    }
+
+    public void setNextName(String nextName) {
+        this.nextName = nextName;
+    }
+
+    public Integer getNextLon() {
+        return nextLon;
+    }
+
+    public void setNextLon(Integer nextLon) {
+        this.nextLon = nextLon;
+    }
+
+    public Double getNextLat() {
+        return nextLat;
+    }
+
+    public void setNextLat(Double nextLat) {
+        this.nextLat = nextLat;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineVo.java
new file mode 100644
index 0000000..3edae97
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/LineVo.java
@@ -0,0 +1,88 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+/**
+ * 拓展类
+ */
+public class LineVo {
+
+
+    private Integer cityId;
+
+    private Double startLon;
+
+    private Double startLat;
+
+    private Double endLon;
+
+    private Double endLat;
+
+    private Integer siteId;
+
+    private Integer siteIdEnd;
+
+    private Double distance;
+
+    public Integer getSiteIdEnd() {
+        return siteIdEnd;
+    }
+
+    public void setSiteIdEnd(Integer siteIdEnd) {
+        this.siteIdEnd = siteIdEnd;
+    }
+
+    public Integer getCityId() {
+        return cityId;
+    }
+
+    public void setCityId(Integer cityId) {
+        this.cityId = cityId;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public Integer getSiteId() {
+        return siteId;
+    }
+
+    public void setSiteId(Integer siteId) {
+        this.siteId = siteId;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MechanismVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MechanismVo.java
new file mode 100644
index 0000000..2a21c24
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MechanismVo.java
@@ -0,0 +1,75 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+/**
+ * 退票参数
+ */
+public class MechanismVo {
+
+
+    private Double k1;
+
+    private Double k2;
+
+    private Double k3;
+
+    private Double k4;
+    private Double k5;
+    private Double k6;
+    private Double k7;
+
+    public Double getK1() {
+        return k1;
+    }
+
+    public void setK1(Double k1) {
+        this.k1 = k1;
+    }
+
+    public Double getK2() {
+        return k2;
+    }
+
+    public void setK2(Double k2) {
+        this.k2 = k2;
+    }
+
+    public Double getK3() {
+        return k3;
+    }
+
+    public void setK3(Double k3) {
+        this.k3 = k3;
+    }
+
+    public Double getK4() {
+        return k4;
+    }
+
+    public void setK4(Double k4) {
+        this.k4 = k4;
+    }
+
+    public Double getK5() {
+        return k5;
+    }
+
+    public void setK5(Double k5) {
+        this.k5 = k5;
+    }
+
+    public Double getK6() {
+        return k6;
+    }
+
+    public void setK6(Double k6) {
+        this.k6 = k6;
+    }
+
+    public Double getK7() {
+        return k7;
+    }
+
+    public void setK7(Double k7) {
+        this.k7 = k7;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MessageVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MessageVo.java
new file mode 100644
index 0000000..331b545
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MessageVo.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+/**
+ * 系统消息拓展
+ */
+public class MessageVo {
+
+    private String busTime;
+
+    private String name;
+
+    private String startTime;
+
+    private Integer companyId;
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getBusTime() {
+        return busTime;
+    }
+
+    public void setBusTime(String busTime) {
+        this.busTime = busTime;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MethodModel.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MethodModel.java
new file mode 100644
index 0000000..d7dea99
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/MethodModel.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+/**
+ * 方法实体类
+ *
+ * @author tuzx
+ * @date 2017年10月26日
+ * @version 1.0
+ */
+public class MethodModel {
+
+	//心跳
+	public static String ok= "OK";
+	
+	//司机上传位置
+	public static String loc="LOTICO";
+	
+	//司机实时计费
+	public static String realtime="REALTIME";
+	
+	//司机按小时计费
+	public static String hourstime="HOURSTIME";
+	
+	//司机按小时计费
+	public static String todaytime="TODAYTIME";
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/NtteyModel.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/NtteyModel.java
new file mode 100644
index 0000000..6f731bf
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/NtteyModel.java
@@ -0,0 +1,98 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+public class NtteyModel {
+
+	//司机/用户Id
+	private Integer id;
+
+	//角色  1=用户 2=司机
+	private Integer role;
+	
+	//执行的方法 做什么操作
+	private String method;
+	
+	//手机唯一标识
+	private String token;
+	//经度
+	private Double lon;
+	//纬度
+	private Double lat;
+	
+	//城市code
+	private String citycode;
+	
+	
+	//订单ID
+	private Integer orderId;
+	
+	
+	
+	
+	public Integer getOrderId() {
+		return orderId;
+	}
+
+	public void setOrderId(Integer orderId) {
+		this.orderId = orderId;
+	}
+
+	public String getCitycode() {
+		return citycode;
+	}
+
+	public void setCitycode(String citycode) {
+		this.citycode = citycode;
+	}
+
+
+	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;
+	}
+
+	public String getToken() {
+		return token;
+	}
+
+	public void setToken(String token) {
+		this.token = token;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getRole() {
+		return role;
+	}
+
+	public void setRole(Integer role) {
+		this.role = role;
+	}
+
+	public String getMethod() {
+		return method;
+	}
+
+	public void setMethod(String method) {
+		this.method = method;
+	}
+	
+	
+	
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderRideInfoVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderRideInfoVo.java
new file mode 100644
index 0000000..d268243
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderRideInfoVo.java
@@ -0,0 +1,283 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+import java.util.Date;
+
+public class OrderRideInfoVo {
+
+    private Integer userId;
+
+    private Integer userOrderId;
+
+    private Integer driverOrderId;
+
+    private Date addTime;
+
+    private Date startTime;
+
+    private Integer driverId;
+    /*司机名称或者用户名称*/
+    private String name;
+    /*头像*/
+    private String headImg;
+    /*性别*/
+    private String sex;
+    /*车辆品牌*/
+    private String carType;
+    /*车牌*/
+    private String carNum;
+    /*总订单数*/
+    private Integer totalOrders;
+    /*用户评价分数*/
+    private Double evaluateScoreUser=0d;
+    /*司机评分*/
+    private Integer evaluateScore=0;
+    /*司机电话或用户电话*/
+    private String phone;
+    /*数量*/
+    private Integer num;
+    /*起点名称*/
+    private String startName;
+    /*订单金额*/
+    private Double money;
+    /*结束点*/
+    private String endName;
+    /*距离*/
+    private Double distance=0d;
+    /*位置经度*/
+    private Double lon=0d;
+    /*位置 纬度*/
+    private Double lat=0d;
+
+    /*状态(1未支付,2已支付,3待出行,4出行中,5完成,6取消)*/
+    private Integer state;
+
+    /*是否评价(1未评价,2已评价)*/
+    private Integer isEvaluate;
+
+    /*是否投诉(1未投诉,2已投诉)*/
+    private Integer isComplaint;
+    /**
+     * 支付倒计时设置 单位 分钟
+     */
+    private Integer djs=10;
+    /**
+     * 评价内容
+     */
+    private  String content;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getUserOrderId() {
+        return userOrderId;
+    }
+
+    public void setUserOrderId(Integer userOrderId) {
+        this.userOrderId = userOrderId;
+    }
+
+    public Integer getDriverOrderId() {
+        return driverOrderId;
+    }
+
+    public void setDriverOrderId(Integer driverOrderId) {
+        this.driverOrderId = driverOrderId;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getHeadImg() {
+        return headImg;
+    }
+
+    public void setHeadImg(String headImg) {
+        this.headImg = headImg;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public String getCarType() {
+        return carType;
+    }
+
+    public void setCarType(String carType) {
+        this.carType = carType;
+    }
+
+    public String getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(String carNum) {
+        this.carNum = carNum;
+    }
+
+    public Integer getTotalOrders() {
+        return totalOrders;
+    }
+
+    public void setTotalOrders(Integer totalOrders) {
+        this.totalOrders = totalOrders;
+    }
+
+    public Double getEvaluateScoreUser() {
+        return evaluateScoreUser;
+    }
+
+    public void setEvaluateScoreUser(Double evaluateScoreUser) {
+        this.evaluateScoreUser = evaluateScoreUser;
+    }
+
+    public Integer getEvaluateScore() {
+        return evaluateScore;
+    }
+
+    public void setEvaluateScore(Integer evaluateScore) {
+        this.evaluateScore = evaluateScore;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
+    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;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getIsEvaluate() {
+        return isEvaluate;
+    }
+
+    public void setIsEvaluate(Integer isEvaluate) {
+        this.isEvaluate = isEvaluate;
+    }
+
+    public Integer getIsComplaint() {
+        return isComplaint;
+    }
+
+    public void setIsComplaint(Integer isComplaint) {
+        this.isComplaint = isComplaint;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getDjs() {
+        return djs;
+    }
+
+    public void setDjs(Integer djs) {
+        this.djs = djs;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderRideVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderRideVo.java
new file mode 100644
index 0000000..2d5407c
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderRideVo.java
@@ -0,0 +1,226 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+import java.util.Date;
+
+public class OrderRideVo {
+    private Integer current=0;
+
+    private Integer id;
+
+    private Integer userOrderId;
+
+    private Integer driverOrderId;
+
+    private String name;
+
+    private Integer size;
+
+    private Integer userId;
+
+    private Date addTime;
+
+    private Date startTime;
+
+    private Integer driverId;
+
+    private Integer num;
+
+    private String startName;
+    /*订单金额*/
+    private Double money;
+
+    private String endName;
+    /*状态(1未支付,2已支付,3待出行,4出行中,5完成,6取消)*/
+    private Integer state;
+
+    /*返回字段:1用户订单,2司机订单 ;搜索条件:1默认排序,2时间最早,3距离最近,4价格最低*/
+    private Integer type;
+    /*距离*/
+    private Double distance;
+    /*总接单数*/
+    private Integer totalOrders;
+    /*性别*/
+    private String sex;
+    /*头像*/
+    private String headImg;
+
+    private Double lon;
+
+    private Double lat;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCurrent() {
+        return current;
+    }
+
+    public void setCurrent(Integer current) {
+        this.current = current;
+    }
+
+    public Integer getSize() {
+        return size;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    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 Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
+    public Integer getTotalOrders() {
+        return totalOrders;
+    }
+
+    public void setTotalOrders(Integer totalOrders) {
+        this.totalOrders = totalOrders;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public String getHeadImg() {
+        return headImg;
+    }
+
+    public void setHeadImg(String headImg) {
+        this.headImg = headImg;
+    }
+
+    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;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getUserOrderId() {
+        return userOrderId;
+    }
+
+    public void setUserOrderId(Integer userOrderId) {
+        this.userOrderId = userOrderId;
+    }
+
+    public Integer getDriverOrderId() {
+        return driverOrderId;
+    }
+
+    public void setDriverOrderId(Integer driverOrderId) {
+        this.driverOrderId = driverOrderId;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiDriverVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiDriverVo.java
new file mode 100644
index 0000000..29bbb3b
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiDriverVo.java
@@ -0,0 +1,209 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+import java.util.Date;
+
+/**
+ * 司机端订单详情
+ */
+public class OrderTaxiDriverVo {
+    /*订单id*/
+    private Integer id;
+    /*状态*/
+    private Integer state;
+    /*订单编号*/
+    private String orderNum;
+    /*距离*/
+    private Double distance;
+    /*起点*/
+    private String startName;
+    /*终点*/
+    private String endName;
+    /*下单时间*/
+    private Date addTime;
+    /*是否使用红包*/
+    private Integer isEnvelope;
+    /*红包金额*/
+    private Double  money;
+    /*起点经度*/
+    private Double startLon;
+    /*起点纬度*/
+    private Double startLat;
+    /*终点经度*/
+    private Double endLon;
+    /*终点纬度*/
+    private Double endLat;
+    /*用户名称*/
+    private String nickName;
+    /*用户头像*/
+    private String headImg;
+    /*用户电话*/
+    private String phone;
+    /*司机到达时间*/
+    private long arriveTime;
+    /*用户乘车次数*/
+    private Integer taxiNum;
+    /*全程距离*/
+    private Integer distanceAll;
+    /*推单时间*/
+    private Integer pushTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
+    public Integer getIsEnvelope() {
+        return isEnvelope;
+    }
+
+    public void setIsEnvelope(Integer isEnvelope) {
+        this.isEnvelope = isEnvelope;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getHeadImg() {
+        return headImg;
+    }
+
+    public void setHeadImg(String headImg) {
+        this.headImg = headImg;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public long getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(long arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Integer getTaxiNum() {
+        return taxiNum;
+    }
+
+    public void setTaxiNum(Integer taxiNum) {
+        this.taxiNum = taxiNum;
+    }
+
+    public Integer getDistanceAll() {
+        return distanceAll;
+    }
+
+    public void setDistanceAll(Integer distanceAll) {
+        this.distanceAll = distanceAll;
+    }
+
+    public Integer getPushTime() {
+        return pushTime;
+    }
+
+    public void setPushTime(Integer pushTime) {
+        this.pushTime = pushTime;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiListDriverVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiListDriverVo.java
new file mode 100644
index 0000000..95da0e5
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiListDriverVo.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+import java.util.Date;
+
+/**
+ * 司机端订单列表
+ */
+public class OrderTaxiListDriverVo {
+    /*订单id*/
+    private Integer id;
+    /*状态*/
+    private Integer state;
+    /*距离*/
+    private Double distance;
+    /*起点*/
+    private String startName;
+    /*终点*/
+    private String endName;
+    /*下单时间*/
+    private Date addTime;
+    /*是否使用红包*/
+    private Integer isEnvelope;
+    /*红包金额*/
+    private Double  money;
+    /*起点经度*/
+    private Double startLon;
+    /*起点纬度*/
+    private Double startLat;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
+    public Integer getIsEnvelope() {
+        return isEnvelope;
+    }
+
+    public void setIsEnvelope(Integer isEnvelope) {
+        this.isEnvelope = isEnvelope;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    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;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiListVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiListVo.java
new file mode 100644
index 0000000..5158916
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiListVo.java
@@ -0,0 +1,98 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+
+/**
+ * 用户端订单列表
+ */
+public class OrderTaxiListVo {
+    /*订单id*/
+    private Integer id;
+    /*状态*/
+    private Integer state;
+    /*用户id*/
+    private Integer userId;
+    /*起点*/
+    private String startName;
+    /*终点*/
+    private String endName;
+    /*下单时间*/
+    private String addTime;
+    /*订单编号*/
+    private String orderNum;
+    /*是否评价(1未评价,2已评价)*/
+    private Integer isEvaluate;
+    /*司机id*/
+    private Integer driverId=0;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    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 getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public String getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(String addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getIsEvaluate() {
+        return isEvaluate;
+    }
+
+    public void setIsEvaluate(Integer isEvaluate) {
+        this.isEvaluate = isEvaluate;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiVo.java
new file mode 100644
index 0000000..d4a4e25
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderTaxiVo.java
@@ -0,0 +1,302 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+import java.util.Date;
+
+/**
+ * 用户端订单详情
+ */
+public class OrderTaxiVo {
+    /*订单id*/
+    private Integer id;
+    /*订单号*/
+    private String  orderNum;
+    /*状态*/
+    private Integer state;
+    /*起点*/
+    private String startName;
+    /*是否使用红包(1使用,2不使用)*/
+    private Integer isEnvelope;
+    /*红包金额*/
+    private Double money;
+    /*终点*/
+    private String endName;
+    /*下单时间*/
+    private Long addTime;
+    /*起点经度*/
+    private Double startLon;
+    /*起点纬度*/
+    private Double startLat;
+    /*终点经度*/
+    private Double endLon;
+    /*终点纬度*/
+    private Double endLat;
+    /*司机头像*/
+    private  String headImg="";
+    /*司机名称*/
+    private String name="";
+    /*车牌*/
+    private String carNum="";
+    /*车辆品牌*/
+    private String carType="";
+    /*电话*/
+    private String phone="";
+    /*总完成单数*/
+    private Integer totalOrders=0;
+    /*司机评分*/
+    private Double evaluateScore=0d;
+    /*司机位置经度*/
+    private Double lon=0d;
+    /*司机位置 纬度*/
+    private Double lat=0d;
+    /*预计到达时间*/
+    private Integer arrivalTime=0;
+    /*距离*/
+    private Double distance=0d;
+    /*司机到达预约地点时间*/
+    private Long arriveTime;
+    /*是否评价(1未评价,2已评价)*/
+    private Integer isEvaluate;
+    /*司机id*/
+    private Integer driverId=0;
+    /*评价分数*/
+    private Integer score;
+    /*评价内容*/
+    private String content;
+
+    /**
+     * 订单取消状态(1有效,2无效)
+     */
+    private Integer cancelState;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public Long getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Long addTime) {
+        this.addTime = addTime;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public Integer getArrivalTime() {
+        return arrivalTime;
+    }
+
+    public void setArrivalTime(Integer arrivalTime) {
+        this.arrivalTime = arrivalTime;
+    }
+
+    public String getHeadImg() {
+        return headImg;
+    }
+
+    public void setHeadImg(String headImg) {
+        this.headImg = headImg;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(String carNum) {
+        this.carNum = carNum;
+    }
+
+    public String getCarType() {
+        return carType;
+    }
+
+    public void setCarType(String carType) {
+        this.carType = carType;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getTotalOrders() {
+        return totalOrders;
+    }
+
+    public void setTotalOrders(Integer  totalOrders) {
+        this.totalOrders = totalOrders;
+    }
+
+    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;
+    }
+
+    public Long getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Long arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Integer getIsEvaluate() {
+        return isEvaluate;
+    }
+
+    public void setIsEvaluate(Integer isEvaluate) {
+        this.isEvaluate = isEvaluate;
+    }
+
+    public Double getEvaluateScore() {
+        return evaluateScore;
+    }
+
+    public void setEvaluateScore(Double evaluateScore) {
+        this.evaluateScore = evaluateScore;
+    }
+
+    public Integer getIsEnvelope() {
+        return isEnvelope;
+    }
+
+    public void setIsEnvelope(Integer isEnvelope) {
+        this.isEnvelope = isEnvelope;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getScore() {
+        return score;
+    }
+
+    public void setScore(Integer score) {
+        this.score = score;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getCancelState() {
+        return cancelState;
+    }
+
+    public void setCancelState(Integer cancelState) {
+        this.cancelState = cancelState;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderVo.java
new file mode 100644
index 0000000..e81ddb0
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/OrderVo.java
@@ -0,0 +1,107 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+import java.util.Date;
+
+public class OrderVo {
+    private Integer current;
+
+
+    private Integer size;
+
+    private Integer userId;
+
+    private Integer type;
+
+
+    private Integer carId;
+
+    private Integer shiftId;
+
+    private Integer lineId;
+
+    private Integer driverId;
+
+    private Integer companyId;
+
+    private Date searchDate;
+
+    public Integer getShiftId() {
+        return shiftId;
+    }
+
+    public void setShiftId(Integer shiftId) {
+        this.shiftId = shiftId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getCurrent() {
+        return current;
+    }
+
+    public void setCurrent(Integer current) {
+        this.current = current;
+    }
+
+    public Integer getSize() {
+        return size;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Date getSearchDate() {
+        return searchDate;
+    }
+
+    public void setSearchDate(Date searchDate) {
+        this.searchDate = searchDate;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/ShiftVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/ShiftVo.java
new file mode 100644
index 0000000..ad738e8
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/ShiftVo.java
@@ -0,0 +1,108 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+/**
+ *
+ * 班次拓展类
+ */
+public class ShiftVo {
+    //模板班次ID
+    private Integer id;
+
+
+    //班次出发时间
+    private String startTime;
+
+
+    //总票数
+    private Integer num;
+
+
+    //出发站名称
+    private String beginName;
+
+
+    //目的地名称
+    private String endName;
+
+    //剩余票数
+    private Integer remaining;
+
+    //是否为最近发出班次
+    private Integer isLately=0;
+    //0否1是
+    private Integer isOwner;
+
+    private Integer shiftId;
+
+    public Integer getRemaining() {
+        return remaining;
+    }
+
+    public void setRemaining(Integer remaining) {
+        this.remaining = remaining;
+    }
+
+    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 Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getBeginName() {
+        return beginName;
+    }
+
+    public void setBeginName(String beginName) {
+        this.beginName = beginName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    public Integer getIsLately() {
+        return isLately;
+    }
+
+    public void setIsLately(Integer isLately) {
+        this.isLately = isLately;
+    }
+
+    public Integer getIsOwner() {
+        return isOwner;
+    }
+
+    public void setIsOwner(Integer isOwner) {
+        this.isOwner = isOwner;
+    }
+
+    public Integer getShiftId() {
+        return shiftId;
+    }
+
+    public void setShiftId(Integer shiftId) {
+        this.shiftId = shiftId;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/SiteLineVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/SiteLineVo.java
new file mode 100644
index 0000000..a2dc2e7
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/SiteLineVo.java
@@ -0,0 +1,91 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+
+public class SiteLineVo {
+
+
+    //上车站点名称
+    private String startName;
+
+
+    //目的地名称
+    private String endName;
+
+
+
+    //线路ID
+    private Integer lineId;
+
+
+
+    //距离
+    private Integer dis;
+
+
+    //上车站点
+    private Integer siteId;
+
+    //价格
+    private Double money;
+
+    private Integer istu;
+
+
+    public Integer getIstu() {
+        return istu;
+    }
+
+    public void setIstu(Integer istu) {
+        this.istu = istu;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public String getStartName() {
+        return startName;
+    }
+
+    public void setStartName(String startName) {
+        this.startName = startName;
+    }
+
+    public String getEndName() {
+        return endName;
+    }
+
+    public void setEndName(String endName) {
+        this.endName = endName;
+    }
+
+    
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getDis() {
+        return dis;
+    }
+
+    public void setDis(Integer dis) {
+        this.dis = dis;
+    }
+
+    public Integer getSiteId() {
+        return siteId;
+    }
+
+    public void setSiteId(Integer siteId) {
+        this.siteId = siteId;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/SiteVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/SiteVo.java
new file mode 100644
index 0000000..af960c3
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/SiteVo.java
@@ -0,0 +1,164 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+public class SiteVo {
+
+    private Integer id;
+    private Integer siteId;
+
+    private String siteName;
+
+    private Integer endId;
+
+
+    private Integer dis;
+
+    private Double lon;
+
+
+    private Double lat;
+
+
+    private Integer isType;
+
+    private Integer type;
+
+    private Integer lineId;
+
+    private Integer sort;
+    /**
+     * 距离
+     */
+    private Double distance=0d;
+    /**
+     * 停止售卖时间(发车/到站时间前N分钟)
+     */
+    private Integer stopTime;
+    /**
+     * 每个站点预计到站时间
+     */
+    private String estimatedTime;
+    /**
+     * 经纬度
+     */
+    private String latLon ;
+
+    public String getLatLon() {
+        return latLon;
+    }
+
+    public void setLatLon(String latLon) {
+        this.latLon = latLon;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getIsType() {
+        return isType;
+    }
+
+    public void setIsType(Integer isType) {
+        this.isType = isType;
+    }
+
+    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;
+    }
+
+    public Integer getDis() {
+        return dis;
+    }
+
+    public void setDis(Integer dis) {
+        this.dis = dis;
+    }
+
+    public Integer getEndId() {
+        return endId;
+    }
+
+    public void setEndId(Integer endId) {
+        this.endId = endId;
+    }
+
+    public Integer getSiteId() {
+        return siteId;
+    }
+
+    public void setSiteId(Integer siteId) {
+        this.siteId = siteId;
+    }
+
+    public String getSiteName() {
+        return siteName;
+    }
+
+    public void setSiteName(String siteName) {
+        this.siteName = siteName;
+    }
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
+    public Integer getStopTime() {
+        return stopTime;
+    }
+
+    public void setStopTime(Integer stopTime) {
+        this.stopTime = stopTime;
+    }
+
+    public String getEstimatedTime() {
+        return estimatedTime;
+    }
+
+    public void setEstimatedTime(String estimatedTime) {
+        this.estimatedTime = estimatedTime;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/UserSetVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/UserSetVo.java
new file mode 100644
index 0000000..f8578c8
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/model/vo/UserSetVo.java
@@ -0,0 +1,51 @@
+package com.stylefeng.guns.modular.shunfeng.model.vo;
+
+public class UserSetVo {
+    
+    /** 是否接收消息 */
+    private Integer isReceiveMsg;
+
+    /** 是否开启手势 */
+    private Integer isEnableHandPwd;
+
+    /** 用户协议 */
+    private String userAgreementH5;
+
+    /** 关于我们 */
+    private String aboutUsH5;
+
+    public UserSetVo() {
+    }
+
+    public Integer getIsReceiveMsg() {
+        return isReceiveMsg;
+    }
+
+    public void setIsReceiveMsg(Integer isReceiveMsg) {
+        this.isReceiveMsg = isReceiveMsg;
+    }
+
+    public Integer getIsEnableHandPwd() {
+        return isEnableHandPwd;
+    }
+
+    public void setIsEnableHandPwd(Integer isEnableHandPwd) {
+        this.isEnableHandPwd = isEnableHandPwd;
+    }
+
+    public String getUserAgreementH5() {
+        return userAgreementH5;
+    }
+
+    public void setUserAgreementH5(String userAgreementH5) {
+        this.userAgreementH5 = userAgreementH5;
+    }
+
+    public String getAboutUsH5() {
+        return aboutUsH5;
+    }
+
+    public void setAboutUsH5(String aboutUsH5) {
+        this.aboutUsH5 = aboutUsH5;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IBrandService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IBrandService.java
new file mode 100644
index 0000000..e130e3a
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IBrandService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.Brand;
+
+/**
+ * <p>
+ * 顺风车品牌 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-27
+ */
+public interface IBrandService extends IService<Brand> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IComplaintsService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IComplaintsService.java
new file mode 100644
index 0000000..679eda1
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IComplaintsService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.Complaints;
+
+/**
+ * <p>
+ * 投诉管理; InnoDB free: 6144 kB 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+public interface IComplaintsService extends IService<Complaints> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IDriverRideService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IDriverRideService.java
new file mode 100644
index 0000000..c9eb3a5
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IDriverRideService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.DriverRide;
+
+/**
+ * <p>
+ * 顺风车司机 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+public interface IDriverRideService extends IService<DriverRide> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IEvaluateService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IEvaluateService.java
new file mode 100644
index 0000000..f35de8f
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IEvaluateService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.Evaluate;
+
+/**
+ * <p>
+ * 评价; InnoDB free: 10240 kB 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-08-29
+ */
+public interface IEvaluateService extends IService<Evaluate> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IFinancialService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IFinancialService.java
new file mode 100644
index 0000000..5312600
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IFinancialService.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.Financial;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 财务管理; InnoDB free: 6144 kB 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+public interface IFinancialService extends IService<Financial> {
+    /**
+     * 获取司机消费记录
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getOrderRecord(Map<String,Object> map);
+    /**
+     * 获取收入和支出总数据
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getOrderSum(Map<String,Object> map);
+    /**
+     * 获取司机消费记录(出租车)
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getOrderRecordTaxi(Map<String,Object> map);
+    /**
+     * 获取收入和支出总数据(出租车)
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getOrderSumTaxi(Map<String,Object> map);
+    /**
+     * 获取用户我的消费记录
+     * @param map
+     * @return
+     */
+    List<Map<String,Object>> getFinancialUser(Map<String,Object> map);
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IOrderRideService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IOrderRideService.java
new file mode 100644
index 0000000..7377cd8
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IOrderRideService.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.OrderRide;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideInfoVo;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 顺风车订单 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+public interface IOrderRideService extends IService<OrderRide> {
+    /**
+     *用户顺风车订单
+     * @param orderRideVo
+     * @return
+     */
+    List<OrderRideVo> getOrderRide(OrderRideVo orderRideVo);
+    /**
+     * 获取用户身份和司机身份的订单 只需要按照时间排序
+     * @param orderRideVo
+     * @return
+     */
+    List<OrderRideVo> getOrderRideAndTravel(OrderRideVo orderRideVo);
+    /**
+     * 根据订单id获取订单详情
+     * @param orderRideInfoVo
+     * @return
+     */
+    OrderRideInfoVo getOrderInfo(OrderRideInfoVo orderRideInfoVo);
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IOrderTravelService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IOrderTravelService.java
new file mode 100644
index 0000000..e160eb4
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IOrderTravelService.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.OrderTravel;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideInfoVo;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 顺风车司机行程 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+public interface IOrderTravelService extends IService<OrderTravel> {
+    /**
+     *顺风车司机订单行程
+     * @param orderRideVo
+     * @return
+     */
+    List<OrderRideVo> getOrderTravel(OrderRideVo orderRideVo);
+    /**
+     * 根据订单id获取订单详情
+     * @param orderRideInfoVo
+     * @return
+     */
+    OrderRideInfoVo getOrderInfo(OrderRideInfoVo orderRideInfoVo);
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IParamRideService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IParamRideService.java
new file mode 100644
index 0000000..99054e2
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IParamRideService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.ParamRide;
+
+/**
+ * <p>
+ * 顺风车设置 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+public interface IParamRideService extends IService<ParamRide> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IParamService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IParamService.java
new file mode 100644
index 0000000..30ef33b
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IParamService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.Param;
+
+/**
+ * <p>
+ * 系统设置; InnoDB free: 6144 kB 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+public interface IParamService extends IService<Param> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/ITimeTaskService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/ITimeTaskService.java
new file mode 100644
index 0000000..14a6d8b
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/ITimeTaskService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.TimeTask;
+
+/**
+ * <p>
+ * 定时任务数据; InnoDB free: 11264 kB 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-08-10
+ */
+public interface ITimeTaskService extends IService<TimeTask> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IUserApplyService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IUserApplyService.java
new file mode 100644
index 0000000..a20c750
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/IUserApplyService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.shunfeng.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.shunfeng.model.UserApply;
+
+/**
+ * <p>
+ * 用户和司机申请表 服务类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-22
+ */
+public interface IUserApplyService extends IService<UserApply> {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/BrandServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/BrandServiceImpl.java
new file mode 100644
index 0000000..c6db61b
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/BrandServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.BrandMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Brand;
+import com.stylefeng.guns.modular.shunfeng.service.IBrandService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 顺风车品牌 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-27
+ */
+@Service
+public class BrandServiceImpl extends ServiceImpl<BrandMapper, Brand> implements IBrandService {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ComplaintsServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ComplaintsServiceImpl.java
new file mode 100644
index 0000000..3262094
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ComplaintsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.ComplaintsMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Complaints;
+import com.stylefeng.guns.modular.shunfeng.service.IComplaintsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 投诉管理; InnoDB free: 6144 kB 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+@Service
+public class ComplaintsServiceImpl extends ServiceImpl<ComplaintsMapper, Complaints> implements IComplaintsService {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/DriverRideServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/DriverRideServiceImpl.java
new file mode 100644
index 0000000..b29e293
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/DriverRideServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.DriverRideMapper;
+import com.stylefeng.guns.modular.shunfeng.model.DriverRide;
+import com.stylefeng.guns.modular.shunfeng.service.IDriverRideService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 顺风车司机 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+@Service
+public class DriverRideServiceImpl extends ServiceImpl<DriverRideMapper, DriverRide> implements IDriverRideService {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/EvaluateServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/EvaluateServiceImpl.java
new file mode 100644
index 0000000..93d94ec
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/EvaluateServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.EvaluateMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Evaluate;
+import com.stylefeng.guns.modular.shunfeng.service.IEvaluateService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 评价; InnoDB free: 10240 kB 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-08-29
+ */
+@Service
+public class EvaluateServiceImpl extends ServiceImpl<EvaluateMapper, Evaluate> implements IEvaluateService {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/FinancialServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/FinancialServiceImpl.java
new file mode 100644
index 0000000..6f683f1
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/FinancialServiceImpl.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.FinancialMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Financial;
+import com.stylefeng.guns.modular.shunfeng.service.IFinancialService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 财务管理; InnoDB free: 6144 kB 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+@Service
+public class FinancialServiceImpl extends ServiceImpl<FinancialMapper, Financial> implements IFinancialService {
+    @Override
+    public List<Map<String, Object>> getOrderRecord(Map<String, Object> map) {
+        return this.baseMapper.getOrderRecord(map);
+    }
+
+    @Override
+    public List<Map<String, Object>> getOrderSum(Map<String, Object> map) {
+        return this.baseMapper.getOrderSum(map);
+    }
+
+    @Override
+    public List<Map<String, Object>> getOrderRecordTaxi(Map<String, Object> map) {
+        return this.baseMapper.getOrderRecordTaxi(map);
+    }
+
+    @Override
+    public List<Map<String, Object>> getOrderSumTaxi(Map<String, Object> map) {
+        return this.baseMapper.getOrderSumTaxi(map);
+    }
+
+    @Override
+    public List<Map<String, Object>> getFinancialUser(Map<String, Object> map) {
+        return this.baseMapper.getFinancialUser(map);
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/OrderRideServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/OrderRideServiceImpl.java
new file mode 100644
index 0000000..3912c9d
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/OrderRideServiceImpl.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.OrderRideMapper;
+import com.stylefeng.guns.modular.shunfeng.model.OrderRide;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideInfoVo;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo;
+import com.stylefeng.guns.modular.shunfeng.service.IOrderRideService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 顺风车订单 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+@Service
+public class OrderRideServiceImpl extends ServiceImpl<OrderRideMapper, OrderRide> implements IOrderRideService {
+    @Override
+    public List<OrderRideVo> getOrderRide(OrderRideVo orderRideVo) {
+        return this.baseMapper.getOrderRide(orderRideVo);
+    }
+
+    @Override
+    public List<OrderRideVo> getOrderRideAndTravel(OrderRideVo orderRideVo) {
+        return this.baseMapper.getOrderRideAndTravel(orderRideVo);
+    }
+
+    @Override
+    public OrderRideInfoVo getOrderInfo(OrderRideInfoVo orderRideInfoVo) {
+        return this.baseMapper.getOrderInfo(orderRideInfoVo);
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/OrderTravelServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/OrderTravelServiceImpl.java
new file mode 100644
index 0000000..475a3c4
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/OrderTravelServiceImpl.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.OrderTravelMapper;
+import com.stylefeng.guns.modular.shunfeng.model.OrderTravel;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideInfoVo;
+import com.stylefeng.guns.modular.shunfeng.model.vo.OrderRideVo;
+import com.stylefeng.guns.modular.shunfeng.service.IOrderTravelService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 顺风车司机行程 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+@Service
+public class OrderTravelServiceImpl extends ServiceImpl<OrderTravelMapper, OrderTravel> implements IOrderTravelService {
+    @Override
+    public List<OrderRideVo> getOrderTravel(OrderRideVo orderRideVo) {
+        return this.baseMapper.getOrderTravel(orderRideVo);
+    }
+
+    @Override
+    public OrderRideInfoVo getOrderInfo(OrderRideInfoVo orderRideInfoVo) {
+        return this.baseMapper.getOrderInfo(orderRideInfoVo);
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ParamRideServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ParamRideServiceImpl.java
new file mode 100644
index 0000000..29732e7
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ParamRideServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.ParamRideMapper;
+import com.stylefeng.guns.modular.shunfeng.model.ParamRide;
+import com.stylefeng.guns.modular.shunfeng.service.IParamRideService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 顺风车设置 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-26
+ */
+@Service
+public class ParamRideServiceImpl extends ServiceImpl<ParamRideMapper, ParamRide> implements IParamRideService {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ParamServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ParamServiceImpl.java
new file mode 100644
index 0000000..d1e7916
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/ParamServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.ParamMapper;
+import com.stylefeng.guns.modular.shunfeng.model.Param;
+import com.stylefeng.guns.modular.shunfeng.service.IParamService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置; InnoDB free: 6144 kB 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-06-11
+ */
+@Service
+public class ParamServiceImpl extends ServiceImpl<ParamMapper, Param> implements IParamService {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/TimeTaskServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/TimeTaskServiceImpl.java
new file mode 100644
index 0000000..dd0f6a1
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/TimeTaskServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.TimeTaskMapper;
+import com.stylefeng.guns.modular.shunfeng.model.TimeTask;
+import com.stylefeng.guns.modular.shunfeng.service.ITimeTaskService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 定时任务数据; InnoDB free: 11264 kB 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2019-08-10
+ */
+@Service
+public class TimeTaskServiceImpl extends ServiceImpl<TimeTaskMapper, TimeTask> implements ITimeTaskService {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/UserApplyServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/UserApplyServiceImpl.java
new file mode 100644
index 0000000..de070eb
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/service/impl/UserApplyServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.shunfeng.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.shunfeng.dao.UserApplyMapper;
+import com.stylefeng.guns.modular.shunfeng.model.UserApply;
+import com.stylefeng.guns.modular.shunfeng.service.IUserApplyService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户和司机申请表 服务实现类
+ * </p>
+ *
+ * @author wumeng123
+ * @since 2020-04-22
+ */
+@Service
+public class UserApplyServiceImpl extends ServiceImpl<UserApplyMapper, UserApply> implements IUserApplyService {
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/TestJob.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/TestJob.java
new file mode 100644
index 0000000..adc81a9
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/TestJob.java
@@ -0,0 +1,13 @@
+package com.stylefeng.guns.modular.shunfeng.task;/*public class TestJob extends AbstractJob {
+
+	@Override
+	public void execute(JobExecutionContext context) throws JobExecutionException {
+			logger.debug("Start >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
+		 	Integer serial = (Integer) context.get("serialize");
+			Integer keys = context.getMergedJobDataMap().getIntValue("keys");
+			System.out.println(">>>>>>>>>>> serial:"+serial);
+			System.out.println(">>>>>>>>>>> keys:"+keys);
+			
+			System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>"+DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
+	}
+}*/
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/ThreadTes.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/ThreadTes.java
new file mode 100644
index 0000000..9353132
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/ThreadTes.java
@@ -0,0 +1,25 @@
+package com.stylefeng.guns.modular.shunfeng.task;
+
+
+public class ThreadTes implements Runnable{
+	@Override
+	public void run() {
+		try {
+			System.out.println(">>>>>>>>>>>>>>>>>>> start ");
+			Thread.sleep(2000);
+			System.out.println(">>>>>>>>>>>>>>>>>>> remove job 5 ");
+			/*QuartzManager.removeJob(String.valueOf(5), 
+					TimeJobType.NEWS);*/
+			System.out.println(">>>>>>>>>>>>>>>>>>> stop");
+			
+			
+			Thread.sleep(2000);
+			System.out.println(">>>>>>>>>>>>>>>>>>> modify job 10 ");
+			//QuartzManager.modifyJobTime(String.valueOf(10), TimeJobType.NEWS, new Date(Calendar.getInstance().getTimeInMillis() + 20*1000));
+			System.out.println(">>>>>>>>>>>>>>>>>>> stop");
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/AbstractJob.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/AbstractJob.java
new file mode 100644
index 0000000..4977ffa
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/AbstractJob.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.modular.shunfeng.task.base;
+
+
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import com.stylefeng.guns.modular.shunfeng.service.IOrderRideService;
+import com.stylefeng.guns.modular.shunfeng.service.IParamService;
+import com.stylefeng.guns.modular.shunfeng.service.ITimeTaskService;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public abstract class AbstractJob implements Job{
+	protected Logger logger = LoggerFactory.getLogger(getClass());
+	
+	@Override
+	public abstract void execute(JobExecutionContext context) throws JobExecutionException;
+
+
+	protected ITimeTaskService timeTaskService;
+
+
+	protected IParamService paramService;
+
+
+	protected IOrderRideService orderRideService;
+
+	public AbstractJob(){
+		this.timeTaskService = SpringContextHolder.getBean( ITimeTaskService.class);
+		this.paramService = SpringContextHolder.getBean( IParamService.class);
+		this.orderRideService = SpringContextHolder.getBean( IOrderRideService.class);
+
+	}
+
+	 
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/QuartzManager.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/QuartzManager.java
new file mode 100644
index 0000000..caf0df6
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/QuartzManager.java
@@ -0,0 +1,132 @@
+package com.stylefeng.guns.modular.shunfeng.task.base;
+
+import org.quartz.*;
+import org.quartz.impl.StdSchedulerFactory;
+
+import java.util.Date;
+import java.util.Map;
+
+public class QuartzManager {
+	private static SchedulerFactory factory = new StdSchedulerFactory();
+	private static final String TRIGGER_NAME_PREFIX = "TRIGGER_PREFIX_";
+	private static final String JOB_NAME_PREFIX = "JOB_PREFIX_";
+	
+	/**
+	 * 添加定时任务:具体某个时间点执行一次的任务,如:在某个2015-06-01 12:00发送一条消息
+	 * 
+	 * @param class1
+	 * @param jobName
+	 *            具体的任务名+ID标识唯一
+	 * @param jobType
+	 * @param date
+	 * @param jp
+	 */
+	public synchronized static void addJob(Class<? extends Job> jobClass, String jobName, TimeJobType jobType, Date date,
+                                           Map<String,  ? extends Object> jp) {
+		//logger.debug("ADD JOB {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+		try {
+			Scheduler sched = factory.getScheduler();
+			JobDetail job = JobBuilder.newJob(jobClass).withIdentity(JOB_NAME_PREFIX + jobName, jobType.getType())
+					.setJobData(new JobDataMap(jp)).build();
+
+			SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
+					.withIdentity(TRIGGER_NAME_PREFIX + jobName, jobType.getType()).startAt(date).build();
+			removeJob(jobName, jobType);
+			
+			sched.scheduleJob(job, trigger);
+
+			if (!sched.isShutdown()) {
+				sched.start();
+			}
+		} catch (Exception e) {
+			//logger.error("ADD JOB exception {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+		}
+	}
+	
+	   /**
+	    * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) 
+	    * @param jobName 
+	    * @param time 
+	    */  
+	    public synchronized static void modifyJobTime(String jobName, TimeJobType jobType, Date time) {
+	    	 //logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+	        try {  
+	        	JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+				TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
+				
+				
+	            Scheduler sched = factory.getScheduler();  
+	            SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(key);  
+	            if(trigger == null) {  
+	                return;  
+	            }  
+	            Date oldTime = trigger.getStartTime();
+	          
+	            if (oldTime.getTime() != time.getTime()) {  
+	                JobDetail jobDetail = sched.getJobDetail(jobKey);  
+	                Class<? extends Job> objJobClass = jobDetail.getJobClass();  
+	                removeJob(jobName,jobType);  
+	                Map<String, Object> jp = jobDetail.getJobDataMap();
+	                addJob(objJobClass, jobName, jobType, time, jp); 
+	            }  
+	        } catch (Exception e) {  
+	           // logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+	        }  
+	    }
+
+	/**
+	 * 移除一个任务
+	 * 
+	 * @param jobName
+	 * @param jobGroupName
+	 * @param triggerName
+	 * @param triggerGroupName
+	 */
+	public synchronized static void removeJob(String jobName, TimeJobType jobType) {
+		try {
+			JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+			TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
+			Scheduler sched = factory.getScheduler();
+
+			JobDetail detail = sched.getJobDetail(jobKey);
+			if (detail != null) {
+				sched.pauseJob(jobKey);
+				sched.pauseTrigger(key);// 停止触发器
+				sched.unscheduleJob(key);// 移除触发器
+				sched.deleteJob(jobKey);// 删除任务
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 启动所有定时任务
+	 */
+	public synchronized static void startJobs() {
+		try {
+			Scheduler sched = factory.getScheduler();
+			sched.start();
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 关闭所有定时任务
+	 */
+	public synchronized static void shutdownJobs() {
+		try {
+			Scheduler sched = factory.getScheduler();
+			if (!sched.isShutdown()) {
+				sched.shutdown();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/TimeJobType.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/TimeJobType.java
new file mode 100644
index 0000000..dc3be1a
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/base/TimeJobType.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.shunfeng.task.base;
+
+/**
+ * @Description 按时间点发布的任务类型
+ * @author Leeyns
+ * @date 2016年5月17日 下午7:22:28
+ */
+public enum TimeJobType {
+	UNLOCK("UNLOCK","是否过期"),
+	SDFE("UNLOCK","是否过期111"),
+	DSGQ("DSGQ","是否拼房失败");
+	private String type;
+	private String desc;
+	private TimeJobType(String type, String desc) {
+		this.type = type;
+		this.desc = desc;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getDesc() {
+		return desc;
+	}
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+	
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/exceptions/TimeException.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/exceptions/TimeException.java
new file mode 100644
index 0000000..6fb5550
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/exceptions/TimeException.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.shunfeng.task.exceptions;
+
+/** 
+ * @文件说明:定时器任务执行异常 
+ * @版权所有:成都喜来达
+ * @项目名称: fengsheng
+ * @创建者: Leeyns 
+ * @创建日期: 2016年5月18日
+ * @最近修改者:Leeyns 
+ * @最近修改日期:2016年5月18日
+ */ 
+public class TimeException extends Exception {
+
+	/**
+	 *  TODO
+	 */
+	private static final long serialVersionUID = 5703430073981692250L;
+
+	private String message;
+	
+	public TimeException() {
+		super();
+	}
+	
+	public TimeException(String message) {
+		super(message);
+		this.message = message;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/jobs/CourseExamineRide.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/jobs/CourseExamineRide.java
new file mode 100644
index 0000000..5e72d18
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/task/jobs/CourseExamineRide.java
@@ -0,0 +1,43 @@
+package com.stylefeng.guns.modular.shunfeng.task.jobs;
+
+import com.stylefeng.guns.modular.shunfeng.model.OrderRide;
+import com.stylefeng.guns.modular.shunfeng.model.TimeTask;
+import com.stylefeng.guns.modular.shunfeng.task.base.AbstractJob;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+/**
+ *  支付倒计时
+ *  @author lvxue
+ *  @date 2019年01月22日
+ *  @version 1.0
+ */
+public class CourseExamineRide extends AbstractJob {
+
+    public static final String DSCE = "orderRide";
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        JobDataMap maps = context.getMergedJobDataMap();
+        Integer orderId = maps.getInt("orderId");
+        Integer timeTaskId = maps.getInt("timeTaskId");
+        try {
+            System.out.println("----当id为:"+orderId+"的订单未支付,自动取消支付,释放");
+
+            OrderRide order = this.orderRideService.selectById(orderId);
+            if(order.getState().equals(1) || order.getState() ==1 ){
+                //自动取消
+                order.setState(6);
+                this.orderRideService.updateById(order);
+            }
+            //修改定时任务数据状态
+            TimeTask timeTask=timeTaskService.selectById(timeTaskId);
+            //0有效,1无效
+            timeTask.setState(1);
+            timeTaskService.updateById(timeTask);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/WXPay.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/WXPay.java
new file mode 100644
index 0000000..4ef0934
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/WXPay.java
@@ -0,0 +1,307 @@
+package com.stylefeng.guns.modular.shunfeng.tencent;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Configure;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayConfig;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayConstants;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayUtil;
+import com.stylefeng.guns.modular.shunfeng.tencent.protocol.RefundReqData;
+import com.stylefeng.guns.modular.shunfeng.tencent.protocol.UnifiedorderReqData;
+import com.stylefeng.guns.modular.shunfeng.tencent.protocol.WXPayRequest;
+import com.stylefeng.guns.modular.shunfeng.tencent.service.RefundService;
+import com.stylefeng.guns.modular.shunfeng.tencent.service.UnifiedorderService;
+
+import java.util.Map;
+
+
+
+
+/**
+ * SDK总入口
+ */
+/**
+ * SDK总入口
+ */
+public class WXPay {
+	
+	  private WXPayConfig config;
+	    private WXPayConstants.SignType signType;
+	    private boolean autoReport;
+	    private boolean useSandbox;
+	    private String notifyUrl;
+	    private WXPayRequest wxPayRequest;
+	 
+	    public WXPay(final WXPayConfig config) throws Exception {
+	        this(config, null, true, false);
+	    }
+
+	    public WXPay(final WXPayConfig config, final boolean autoReport) throws Exception {
+	        this(config, null, autoReport, false);
+	    }
+
+
+	    public WXPay(final WXPayConfig config, final boolean autoReport, final boolean useSandbox) throws Exception{
+	        this(config, null, autoReport, useSandbox);
+	    }
+
+	    public WXPay(final WXPayConfig config, final String notifyUrl) throws Exception {
+	        this(config, notifyUrl, true, false);
+	    }
+
+	    public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport) throws Exception {
+	        this(config, notifyUrl, autoReport, false);
+	    }
+
+	    public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
+	        this.config = config;
+	        this.notifyUrl = notifyUrl;
+	        this.autoReport = autoReport;
+	        this.useSandbox = useSandbox;
+	        if (useSandbox) {
+	            this.signType = WXPayConstants.SignType.MD5; // 沙箱环境
+	        }
+	        else {
+	            this.signType = WXPayConstants.SignType.HMACSHA256;
+	        }
+	        this.wxPayRequest = new WXPayRequest(config);
+	    }
+
+    /**
+     * 初始化SDK依赖的几个关键配置
+     * @param key 签名算法需要用到的秘钥
+     * @param appID 公众账号ID
+     * @param mchID 商户ID
+     * @param sdbMchID 子商户ID,受理模式必填
+     * @param certLocalPath HTTP证书在服务器中的路径,用来加载证书用
+     * @param certPassword HTTP证书的密码,默认等于MCHID
+     */
+    public static void initSDKConfiguration(String key,String appID,String mchID,String sdbMchID,String certLocalPath,String certPassword){
+        System.out.println("________@@@@@______initSDKConfiguration");
+    	Configure.setKey(key);
+        Configure.setAppID(appID);
+        Configure.setMchID(mchID);
+        Configure.setSubMchID(sdbMchID);
+        Configure.setCertLocalPath(certLocalPath);
+        Configure.setCertPassword(certPassword);
+    }
+    
+    /**
+     * 请求统一下单服务
+     */
+    public static String requestUnifiedorderService(Integer apptype, UnifiedorderReqData unifiedorderReqData) throws Exception{
+        return new UnifiedorderService(apptype).request(unifiedorderReqData);
+    }
+    
+    
+    /**
+     * 商家向用户付款(提现)
+     */
+   /* public static String requestPayToTheUserService(Integer apptype, PayToTheUserReqData payToTheUserReqData) throws Exception{
+        return new PayToTheUserService(apptype).request(payToTheUserReqData);
+    }*/
+
+    /**
+     * 请求退款服务
+     */
+    public static String requestRefundService(Integer apptype, RefundReqData refundReqData) throws Exception{
+        return new RefundService(apptype).request(refundReqData);
+    }
+    
+    /**
+     * 提交刷卡支付,针对软POS,尽可能做成功
+     * 内置重试机制,最多60s
+     * @param reqData
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> microPayWithPos(Map<String, String> reqData) throws Exception {
+        return this.microPayWithPos(reqData, 6*1000);
+    }
+    
+    /**
+     * 作用:提交刷卡支付<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> microPay(Map<String, String> reqData) throws Exception {
+        return this.microPay(reqData, 6*1000, 8*1000);
+    }
+
+
+    /**
+     * 作用:提交刷卡支付<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> microPay(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+       /* if (this.useSandbox) {//沙箱环境
+            url = WXPayConstants.SANDBOX_MICROPAY_URL_SUFFIX;
+        }*/
+        url = WXPayConstants.MICROPAY_URL_SUFFIX;
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+    /**
+     * 不需要证书的请求
+     * @param urlSuffix String
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 超时时间,单位是毫秒
+     * @param readTimeoutMs 超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public String requestWithoutCert(String urlSuffix, Map<String, String> reqData,
+                                     int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String msgUUID = reqData.get("nonce_str");
+        String reqBody = WXPayUtil.mapToXml(reqData);
+
+        String resp = new WXPayRequest(config).requestWithoutCert(urlSuffix, msgUUID, reqBody, connectTimeoutMs, readTimeoutMs, autoReport);
+        return resp;
+    }
+
+    
+    /**
+     * 处理 HTTPS API返回数据,转换成Map对象。return_code为SUCCESS时,验证签名。
+     * @param xmlStr API返回的XML格式数据
+     * @return Map类型数据
+     * @throws Exception
+     */
+    public Map<String, String> processResponseXml(String xmlStr) throws Exception {
+        /*String RETURN_CODE = "return_code";
+        String return_code;*/
+        Map<String, String> respData = WXPayUtil.xmlToMap(xmlStr);
+        return respData;
+    /*    if (respData.containsKey(RETURN_CODE)) {
+            return_code = respData.get(RETURN_CODE);
+        }
+        else {
+            throw new Exception(String.format("No `return_code` in XML: %s", xmlStr));
+        }
+
+        if (return_code.equals(WXPayConstants.FAIL)) {
+            return respData;
+        }
+        else if (return_code.equals(WXPayConstants.SUCCESS)) {
+           if (this.isResponseSignatureValid(respData)) {
+               return respData;
+           }
+           else {
+               throw new Exception(String.format("Invalid sign value in XML: %s", xmlStr));
+           }
+        }
+        else {
+            throw new Exception(String.format("return_code value %s is invalid in XML: %s", return_code, xmlStr));
+        }*/
+    }
+    
+    /**
+     * 判断xml数据的sign是否有效,必须包含sign字段,否则返回false。
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return 签名是否有效
+     * @throws Exception
+     */
+    public boolean isResponseSignatureValid(Map<String, String> reqData) throws Exception {
+        // 返回数据的签名方式和请求中给定的签名方式是一致的
+        return WXPayUtil.isSignatureValid(reqData, this.config.getKey(), this.signType);
+    }
+    
+    /**
+     * 向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign <br>
+     * 该函数适用于商户适用于统一下单等接口,不适用于红包、代金券接口
+     *
+     * @param reqData
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {
+        reqData.put("appid", Configure.getAppid());       
+        reqData.put("mch_id", Configure.getMchid());
+        reqData.put("nonce_str", WXPayUtil.generateUUID());
+        reqData.put("sign_type", WXPayConstants.MD5);
+        //reqData.put("sign_type", WXPayConstants.HMACSHA256);
+        reqData.put("sign", WXPayUtil.generateSignature(reqData, Configure.getKey(), WXPayConstants.SignType.MD5));
+        return reqData;
+    }
+    
+    /**
+     * 提交刷卡支付,针对软POS,尽可能做成功
+     * 内置重试机制,最多60s
+     * @param reqData
+     * @param connectTimeoutMs
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> microPayWithPos(Map<String, String> reqData, int connectTimeoutMs) throws Exception {
+        int remainingTimeMs = 10*1000;
+        long startTimestampMs = 0;
+        Map<String, String> lastResult = null;
+        Exception lastException = null;
+
+        
+        while (true) {
+            startTimestampMs = WXPayUtil.getCurrentTimestampMs();
+            int readTimeoutMs = remainingTimeMs - connectTimeoutMs;
+            if (readTimeoutMs > 1000) {
+                try {
+                    lastResult = this.microPay(reqData, connectTimeoutMs, readTimeoutMs);
+                    String returnCode = lastResult.get("return_code");//return_code
+                    if (returnCode.equals("SUCCESS")) {break;
+                 /*       String resultCode = lastResult.get("result_code");
+                        String errCode = lastResult.get("err_code");
+                        if (resultCode.equals("SUCCESS")) {
+                            break;
+                        }
+                        else {
+                            // 看错误码,若支付结果未知,则重试提交刷卡支付
+                            if (errCode.equals("SYSTEMERROR") || errCode.equals("BANKERROR") || errCode.equals("USERPAYING")) {
+                                remainingTimeMs = remainingTimeMs - (int)(WXPayUtil.getCurrentTimestampMs() - startTimestampMs);
+                                if (remainingTimeMs <= 100) {
+                                    break;
+                                }
+                                else {
+                                    WXPayUtil.getLogger().info("microPayWithPos: try micropay again");
+                                    if (remainingTimeMs > 5*1000) {
+                                        Thread.sleep(5*1000);
+                                    }
+                                    else {
+                                        Thread.sleep(1*1000);
+                                    }
+                                    continue;
+                                }
+                            }
+                            else {
+                                break;
+                            }
+                        }*/
+                    }
+                    else {
+                        break;
+                    }
+                }
+                catch (Exception ex) {
+                    lastResult = null;
+                    lastException = ex;
+                }
+            }
+            else {
+                break;
+            }
+        }
+
+        if (lastResult == null) {
+            throw lastException;
+        }
+        else {
+            return lastResult;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Configure.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Configure.java
new file mode 100644
index 0000000..5f274b9
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Configure.java
@@ -0,0 +1,235 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+
+import com.stylefeng.guns.modular.shunfeng.util.ParamUtil;
+
+/**
+ * User: TZJ
+ * Date: 2017/08/29
+ * Time: 14:40
+ * 这里放置微信支付的各种配置数据
+ */
+public class Configure {
+//这个就是自己要保管好的私有Key了(切记只能放在自己的后台代码里,不能放在任何可能被看到源代码的客户端程序中)
+	// 每次自己Post数据给API的时候都要用这个key来对所有字段进行签名,生成的签名会放在Sign这个字段,API收到Post数据的时候也会用同样的签名算法对Post过来的数据进行签名和验证
+	// 收到API的返回的时候也要用这个key来对返回的数据算下签名,跟API的Sign数据进行比较,如果值不一致,有可能数据被第三方给篡改
+
+	private static String key = ParamUtil.getValue("key");
+
+	//用户端开发者平台的appid
+	private static String appID = ParamUtil.getValue("appID");
+	//公众号的appid
+	private static String GappID = ParamUtil.getValue("GappID");
+	//小程序的appid
+	private static String XappID = ParamUtil.getValue("XappID");
+	
+	//公众号的appSecret
+	private static String appSecret = ParamUtil.getValue("appSecret");
+
+	//微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
+	private static String mchID = ParamUtil.getValue("mchID");
+	
+	
+	private static String key_2 = ParamUtil.getValue("key_2");
+	//微信分配的公众号ID(开通公众号之后可以获取到)
+	private static String appID_2 = ParamUtil.getValue("appID_2");
+	//微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
+	private static String mchID_2 = ParamUtil.getValue("mchID_2");
+	
+	
+	
+	private static String GmchID = ParamUtil.getValue("GmchID");
+	
+	private static String XmchID = ParamUtil.getValue("XmchID");
+	
+	//微信回调地址
+	public static String wx_notify_url = ParamUtil.getValue("wx_notify_url");
+
+	//受理模式下给子商户分配的子商户号
+	private static String subMchID = "";
+
+	//HTTPS证书的本地路径
+	private static String certLocalPath;
+	static{//从服务器相对路径中获取
+		//certLocalPath = Configure.class.getClassLoader().getResource("").getPath() + "com/stylefeng/guns/rest/modular/system/tencent/common/cert/apiclient_cert.p12";
+		certLocalPath="C:/cert/apiclient_cert.p12";
+	}
+	
+	//HTTPS证书密码,默认密码等于商户号MCHID
+		private static String certPassword = mchID;
+
+	//HTTPS证书的本地路径
+	private static String certLocalPath_2;
+	static{//从服务器相对路径中获取
+		//certLocalPath_2 = Configure.class.getClassLoader().getResource("").getPath() + "com/stylefeng/guns/rest/modular/system/tencent/common/cert2/apiclient_cert.p12";
+		certLocalPath_2="C:/cert/apiclient_cert.p12";
+	}
+	
+	//HTTPS证书密码,默认密码等于商户号MCHID
+	private static String certPassword_2 = GmchID;
+	
+	//是否使用异步线程的方式来上报API测速,默认为异步模式
+	private static boolean useThreadToDoReport = true;
+
+	//机器IP
+	private static String ip = "";
+
+	//以下是几个API的路径:
+	//1)被扫支付API
+	public static String PAY_API = "https://api.mch.weixin.qq.com/pay/micropay";
+
+	//2)被扫支付查询API
+	public static String PAY_QUERY_API = "https://api.mch.weixin.qq.com/pay/orderquery";
+
+	//3)退款API
+	public static String REFUND_API = "https://api.mch.weixin.qq.com/secapi/pay/refund";
+
+	//4)退款查询API
+	public static String REFUND_QUERY_API = "https://api.mch.weixin.qq.com/pay/refundquery";
+
+	//5)撤销API
+	public static String REVERSE_API = "https://api.mch.weixin.qq.com/secapi/pay/reverse";
+
+	//6)下载对账单API
+	public static String DOWNLOAD_BILL_API = "https://api.mch.weixin.qq.com/pay/downloadbill";
+
+	//7) 统计上报API
+	public static String REPORT_API = "https://api.mch.weixin.qq.com/payitil/report";
+	
+	//商家支付用户(提现)API
+	public static String PayToTheUser_API = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
+
+	//统一下单API(预支付生成接口)
+	public static String UNIFIEDORDER_API = "https://api.mch.weixin.qq.com/pay/unifiedorder";
+	
+	public static boolean isUseThreadToDoReport() {
+		return useThreadToDoReport;
+	}
+
+	public static void setUseThreadToDoReport(boolean useThreadToDoReport) {
+		Configure.useThreadToDoReport = useThreadToDoReport;
+	}
+
+	public static String HttpsRequestClassName = "com.stylefeng.guns.rest.modular.system.tencent.common.HttpsRequest";
+	
+	public static String HttpsRequestClassName_2 = "com.stylefeng.guns.rest.modular.system.tencent.common.HttpsRequest_2";
+
+	public static void setKey(String key) {
+		Configure.key = key;
+	}
+
+	public static void setAppID(String appID) {
+		Configure.appID = appID;
+	}
+
+	public static void setMchID(String mchID) {
+		Configure.mchID = mchID;
+	}
+
+	public static void setSubMchID(String subMchID) {
+		Configure.subMchID = subMchID;
+	}
+
+	public static void setCertLocalPath(String certLocalPath) {
+		Configure.certLocalPath = certLocalPath;
+	}
+
+	public static void setCertPassword(String certPassword) {
+		Configure.certPassword = certPassword;
+	}
+
+	public static void setIp(String ip) {
+		Configure.ip = ip;
+	}
+
+	public static String getKey(){
+		return key;
+	}
+	
+	public static String getAppid(){
+		return appID;
+	}
+	public static String getGappid(){
+		return GappID;
+	}
+	public static String getXappid(){
+		return XappID;
+	}	
+	public static String getMchid(){
+		return mchID;
+	}
+	
+	public static String getGmchid(){
+		return GmchID;
+	}
+	public static String getXmchid(){
+		return XmchID;
+	}
+
+	public static String getCertPassword_2() {
+		return certPassword_2;
+	}
+
+	public static void setCertPassword_2(String certPassword_2) {
+		Configure.certPassword_2 = certPassword_2;
+	}
+
+	public static String getSubMchid(){
+		return subMchID;
+	}
+	
+	public static String getCertLocalPath(){
+		return certLocalPath;
+	}
+	
+	public static String getCertLocalPath_2() {
+		return certLocalPath_2;
+	}
+
+	public static void setCertLocalPath_2(String certLocalPath_2) {
+		Configure.certLocalPath_2 = certLocalPath_2;
+	}
+
+	public static String getCertPassword(){
+		return certPassword;
+	}
+
+	public static String getIP(){
+		return ip;
+	}
+
+	public static String getAppSecret() {
+		return appSecret;
+	}
+
+	public static void setAppSecret(String appSecret) {
+		Configure.appSecret = appSecret;
+	}
+
+	public static void setHttpsRequestClassName(String name){
+		HttpsRequestClassName = name;
+	}
+
+	public static String getKey_2() {
+		return key_2;
+	}
+
+	public static void setKey_2(String key_2) {
+		Configure.key_2 = key_2;
+	}
+
+	public static String getAppID_2() {
+		return appID_2;
+	}
+
+	public static void setAppID_2(String appID_2) {
+		Configure.appID_2 = appID_2;
+	}
+
+	public static String getAppID() {
+		return appID;
+	}
+
+	
+	
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/HttpsRequest.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/HttpsRequest.java
new file mode 100644
index 0000000..51d0869
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/HttpsRequest.java
@@ -0,0 +1,181 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.service.IServiceRequest;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContexts;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.*;
+import java.security.cert.CertificateException;
+
+/**
+ * User: rizenguo
+ * Date: 2014/10/29
+ * Time: 14:36
+ */
+@SuppressWarnings("deprecation")
+public class HttpsRequest implements IServiceRequest {
+
+    public interface ResultListener {
+        public void onConnectionPoolTimeoutError();
+    }
+
+    //表示请求器是否已经做了初始化工作
+    private boolean hasInit = false;
+
+    //连接超时时间,默认10秒
+    private int socketTimeout = 10000;
+
+    //传输超时时间,默认30秒
+    private int connectTimeout = 30000;
+
+    //请求器的配置
+    private RequestConfig requestConfig;
+
+    //HTTP请求器
+    private CloseableHttpClient httpClient;
+
+    public HttpsRequest() throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException {
+        init();
+    }
+
+    private void init() throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
+
+        KeyStore keyStore = KeyStore.getInstance("PKCS12");
+        FileInputStream instream = new FileInputStream(new File(Configure.getCertLocalPath()));//加载本地的证书进行https加密传输
+        try {
+            keyStore.load(instream, Configure.getCertPassword().toCharArray());//设置证书密码
+        } catch (CertificateException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } finally {
+            instream.close();
+        }
+
+        // Trust own CA and all self-signed certs
+        SSLContext sslcontext = SSLContexts.custom()
+                .loadKeyMaterial(keyStore, Configure.getCertPassword().toCharArray())
+                .build();
+        // Allow TLSv1 protocol only
+        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
+                sslcontext,
+                new String[]{"TLSv1"},
+                null,
+                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+
+        httpClient = HttpClients.custom()
+                .setSSLSocketFactory(sslsf)
+                .build();
+
+        //根据默认超时限制初始化requestConfig
+        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
+
+        hasInit = true;
+    }
+
+    /**
+     * 通过Https往API post xml数据
+     *
+     * @param url    API地址
+     * @param xmlObj 要提交的XML数据对象
+     * @return API回包的实际数据
+     * @throws IOException
+     * @throws KeyStoreException
+     * @throws UnrecoverableKeyException
+     * @throws NoSuchAlgorithmException
+     * @throws KeyManagementException
+     */
+
+    public String sendPost(String url, Object xmlObj) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
+
+        if (!hasInit) {
+            init();
+        }
+
+        String result = null;
+
+        HttpPost httpPost = new HttpPost(url);
+
+        //解决XStream对出现双下划线的bug
+        XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
+
+        //将要提交给API的数据对象转换成XML格式数据Post给API
+        String postDataXML = xStreamForRequestPostData.toXML(xmlObj);
+
+//      Util.log("API,POST过去的数据是:\n"+postDataXML);
+
+        //得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别
+        StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");
+        httpPost.addHeader("Content-Type", "text/xml");
+        httpPost.setEntity(postEntity);
+
+        //设置请求器的配置
+        httpPost.setConfig(requestConfig);
+
+        Util.log("executing request" + httpPost.getRequestLine());
+
+        try {
+            HttpResponse response = httpClient.execute(httpPost);
+
+            HttpEntity entity = response.getEntity();
+
+            result = EntityUtils.toString(entity, "UTF-8");
+
+        } catch (Exception e) {
+           e.printStackTrace();
+
+        } finally {
+            httpPost.abort();
+        }
+
+        return result;
+    }
+
+    /**
+     * 设置连接超时时间
+     *
+     * @param socketTimeout 连接时长,默认10秒
+     */
+    public void setSocketTimeout(int socketTimeout) {
+        this.socketTimeout = socketTimeout;
+        resetRequestConfig();
+    }
+
+    /**
+     * 设置传输超时时间
+     *
+     * @param connectTimeout 传输时长,默认30秒
+     */
+    public void setConnectTimeout(int connectTimeout) {
+    	this.connectTimeout = connectTimeout;
+        resetRequestConfig();
+    }
+
+    private void resetRequestConfig(){
+        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
+    }
+
+    /**
+     * 允许商户自己做更高级更复杂的请求器配置
+     *
+     * @param requestConfig 设置HttpsRequest的请求器配置
+     */
+    public void setRequestConfig(RequestConfig requestConfig) {
+    	this.requestConfig = requestConfig;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/HttpsRequest_2.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/HttpsRequest_2.java
new file mode 100644
index 0000000..dcdcfd9
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/HttpsRequest_2.java
@@ -0,0 +1,181 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.service.IServiceRequest;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContexts;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.*;
+import java.security.cert.CertificateException;
+
+/**
+ * User: rizenguo
+ * Date: 2014/10/29
+ * Time: 14:36
+ */
+@SuppressWarnings("deprecation")
+public class HttpsRequest_2 implements IServiceRequest {
+
+    public interface ResultListener {
+        public void onConnectionPoolTimeoutError();
+    }
+
+    //表示请求器是否已经做了初始化工作
+    private boolean hasInit = false;
+
+    //连接超时时间,默认10秒
+    private int socketTimeout = 10000;
+
+    //传输超时时间,默认30秒
+    private int connectTimeout = 30000;
+
+    //请求器的配置
+    private RequestConfig requestConfig;
+
+    //HTTP请求器
+    private CloseableHttpClient httpClient;
+
+    public HttpsRequest_2() throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException {
+        init();
+    }
+
+    private void init() throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
+
+        KeyStore keyStore = KeyStore.getInstance("PKCS12");
+        FileInputStream instream = new FileInputStream(new File(Configure.getCertLocalPath_2()));//加载本地的证书进行https加密传输
+        try {
+            keyStore.load(instream, Configure.getCertPassword_2().toCharArray());//设置证书密码
+        } catch (CertificateException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } finally {
+            instream.close();
+        }
+
+        // Trust own CA and all self-signed certs
+        SSLContext sslcontext = SSLContexts.custom()
+                .loadKeyMaterial(keyStore, Configure.getCertPassword_2().toCharArray())
+                .build();
+        // Allow TLSv1 protocol only
+        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
+                sslcontext,
+                new String[]{"TLSv1"},
+                null,
+                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+
+        httpClient = HttpClients.custom()
+                .setSSLSocketFactory(sslsf)
+                .build();
+
+        //根据默认超时限制初始化requestConfig
+        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
+
+        hasInit = true;
+    }
+
+    /**
+     * 通过Https往API post xml数据
+     *
+     * @param url    API地址
+     * @param xmlObj 要提交的XML数据对象
+     * @return API回包的实际数据
+     * @throws IOException
+     * @throws KeyStoreException
+     * @throws UnrecoverableKeyException
+     * @throws NoSuchAlgorithmException
+     * @throws KeyManagementException
+     */
+
+    public String sendPost(String url, Object xmlObj) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
+
+        if (!hasInit) {
+            init();
+        }
+
+        String result = null;
+
+        HttpPost httpPost = new HttpPost(url);
+
+        //解决XStream对出现双下划线的bug
+        XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
+
+        //将要提交给API的数据对象转换成XML格式数据Post给API
+        String postDataXML = xStreamForRequestPostData.toXML(xmlObj);
+
+//      Util.log("API,POST过去的数据是:\n"+postDataXML);
+
+        //得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别
+        StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");
+        httpPost.addHeader("Content-Type", "text/xml");
+        httpPost.setEntity(postEntity);
+
+        //设置请求器的配置
+        httpPost.setConfig(requestConfig);
+
+        Util.log("executing request" + httpPost.getRequestLine());
+
+        try {
+            HttpResponse response = httpClient.execute(httpPost);
+
+            HttpEntity entity = response.getEntity();
+
+            result = EntityUtils.toString(entity, "UTF-8");
+
+        } catch (Exception e) {
+           e.printStackTrace();
+
+        } finally {
+            httpPost.abort();
+        }
+
+        return result;
+    }
+
+    /**
+     * 设置连接超时时间
+     *
+     * @param socketTimeout 连接时长,默认10秒
+     */
+    public void setSocketTimeout(int socketTimeout) {
+        this.socketTimeout = socketTimeout;
+        resetRequestConfig();
+    }
+
+    /**
+     * 设置传输超时时间
+     *
+     * @param connectTimeout 传输时长,默认30秒
+     */
+    public void setConnectTimeout(int connectTimeout) {
+    	this.connectTimeout = connectTimeout;
+        resetRequestConfig();
+    }
+
+    private void resetRequestConfig(){
+        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
+    }
+
+    /**
+     * 允许商户自己做更高级更复杂的请求器配置
+     *
+     * @param requestConfig 设置HttpsRequest的请求器配置
+     */
+    public void setRequestConfig(RequestConfig requestConfig) {
+    	this.requestConfig = requestConfig;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/IWXPayDomain.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/IWXPayDomain.java
new file mode 100644
index 0000000..e84963c
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/IWXPayDomain.java
@@ -0,0 +1,42 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+/**
+ * 域名管理,实现主备域名自动切换
+ */
+public abstract interface IWXPayDomain {
+    /**
+     * 上报域名网络状况
+     * @param domain 域名。 比如:api.mch.weixin.qq.com
+     * @param elapsedTimeMillis 耗时
+     * @param ex 网络请求中出现的异常。
+     *           null表示没有异常
+     *           ConnectTimeoutException,表示建立网络连接异常
+     *           UnknownHostException, 表示dns解析异常
+     */
+    abstract void report(final String domain, long elapsedTimeMillis, final Exception ex);
+
+    /**
+     * 获取域名
+     * @param config 配置
+     * @return 域名
+     */
+    abstract DomainInfo getDomain(final WXPayConfig config);
+
+    static class DomainInfo{
+        public String domain;       //域名
+        public boolean primaryDomain;     //该域名是否为主域名。例如:api.mch.weixin.qq.com为主域名
+        public DomainInfo(String domain, boolean primaryDomain) {
+            this.domain = domain;
+            this.primaryDomain = primaryDomain;
+        }
+
+        @Override
+        public String toString() {
+            return "DomainInfo{" +
+                    "domain='" + domain + '\'' +
+                    ", primaryDomain=" + primaryDomain +
+                    '}';
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Log.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Log.java
new file mode 100644
index 0000000..eefb7df
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Log.java
@@ -0,0 +1,59 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import org.slf4j.Logger;
+
+/**
+ * User: rizenguo
+ * Date: 2014/11/12
+ * Time: 14:32
+ */
+public class Log {
+
+    public static final String LOG_TYPE_TRACE = "logTypeTrace";
+    public static final String LOG_TYPE_DEBUG = "logTypeDebug";
+    public static final String LOG_TYPE_INFO = "logTypeInfo";
+    public static final String LOG_TYPE_WARN = "logTypeWarn";
+    public static final String LOG_TYPE_ERROR = "logTypeError";
+
+    //打印日志
+    private Logger logger;
+
+    public Log(Logger log){
+        logger = log;
+    }
+
+    public void t(String s){
+        logger.trace(s);
+    }
+
+    public void d(String s){
+        logger.debug(s);
+    }
+
+    public void i(String s){
+        logger.info(s);
+    }
+
+    public void w(String s){
+        logger.warn(s);
+    }
+
+    public void e(String s){
+        logger.error(s);
+    }
+
+    public void log(String type,String s){
+        if(type.equals(Log.LOG_TYPE_TRACE)){
+            t(s);
+        }else if(type.equals(Log.LOG_TYPE_DEBUG)){
+            d(s);
+        }else if(type.equals(Log.LOG_TYPE_INFO)){
+            i(s);
+        }else if(type.equals(Log.LOG_TYPE_WARN)){
+            w(s);
+        }else if(type.equals(Log.LOG_TYPE_ERROR)){
+            e(s);
+        }
+    }
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/MD5.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/MD5.java
new file mode 100644
index 0000000..8b84026
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/MD5.java
@@ -0,0 +1,59 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import java.security.MessageDigest;
+
+/**
+ * User: rizenguo
+ * Date: 2014/10/23
+ * Time: 15:43
+ */
+public class MD5 {
+    private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7",
+            "8", "9", "a", "b", "c", "d", "e", "f"};
+
+    /**
+     * 转换字节数组为16进制字串
+     * @param b 字节数组
+     * @return 16进制字串
+     */
+    public static String byteArrayToHexString(byte[] b) {
+        StringBuilder resultSb = new StringBuilder();
+        for (byte aB : b) {
+            resultSb.append(byteToHexString(aB));
+        }
+        return resultSb.toString();
+    }
+
+    /**
+     * 转换byte到16进制
+     * @param b 要转换的byte
+     * @return 16进制格式
+     */
+    private static String byteToHexString(byte b) {
+        int n = b;
+        if (n < 0) {
+            n = 256 + n;
+        }
+        int d1 = n / 16;
+        int d2 = n % 16;
+        return hexDigits[d1] + hexDigits[d2];
+    }
+
+    /**
+     * MD5编码
+     * @param origin 原始字符串
+     * @return 经过MD5加密之后的结果
+     */
+    public static String MD5Encode(String origin) {
+        String resultString = null;
+        try {
+            resultString = origin;
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            resultString = byteArrayToHexString(md.digest(resultString.getBytes("UTF-8")));//微信支付有汉字时出现签名错误的解决办法
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return resultString;
+    }
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/RandomStringGenerator.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/RandomStringGenerator.java
new file mode 100644
index 0000000..a408619
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/RandomStringGenerator.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import java.util.Random;
+
+/**
+ * User: rizenguo
+ * Date: 2014/10/29
+ * Time: 14:18
+ */
+public class RandomStringGenerator {
+
+    /**
+     * 获取一定长度的随机字符串
+     * @param length 指定字符串长度
+     * @return 一定长度的字符串
+     */
+    public static String getRandomStringByLength(int length) {
+        String base = "abcdefghijklmnopqrstuvwxyz0123456789";
+        Random random = new Random();
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < length; i++) {
+            int number = random.nextInt(base.length());
+            sb.append(base.charAt(number));
+        }
+        return sb.toString();
+    }
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Signature.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Signature.java
new file mode 100644
index 0000000..dd12f12
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Signature.java
@@ -0,0 +1,128 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import java.io.IOException;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.xml.sax.SAXException;
+
+
+/**
+ * User: tzj
+ * Date: 2017/06/17
+ * Time: 15:23
+ */
+public class Signature {
+    /**
+     * 签名算法
+     * @param o 要参与签名的数据对象
+     * @return 签名
+     * @throws IllegalAccessException
+     */
+    public static String getSign(Object o) throws IllegalAccessException {
+        ArrayList<String> list = new ArrayList<String>();
+        Class<? extends Object> cls = o.getClass();
+        Field[] fields = cls.getDeclaredFields();
+        for (Field f : fields) {
+            f.setAccessible(true);
+            if (f.get(o) != null && f.get(o) != "") {
+                list.add(f.getName() + "=" + f.get(o) + "&");
+            }
+        }
+        int size = list.size();
+        String [] arrayToSort = list.toArray(new String[size]);
+        Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
+        StringBuilder sb = new StringBuilder();
+        for(int i = 0; i < size; i ++) {
+            sb.append(arrayToSort[i]);
+        }
+        String result = sb.toString();
+        result += "key=" + Configure.getKey();
+        Util.log("Sign Before MD5:" + result);
+        result = MD5.MD5Encode(result).toUpperCase();
+        Util.log("Sign Result:" + result);
+        return result;
+    }
+
+    public static String getSign(Integer apptype,Map<String,Object> map){
+        ArrayList<String> list = new ArrayList<String>();
+        for(Map.Entry<String,Object> entry:map.entrySet()){
+            if(entry.getValue()!=""){
+                list.add(entry.getKey() + "=" + entry.getValue() + "&");
+            }
+        }
+        int size = list.size();
+        String [] arrayToSort = list.toArray(new String[size]);
+        Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
+        StringBuilder sb = new StringBuilder();
+        for(int i = 0; i < size; i ++) {
+            sb.append(arrayToSort[i]);
+        }
+        String result = sb.toString();
+        if (apptype == 2) {
+        	result += "key=" + Configure.getKey_2();
+		} else {
+			result += "key=" + Configure.getKey();
+		}
+        
+//        Util.log("Sign Before MD5:" + result);
+        result = MD5.MD5Encode(result).toUpperCase();
+//        Util.log("Sign Result:" + result);
+        return result;
+    }
+
+    /**
+     * 从API返回的XML数据里面重新计算一次签名
+     * @param responseString API返回的XML数据
+     * @return 新鲜出炉的签名
+     * @throws ParserConfigurationException
+     * @throws IOException
+     * @throws SAXException
+     */
+    public static String getSignFromResponseString(Integer apptype, String responseString) throws IOException, SAXException, ParserConfigurationException {
+        Map<String,Object> map = XMLParser.getMapFromXML(responseString);
+        //清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名
+        map.put("sign","");
+        //将API返回的数据根据用签名算法进行计算新的签名,用来跟API返回的签名进行比较
+        return Signature.getSign(apptype, map);
+    }
+
+    /**
+     * 检验API返回的数据里面的签名是否合法,避免数据在传输的过程中被第三方篡改
+     * @param responseString API返回的XML数据字符串
+     * @return API签名是否合法
+     * @throws ParserConfigurationException
+     * @throws IOException
+     * @throws SAXException
+     */
+    public static boolean checkIsSignValidFromResponseString(Integer apptype, String responseString) throws ParserConfigurationException, IOException, SAXException {
+
+        Map<String,Object> map = XMLParser.getMapFromXML(responseString);
+        Util.log(map.toString());
+
+        String signFromAPIResponse = map.get("sign").toString();
+        if(signFromAPIResponse=="" || signFromAPIResponse == null){
+            Util.log("API返回的数据签名数据不存在,有可能被第三方篡改!!!");
+            return false;
+        }
+        Util.log("服务器回包里面的签名是:" + signFromAPIResponse);
+        //清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名
+        map.put("sign","");
+        //将API返回的数据根据用签名算法进行计算新的签名,用来跟API返回的签名进行比较
+        String signForAPIResponse = Signature.getSign(apptype, map);
+
+        if(!signForAPIResponse.equals(signFromAPIResponse)){
+            //签名验不过,表示这个API返回的数据有可能已经被篡改了
+            Util.log("API返回的数据签名验证不通过,有可能被第三方篡改!!!");
+            return false;
+        }
+        Util.log("恭喜,API返回的数据签名验证通过!!!");
+        return true;
+    }
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Util.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Util.java
new file mode 100644
index 0000000..de7dfa2
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/Util.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import java.io.ByteArrayInputStream;
+
+
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.thoughtworks.xstream.XStream;
+
+
+/**
+ * User: tzj
+ * Date: 2017/08/23
+ * Time: 14:59
+ */
+public class Util {
+
+    Logger logger= LoggerFactory.getLogger(getClass());
+    /**
+     * 通过反射的方式遍历对象的属性和属性值,方便调试
+     *
+     * @param o 要遍历的对象
+     * @throws Exception
+     */
+    public static void reflect(Object o) throws Exception {
+        Class<? extends Object> cls = o.getClass();
+        Field[] fields = cls.getDeclaredFields();
+        for (int i = 0; i < fields.length; i++) {
+            Field f = fields[i];
+            f.setAccessible(true);
+            Util.log(f.getName() + " -> " + f.get(o));
+        }
+    }
+
+    public static byte[] readInput(InputStream in) throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        int len = 0;
+        byte[] buffer = new byte[1024];
+        while ((len = in.read(buffer)) > 0) {
+            out.write(buffer, 0, len);
+        }
+        out.close();
+        in.close();
+        return out.toByteArray();
+    }
+
+    public static String inputStreamToString(InputStream is) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        int i;
+        while ((i = is.read()) != -1) {
+            baos.write(i);
+        }
+        return baos.toString();
+    }
+
+
+    public static InputStream getStringStream(String sInputString) {
+        ByteArrayInputStream tInputStringStream = null;
+        if (sInputString != null && !sInputString.trim().equals("")) {
+        	try {
+        		tInputStringStream = new ByteArrayInputStream(sInputString.getBytes("UTF-8"));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+        }
+        return tInputStringStream;
+    }
+
+    public static Object getObjectFromXML(String xml, Class<?> tClass) {
+        //将从API返回的XML数据映射到Java对象
+        XStream xStreamForResponseData = new XStream();
+        xStreamForResponseData.alias("xml", tClass);
+        xStreamForResponseData.ignoreUnknownElements();//暂时忽略掉一些新增的字段
+        return xStreamForResponseData.fromXML(xml);
+    }
+
+    public static String getStringFromMap(Map<String, Object> map, String key, String defaultValue) {
+        if (key == "" || key == null) {
+            return defaultValue;
+        }
+        String result = (String) map.get(key);
+        if (result == null) {
+            return defaultValue;
+        } else {
+            return result;
+        }
+    }
+
+    public static int getIntFromMap(Map<String, Object> map, String key) {
+        if (key == "" || key == null) {
+            return 0;
+        }
+        if (map.get(key) == null) {
+            return 0;
+        }
+        return Integer.parseInt((String) map.get(key));
+    }
+
+    /**
+     * 打log接口
+     * @param log 要打印的log字符串
+     * @return 返回log
+     */
+    public static String log(Object log){
+        System.out.println(log.toString());
+        return log.toString();
+    }
+
+    /**
+     * 读取本地的xml数据,一般用来自测用
+     * @param localPath 本地xml文件路径
+     * @return 读到的xml字符串
+     */
+    public static String getLocalXMLString(String localPath) throws IOException {
+        return Util.inputStreamToString(Util.class.getResourceAsStream(localPath));
+    }
+
+}
+
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayConfig.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayConfig.java
new file mode 100644
index 0000000..53ff4af
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayConfig.java
@@ -0,0 +1,103 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import java.io.InputStream;
+
+public abstract class WXPayConfig {
+
+
+
+    /**
+     * 获取 App ID
+     *
+     * @return App ID
+     */
+	public abstract String getAppID();
+
+
+    /**
+     * 获取 Mch ID
+     *
+     * @return Mch ID
+     */
+    public abstract String getMchID();
+
+
+    /**
+     * 获取 API 密钥
+     *
+     * @return API密钥
+     */
+    public abstract String getKey();
+
+
+    /**
+     * 获取商户证书内容
+     *
+     * @return 商户证书内容
+     */
+    public abstract InputStream getCertStream();
+
+    /**
+     * HTTP(S) 连接超时时间,单位毫秒
+     *
+     * @return
+     */
+    public int getHttpConnectTimeoutMs() {
+        return 6*1000;
+    }
+
+    /**
+     * HTTP(S) 读数据超时时间,单位毫秒
+     *
+     * @return
+     */
+    public int getHttpReadTimeoutMs() {
+        return 8*1000;
+    }
+
+    /**
+     * 获取WXPayDomain, 用于多域名容灾自动切换
+     * @return
+     */
+    public abstract IWXPayDomain getWXPayDomain();
+
+    /**
+     * 是否自动上报。
+     * 若要关闭自动上报,子类中实现该函数返回 false 即可。
+     *
+     * @return
+     */
+    public boolean shouldAutoReport() {
+        return true;
+    }
+
+    /**
+     * 进行健康上报的线程的数量
+     *
+     * @return
+     */
+    public int getReportWorkerNum() {
+        return 6;
+    }
+
+
+    /**
+     * 健康上报缓存消息的最大数量。会有线程去独立上报
+     * 粗略计算:加入一条消息200B,10000消息占用空间 2000 KB,约为2MB,可以接受
+     *
+     * @return
+     */
+    public int getReportQueueMaxSize() {
+        return 10000;
+    }
+
+    /**
+     * 批量上报,一次最多上报多个数据
+     *
+     * @return
+     */
+    public int getReportBatchSize() {
+        return 10;
+    }
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayConstants.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayConstants.java
new file mode 100644
index 0000000..66c1b9e
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayConstants.java
@@ -0,0 +1,52 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+/**
+ * 常量
+ */
+public class WXPayConstants {
+
+    public enum SignType {
+        MD5, HMACSHA256
+    }
+
+    public static final String DOMAIN_API = "api.mch.weixin.qq.com";
+    public static final String DOMAIN_API2 = "api2.mch.weixin.qq.com";
+    public static final String DOMAIN_APIHK = "apihk.mch.weixin.qq.com";
+    public static final String DOMAIN_APIUS = "apius.mch.weixin.qq.com";
+
+
+    public static final String FAIL     = "FAIL";
+    public static final String SUCCESS  = "SUCCESS";
+    public static final String HMACSHA256 = "HMAC-SHA256";
+    public static final String MD5 = "MD5";
+
+    public static final String FIELD_SIGN = "sign";
+    public static final String FIELD_SIGN_TYPE = "sign_type";
+
+    public static final String MICROPAY_URL_SUFFIX     = "/pay/micropay";
+    public static final String UNIFIEDORDER_URL_SUFFIX = "/pay/unifiedorder";
+    public static final String ORDERQUERY_URL_SUFFIX   = "/pay/orderquery";
+    public static final String REVERSE_URL_SUFFIX      = "/secapi/pay/reverse";
+    public static final String CLOSEORDER_URL_SUFFIX   = "/pay/closeorder";
+    public static final String REFUND_URL_SUFFIX       = "/secapi/pay/refund";
+    public static final String REFUNDQUERY_URL_SUFFIX  = "/pay/refundquery";
+    public static final String DOWNLOADBILL_URL_SUFFIX = "/pay/downloadbill";
+    public static final String REPORT_URL_SUFFIX       = "/payitil/report";
+    public static final String SHORTURL_URL_SUFFIX     = "/tools/shorturl";
+    public static final String AUTHCODETOOPENID_URL_SUFFIX = "/tools/authcodetoopenid";
+
+    // sandbox
+    public static final String SANDBOX_MICROPAY_URL_SUFFIX     = "/sandboxnew/pay/micropay";
+    public static final String SANDBOX_UNIFIEDORDER_URL_SUFFIX = "/sandboxnew/pay/unifiedorder";
+    public static final String SANDBOX_ORDERQUERY_URL_SUFFIX   = "/sandboxnew/pay/orderquery";
+    public static final String SANDBOX_REVERSE_URL_SUFFIX      = "/sandboxnew/secapi/pay/reverse";
+    public static final String SANDBOX_CLOSEORDER_URL_SUFFIX   = "/sandboxnew/pay/closeorder";
+    public static final String SANDBOX_REFUND_URL_SUFFIX       = "/sandboxnew/secapi/pay/refund";
+    public static final String SANDBOX_REFUNDQUERY_URL_SUFFIX  = "/sandboxnew/pay/refundquery";
+    public static final String SANDBOX_DOWNLOADBILL_URL_SUFFIX = "/sandboxnew/pay/downloadbill";
+    public static final String SANDBOX_REPORT_URL_SUFFIX       = "/sandboxnew/payitil/report";
+    public static final String SANDBOX_SHORTURL_URL_SUFFIX     = "/sandboxnew/tools/shorturl";
+    public static final String SANDBOX_AUTHCODETOOPENID_URL_SUFFIX = "/sandboxnew/tools/authcodetoopenid";
+
+}
+
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayUtil.java
new file mode 100644
index 0000000..3547095
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/WXPayUtil.java
@@ -0,0 +1,298 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.security.MessageDigest;
+import java.util.*;
+
+
+
+public class WXPayUtil {
+
+    /**
+     * XML格式字符串转换为Map
+     *
+     * @param strXML XML字符串
+     * @return XML数据转换后的Map
+     * @throws Exception
+     */
+    public static Map<String, String> xmlToMap(String strXML) throws Exception {
+        try {
+            Map<String, String> data = new HashMap<String, String>();
+            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+            InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
+            org.w3c.dom.Document doc = documentBuilder.parse(stream);
+            doc.getDocumentElement().normalize();
+            NodeList nodeList = doc.getDocumentElement().getChildNodes();
+            for (int idx = 0; idx < nodeList.getLength(); ++idx) {
+                Node node = nodeList.item(idx);
+                if (node.getNodeType() == Node.ELEMENT_NODE) {
+                    org.w3c.dom.Element element = (org.w3c.dom.Element) node;
+                    data.put(element.getNodeName(), element.getTextContent());
+                }
+            }
+            try {
+                stream.close();
+            } catch (Exception ex) {
+                // do nothing
+            }
+            return data;
+        } catch (Exception ex) {
+            WXPayUtil.getLogger().warn("Invalid XML, can not convert to map. Error message: {}. XML content: {}", ex.getMessage(), strXML);
+            throw ex;
+        }
+
+    }
+
+    /**
+     * 将Map转换为XML格式的字符串
+     *
+     * @param data Map类型数据
+     * @return XML格式的字符串
+     * @throws Exception
+     */
+    public static String mapToXml(Map<String, String> data) throws Exception {
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
+        org.w3c.dom.Document document = documentBuilder.newDocument();
+        org.w3c.dom.Element root = document.createElement("xml");
+        document.appendChild(root);
+        for (String key: data.keySet()) {
+            String value = data.get(key);
+            if (value == null) {
+                value = "";
+            }
+            value = value.trim();
+            org.w3c.dom.Element filed = document.createElement(key);
+            filed.appendChild(document.createTextNode(value));
+            root.appendChild(filed);
+        }
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer transformer = tf.newTransformer();
+        DOMSource source = new DOMSource(document);
+        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+        StringWriter writer = new StringWriter();
+        StreamResult result = new StreamResult(writer);
+        transformer.transform(source, result);
+        String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
+        try {
+            writer.close();
+        }
+        catch (Exception ex) {
+        }
+        return output;
+    }
+
+
+    /**
+     * 生成带有 sign 的 XML 格式字符串
+     *
+     * @param data Map类型数据
+     * @param key API密钥
+     * @return 含有sign字段的XML
+     */
+    public static String generateSignedXml(final Map<String, String> data, String key) throws Exception {
+        return generateSignedXml(data, key, WXPayConstants.SignType.MD5);
+    }
+
+    /**
+     * 生成带有 sign 的 XML 格式字符串
+     *
+     * @param data Map类型数据
+     * @param key API密钥
+     * @param signType 签名类型
+     * @return 含有sign字段的XML
+     */
+    public static String generateSignedXml(final Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
+        String sign = generateSignature(data, key, signType);
+        data.put(WXPayConstants.FIELD_SIGN, sign);
+        return mapToXml(data);
+    }
+
+
+    /**
+     * 判断签名是否正确
+     *
+     * @param xmlStr XML格式数据
+     * @param key API密钥
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean isSignatureValid(String xmlStr, String key) throws Exception {
+        Map<String, String> data = xmlToMap(xmlStr);
+        if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) {
+            return false;
+        }
+        String sign = data.get(WXPayConstants.FIELD_SIGN);
+        return generateSignature(data, key).equals(sign);
+    }
+
+    /**
+     * 判断签名是否正确,必须包含sign字段,否则返回false。使用MD5签名。
+     *
+     * @param data Map类型数据
+     * @param key API密钥
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean isSignatureValid(Map<String, String> data, String key) throws Exception {
+        return isSignatureValid(data, key, WXPayConstants.SignType.MD5);
+    }
+
+    /**
+     * 判断签名是否正确,必须包含sign字段,否则返回false。
+     *
+     * @param data Map类型数据
+     * @param key API密钥
+     * @param signType 签名方式
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean isSignatureValid(Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
+        if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) {
+            return false;
+        }
+        String sign = data.get(WXPayConstants.FIELD_SIGN);
+        return generateSignature(data, key, signType).equals(sign);
+    }
+
+    /**
+     * 生成签名
+     *
+     * @param data 待签名数据
+     * @param key API密钥
+     * @return 签名
+     */
+    public static String generateSignature(final Map<String, String> data, String key) throws Exception {
+        return generateSignature(data, key, WXPayConstants.SignType.MD5);
+    }
+
+    /**
+     * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
+     *
+     * @param data 待签名数据
+     * @param key API密钥
+     * @param signType 签名方式
+     * @return 签名
+     */
+    public static String generateSignature(final Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
+        Set<String> keySet = data.keySet();
+        String[] keyArray = keySet.toArray(new String[keySet.size()]);
+        Arrays.sort(keyArray);
+        StringBuilder sb = new StringBuilder();
+        for (String k : keyArray) {
+            if (k.equals(WXPayConstants.FIELD_SIGN)) {
+                continue;
+            }
+            if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
+                sb.append(k).append("=").append(data.get(k).trim()).append("&");
+        }
+        sb.append("key=").append(key);
+        if (WXPayConstants.SignType.MD5.equals(signType)) {
+            return MD5(sb.toString()).toUpperCase();
+        }
+        else if (WXPayConstants.SignType.HMACSHA256.equals(signType)) {
+            return HMACSHA256(sb.toString(), key);
+        }
+        else {
+            throw new Exception(String.format("Invalid sign_type: %s", signType));
+        }
+    }
+
+
+    /**
+     * 获取随机字符串 Nonce Str
+     *
+     * @return String 随机字符串
+     */
+    public static String generateNonceStr() {
+        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
+    }
+
+
+    /**
+     * 生成 MD5
+     *
+     * @param data 待处理数据
+     * @return MD5结果
+     */
+    public static String MD5(String data) throws Exception {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] array = md.digest(data.getBytes("UTF-8"));
+        StringBuilder sb = new StringBuilder();
+        for (byte item : array) {
+            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+        }
+        return sb.toString().toUpperCase();
+    }
+
+    /**
+     * 生成 HMACSHA256
+     * @param data 待处理数据
+     * @param key 密钥
+     * @return 加密结果
+     * @throws Exception
+     */
+    public static String HMACSHA256(String data, String key) throws Exception {
+        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
+        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
+        sha256_HMAC.init(secret_key);
+        byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
+        StringBuilder sb = new StringBuilder();
+        for (byte item : array) {
+            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+        }
+        return sb.toString().toUpperCase();
+    }
+
+    /**
+     * 日志
+     * @return
+     */
+    public static Logger getLogger() {
+        Logger logger = LoggerFactory.getLogger("wxpay java sdk");
+        return logger;
+    }
+
+    /**
+     * 获取当前时间戳,单位秒
+     * @return
+     */
+    public static long getCurrentTimestamp() {
+        return System.currentTimeMillis()/1000;
+    }
+
+    /**
+     * 获取当前时间戳,单位毫秒
+     * @return
+     */
+    public static long getCurrentTimestampMs() {
+        return System.currentTimeMillis();
+    }
+
+    /**
+     * 生成 uuid, 即用来标识一笔单,也用做 nonce_str
+     * @return
+     */
+    public static String generateUUID() {
+        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
+    }
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/XMLParser.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/XMLParser.java
new file mode 100644
index 0000000..0b77eb5
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/XMLParser.java
@@ -0,0 +1,43 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.common;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class XMLParser {
+
+    public static Map<String,Object> getMapFromXML(String xmlString) throws ParserConfigurationException, IOException, SAXException {
+
+        //这里用Dom的方式解析回包的最主要目的是防止API新增回包字段
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder builder = factory.newDocumentBuilder();
+        InputStream is =  Util.getStringStream(xmlString);
+        Document document = builder.parse(is);
+
+        //获取到document里面的全部结点
+        NodeList allNodes = document.getFirstChild().getChildNodes();
+        Node node;
+        Map<String, Object> map = new HashMap<String, Object>();
+        int i=0;
+        while (i < allNodes.getLength()) {
+            node = allNodes.item(i);
+            if(node instanceof Element){
+                map.put(node.getNodeName(),node.getTextContent());
+            }
+            i++;
+        }
+        return map;
+    }
+    
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_cert.p12 b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_cert.p12
new file mode 100644
index 0000000..bfcb97c
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_cert.p12
Binary files differ
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_cert.pem b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_cert.pem
new file mode 100644
index 0000000..930ca25
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_cert.pem
@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID+TCCAuGgAwIBAgIUHt/Ff4zv9XrMMMYA6J/pzzxGatQwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMTkwODA5MTAxMjQ2WhcNMjQwODA3MTAxMjQ2WjCBijETMBEGA1UEAwwK
+MTU0OTA0NTA4MTEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTYwNAYDVQQL
+DC3lhajlrqLpgJrvvIjlm5vlt53vvInnp5HmioDkv6Hmga/mnInpmZDlhazlj7gx
+CzAJBgNVBAYMAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMBMbs3vxTp8coHuOZ6yLEpWoD5SCrUU5zhSxB/fZvgR
+6tSVrBjJpatwquGSUek/G0ny8nBzTi32J/3oEVXuBj0s5RQyzwT4byFBhT4zm859
+JfVuaKtGI/pe7QELHjKs7Qoe5XBEbitopTqFU0GeAElniHkwd1qb96JyY1IkWWg6
+JMtBz7NMsermmTDxDh8gS2hOtmaWLTSvovXbUyX6YMnqkQS6eBcnW3ShKDwfKkAq
+4//fvkTJZiaOR4t9iujlVEsFLLSnqlWwAMwUCQdShummRUB6blnCfTbjRJCE0Y3Q
+k5MelYyH5KmYMn945U3nSNvwMQTZS1seY21GVZFEe4sCAwEAAaOBgTB/MAkGA1Ud
+EwQCMAAwCwYDVR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNh
+Lml0cnVzLmNvbS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0
+QjA2QUQzOTc1NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAHh+t
+cyLUPAtNnvbQUGA2ZyA5L0Mp4pp3IarAFt8qh7oOdqIPSK0u61I5EwtdsXiAYVyt
+GDYmfpk/HGeg1T2f0nhchUQ0D0s0sCkKboBKeBvYrefvwWCbJJJSQeyVzCBbap64
+TeuMwQYYhhmDn81a6xU/9Lu9lcIEisZQq9fwsq2hEZuYXwoCWR1trXHv79IQeGnu
+OpyP9Kjcmj7ujjFDSGYCekYDhoncNeDnfc77erYljmEf2O3HM636wu197mIH6Rqa
+sGPk7oJDjkdXLMQeJ7kbw/3tRlEqMXPYHka1K8HFlQJ//sAcTJzDTCruDUnqG19F
+cZpVvy/bNz0E1Y4GXA==
+-----END CERTIFICATE-----
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_key.pem b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_key.pem
new file mode 100644
index 0000000..6999471
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/apiclient_key.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDATG7N78U6fHKB
+7jmesixKVqA+Ugq1FOc4UsQf32b4EerUlawYyaWrcKrhklHpPxtJ8vJwc04t9if9
+6BFV7gY9LOUUMs8E+G8hQYU+M5vOfSX1bmirRiP6Xu0BCx4yrO0KHuVwRG4raKU6
+hVNBngBJZ4h5MHdam/eicmNSJFloOiTLQc+zTLHq5pkw8Q4fIEtoTrZmli00r6L1
+21Ml+mDJ6pEEungXJ1t0oSg8HypAKuP/375EyWYmjkeLfYro5VRLBSy0p6pVsADM
+FAkHUobppkVAem5Zwn0240SQhNGN0JOTHpWMh+SpmDJ/eOVN50jb8DEE2UtbHmNt
+RlWRRHuLAgMBAAECggEBAI9S6GsZQDjdNENfGRcM2TH26qxIXa6li8hQ99iBm69d
+O1eCzqgS8yWabeJ+OgrMfDxblRL2/dgH1brK0tDm/UNvSLYLQH0F5V42BWdc882t
+PTN2PREa0An14lOaw8ElXe7jJELO3gYAktXRNUJ8zt3nCrK4ytx/zswG0bwRV4n0
+L23igxUvHxztqUxfQ9nSGW0aQi9+ZpHpAvhq9h2TWRcVilZSD3ddBVjsY96ZPDVd
+Hee+21+3YLohdCp1IPROCU9DKWKDIoz9u3fE+8GtrJDTRBU678weKnUCj758JAOV
+Q/fHrxmnze//y9wKSQnq7mRP4Hjsf5FBaSbQBurAYyECgYEA93bLPtEZDiLTXjEm
+QG+Eiaxs9Hds+OaLEQEip6eYCdSi5F5te/vZGzOreATeB6wSaZtVEDiweBJLxO0w
+lhIJnfo/LimNXtyO91NvwmzrfHdewNxsNbFZ8ty0y37i+lUyEl8Wu3PrrZL6TMKc
+x8FHJ382deHGYqnHuNuDqgZtEHkCgYEAxu6Be6jH2kQtUZvH/j43GlIho1wYtJeE
+vLb2VQ6ThyF6m+6CM9+eedTMUpCuL0zn609aj93mTMve5iJbBrbElKFbILH3iqsC
+02BtFJnUOB++3rtgBv/b9uA9b+mk7iWGXf/dLOgjFpW+MWWo8o/X90VRZnsV4hyC
+1cD0UFskUyMCgYEAmG5bWbFRPqzjCAU8a7qFqIxGfPvHazYPeYT6hM0uUPfi8srb
+o+CJZkEYoRBWd+FdYiHlbt2MjhmvBHmaUQaBWAdavaOoykMP6XdCwz92eq/I9QGR
+wi0hnACpeSQKymqKMljSVttb1ApSFdBW5JDAtKqesFRHcGTmeo709lmI+vkCgYB4
+Cc+ESPJfmKgoCHKDzhL+BPVbV+Vog82K+nRmGueWsPMFSMS0fIlqRqgMYlVZIXUI
+ntes3F9tk8+q2qxGvt6cOUl9zyXqPQr1dcgcmD5gp3dLe5GUZ6vZqrIn57qoIWiV
+LCHQSTtzE2Sy9f8ebwIIqYFW74ri6AVi6o4CNx0SNQKBgB7t/FnqPIU3QKV86ppY
+slxE+zBTYBJ+tQABPXZ2bEOCzBf/LE6b7KdUoakiTbR8L+RQ1yzSvja/MfxMSFHN
+UxjZf2RI62uuq7e+p4MmOYSbxdm12LGooNjm3pJzCcKToZRMEYNXr6JGx9xVpZjp
+Pj5iUUk+PbS4dhVPClMyJWlA
+-----END PRIVATE KEY-----
diff --git "a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/\350\257\201\344\271\246\344\275\277\347\224\250\350\257\264\346\230\216.txt" "b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/\350\257\201\344\271\246\344\275\277\347\224\250\350\257\264\346\230\216.txt"
new file mode 100644
index 0000000..9a0aab1
--- /dev/null
+++ "b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/common/cert/\350\257\201\344\271\246\344\275\277\347\224\250\350\257\264\346\230\216.txt"
@@ -0,0 +1,18 @@
+欢迎使用微信支付!
+附件中的三份文件(证书pkcs12格式、证书pem格式、证书密钥pem格式),为接口中强制要求时需携带的证书文件。
+证书属于敏感信息,请妥善保管不要泄露和被他人复制。
+不同开发语言下的证书格式不同,以下为说明指引:
+    证书pkcs12格式(apiclient_cert.p12)
+        包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
+        部分安全性要求较高的API需要使用该证书来确认您的调用身份
+        windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户号(如:1900006031)
+    证书pem格式(apiclient_cert.pem)
+        从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制
+        部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
+        您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
+    证书密钥pem格式(apiclient_key.pem)
+        从apiclient_cert.p12中导出密钥部分的文件,为pem格式
+        部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
+        您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
+备注说明:  
+        由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书,  2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载 
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/AppPayReqData.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/AppPayReqData.java
new file mode 100644
index 0000000..3e532b4
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/AppPayReqData.java
@@ -0,0 +1,125 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.protocol;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.RandomStringGenerator;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Signature;
+import com.stylefeng.guns.modular.shunfeng.util.DateUtil;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 调起支付-API需要提交的数据
+ * @author pan
+ */
+public class AppPayReqData {
+
+    //每个字段具体的意思请查看API文档
+	private String appid;//公众账号ID
+	private String partnerid;//商户号
+	private String prepayid;//预支付编号(微信返回的支付交易会话ID)
+	private String _package = "Sign=WXPay";//扩展字段(暂填写固定值Sign=WXPay)
+	private String noncestr = RandomStringGenerator.getRandomStringByLength(32);//随机字符串 (32位)
+	private String timestamp = DateUtil.nowDateLongStr().substring(0, 10);//时间戳
+	private String sign;//签名 
+	/**
+	 * 调用微信支付
+	 * @param appid 微信分配的APPID
+	 * @param partnerid 微信支付分配的商户号ID
+	 * @param prepayid 预支付编号(微信返回的支付交易会话ID)
+	 */
+    public AppPayReqData(Integer apptype, String appid, String partnerid, String prepayid, String noncestr){
+    	//微信分配的APPID
+    	this.appid = appid;
+    	//微信支付接口与预支付接口随机字符串,保持一致!
+    	this.noncestr = noncestr;
+        //微信支付分配的商户号ID
+    	this.partnerid = partnerid;
+        //预支付编号(微信返回的支付交易会话ID)
+        this.prepayid = prepayid;
+		// 根据API给的签名规则进行签名
+		String sign = Signature.getSign(apptype, toMap());
+		setSign(sign);//微信公众号(最后参与签名的参数有appId, timeStamp, nonceStr, package, signType)
+    }
+
+    public Map<String,Object> toMap(){
+        Map<String,Object> map = new HashMap<String, Object>();
+        Field[] fields = this.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            Object obj;
+            try {
+                obj = field.get(this);
+                if(obj!=null){
+                    if ("_package".equals(field.getName())) {
+                    	map.put("package", obj);
+					}else{
+						 map.put(field.getName(), obj);
+					}
+                }
+            } catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return map;
+    }
+
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	public String getPartnerid() {
+		return partnerid;
+	}
+
+	public void setPartnerid(String partnerid) {
+		this.partnerid = partnerid;
+	}
+
+	public String getPrepayid() {
+		return prepayid;
+	}
+
+	public void setPrepayid(String prepayid) {
+		this.prepayid = prepayid;
+	}
+
+	public String get_package() {
+		return _package;
+	}
+
+	public void set_package(String _package) {
+		this._package = _package;
+	}
+
+	public String getNoncestr() {
+		return noncestr;
+	}
+
+	public void setNoncestr(String noncestr) {
+		this.noncestr = noncestr;
+	}
+
+	public String getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(String timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getSign() {
+		return sign;
+	}
+
+	public void setSign(String sign) {
+		this.sign = sign;
+	}
+
+}
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/RefundReqData.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/RefundReqData.java
new file mode 100644
index 0000000..f5ce4bb
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/RefundReqData.java
@@ -0,0 +1,209 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.protocol;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Configure;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.RandomStringGenerator;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Signature;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 商户退款-API需要提交的数据
+ * @author pan
+ */
+public class RefundReqData {
+
+	//每个字段具体的意思请查看API文档
+	private String appid = "";
+	private String mch_id = "";
+	private String device_info = "";
+	private String nonce_str = "";
+	private String sign = "";
+	private String transaction_id = "";
+	private String out_trade_no = "";
+	private String out_refund_no = "";
+	private int total_fee = 0;
+	private int refund_fee = 0;
+	private String refund_fee_type = "CNY";
+	private String op_user_id = "";
+	private String pay_type = "";//2微信app支付,3公众号支付,4小程序支付
+
+	/**
+	 * 请求退款服务
+	 * @param transactionID 是微信系统为每一笔支付交易分配的订单号,通过这个订单号可以标识这笔交易,它由支付订单API支付成功时返回的数据里面获取到。建议优先使用
+	 * @param outTradeNo 商户系统内部的订单号,transaction_id 、out_trade_no 二选一,如果同时存在优先级:transaction_id>out_trade_no
+	 * @param deviceInfo 微信支付分配的终端设备号,与下单一致
+	 * @param outRefundNo 商户系统内部的退款单号,商户系统内部唯一,同一退款单号多次请求只退一笔
+	 * @param totalFee 订单总金额,单位为分
+	 * @param refundFee 退款总金额,单位为分,可以做部分退款
+	 * @param opUserID 操作员帐号, 默认为商户号
+	 * @param refundFeeType 货币类型,符合ISO 4217标准的三位字母代码,默认为CNY(人民币)
+	 */
+	public RefundReqData(String transactionID, String outTradeNo, String outRefundNo, int totalFee, int refundFee,String payType) {
+		// 微信分配的公众号ID(开通公众号之后可以获取到)
+
+		if (payType.equals("2")) {//微信app
+			System.out.println("微信app退款!!!!!!!!!!!");
+			setAppid(Configure.getAppid());
+			setMch_id(Configure.getMchid());
+			setOp_user_id(getMch_id());
+		}else if(payType.equals("3")) {//微信公众号
+			System.out.println("微信公众号退款!!!!!!!!!!!");
+			setAppid(Configure.getGappid());
+			setMch_id(Configure.getGmchid());
+			setOp_user_id(Configure.getGmchid());
+		}else if(payType.equals("4")) {//微信小程序
+			System.out.println("微信小程序退款!!!!!!!!!!!");
+			setAppid(Configure.getXappid());
+			setMch_id(Configure.getXmchid());
+			setOp_user_id(Configure.getXmchid());
+		}
+
+		//transaction_id是微信系统为每一笔支付交易分配的订单号,通过这个订单号可以标识这笔交易,它由支付订单API支付成功时返回的数据里面获取到。
+		setTransaction_id(transactionID);
+
+		//商户系统自己生成的唯一的订单号
+		setOut_trade_no(outTradeNo);
+
+		setOut_refund_no(outRefundNo);
+
+		setTotal_fee(totalFee);
+
+		setRefund_fee(refundFee);
+
+		//随机字符串,不长于32 位
+		setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
+
+		//根据API给的签名规则进行签名
+		String sign = Signature.getSign(1,toMap());
+		setSign(sign);//把签名数据设置到Sign这个属性中
+
+
+	}
+
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	public String getMch_id() {
+		return mch_id;
+	}
+
+	public void setMch_id(String mch_id) {
+		this.mch_id = mch_id;
+	}
+
+	public String getDevice_info() {
+		return device_info;
+	}
+
+	public void setDevice_info(String device_info) {
+		this.device_info = device_info;
+	}
+
+	public String getNonce_str() {
+		return nonce_str;
+	}
+
+	public void setNonce_str(String nonce_str) {
+		this.nonce_str = nonce_str;
+	}
+
+	public String getSign() {
+		return sign;
+	}
+
+	public void setSign(String sign) {
+		this.sign = sign;
+	}
+
+	public String getTransaction_id() {
+		return transaction_id;
+	}
+
+	public void setTransaction_id(String transaction_id) {
+		this.transaction_id = transaction_id;
+	}
+
+	public String getOut_trade_no() {
+		return out_trade_no;
+	}
+
+	public void setOut_trade_no(String out_trade_no) {
+		this.out_trade_no = out_trade_no;
+	}
+
+	public String getOut_refund_no() {
+		return out_refund_no;
+	}
+
+	public void setOut_refund_no(String out_refund_no) {
+		this.out_refund_no = out_refund_no;
+	}
+
+	public int getTotal_fee() {
+		return total_fee;
+	}
+
+	public void setTotal_fee(int total_fee) {
+		this.total_fee = total_fee;
+	}
+
+	public int getRefund_fee() {
+		return refund_fee;
+	}
+
+	public void setRefund_fee(int refund_fee) {
+		this.refund_fee = refund_fee;
+	}
+
+	public String getOp_user_id() {
+		return op_user_id;
+	}
+
+	public void setOp_user_id(String op_user_id) {
+		this.op_user_id = op_user_id;
+	}
+
+	public String getRefund_fee_type() {
+		return refund_fee_type;
+	}
+
+	public void setRefund_fee_type(String refund_fee_type) {
+		this.refund_fee_type = refund_fee_type;
+	}	
+
+	public String getPay_type() {
+		return pay_type;
+	}
+
+	public void setPay_type(String pay_type) {
+		this.pay_type = pay_type;
+	}
+
+	public Map<String,Object> toMap(){
+		Map<String,Object> map = new HashMap<String, Object>();
+		Field[] fields = this.getClass().getDeclaredFields();
+		for (Field field : fields) {
+			Object obj;
+			try {
+				obj = field.get(this);
+				if(obj!=null){
+					map.put(field.getName(), obj);
+				}
+			} catch (IllegalArgumentException e) {
+				e.printStackTrace();
+			} catch (IllegalAccessException e) {
+				e.printStackTrace();
+			}
+		}
+		return map;
+	}
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/UnifiedorderReqData.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/UnifiedorderReqData.java
new file mode 100644
index 0000000..4674681
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/UnifiedorderReqData.java
@@ -0,0 +1,297 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.protocol;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Configure;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.RandomStringGenerator;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Signature;
+
+import java.lang.reflect.Field;
+import java.text.DecimalFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+/**
+ * 请求统一下单-API需要提交的数据
+ * @author pan
+ */
+public class UnifiedorderReqData {
+
+    //每个字段具体的意思请查看API文档
+    private String appid;//公众账号ID (内置)
+    private String mch_id;//商户号  (内置)
+    private String nonce_str;//随机字符串 (内置)
+    private String sign;//签名
+
+
+    //接口调用需要的参数
+    private String body;//商品描述
+    private String out_trade_no;//商户订单号
+    private Integer total_fee;//总金额
+    private String spbill_create_ip;//终端IP
+    private String notify_url;//通知地址
+    private String trade_type;//交易类型
+    private String openid;//用户标识
+
+    /**
+     * 预支付请求需要的参数(获取微信统一下单-必填参数)
+     * 公众账号ID 	appid (内置)
+     * 商户号  	mch_id (内置)
+     * 随机字符串  	nonce_str (内置)
+     * 签名 	sign (内置)
+     * @param body				商品描述
+     * @param out_trade_no		商户订单号
+     * @param total_fee			总金额 (单位:分)
+     * @param notify_url		通知地址
+     */
+    public UnifiedorderReqData(Integer apptype, String out_trade_no, String body, Double total_fee, String notify_url){
+
+        //乘客appID与商户号
+        this.appid = Configure.getAppid();
+
+        //微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
+        this.mch_id = Configure.getMchid();
+
+        //随机字符串,不长于32 位
+        //        setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
+        this.nonce_str = RandomStringGenerator.getRandomStringByLength(32);
+
+
+        //		setBody(body);// 商品描述
+        this.body = body;
+
+        //		setOut_trade_no(out_trade_no);// 商户订单号
+        this.out_trade_no = out_trade_no;
+
+        //		setTotal_fee();// 总金额
+        String money=doubleRetainTwo(total_fee*100d);
+        this.total_fee = Integer.parseInt(money.substring(0,money.length()-3));
+
+        //		setNotify_url(notify_url);// 通知地址
+        this.notify_url = notify_url;
+        //		setTrade_type("APP");// 交易类型,默认:APP
+        this.trade_type = "APP";
+        // 根据API给的签名规则进行签名
+        this.sign =  Signature.getSign(apptype, toMap());
+
+    }
+
+
+    /**
+     * 预支付请求需要的参数(获取微信统一下单-必填参数)(公众号)
+     * 公众账号ID 	appid (内置)
+     * 商户号  	mch_id (内置)
+     * 随机字符串  	nonce_str (内置)
+     * 签名 	sign (内置)
+     * @param body				商品描述
+     * @param out_trade_no		商户订单号
+     * @param total_fee			总金额 (单位:分)
+     * @param notify_url		通知地址
+     * @throws IllegalAccessException
+     */
+    public UnifiedorderReqData(String out_trade_no, String body, Double total_fee, String notify_url,String trade_type,String openid) throws IllegalAccessException{
+
+        //appID与商户号
+        this.appid = Configure.getGappid();
+
+        //微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
+        this.mch_id = Configure.getGmchid();
+
+        //随机字符串,不长于32 位
+        //        setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
+        this.nonce_str = RandomStringGenerator.getRandomStringByLength(32);
+
+
+        //		setBody(body);// 商品描述
+        this.body = body;
+
+        //		setOut_trade_no(out_trade_no);// 商户订单号
+        this.out_trade_no = out_trade_no;
+
+        //		setTotal_fee();// 总金额
+        String money=doubleRetainTwo(total_fee*100d);
+        this.total_fee = Integer.parseInt(money.substring(0,money.length()-3));
+        //this.total_fee = (int)(total_fee * 100);
+
+        //		setNotify_url(notify_url);// 通知地址
+        this.notify_url = notify_url;
+		/*trade_type 交易类型JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里
+		MICROPAY--刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口*/
+
+        this.trade_type = trade_type;
+        this.openid = openid;
+        // 根据API给的签名规则进行签名
+        this.sign =  Signature.getSign(1,toMap());
+
+    }
+
+    /**
+     * 预支付请求需要的参数(获取微信统一下单-必填参数)(小程序)
+     * 公众账号ID 	appid (内置)
+     * 商户号  	mch_id (内置)
+     * 随机字符串  	nonce_str (内置)
+     * 签名 	sign (内置)
+     * @param body				商品描述
+     * @param out_trade_no		商户订单号
+     * @param total_fee			总金额 (单位:分)
+     * @param notify_url		通知地址
+     * @throws IllegalAccessException
+     */
+    public UnifiedorderReqData(String out_trade_no, Double total_fee, String notify_url,String trade_type,String openid) throws IllegalAccessException{
+
+        //appID与商户号
+        this.appid = Configure.getXappid();
+
+        //微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
+        this.mch_id = Configure.getXmchid();
+
+        //随机字符串,不长于32 位
+        //        setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
+        this.nonce_str = RandomStringGenerator.getRandomStringByLength(32);
+
+
+        //		setBody(body);// 商品描述
+        this.body = "小程序支付";
+
+        //		setOut_trade_no(out_trade_no);// 商户订单号
+        this.out_trade_no = out_trade_no;
+
+        //		setTotal_fee();// 总金额
+        String money=doubleRetainTwo(total_fee*100d);
+        this.total_fee = Integer.parseInt(money.substring(0,money.length()-3));
+        //this.total_fee = (int)(total_fee * 100);
+
+        //		setNotify_url(notify_url);// 通知地址
+        this.notify_url = notify_url;
+		/*trade_type 交易类型JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里
+		MICROPAY--刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口*/
+
+        this.trade_type = trade_type;
+        this.openid = openid;
+        // 根据API给的签名规则进行签名
+        this.sign =  Signature.getSign(1,toMap());
+
+    }
+
+    public Map<String,Object> toMap(){
+        Map<String,Object> map = new HashMap<String, Object>();
+        Field[] fields = this.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            Object obj;
+            try {
+                obj = field.get(this);
+                if(obj!=null){
+                    map.put(field.getName(), obj);
+                }
+            } catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return map;
+    }
+
+    public String getAppid() {
+        return appid;
+    }
+
+    public void setAppid(String appid) {
+        this.appid = appid;
+    }
+
+    public String getMch_id() {
+        return mch_id;
+    }
+
+    public void setMch_id(String mch_id) {
+        this.mch_id = mch_id;
+    }
+
+    public String getNonce_str() {
+        return nonce_str;
+    }
+
+    public void setNonce_str(String nonce_str) {
+        this.nonce_str = nonce_str;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+    public String getOut_trade_no() {
+        return out_trade_no;
+    }
+
+    public void setOut_trade_no(String out_trade_no) {
+        this.out_trade_no = out_trade_no;
+    }
+
+    public Integer getTotal_fee() {
+        return total_fee;
+    }
+
+    public void setTotal_fee(Integer total_fee) {
+        this.total_fee = total_fee;
+    }
+
+    public String getSpbill_create_ip() {
+        return spbill_create_ip;
+    }
+
+    public void setSpbill_create_ip(String spbill_create_ip) {
+        this.spbill_create_ip = spbill_create_ip;
+    }
+
+    public String getNotify_url() {
+        return notify_url;
+    }
+
+    public void setNotify_url(String notify_url) {
+        this.notify_url = notify_url;
+    }
+
+    public String getTrade_type() {
+        return trade_type;
+    }
+
+    public void setTrade_type(String trade_type) {
+        this.trade_type = trade_type;
+    }
+
+
+    public String getOpenid() {
+        return openid;
+    }
+
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+    /**
+     * Double类型保留2位小数
+     *
+     * @param num
+     * @return
+     */
+    public static String doubleRetainTwo(double num) {
+        DecimalFormat dfs = new DecimalFormat("0.00");
+        String.format("%.2f", num);
+        return dfs.format(num);
+    }
+
+}
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/WXPayReport.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/WXPayReport.java
new file mode 100644
index 0000000..705f641
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/WXPayReport.java
@@ -0,0 +1,268 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.protocol;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayConfig;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayUtil;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
+import org.apache.http.util.EntityUtils;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * 
+ * 交易保障
+ */
+public class WXPayReport {
+
+    public static class ReportInfo {
+
+        /**
+         * 布尔变量使用int。0为false, 1为true。
+         */
+
+        // 基本信息
+        private String version = "v0";
+        private String sdk = "wxpay java sdk v1.0";
+        private String uuid;  // 交易的标识
+        private long timestamp;   // 上报时的时间戳,单位秒
+        private long elapsedTimeMillis; // 耗时,单位 毫秒
+
+        // 针对主域名
+        private String firstDomain;  // 第1次请求的域名
+        private boolean primaryDomain; //是否主域名
+        private int firstConnectTimeoutMillis;  // 第1次请求设置的连接超时时间,单位 毫秒
+        private int firstReadTimeoutMillis;  // 第1次请求设置的读写超时时间,单位 毫秒
+        private int firstHasDnsError;  // 第1次请求是否出现dns问题
+        private int firstHasConnectTimeout; // 第1次请求是否出现连接超时
+        private int firstHasReadTimeout; // 第1次请求是否出现连接超时
+
+        public ReportInfo(String uuid, long timestamp, long elapsedTimeMillis, String firstDomain, boolean primaryDomain, int firstConnectTimeoutMillis, int firstReadTimeoutMillis, boolean firstHasDnsError, boolean firstHasConnectTimeout, boolean firstHasReadTimeout) {
+            this.uuid = uuid;
+            this.timestamp = timestamp;
+            this.elapsedTimeMillis = elapsedTimeMillis;
+            this.firstDomain = firstDomain;
+            this.primaryDomain = primaryDomain;
+            this.firstConnectTimeoutMillis = firstConnectTimeoutMillis;
+            this.firstReadTimeoutMillis = firstReadTimeoutMillis;
+            this.firstHasDnsError = firstHasDnsError?1:0;
+            this.firstHasConnectTimeout = firstHasConnectTimeout?1:0;
+            this.firstHasReadTimeout = firstHasReadTimeout?1:0;
+         }
+
+        @Override
+        public String toString() {
+            return "ReportInfo{" +
+                    "version='" + version + '\'' +
+                    ", sdk='" + sdk + '\'' +
+                    ", uuid='" + uuid + '\'' +
+                    ", timestamp=" + timestamp +
+                    ", elapsedTimeMillis=" + elapsedTimeMillis +
+                    ", firstDomain='" + firstDomain + '\'' +
+                    ", primaryDomain=" + primaryDomain +
+                    ", firstConnectTimeoutMillis=" + firstConnectTimeoutMillis +
+                    ", firstReadTimeoutMillis=" + firstReadTimeoutMillis +
+                    ", firstHasDnsError=" + firstHasDnsError +
+                    ", firstHasConnectTimeout=" + firstHasConnectTimeout +
+                    ", firstHasReadTimeout=" + firstHasReadTimeout +
+                    '}';
+        }
+
+        /**
+         * 转换成 csv 格式
+         *
+         * @return
+         */
+        public String toLineString(String key) {
+            String separator = ",";
+            Object[] objects = new Object[] {
+                version, sdk, uuid, timestamp, elapsedTimeMillis,
+                    firstDomain, primaryDomain, firstConnectTimeoutMillis, firstReadTimeoutMillis,
+                    firstHasDnsError, firstHasConnectTimeout, firstHasReadTimeout
+            };
+            StringBuffer sb = new StringBuffer();
+            for(Object obj: objects) {
+                sb.append(obj).append(separator);
+            }
+            try {
+                String sign = WXPayUtil.HMACSHA256(sb.toString(), key);
+                sb.append(sign);
+                return sb.toString();
+            }
+            catch (Exception ex) {
+                return null;
+            }
+
+        }
+
+    }
+
+    private static final String REPORT_URL = "http://report.mch.weixin.qq.com/wxpay/report/default";
+    // private static final String REPORT_URL = "http://127.0.0.1:5000/test";
+
+
+    private static final int DEFAULT_CONNECT_TIMEOUT_MS = 6*1000;
+    private static final int DEFAULT_READ_TIMEOUT_MS = 8*1000;
+
+    private LinkedBlockingQueue<String> reportMsgQueue = null;
+    private WXPayConfig config;
+    private ExecutorService executorService;
+
+    private volatile static WXPayReport INSTANCE;
+
+    private WXPayReport(final WXPayConfig config) {
+        this.config = config;
+        reportMsgQueue = new LinkedBlockingQueue<String>(config.getReportQueueMaxSize());
+
+        // 添加处理线程
+        executorService = Executors.newFixedThreadPool(config.getReportWorkerNum(), new ThreadFactory() {
+            public Thread newThread(Runnable r) {
+                Thread t = Executors.defaultThreadFactory().newThread(r);
+                t.setDaemon(true);
+                return t;
+            }
+        });
+
+        if (config.shouldAutoReport()) {
+            WXPayUtil.getLogger().info("report worker num: {}", config.getReportWorkerNum());
+            for (int i = 0; i < config.getReportWorkerNum(); ++i) {
+                executorService.execute(new Runnable() {
+                    public void run() {
+                        while (true) {
+                            // 先用 take 获取数据
+                            try {
+                                StringBuffer sb = new StringBuffer();
+                                String firstMsg = reportMsgQueue.take();
+                                WXPayUtil.getLogger().info("get first report msg: {}", firstMsg);
+                                String msg = null;
+                                sb.append(firstMsg); //会阻塞至有消息
+                                int remainNum = config.getReportBatchSize() - 1;
+                                for (int j=0; j<remainNum; ++j) {
+                                    WXPayUtil.getLogger().info("try get remain report msg");
+                                    // msg = reportMsgQueue.poll();  // 不阻塞了
+                                    msg = reportMsgQueue.take();
+                                    WXPayUtil.getLogger().info("get remain report msg: {}", msg);
+                                    if (msg == null) {
+                                        break;
+                                    }
+                                    else {
+                                        sb.append("\n");
+                                        sb.append(msg);
+                                    }
+                                }
+                                // 上报
+                                WXPayReport.httpRequest(sb.toString(), DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_READ_TIMEOUT_MS);
+                            }
+                            catch (Exception ex) {
+                                WXPayUtil.getLogger().warn("report fail. reason: {}", ex.getMessage());
+                            }
+                        }
+                    }
+                });
+            }
+        }
+
+    }
+
+    /**
+     * 单例,双重校验,请在 JDK 1.5及更高版本中使用
+     *
+     * @param config
+     * @return
+     */
+    public static WXPayReport getInstance(WXPayConfig config) {
+        if (INSTANCE == null) {
+            synchronized (WXPayReport.class) {
+                if (INSTANCE == null) {
+                    INSTANCE = new WXPayReport(config);
+                }
+            }
+        }
+        return INSTANCE;
+    }
+
+    public void report(String uuid, long elapsedTimeMillis,
+                       String firstDomain, boolean primaryDomain, int firstConnectTimeoutMillis, int firstReadTimeoutMillis,
+                       boolean firstHasDnsError, boolean firstHasConnectTimeout, boolean firstHasReadTimeout) {
+        long currentTimestamp = WXPayUtil.getCurrentTimestamp();
+        ReportInfo reportInfo = new ReportInfo(uuid, currentTimestamp, elapsedTimeMillis,
+                firstDomain, primaryDomain, firstConnectTimeoutMillis, firstReadTimeoutMillis,
+                firstHasDnsError, firstHasConnectTimeout, firstHasReadTimeout);
+        String data = reportInfo.toLineString(config.getKey());
+        WXPayUtil.getLogger().info("report {}", data);
+        if (data != null) {
+            reportMsgQueue.offer(data);
+        }
+    }
+
+
+    @Deprecated
+    private void reportSync(final String data) throws Exception {
+        httpRequest(data, DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_READ_TIMEOUT_MS);
+    }
+
+    @Deprecated
+    private void reportAsync(final String data) throws Exception {
+        new Thread(new Runnable() {
+            public void run() {
+                try {
+                    httpRequest(data, DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_READ_TIMEOUT_MS);
+                }
+                catch (Exception ex) {
+                    WXPayUtil.getLogger().warn("report fail. reason: {}", ex.getMessage());
+                }
+            }
+        }).start();
+    }
+
+    /**
+     * http 请求
+     * @param data
+     * @param connectTimeoutMs
+     * @param readTimeoutMs
+     * @return
+     * @throws Exception
+     */
+    private static String httpRequest(String data, int connectTimeoutMs, int readTimeoutMs) throws Exception{
+        BasicHttpClientConnectionManager connManager;
+        connManager = new BasicHttpClientConnectionManager(
+                RegistryBuilder.<ConnectionSocketFactory>create()
+                        .register("http", PlainConnectionSocketFactory.getSocketFactory())
+                        .register("https", SSLConnectionSocketFactory.getSocketFactory())
+                        .build(),
+                null,
+                null,
+                null
+        );
+        HttpClient httpClient = HttpClientBuilder.create()
+                .setConnectionManager(connManager)
+                .build();
+
+        HttpPost httpPost = new HttpPost(REPORT_URL);
+
+        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(readTimeoutMs).setConnectTimeout(connectTimeoutMs).build();
+        httpPost.setConfig(requestConfig);
+
+        StringEntity postEntity = new StringEntity(data, "UTF-8");
+        httpPost.addHeader("Content-Type", "text/xml");
+        httpPost.addHeader("User-Agent", "wxpay sdk java v1.0 ");  // TODO: 很重要,用来检测 sdk 的使用情况,要不要加上商户信息?
+        httpPost.setEntity(postEntity);
+
+        HttpResponse httpResponse = httpClient.execute(httpPost);
+        HttpEntity httpEntity = httpResponse.getEntity();
+        return EntityUtils.toString(httpEntity, "UTF-8");
+    }
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/WXPayRequest.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/WXPayRequest.java
new file mode 100644
index 0000000..cee5b14
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/protocol/WXPayRequest.java
@@ -0,0 +1,328 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.protocol;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.IWXPayDomain;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayConfig;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayUtil;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
+import org.apache.http.util.EntityUtils;
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import java.io.InputStream;
+import java.net.SocketTimeoutException;
+import java.net.UnknownHostException;
+import java.security.KeyStore;
+import java.security.SecureRandom;
+
+public class WXPayRequest {
+    private WXPayConfig config;
+    public WXPayRequest(WXPayConfig config) throws Exception{
+
+        this.config = config;
+    }
+
+    /**
+     * 请求,只请求一次,不做重试
+     * @param domain
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @param connectTimeoutMs
+     * @param readTimeoutMs
+     * @param useCert 是否使用证书,针对退款、撤销等操作
+     * @return
+     * @throws Exception
+     */
+    private String requestOnce(final String domain, String urlSuffix, String uuid, String data, int connectTimeoutMs, int readTimeoutMs, boolean useCert) throws Exception {
+        BasicHttpClientConnectionManager connManager;
+        if (useCert) {
+            // 证书
+            char[] password = config.getMchID().toCharArray();
+            InputStream certStream = config.getCertStream();
+            KeyStore ks = KeyStore.getInstance("PKCS12");
+            ks.load(certStream, password);
+
+            // 实例化密钥库 & 初始化密钥工厂
+            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+            kmf.init(ks, password);
+
+            // 创建 SSLContext
+            SSLContext sslContext = SSLContext.getInstance("TLS");
+            sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
+
+            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
+                    sslContext);
+
+            connManager = new BasicHttpClientConnectionManager(
+                    RegistryBuilder.<ConnectionSocketFactory>create()
+                            .register("http", PlainConnectionSocketFactory.getSocketFactory())
+                            .register("https", sslConnectionSocketFactory)
+                            .build(),
+                    null,
+                    null,
+                    null
+            );
+        }
+        else {
+            connManager = new BasicHttpClientConnectionManager(
+                    RegistryBuilder.<ConnectionSocketFactory>create()
+                            .register("http", PlainConnectionSocketFactory.getSocketFactory())
+                            .register("https", SSLConnectionSocketFactory.getSocketFactory())
+                            .build(),
+                    null,
+                    null,
+                    null
+            );
+        }
+
+        HttpClient httpClient = HttpClientBuilder.create()
+                .setConnectionManager(connManager)
+                .build();
+
+        String url = "https://" + domain + urlSuffix;
+        HttpPost httpPost = new HttpPost(url);
+
+        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(readTimeoutMs).setConnectTimeout(connectTimeoutMs).build();
+        httpPost.setConfig(requestConfig);
+
+        StringEntity postEntity = new StringEntity(data, "UTF-8");
+        httpPost.addHeader("Content-Type", "text/xml");
+        httpPost.addHeader("User-Agent", "wxpay sdk java v1.0 " + config.getMchID());  // TODO: 很重要,用来检测 sdk 的使用情况,要不要加上商户信息?
+        httpPost.setEntity(postEntity);
+
+        HttpResponse httpResponse = httpClient.execute(httpPost);
+        HttpEntity httpEntity = httpResponse.getEntity();
+        return EntityUtils.toString(httpEntity, "UTF-8");
+
+    }
+
+
+    private String request(String urlSuffix, String uuid, String data, int connectTimeoutMs, int readTimeoutMs, boolean useCert, boolean autoReport) throws Exception {
+        Exception exception = null;
+        long elapsedTimeMillis = 0;
+        long startTimestampMs = WXPayUtil.getCurrentTimestampMs();
+        boolean firstHasDnsErr = false;
+        boolean firstHasConnectTimeout = false;
+        boolean firstHasReadTimeout = false;
+        IWXPayDomain.DomainInfo domainInfo = config.getWXPayDomain().getDomain(config);
+        if(domainInfo == null){
+            throw new Exception("WXPayConfig.getWXPayDomain().getDomain() is empty or null");
+        }
+        try {
+            String result = requestOnce(domainInfo.domain, urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, useCert);
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs()-startTimestampMs;
+            config.getWXPayDomain().report(domainInfo.domain, elapsedTimeMillis, null);
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout);
+            return result;
+        }
+        catch (UnknownHostException ex) {  // dns 解析错误,或域名不存在
+            exception = ex;
+            firstHasDnsErr = true;
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs()-startTimestampMs;
+            WXPayUtil.getLogger().warn("UnknownHostException for domainInfo {}", domainInfo);
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout
+            );
+        }
+        catch (ConnectTimeoutException ex) {
+            exception = ex;
+            firstHasConnectTimeout = true;
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs()-startTimestampMs;
+            WXPayUtil.getLogger().warn("connect timeout happened for domainInfo {}", domainInfo);
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout
+            );
+        }
+        catch (SocketTimeoutException ex) {
+            exception = ex;
+            firstHasReadTimeout = true;
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs()-startTimestampMs;
+            WXPayUtil.getLogger().warn("timeout happened for domainInfo {}", domainInfo);
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout);
+        }
+        catch (Exception ex) {
+            exception = ex;
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs()-startTimestampMs;
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout);
+        }
+        config.getWXPayDomain().report(domainInfo.domain, elapsedTimeMillis, exception);
+        throw exception;
+    }
+
+
+    /**
+     * 可重试的,非双向认证的请求
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @return
+     */
+    public String requestWithoutCert(String urlSuffix, String uuid, String data, boolean autoReport) throws Exception {
+        return this.request(urlSuffix, uuid, data, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs(), false, autoReport);
+        //return requestWithoutCert(urlSuffix, uuid, data, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs(), autoReport);
+    }
+
+    /**
+     * 可重试的,非双向认证的请求
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @param connectTimeoutMs
+     * @param readTimeoutMs
+     * @return
+     */
+    public String requestWithoutCert(String urlSuffix, String uuid, String data, int connectTimeoutMs, int readTimeoutMs,  boolean autoReport) throws Exception {
+        return this.request(urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, false, autoReport);
+
+        /*
+        String result;
+        Exception exception;
+        boolean shouldRetry = false;
+
+        boolean useCert = false;
+        try {
+            result = requestOnce(domain, urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, useCert);
+            return result;
+        }
+        catch (UnknownHostException ex) {  // dns 解析错误,或域名不存在
+            exception = ex;
+            WXPayUtil.getLogger().warn("UnknownHostException for domain {}, try to use {}", domain, this.primaryDomain);
+            shouldRetry = true;
+        }
+        catch (ConnectTimeoutException ex) {
+            exception = ex;
+            WXPayUtil.getLogger().warn("connect timeout happened for domain {}, try to use {}", domain, this.primaryDomain);
+            shouldRetry = true;
+        }
+        catch (SocketTimeoutException ex) {
+            exception = ex;
+            shouldRetry = false;
+        }
+        catch (Exception ex) {
+            exception = ex;
+            shouldRetry = false;
+        }
+
+        if (shouldRetry) {
+            result = requestOnce(this.primaryDomain, urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, useCert);
+            return result;
+        }
+        else {
+            throw exception;
+        }
+        */
+    }
+
+    /**
+     * 可重试的,双向认证的请求
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @return
+     */
+    public String requestWithCert(String urlSuffix, String uuid, String data, boolean autoReport) throws Exception {
+        return this.request(urlSuffix, uuid, data, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs(), true, autoReport);
+        //return requestWithCert(urlSuffix, uuid, data, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs(), autoReport);
+    }
+
+    /**
+     * 可重试的,双向认证的请求
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @param connectTimeoutMs
+     * @param readTimeoutMs
+     * @return
+     */
+    public String requestWithCert(String urlSuffix, String uuid, String data, int connectTimeoutMs, int readTimeoutMs, boolean autoReport) throws Exception {
+        return this.request(urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, true, autoReport);
+
+        /*
+        String result;
+        Exception exception;
+        boolean shouldRetry = false;
+
+        boolean useCert = true;
+        try {
+            result = requestOnce(domain, urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, useCert);
+            return result;
+        }
+        catch (ConnectTimeoutException ex) {
+            exception = ex;
+            WXPayUtil.getLogger().warn(String.format("connect timeout happened for domain {}, try to use {}", domain, this.primaryDomain));
+            shouldRetry = true;
+        }
+        catch (SocketTimeoutException ex) {
+            exception = ex;
+            shouldRetry = false;
+        }
+        catch (Exception ex) {
+            exception = ex;
+            shouldRetry = false;
+        }
+
+        if (shouldRetry && this.primaryDomain != null) {
+            result = requestOnce(this.primaryDomain, urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, useCert, autoReport);
+            return result;
+        }
+        else {
+            throw exception;
+        }
+        */
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/BaseService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/BaseService.java
new file mode 100644
index 0000000..2f1757f
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/BaseService.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.service;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Configure;
+
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+
+
+
+/**
+ * User: rizenguo
+ * Date: 2014/12/10
+ * Time: 15:44
+ * 服务的基类
+ */
+public class BaseService{
+
+	//API的地址
+	private String apiURL;
+
+	//发请求的HTTPS请求器
+	private IServiceRequest serviceRequest;
+
+	public BaseService(Integer apptype,String api) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+		apiURL = api;
+	
+		   if (apptype.equals(2)) {//微信小程序和公众号的
+	        	Class<?> c = Class.forName(Configure.HttpsRequestClassName_2);
+	            serviceRequest = (IServiceRequest) c.newInstance();
+			} else {//微信app的
+				Class<?> c = Class.forName(Configure.HttpsRequestClassName);
+				serviceRequest = (IServiceRequest) c.newInstance();
+			}
+	}
+
+	protected String sendPost(Object xmlObj) throws UnrecoverableKeyException, IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
+		return serviceRequest.sendPost(apiURL, xmlObj);
+	}
+
+	/**
+	 * 供商户想自定义自己的HTTP请求器用
+	 * @param request 实现了IserviceRequest接口的HttpsRequest
+	 */
+	public void setServiceRequest(IServiceRequest request){
+		serviceRequest = request;
+	}
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/IServiceRequest.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/IServiceRequest.java
new file mode 100644
index 0000000..c764bee
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/IServiceRequest.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.service;
+
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+
+/**
+ * User: rizenguo
+ * Date: 2014/12/10
+ * Time: 15:16
+ * 这里定义服务层需要请求器标准接口
+ */
+public interface IServiceRequest {
+
+    //Service依赖的底层https请求器必须实现这么一个接口
+    public String sendPost(String api_url, Object xmlObj) throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException;
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/RefundService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/RefundService.java
new file mode 100644
index 0000000..6af2a76
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/RefundService.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.service;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Configure;
+import com.stylefeng.guns.modular.shunfeng.tencent.protocol.RefundReqData;
+
+/**
+ * User: rizenguo
+ * Date: 2014/10/29
+ * Time: 16:04
+ */
+public class RefundService extends BaseService{
+
+    public RefundService(Integer apptype) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
+        super(apptype, Configure.REFUND_API);
+    }
+
+    /**
+     * 请求退款服务
+     * @param refundReqData 这个数据对象里面包含了API要求提交的各种数据字段
+     * @return API返回的XML数据
+     * @throws Exception
+     */
+    public String request(RefundReqData refundReqData) throws Exception {
+
+        //--------------------------------------------------------------------
+        //发送HTTPS的Post请求到API地址
+        //--------------------------------------------------------------------
+        String responseString = sendPost(refundReqData);
+
+        return responseString;
+    }
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/UnifiedorderService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/UnifiedorderService.java
new file mode 100644
index 0000000..ed8c0a8
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/UnifiedorderService.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.service;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.Configure;
+import com.stylefeng.guns.modular.shunfeng.tencent.protocol.UnifiedorderReqData;
+
+/**
+ * 统一下单服务
+ * @author pen
+ */
+public class UnifiedorderService extends BaseService{
+
+    public UnifiedorderService(Integer apptype) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
+        super(apptype, Configure.UNIFIEDORDER_API);
+    }
+
+    /**
+     * 统一下单服务
+     */
+    public String request(UnifiedorderReqData unifiedorderReqData) throws Exception {
+
+        //--------------------------------------------------------------------
+        //发送HTTPS的Post请求到API地址
+        //--------------------------------------------------------------------
+        String responseString = sendPost(unifiedorderReqData);
+
+        return responseString;
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayConfigImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayConfigImpl.java
new file mode 100644
index 0000000..8b92d8a
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayConfigImpl.java
@@ -0,0 +1,90 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.service;
+
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.IWXPayDomain;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayConfig;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+
+public class WXPayConfigImpl extends WXPayConfig {
+
+    private byte[] certData;
+    private static WXPayConfigImpl INSTANCE;
+
+    private WXPayConfigImpl() throws Exception{
+        //String certPath = WXPayConfigImpl.class.getClassLoader().getResource("").getPath() + "com/tencent/common/cert/apiclient_cert.p12";
+        String certPath ="C:/cert/apiclient_cert.p12";
+        File file = new File(certPath);
+        InputStream certStream = new FileInputStream(file);
+        this.certData = new byte[(int) file.length()];
+        certStream.read(this.certData);
+        certStream.close();
+    }
+
+    public static WXPayConfigImpl getInstance() throws Exception{
+        if (INSTANCE == null) {
+            synchronized (WXPayConfigImpl.class) {
+                if (INSTANCE == null) {
+                    INSTANCE = new WXPayConfigImpl();
+                }
+            }
+        }
+        return INSTANCE;
+    }
+
+
+    public String getMchID() {
+        return "11473623";
+    }
+
+    public String getKey() {
+        return "2ab9071b06b9f739b950ddb41db2690d";
+    }
+
+    public InputStream getCertStream() {
+        ByteArrayInputStream certBis;
+        certBis = new ByteArrayInputStream(this.certData);
+        return certBis;
+    }
+
+
+    public int getHttpConnectTimeoutMs() {
+        return 2000;
+    }
+
+    public int getHttpReadTimeoutMs() {
+        return 10000;
+    }
+
+    public IWXPayDomain getWXPayDomain() {
+        return WXPayDomainSimpleImpl.instance();
+    }
+
+    public String getPrimaryDomain() {
+        return "api.mch.weixin.qq.com";
+    }
+
+    public String getAlternateDomain() {
+        return "api2.mch.weixin.qq.com";
+    }
+
+    @Override
+    public int getReportWorkerNum() {
+        return 1;
+    }
+
+    @Override
+    public int getReportBatchSize() {
+        return 2;
+    }
+
+	@Override
+	public String getAppID() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayDomainSimpleImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayDomainSimpleImpl.java
new file mode 100644
index 0000000..41a60dd
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayDomainSimpleImpl.java
@@ -0,0 +1,100 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.service;
+
+import com.stylefeng.guns.modular.shunfeng.tencent.common.IWXPayDomain;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayConfig;
+import com.stylefeng.guns.modular.shunfeng.tencent.common.WXPayConstants;
+import org.apache.http.conn.ConnectTimeoutException;
+
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by blaketang on 2017/6/16.
+ */
+public class WXPayDomainSimpleImpl implements IWXPayDomain {
+    private WXPayDomainSimpleImpl(){}
+    private static class WxpayDomainHolder{
+        private static IWXPayDomain holder = new WXPayDomainSimpleImpl();
+    }
+    public static IWXPayDomain instance(){
+        return WxpayDomainHolder.holder;
+    }
+
+    public synchronized void report(final String domain, long elapsedTimeMillis, final Exception ex) {
+        DomainStatics info = domainData.get(domain);
+        if(info == null){
+            info = new DomainStatics(domain);
+            domainData.put(domain, info);
+        }
+
+        if(ex == null){ //success
+            if(info.succCount >= 2){    //continue succ, clear error count
+                info.connectTimeoutCount = info.dnsErrorCount = info.otherErrorCount = 0;
+            }else{
+                ++info.succCount;
+            }
+        }else if(ex instanceof ConnectTimeoutException){
+            info.succCount = info.dnsErrorCount = 0;
+            ++info.connectTimeoutCount;
+        }else if(ex instanceof UnknownHostException){
+            info.succCount = 0;
+            ++info.dnsErrorCount;
+        }else{
+            info.succCount = 0;
+            ++info.otherErrorCount;
+        }
+    }
+
+    public synchronized DomainInfo getDomain(final WXPayConfig config) {
+        DomainStatics primaryDomain = domainData.get(WXPayConstants.DOMAIN_API);
+        if(primaryDomain == null ||
+                primaryDomain.isGood()) {
+            return new DomainInfo(WXPayConstants.DOMAIN_API, true);
+        }
+
+        long now = System.currentTimeMillis();
+        if(switchToAlternateDomainTime == 0){   //first switch
+            switchToAlternateDomainTime = now;
+            return new DomainInfo(WXPayConstants.DOMAIN_API2, false);
+        }else if(now - switchToAlternateDomainTime < MIN_SWITCH_PRIMARY_MSEC){
+            DomainStatics alternateDomain = domainData.get(WXPayConstants.DOMAIN_API2);
+            if(alternateDomain == null ||
+                alternateDomain.isGood() ||
+                alternateDomain.badCount() < primaryDomain.badCount()){
+                return new DomainInfo(WXPayConstants.DOMAIN_API2, false);
+            }else{
+                return new DomainInfo(WXPayConstants.DOMAIN_API, true);
+            }
+        }else{  //force switch back
+            switchToAlternateDomainTime = 0;
+            primaryDomain.resetCount();
+            DomainStatics alternateDomain = domainData.get(WXPayConstants.DOMAIN_API2);
+            if(alternateDomain != null)
+                alternateDomain.resetCount();
+            return new DomainInfo(WXPayConstants.DOMAIN_API, true);
+        }
+    }
+
+    static class DomainStatics {
+        final String domain;
+        int succCount = 0;
+        int connectTimeoutCount = 0;
+        int dnsErrorCount =0;
+        int otherErrorCount = 0;
+
+        DomainStatics(String domain) {
+            this.domain = domain;
+        }
+        void resetCount(){
+            succCount = connectTimeoutCount = dnsErrorCount = otherErrorCount = 0;
+        }
+        boolean isGood(){ return connectTimeoutCount <= 2 && dnsErrorCount <= 2; }
+        int badCount(){
+            return connectTimeoutCount + dnsErrorCount * 5 + otherErrorCount / 4;
+        }
+    }
+    private final int MIN_SWITCH_PRIMARY_MSEC = 3 * 60 * 1000;  //3 minutes
+    private long switchToAlternateDomainTime = 0;
+    private Map<String, DomainStatics> domainData = new HashMap<String, DomainStatics>();
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayPerformance.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayPerformance.java
new file mode 100644
index 0000000..970b9bc
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/tencent/service/WXPayPerformance.java
@@ -0,0 +1,149 @@
+package com.stylefeng.guns.modular.shunfeng.tencent.service;
+/*package com.tencent.service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.tencent.WXPay;
+import com.tencent.common.WXPayUtil;
+
+public class WXPayPerformance {
+
+
+	private WXPay wxpay;
+	private WXPayConfigImpl config;
+
+	public WXPayPerformance() throws Exception {
+		config = WXPayConfigImpl.getInstance();
+		wxpay = new WXPay(config);
+	}
+
+	*//**
+	 * 商户 扫码抢 扫码支付
+	 * @param out_trade_no
+	 * @param body
+	 * @param total_fee
+	 * @param auth_code
+	 *//*
+	public Map<String, String> doMicropayWithPos(String out_trade_no,String body,String total_fee,String auth_code) {
+		HashMap<String, String> data = new HashMap<String, String>();
+		data.put("out_trade_no", out_trade_no);
+		data.put("body", body);
+		data.put("total_fee", total_fee);
+		data.put("auth_code", auth_code);
+		Map<String, String> r=new HashMap<>();
+		try {
+			 r = wxpay.microPayWithPos(data);
+			System.out.println(r);
+		} catch (Exception e) {			
+			e.printStackTrace();
+			return r;
+		}
+		return r;
+	}
+
+	
+    *//**
+     * 统一 下单2.0
+     *//*
+    public Map<String, String> doUnifiedOrder(String out_trade_no,String total_fee,String notify_url) {
+        HashMap<String, String> data = new HashMap<String, String>();
+        data.put("body", "超级教材");
+        data.put("out_trade_no", out_trade_no);
+        data.put("device_info", "");
+        data.put("fee_type", "CNY");
+        data.put("total_fee", total_fee);
+        //data.put("spbill_create_ip", "123.12.12.123");
+        data.put("notify_url", notify_url);
+        data.put("trade_type", "APP");
+        //data.put("product_id", "12");
+        // data.put("time_expire", "20170112104120");
+
+        try {
+            Map<String, String> r = wxpay.unifiedOrder(data);
+            System.out.println(r);
+            return r;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+	//    public void doReport() {
+	//        HashMap<String, String> data = new HashMap<String, String>();
+	//        data.put("interface_url", "20160822");
+	//        data.put("bill_type", "ALL");
+	//    }
+
+	*//**
+	 * 小测试
+	 *//*
+	public void test001() {
+		String xmlStr="<xml><return_code><![CDATA[SUCCESS]]></return_code>\n" +
+				"<return_msg><![CDATA[OK]]></return_msg>\n" +
+				"<appid><![CDATA[wx273fe72f2db863ed]]></appid>\n" +
+				"<mch_id><![CDATA[1228845802]]></mch_id>\n" +
+				"<nonce_str><![CDATA[lCXjx3wNx45HfTV2]]></nonce_str>\n" +
+				"<sign><![CDATA[68D7573E006F0661FD2A77BA59124E87]]></sign>\n" +
+				"<result_code><![CDATA[SUCCESS]]></result_code>\n" +
+				"<openid><![CDATA[oZyc_uPx_oed7b4q1yKmj_3M2fTU]]></openid>\n" +
+				"<is_subscribe><![CDATA[N]]></is_subscribe>\n" +
+				"<trade_type><![CDATA[NATIVE]]></trade_type>\n" +
+				"<bank_type><![CDATA[CFT]]></bank_type>\n" +
+				"<total_fee>1</total_fee>\n" +
+				"<fee_type><![CDATA[CNY]]></fee_type>\n" +
+				"<transaction_id><![CDATA[4008852001201608221983528929]]></transaction_id>\n" +
+				"<out_trade_no><![CDATA[20160822162018]]></out_trade_no>\n" +
+				"<attach><![CDATA[]]></attach>\n" +
+				"<time_end><![CDATA[20160822202556]]></time_end>\n" +
+				"<trade_state><![CDATA[SUCCESS]]></trade_state>\n" +
+				"<cash_fee>1</cash_fee>\n" +
+				"</xml>";
+		try {
+			System.out.println(xmlStr);
+			System.out.println("+++++++++++++++++");
+			System.out.println(WXPayUtil.isSignatureValid(xmlStr, config.getKey()));
+			Map<String, String> hm = WXPayUtil.xmlToMap(xmlStr);
+			System.out.println("+++++++++++++++++");
+			System.out.println(hm);
+			System.out.println(hm.get("attach").length());
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+	public void testHelloWorld() throws Exception {
+		for (int i=0; i<1000; ++i) {
+			System.out.println("hi");
+			Thread.sleep(1000);
+		}
+	}
+
+
+	public static void main(String[] args) throws Exception {    	
+       //测试商户扫码支付
+		WXPayPerformance dodo = new WXPayPerformance();
+		Map<String, String> r =dodo.doMicropayWithPos("11151521","测试","1","130226992988325162");
+		if(r.isEmpty()){
+			System.out.println("--------------->");
+		}else{
+			if(r.containsKey("err_code_des")){
+				System.out.println("支付失败:"+r.get("err_code_des"));
+			}else{
+				if(r.get("return_msg").equals("OK")){
+					System.out.println("支付成功:"+r.get("err_code_des"));
+				}
+			}
+		}
+		 //测试app支付
+		WXPayPerformance dodo1 = new WXPayPerformance();
+		dodo1.doUnifiedOrder("12121", "1", "http://192.168.1.90:8080/textbook/app/pay/wxpay/notify");
+
+	}
+}
+
+
+*/
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/ApiUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/ApiUtil.java
new file mode 100644
index 0000000..9e72919
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/ApiUtil.java
@@ -0,0 +1,257 @@
+package com.stylefeng.guns.modular.shunfeng.util;
+
+
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * api返回数据格式统一封装
+ * @author tzj
+ *
+ */
+public class ApiUtil {
+
+	/**
+	 * 返回一个成功的对象提示{}
+	 * @return
+	 */
+	public static Map<String, Object> putSuccessObj(String msg){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 0);
+		resultMap.put("msg", msg);
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", new HashMap<Object, Object>());
+		return resultMap;
+	}
+	public static Map<String, Object> putSuccessObj(){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 0);
+		resultMap.put("msg", "操作成功");
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", new HashMap<Object, Object>());
+		return resultMap;
+	}
+	
+	
+	
+
+	/**
+	 * 返回一个失败的对象提示{}
+	 * @param msg 失败原因
+	 * @return
+	 */
+	public static Map<String, Object> putFailObj(String msg){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 1);
+		resultMap.put("msg", msg);
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", new HashMap<Object, Object>());
+		return resultMap;
+	}
+	
+	
+	/**
+	 * 返回一个失败的对象提示{}
+	 * @param msg 失败原因
+	 * @return
+	 */
+	public static Map<String, Object> putFailObj_1(String msg){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 2);
+		resultMap.put("msg", msg);
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", new HashMap<Object, Object>());
+		return resultMap;
+	}
+
+	/**
+	 * 操作成功返回id号
+	 * @param code 1 失败,0成功
+	 * @param msg 描述
+	 * @param sys 系统时间
+	 *  @param data id
+	 * @return
+	 */
+	public static Map<String, Object> putInfo(int code,String msg,int id){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", code);
+		resultMap.put("msg", msg);
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", id);
+		return resultMap;
+	}
+
+	/**
+	 * 返回一个失败的集合提示[]
+	 * @param msg 失败原因
+	 * @return
+	 */
+	public static Map<String, Object> putFailArray(String msg){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 1);
+		resultMap.put("msg", msg);
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", new ArrayList<>());
+		return resultMap;
+	}
+
+	/**
+	 * 返回一个成功的集合提示[]
+	 * @return
+	 */
+	public static Map<String, Object> putSuccessArray(){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 0);
+		resultMap.put("msg", "操作成功!");
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", new ArrayList<>());
+		return resultMap;
+	}
+	
+	
+
+	/**
+	 * 返回一个集合格式的数据[]
+	 * @param code 1 失败,0成功
+	 * @param msg 描述
+	 * @return
+	 */
+	public static Map<String, Object> returnArray(Object data){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 0);
+		resultMap.put("msg", "获取成功");
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", data);
+		return resultMap;
+	}
+	
+	//红包消息
+	public static Map<String, Object> returnArray_1(Object data){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 104);
+		resultMap.put("data", data);
+		return resultMap;
+	}
+	
+	//设置管理员
+	public static Map<String, Object> returnArray_2(Object data){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 105);
+		resultMap.put("data", data);
+		return resultMap;
+	}
+	
+	//等级提升
+	public static Map<String, Object> returnArray_3(Object data){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 106);
+		resultMap.put("data", data);
+		return resultMap;
+	}
+	
+	
+	 //踢出房间
+		public static Map<String, Object> returnArray_4(Object data){
+			Map<String, Object> resultMap = new HashMap<String, Object>();
+			resultMap.put("code", 107);
+			resultMap.put("data", data);
+			return resultMap;
+		}
+		
+		      //下麦
+				public static Map<String, Object> returnArray_5(Object data){
+					Map<String, Object> resultMap = new HashMap<String, Object>();
+					resultMap.put("code", 110);
+					resultMap.put("data", data);
+					return resultMap;
+				}
+				
+				//禁麦
+				public static Map<String, Object> returnArray_6(Object data){
+					Map<String, Object> resultMap = new HashMap<String, Object>();
+					resultMap.put("code", 111);
+					resultMap.put("data", data);
+					return resultMap;
+				}
+				
+				//加入黑名单
+				public static Map<String, Object> returnArray_7(Object data){
+					Map<String, Object> resultMap = new HashMap<String, Object>();
+					resultMap.put("code", 112);
+					resultMap.put("data", data);
+					return resultMap;
+				}
+				
+				//抱她上麦
+				public static Map<String, Object> returnArray_8(Object data){
+					Map<String, Object> resultMap = new HashMap<String, Object>();
+					resultMap.put("code", 114);
+					resultMap.put("data", data);
+					return resultMap;
+				}
+				
+				//送礼物全屏通知
+				public static Map<String, Object> returnArray_9(Object data){
+					Map<String, Object> resultMap = new HashMap<String, Object>();
+					resultMap.put("code", 115);
+					resultMap.put("data", data);
+					return resultMap;
+				}
+
+	/**
+	 * 返回一个对象格式的数据{}
+	 * @param code 1 失败,0成功
+	 * @param msg 描述
+	 * @return
+	 */
+	public static Map<String, Object> returnObj(Object data){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 0);
+		resultMap.put("msg", "获取成功");
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", data);
+		return resultMap;
+	}
+	
+	
+	public static Map<String, Object> returnObj_1(Object data){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 2);
+		resultMap.put("msg", "获取成功");
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", data);
+		return resultMap;
+	}
+	
+	public static Map<String, Object> returnObj_20000(Object data){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 0);
+		resultMap.put("msg", "1");
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", data);
+		return resultMap;
+	}
+	
+	public static Map<String, Object> returnObj_10000(String msg){
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		resultMap.put("code", 10000);
+		resultMap.put("msg", msg);
+		resultMap.put("sys", DateUtil.getCurMilli());
+		resultMap.put("data", new HashMap<Object, Object>());
+		return resultMap;
+	}
+
+
+	public static String convertToContent(String content){
+		try {
+			if(content == null) content = "";
+			return URLDecoder.decode(content,"utf-8");
+		} catch (Exception e) {
+			System.err.println(e);
+			return content;
+		}		
+	}
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/DateUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/DateUtil.java
new file mode 100644
index 0000000..df996ed
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/DateUtil.java
@@ -0,0 +1,1102 @@
+package com.stylefeng.guns.modular.shunfeng.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+/**
+ * <h3>处理时间的工具类</h3>
+ */
+public class DateUtil {
+
+	private static TimeZone tz = TimeZone.getTimeZone("GMT+8");
+
+	// private static TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
+	
+	public static boolean hourMinuteBetween(String nowDate, String startDate, String endDate) throws Exception{
+		
+		SimpleDateFormat format = new SimpleDateFormat("HH:mm");
+		
+		Date now = format.parse(nowDate);
+		Date start = format.parse(startDate);
+		Date end = format.parse(endDate);
+		
+		long nowTime = now.getTime();
+		long startTime = start.getTime();
+		long endTime = end.getTime();
+		
+		return nowTime >= startTime && nowTime <= endTime;
+	}
+
+	/**
+	 * 得到系统日期
+	 * 
+	 * @return
+	 */
+	public static Date getDate() {
+		TimeZone.setDefault(tz);
+		return new Date();
+	}
+
+	/**
+	 * 获取当然凌晨的时间
+	 * 
+	 * @return Date
+	 */
+	public static Date getZero() {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(new Date());
+		calendar.set(Calendar.HOUR_OF_DAY, 0);
+		calendar.set(Calendar.MINUTE, 0);
+		calendar.set(Calendar.SECOND, 0);
+		return calendar.getTime();
+	}
+
+	/**
+	 * 判断日期是否在from,to之内 "yyyy-MM-dd" 格式
+	 * 
+	 * @param time
+	 *            指定日期
+	 * @param from
+	 *            开始日期
+	 * @param to
+	 *            结束日期
+	 * @return true 在之间 false 不在之间
+	 */
+	public static boolean belongCalendar(Date time, Date from, Date to) {
+		Calendar date = Calendar.getInstance();
+		date.setTime(time);
+
+		Calendar after = Calendar.getInstance();
+		after.setTime(from);
+
+		Calendar before = Calendar.getInstance();
+		before.setTime(to);
+
+		if ((date.after(after) && date.before(before)) || (time.compareTo(from) == 0 || time.compareTo(to) == 0)) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * 两个时间之差
+	 * 
+	 * @param startTime
+	 * @param endTime
+	 * @param format
+	 * @return
+	 * @throws ParseException
+	 */
+	public static String dateDiff(String startTime, String endTime, String format) throws ParseException {
+		// 按照传入的格式生成一个simpledateformate对象
+		SimpleDateFormat sd = new SimpleDateFormat(format);
+		long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
+		long nh = 1000 * 60 * 60;// 一小时的毫秒数
+		long nm = 1000 * 60;// 一分钟的毫秒数
+		long ns = 1000;// 一秒钟的毫秒数
+		long diff;
+		long day = 0;
+		long hour = 0;
+		long min = 0;
+		long sec = 0;
+		// long time=0;
+		String strTime = "";
+		// 获得两个时间的毫秒时间差异
+		diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
+		day = diff / nd;// 计算差多少天
+		hour = diff % nd / nh + day * 24;// 计算差多少小时
+		min = diff % nd % nh / nm + day * 24 * 60;// 计算差多少分钟
+		sec = diff % nd % nh % nm / ns;// 计算差多少秒
+		// 输出结果
+		/*
+		 * System.out.println("时间相差:" + day + "天" + (hour - day * 24) + "小时" +
+		 * (min - day * 24 * 60) + "分钟" + sec + "秒。");
+		 * System.out.println("hour=" + hour + ",min=" + min);
+		 */
+		if (day == 1) {
+			strTime = "昨天";
+		} else if (day > 1) {
+			// strTime=day+"天前";
+			strTime = startTime.substring(0, 10);
+		} else if (hour >= 1 && hour < 24) {
+			strTime = hour + "小时前";
+		} else {
+			if (min == 0) {
+				strTime = sec + "秒钟前";
+			} else {
+				strTime = min + "分钟前";
+			}
+
+		}
+		// if (str.equalsIgnoreCase("h")) {
+		// return hour;
+		// } else {
+		// return min;
+		// }
+
+		// if (str.equalsIgnoreCase("h")) {
+		// return hour;
+		// } else {
+		// return min;
+		// }
+		return strTime;
+	}
+
+	/**
+	 * 得到系统Calendar日期
+	 * 
+	 * @return
+	 */
+	public static Calendar getCalendar() {
+		TimeZone.setDefault(tz);
+		Calendar cal = Calendar.getInstance();
+		return cal;
+	}
+
+	/**
+	 * 获取当前时间
+	 * 
+	 * @return
+	 */
+	public static long getMillisecond() {
+		long millisecond = 0;
+		TimeZone.setDefault(tz);
+		Calendar cal = Calendar.getInstance();
+		millisecond = cal.getTimeInMillis();
+		return millisecond;
+	}
+
+	/**
+	 * 获取本月1号的时间戳
+	 * 
+	 * @return
+	 */
+	public static long getMillisecond_MONTH() {
+		long millisecond = 0;
+		TimeZone.setDefault(tz);
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.DAY_OF_MONTH, 1);
+		millisecond = cal.getTimeInMillis();
+		return millisecond;
+	}
+
+	/**
+	 * 获取上个月1号的时间戳
+	 * 
+	 * @return
+	 */
+	public static long getMillisecond_FRONTMONTH() {
+		long millisecond = 0;
+		Calendar cal = getCalendar();
+		cal.set(Calendar.DAY_OF_MONTH, 1);
+		cal.set(Calendar.MONTH, Calendar.MONTH - 2);
+		millisecond = cal.getTimeInMillis();
+		return millisecond;
+	}
+
+	/**
+	 * 获取当前毫秒数
+	 * 
+	 * @return long
+	 */
+	public static long getCurMilli() {
+		long millisecond = 0;
+		Calendar cal = Calendar.getInstance();
+		millisecond = cal.getTimeInMillis();
+		return millisecond;
+	}
+
+	/**
+	 * 日期转毫秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond(Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if (!"".equals(date)) {
+			newDate = sdf.format(date);
+		} else {
+			newDate = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 0;
+		try {
+			millisecond = sdf.parse(newDate).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 日期转毫秒(加24小时,yyyy-MM-dd HH:mm:ss)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_24h(Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if (!"".equals(date)) {
+			newDate = sdf.format(date);
+		} else {
+			newDate = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 24 * 3600 * 1000;
+		try {
+			millisecond += sdf.parse(newDate).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 日期转毫秒(加N年)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_year(String date, Integer year) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if ("".equals(date)) {
+			newDate = sdf.format(DateUtil.getDate());
+		} else {
+			newDate = getDateTime(Long.parseLong(date));
+		}
+		Date dt = null;
+		try {
+			dt = sdf.parse(newDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.YEAR, year);
+		Date dt1 = rightNow.getTime();
+		return dt1.getTime();
+	}
+
+	/**
+	 * 日期转毫秒(加N天)
+	 * 
+	 * @param date
+	 *            毫秒字符串
+	 * @return
+	 */
+	public static Date getMillisecond_day(String date, Integer day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if ("".equals(date)) {
+			newDate = sdf.format(DateUtil.getDate());
+		} else {
+			newDate = date;
+		}
+		Date dt = null;
+		try {
+			dt = sdf.parse(newDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.DATE, day);
+		Date dt1 = rightNow.getTime();
+		Date dates = new Date(dt1.getTime());
+		return dates;
+	}
+
+	/**
+	 * 日期转毫秒(加N月)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_month(String date, Integer day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if ("".equals(date)) {
+			newDate = sdf.format(DateUtil.getDate());
+		} else {
+			newDate = getDateTime(Long.parseLong(date));
+		}
+		Date dt = null;
+		try {
+			dt = sdf.parse(newDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.MONTH, day);
+		Date dt1 = rightNow.getTime();
+		return dt1.getTime();
+	}
+	
+	/**
+	 * 日期转毫秒(加分钟)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_fz(String date, Integer day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if ("".equals(date)) {
+			newDate = sdf.format(DateUtil.getDate());
+		} else {
+			newDate = getDateTime(Long.parseLong(date));
+		}
+		Date dt = null;
+		try {
+			dt = sdf.parse(newDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.MINUTE, day);
+		Date dt1 = rightNow.getTime();
+		return dt1.getTime();
+	}
+	
+	public static Date getMillisecond_fz1(String date, Integer day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		Date dt = null;
+		try {
+			dt = sdf.parse(date);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.MINUTE, day);
+		Date dt1 = rightNow.getTime();
+		return dt1;
+	}
+
+	/**
+	 * 字符串日期转毫秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_str(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 0;
+		try {
+			millisecond = sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 字符串日期转毫秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_strYmd(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 0;
+		try {
+			millisecond = sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 字符串日期转Date
+	 * 
+	 * @param string
+	 * @return date
+	 * @throws ParseException
+	 */
+	public static Date getStrToDate(String dateString) throws ParseException {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date date = sdf.parse(dateString);
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_str(String dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		sdf.setTimeZone(tz);
+		if ("".equals(dateStr)) {
+			dateStr = sdf.format(DateUtil.getDate());
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date yyyy-MM-dd HH:mm
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_str2(String dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+		sdf.setTimeZone(tz);
+		if ("".equals(dateStr)) {
+			dateStr = sdf.format(DateUtil.getDate());
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date yyyy-MM-dd HH:mm:ss
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_str3(String dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		sdf.setTimeZone(tz);
+		if ("".equals(dateStr)) {
+			dateStr = sdf.format(DateUtil.getDate());
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_strYMd(Long dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		if (dateStr == null) {
+			dateStr = DateUtil.getCurMilli();
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(sdf.format(new Date(dateStr)));
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 毫秒转Date
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_strYMdHms(Long dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		if (dateStr == null) {
+			dateStr = DateUtil.getCurMilli();
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(sdf.format(new Date(dateStr)));
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_strYMdHm(Long dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+		if (dateStr == null) {
+			dateStr = DateUtil.getCurMilli();
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(sdf.format(new Date(dateStr)));
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转毫秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_strDmy(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 0;
+		try {
+			millisecond = sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 字符串日期转毫秒转毫秒(加24小时)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_str_24h(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 24 * 3600 * 1000;
+		try {
+			millisecond += sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 字符串日期转毫秒转毫秒(加24小时)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_strYmd_24h(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 24 * 3600 * 1000;
+		try {
+			millisecond += sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 毫秒转日期
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static String getDate(long millisecond) {
+		if (millisecond == 0) {
+			millisecond = getCurMilli();
+		}
+		SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return dateformat.format(calendar.getTime());
+	}
+
+	/**
+	 * 转换为指定格式的时间
+	 * 
+	 * @return Date
+	 */
+	public static Date getDate(String date, String pattern) {
+		SimpleDateFormat format = new SimpleDateFormat(pattern);
+		Date d = null;
+		try {
+			d = format.parse(date);
+		} catch (ParseException ex) {
+			return null;
+		}
+		return d;
+	}
+
+	/**
+	 * 毫秒转日期
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static String getDate_HH(long millisecond) {
+		if (millisecond == 0) {
+			millisecond = getCurMilli();
+		}
+		SimpleDateFormat dateformat = new SimpleDateFormat("HH");
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return dateformat.format(calendar.getTime());
+	}
+
+	/**
+	 * 毫秒转日期时间
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static String getDateTime(long millisecond) {
+		if (millisecond == 0) {
+			millisecond = getCurMilli();
+		}
+		SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return dateformat.format(calendar.getTime());
+	}
+
+	/**
+	 * 毫秒转年月日
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static String getDateYMD(long millisecond) {
+		if (millisecond == 0) {
+			millisecond = getCurMilli();
+		}
+		SimpleDateFormat dateformat = new SimpleDateFormat("yyyy年MM月dd日");
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return dateformat.format(calendar.getTime());
+	}
+
+	/**
+	 * 两日期相差毫秒
+	 * 
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 */
+	public static long getMinusMillisecond(Date startDate, Date endDate) {
+		long startMillisecond = getMillisecond(startDate);
+		long endMillisecond = getMillisecond(endDate);
+		long minusMillisecond = endMillisecond - startMillisecond;
+		if (minusMillisecond < 0) {
+			minusMillisecond = 0;
+		}
+		return minusMillisecond;
+	}
+
+	/**
+	 * 两日期相差天数
+	 * 
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 */
+	public static long getMinusDay(Date startDate, Date endDate) {
+		long startMillisecond = getMillisecond(startDate);
+		long endMillisecond = getMillisecond(endDate);
+		long minusMillisecond = endMillisecond - startMillisecond;
+		long day = 0;
+		if (minusMillisecond < 0) {
+			day = 0;
+		} else {
+			day = minusMillisecond / (24 * 3600 * 1000);
+		}
+		return day;
+	}
+
+	/**
+	 * 前N天毫秒
+	 * 
+	 * @param day
+	 * @return
+	 */
+	public static long getRetreatDay_millisecond(int day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		long nowMillisecond = 0;
+		try {
+			nowMillisecond = sdf.parse(sdf.format(DateUtil.getDate())).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		nowMillisecond += 24 * 3600 * 1000;
+		long retreatMillisecond = 24 * 3600 * 1000 * day;
+		return nowMillisecond - retreatMillisecond;
+	}
+
+	/**
+	 * 前N天时间
+	 * 
+	 * @param day
+	 * @return
+	 */
+	public static String getRetreatDay_millisecond1(int day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		long nowMillisecond = 0;
+		try {
+			nowMillisecond = sdf.parse(sdf.format(DateUtil.getDate())).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		nowMillisecond += 24 * 3600 * 1000;
+		long retreatMillisecond = 24 * 3600 * 1000 * day;
+		long s = nowMillisecond - retreatMillisecond;
+		Date date = new Date(s);
+		String res = sdf.format(date);
+		return res;
+	}
+
+	// 当前时间前30天
+	public static String getRetreatDay_millisecond2() {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date today = new Date();
+		String endDate = sdf.format(today);// 当前日期
+		// 获取三十天前日期
+		Calendar theCa = Calendar.getInstance();
+		theCa.setTime(today);
+		theCa.add(theCa.DATE, -30);// 最后一个数字30可改,30天的意思
+		Date start = theCa.getTime();
+		String startDate = sdf.format(start);// 三十天之前日期
+		return startDate;
+	}
+
+	/**
+	 * 日期转秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getDecond(Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if (!"".equals(date)) {
+			newDate = sdf.format(date);
+		} else {
+			newDate = sdf.format(DateUtil.getDate());
+		}
+		long second = 0;
+		try {
+			second = sdf.parse(newDate).getTime() / 1000;
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return second;
+	}
+
+	/**
+	 * 日期转String
+	 * 
+	 * @param date
+	 * @return
+	 * @throws ParseException
+	 */
+	public static String getDateToString(Date date) throws ParseException {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		String newDate = sdf.format(date);
+		long millisecond = sdf.parse(newDate).getTime();
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return sdf.format(calendar.getTime());
+	}
+
+	public static String getDateToString(Date date,String pattern) throws ParseException {
+		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+		String newDate = sdf.format(date);
+		long millisecond = sdf.parse(newDate).getTime();
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return sdf.format(calendar.getTime());
+	}
+
+	/**
+	 * 毫秒转星期XX
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static int getDate_week(Long millisecond) {
+		if (millisecond == null) {
+			millisecond = getCurMilli();
+		}
+		Calendar cal = getCalendar();
+		cal.setTimeInMillis(millisecond);
+		return cal.get(Calendar.DAY_OF_WEEK) - 1;
+
+	}
+
+	/**
+	 * 获取当前系统时间已yyyy-MM-dd HH:mm:ss格式化的字符串
+	 */
+	public static String nowStr() {
+
+		SimpleDateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
+		return dateFormat.format(getDate());
+	}
+
+	/**
+	 * 
+	 * 获取之前几天日期
+	 * 
+	 * @param pattern
+	 *            yyyy-MM-dd(默认)
+	 * @param few
+	 *            之前几天
+	 */
+	public static String beforeFewDayStr(String pattern, Integer few) {
+
+		if (pattern == null || "".equals(pattern)) {
+			pattern = "yyyy-MM-dd";
+		}
+		Calendar c = getCalendar();
+		c.add(Calendar.DATE, -few);
+		return new SimpleDateFormat(pattern).format(c.getTime());
+	}
+	
+	
+	/**
+	 * 得到几天后的时间
+	 *
+	 * @param d
+	 * @param day
+	 * @return
+	 */
+	public static Date getDateAfter(Date d, int day) {
+	    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+	    Calendar now = Calendar.getInstance();
+	    now.setTime(d);
+	    now.set(Calendar.DATE, now.get(Calendar.DATE) - day);//+后 -前
+	    return now.getTime();
+	}
+	
+
+	/**
+	 * 获取今天日期
+	 * 
+	 * @param pattern
+	 *            yyyy-MM-dd(默认)
+	 */
+	public static String todayStr(String pattern) {
+
+		if (pattern == null || "".equals(pattern)) {
+			pattern = "yyyy-MM-dd";
+		}
+		return new SimpleDateFormat(pattern).format(getDate());
+	}
+
+	/**
+	 * 获取当前系统时间戳字符串
+	 */
+	public static String nowDateLongStr() {
+
+		return getDate().getTime() + "";
+	}
+
+	/**
+	 * 获取当前系统时间
+	 * 
+	 * @return
+	 */
+	public static Date now() {
+
+		return getDate();
+	}
+
+	/*public static void main(String[] args) throws ParseException {
+		// 打印测试日期包含
+		Date time1 = getDate_str("2017-3-11");
+		Date time2 = getDate_str("2017-3-15");
+		Date time3 = getDate_str("2017-3-17");
+		Date time4 = getDate_str("2017-3-12");
+		Date time5 = getDate_str("2017-3-16");
+		Date from = getDate_str("2017-3-12");
+		Date to = getDate_str("2017-3-16");
+		System.out.println(belongCalendar(time1, from, to));
+		System.out.println(belongCalendar(time2, from, to));
+		System.out.println(belongCalendar(time3, from, to));
+		System.out.println(belongCalendar(time4, from, to));
+		System.out.println(belongCalendar(time5, from, to));
+		System.out.println(nowStr());
+
+	}
+*/
+	/**
+	 * 把日期往后增加一天. 正数往后推,负数往前移动
+	 * 
+	 * @param day
+	 * @return
+	 */
+	public static String getString(int day) {
+		Date date = new Date();// 取时间
+		Calendar calendar = new GregorianCalendar();
+		calendar.setTime(date);
+		calendar.add(calendar.DATE, day);// 把日期往后增加一天.整数往后推,负数往前移动
+		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+		String dateString = formatter.format(date);
+		return dateString;
+	}
+
+	/**
+	 * 根据当前日期获得所在周的日期区间(周一和周日日期)
+	 * 
+	 * @return
+	 * @author zhaoxuepu
+	 * @throws ParseException
+	 */
+	public static String getTimeInterval(Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		// 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
+		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
+		if (1 == dayWeek) {
+			cal.add(Calendar.DAY_OF_MONTH, -1);
+		}
+		// System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期
+		// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
+		cal.setFirstDayOfWeek(Calendar.MONDAY);
+		// 获得当前日期是一个星期的第几天
+		int day = cal.get(Calendar.DAY_OF_WEEK);
+		// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
+		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
+		String imptimeBegin = sdf.format(cal.getTime());
+		// System.out.println("所在周星期一的日期:" + imptimeBegin);
+		cal.add(Calendar.DATE, 6);
+		String imptimeEnd = sdf.format(cal.getTime());
+		// System.out.println("所在周星期日的日期:" + imptimeEnd);
+		return imptimeBegin + "," + imptimeEnd;
+	}
+
+	/**
+	 * 根据当前日期获得上周的日期区间(上周周一和周日日期)
+	 * 
+	 * @return
+	 * @author zhaoxuepu
+	 */
+	public static String getLastTimeInterval() {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar calendar1 = Calendar.getInstance();
+		Calendar calendar2 = Calendar.getInstance();
+		int dayOfWeek = calendar1.get(Calendar.DAY_OF_WEEK) - 1;
+		int offset1 = 1 - dayOfWeek;
+		int offset2 = 7 - dayOfWeek;
+		calendar1.add(Calendar.DATE, offset1 - 7);
+		calendar2.add(Calendar.DATE, offset2 - 7);
+		// System.out.println(sdf.format(calendar1.getTime()));// last Monday
+		String lastBeginDate = sdf.format(calendar1.getTime());
+		// System.out.println(sdf.format(calendar2.getTime()));// last Sunday
+		String lastEndDate = sdf.format(calendar2.getTime());
+		return lastBeginDate + "," + lastEndDate;
+	}
+
+	public static String DateYUE() {
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar c = Calendar.getInstance();
+		c.add(Calendar.MONTH, 0);
+		c.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
+		String first = format.format(c.getTime());
+
+		// 获取当前月最后一天
+		Calendar ca = Calendar.getInstance();
+		ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
+		String last = format.format(ca.getTime());
+		return first + "," + last;
+	}
+
+	public static String getBeforeFirstMonthdate() {
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar calendar = Calendar.getInstance();
+		Calendar calendar1 = Calendar.getInstance();
+		calendar.add(Calendar.MONTH, -1);
+		calendar.set(Calendar.DAY_OF_MONTH, 1);
+
+		int month = calendar1.get(Calendar.MONTH);
+		calendar1.set(Calendar.MONTH, month - 1);
+		calendar1.set(Calendar.DAY_OF_MONTH, calendar1.getActualMaximum(Calendar.DAY_OF_MONTH));
+		String str = format.format(calendar.getTime());
+		String str1 = format.format(calendar1.getTime());
+
+		return str + "," + str1;
+	}
+
+	/**
+	 * 获取某年第一天和最后一天日期
+	 * 
+	 * @param year
+	 *            年份
+	 * @return Date
+	 */
+
+	public static String getYearFirst(int year) {
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar calendar = Calendar.getInstance();
+		calendar.clear();
+		calendar.set(Calendar.YEAR, year);
+
+		Calendar calendar1 = Calendar.getInstance();
+		calendar1.clear();
+		calendar1.set(Calendar.YEAR, year);
+		calendar1.roll(Calendar.DAY_OF_YEAR, -1);
+
+		String str = format.format(calendar.getTime());
+		String str1 = format.format(calendar1.getTime());
+
+		return str + "," + str1;
+	}
+	
+	public static Date addDate(Date date,Integer day) throws ParseException {
+		 long time = date.getTime(); // 得到指定日期的毫秒数
+		 day = day*24*60*60*1000; // 要加上的天数转换成毫秒数
+		 time+=day; // 相加得到新的毫秒数
+		 return new Date(time); // 将毫秒数转换成日期
+		}
+	
+	// 获取一天开始和结束
+	public static String getDay() {
+		Date dBefore = new Date();
+		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
+		String defaultStartDate = sdf.format(dBefore); //格式化前一天
+		defaultStartDate = defaultStartDate+" 00:00:00";
+		String defaultEndDate = defaultStartDate.substring(0,10)+" 23:59:59";
+
+		return defaultStartDate + "," + defaultEndDate;
+	}
+	
+	
+	
+	public static void main(String[] args){
+		System.out.println(DateUtil.getDate("2020-05-28", "yyyy-MM-dd").getTime());
+		System.out.println(new Date().getTime());
+	}
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/OrderUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/OrderUtil.java
new file mode 100644
index 0000000..cf8f43a
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/OrderUtil.java
@@ -0,0 +1,81 @@
+package com.stylefeng.guns.modular.shunfeng.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 订单处理工具类
+ * @author taonb
+ * @createDate 2016年5月27日
+ * @version 1.0
+ */
+public class OrderUtil {
+	
+	/* 订单号 */
+	private static long orderNum = 0L;
+	
+	/* 日期 */
+	private static String date;
+	
+	/**
+	 * 生成不重复的订单号 【纯数字】
+	 * @return
+	 */
+	public static synchronized String getOrderNo() {
+		String str = new SimpleDateFormat("yyMMddHHmm").format(new Date());
+		if (date == null || !date.equals(str)) {
+			date = str;
+			orderNum = 0l;
+		}
+		orderNum++;
+		long orderNo = Long.parseLong((date)) * 10000;
+		orderNo += orderNum;
+		return orderNo + "";
+	}
+	
+	/**
+	 * 生成不重复的订单号 【含前缀】
+	 * @param prefix
+	 * @return
+	 */
+	public static synchronized String getOrderNoForPrefix(String prefix) {
+		return prefix + getOrderNo();
+	}
+	
+	/**
+	 * 生成不重复的订单号 【含后缀】
+	 * @param suffix
+	 * @return
+	 */
+	public static synchronized String getOrderNoForSuffix(String suffix) {
+		return getOrderNo() + suffix;
+	}
+	
+	public static void main(String[] args) {
+//		System.out.println(OrderUtil.getOrderNo());
+//		System.out.println(OrderUtil.getOrderNo());
+//		System.out.println(OrderUtil.getOrderNoForSuffix("LTG"));
+
+		System.out.println(getSeatNumer(20,4));
+	}
+	/**
+	 * 生成座位号
+	 * @return
+	 */
+	public static synchronized String getSeatNumer(Integer index,Integer count) {
+		String seatNumber="";
+		for(int i=index+1;i<index+count+1;i++){
+			String number="";
+			if(i<10){
+				number="0"+i;
+			}
+			number=i+"";
+			seatNumber+=number+",";
+		}
+		if(seatNumber.length()>0){
+			seatNumber=seatNumber.substring(0,seatNumber.length()-1);
+		}
+		return seatNumber;
+	}
+
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/ParamUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/ParamUtil.java
new file mode 100644
index 0000000..bb881e5
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/ParamUtil.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.modular.shunfeng.util;
+
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * 配置信息
+ * 
+ * @author TZj
+ * @data 2017年8月03日
+ * @version 1.0
+ */
+public class ParamUtil {
+
+	/**
+	 * 获取配置信息
+	 */
+	private static Properties properties = new Properties();
+	static{
+		try {
+			//获取properties文件
+			properties.load(ParamUtil.class.getClassLoader().getResourceAsStream("conf/param.properties"));
+		} catch (IOException e) {e.printStackTrace();}
+	}
+	
+	/**
+	 * 获取配置参数值
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public static String getValue(String key){		
+		return (String)properties.get(key);
+	}
+	
+}
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/SensitiveWordUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/SensitiveWordUtil.java
new file mode 100644
index 0000000..fe5038f
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/shunfeng/util/SensitiveWordUtil.java
@@ -0,0 +1,252 @@
+package com.stylefeng.guns.modular.shunfeng.util;
+
+import java.util.*;
+
+public class SensitiveWordUtil {
+	 /**
+     * 敏感词匹配规则
+     */
+    public static final int MinMatchTYpe = 1;      //最小匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国]人
+    public static final int MaxMatchType = 2;      //最大匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国人]
+
+    /**
+     * 敏感词集合
+     */
+    public static HashMap sensitiveWordMap;
+
+    /**
+     * 初始化敏感词库,构建DFA算法模型
+     *
+     * @param sensitiveWordSet 敏感词库
+     */
+    public static synchronized void init(Set<String> sensitiveWordSet) {
+        initSensitiveWordMap(sensitiveWordSet);
+    }
+
+    /**
+     * 初始化敏感词库,构建DFA算法模型
+     *
+     * @param sensitiveWordSet 敏感词库
+     */
+    private static void initSensitiveWordMap(Set<String> sensitiveWordSet) {
+        //初始化敏感词容器,减少扩容操作
+        sensitiveWordMap = new HashMap(sensitiveWordSet.size());
+        String key;
+        Map nowMap;
+        Map<String, String> newWorMap;
+        //迭代sensitiveWordSet
+        Iterator<String> iterator = sensitiveWordSet.iterator();
+        while (iterator.hasNext()) {
+            //关键字
+            key = iterator.next();
+            nowMap = sensitiveWordMap;
+            for (int i = 0; i < key.length(); i++) {
+                //转换成char型
+                char keyChar = key.charAt(i);
+                //库中获取关键字
+                Object wordMap = nowMap.get(keyChar);
+                //如果存在该key,直接赋值,用于下一个循环获取
+                if (wordMap != null) {
+                    nowMap = (Map) wordMap;
+                } else {
+                    //不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个
+                    newWorMap = new HashMap<>();
+                    //不是最后一个
+                    newWorMap.put("isEnd", "0");
+                    nowMap.put(keyChar, newWorMap);
+                    nowMap = newWorMap;
+                }
+
+                if (i == key.length() - 1) {
+                    //最后一个
+                    nowMap.put("isEnd", "1");
+                }
+            }
+        }
+    }
+
+    /**
+     * 判断文字是否包含敏感字符
+     *
+     * @param txt       文字
+     * @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则
+     * @return 若包含返回true,否则返回false
+     */
+    public static boolean contains(String txt, int matchType) {
+        boolean flag = false;
+        for (int i = 0; i < txt.length(); i++) {
+            int matchFlag = checkSensitiveWord(txt, i, matchType); //判断是否包含敏感字符
+            if (matchFlag > 0) {    //大于0存在,返回true
+                flag = true;
+            }
+        }
+        return flag;
+    }
+
+    /**
+     * 判断文字是否包含敏感字符
+     *
+     * @param txt 文字
+     * @return 若包含返回true,否则返回false
+     */
+    public static boolean contains(String txt) {
+        return contains(txt, MinMatchTYpe);
+    }
+
+    /**
+     * 获取文字中的敏感词
+     *
+     * @param txt       文字
+     * @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则
+     * @return
+     */
+    public static Set<String> getSensitiveWord(String txt, int matchType) {
+        Set<String> sensitiveWordList = new HashSet<>();
+
+        for (int i = 0; i < txt.length(); i++) {
+            //判断是否包含敏感字符
+            int length = checkSensitiveWord(txt, i, matchType);
+            if (length > 0) {//存在,加入list中
+                sensitiveWordList.add(txt.substring(i, i + length));
+                i = i + length - 1;//减1的原因,是因为for会自增
+            }
+        }
+
+        return sensitiveWordList;
+    }
+
+    /**
+     * 获取文字中的敏感词
+     *
+     * @param txt 文字
+     * @return
+     */
+    public static Set<String> getSensitiveWord(String txt) {
+        return getSensitiveWord(txt, MaxMatchType);
+    }
+
+    /**
+     * 替换敏感字字符
+     *
+     * @param txt         文本
+     * @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱***
+     * @param matchType   敏感词匹配规则
+     * @return
+     */
+    public static String replaceSensitiveWord(String txt, char replaceChar, int matchType) {
+        String resultTxt = txt;
+        //获取所有的敏感词
+        Set<String> set = getSensitiveWord(txt, matchType);
+        Iterator<String> iterator = set.iterator();
+        String word;
+        String replaceString;
+        while (iterator.hasNext()) {
+            word = iterator.next();
+            replaceString = getReplaceChars(replaceChar, word.length());
+            resultTxt = resultTxt.replaceAll(word, replaceString);
+        }
+
+        return resultTxt;
+    }
+
+    /**
+     * 替换敏感字字符
+     *
+     * @param txt         文本
+     * @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱***
+     * @return
+     */
+    public static String replaceSensitiveWord(String txt, char replaceChar) {
+        return replaceSensitiveWord(txt, replaceChar, MaxMatchType);
+    }
+
+    /**
+     * 替换敏感字字符
+     *
+     * @param txt        文本
+     * @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]
+     * @param matchType  敏感词匹配规则
+     * @return
+     */
+    public static String replaceSensitiveWord(String txt, String replaceStr, int matchType) {
+        String resultTxt = txt;
+        //获取所有的敏感词
+        Set<String> set = getSensitiveWord(txt, matchType);
+        Iterator<String> iterator = set.iterator();
+        String word;
+        while (iterator.hasNext()) {
+            word = iterator.next();
+            resultTxt = resultTxt.replaceAll(word, replaceStr);
+        }
+
+        return resultTxt;
+    }
+
+    /**
+     * 替换敏感字字符
+     *
+     * @param txt        文本
+     * @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]
+     * @return
+     */
+    public static String replaceSensitiveWord(String txt, String replaceStr) {
+        return replaceSensitiveWord(txt, replaceStr, MaxMatchType);
+    }
+
+    /**
+     * 获取替换字符串
+     *
+     * @param replaceChar
+     * @param length
+     * @return
+     */
+    private static String getReplaceChars(char replaceChar, int length) {
+        String resultReplace = String.valueOf(replaceChar);
+        for (int i = 1; i < length; i++) {
+            resultReplace += replaceChar;
+        }
+
+        return resultReplace;
+    }
+
+    /**
+     * 检查文字中是否包含敏感字符,检查规则如下:<br>
+     *
+     * @param txt
+     * @param beginIndex
+     * @param matchType
+     * @return 如果存在,则返回敏感词字符的长度,不存在返回0
+     */
+    private static int checkSensitiveWord(String txt, int beginIndex, int matchType) {
+        //敏感词结束标识位:用于敏感词只有1位的情况
+        boolean flag = false;
+        //匹配标识数默认为0
+        int matchFlag = 0;
+        char word;
+        Map nowMap = sensitiveWordMap;
+        for (int i = beginIndex; i < txt.length(); i++) {
+            word = txt.charAt(i);
+            //获取指定key
+            nowMap = (Map) nowMap.get(word);
+            if (nowMap != null) {//存在,则判断是否为最后一个
+                //找到相应key,匹配标识+1
+                matchFlag++;
+                //如果为最后一个匹配规则,结束循环,返回匹配标识数
+                if ("1".equals(nowMap.get("isEnd"))) {
+                    //结束标志位为true
+                    flag = true;
+                    //最小规则,直接返回,最大规则还需继续查找
+                    if (MinMatchTYpe == matchType) {
+                        break;
+                    }
+                }
+            } else {//不存在,直接返回
+                break;
+            }
+        }
+        if (matchFlag < 2 || !flag) {//长度必须大于等于1,为词
+            matchFlag = 0;
+        }
+        return matchFlag;
+   }
+}
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java
index a941215..025c8ce 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java
@@ -132,8 +132,21 @@
      */
     @TableField("state")
     private Integer state;
-
-
+    /**
+     * 是否为顺风车司机(0=否,1=是)
+     */
+    @TableField("isDriverRide")
+    private Integer isDriverRide;
+    /**
+     * 顺风车司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 实名认证照片
+     */
+    @TableField("certificationImg")
+    private String certificationImg;
     /**
      * 绑定的司机id
      */
@@ -161,7 +174,31 @@
     public void setBindDate(Date bindDate) {
         this.bindDate = bindDate;
     }
-
+    
+    public Integer getIsDriverRide() {
+        return isDriverRide;
+    }
+    
+    public void setIsDriverRide(Integer isDriverRide) {
+        this.isDriverRide = isDriverRide;
+    }
+    
+    public Integer getDriverId() {
+        return driverId;
+    }
+    
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+    
+    public String getCertificationImg() {
+        return certificationImg;
+    }
+    
+    public void setCertificationImg(String certificationImg) {
+        this.certificationImg = certificationImg;
+    }
+    
     public Integer getBindDriverId() {
         return bindDriverId;
     }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java
index c1e4d91..0530980 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java
@@ -275,4 +275,47 @@
 	
 	
 	
+	/**
+	 * 实名认证
+	 * @param realName
+	 * @param cardNo
+	 * @return
+	 */
+	public static Boolean idCardAuth(String realName, String cardNo) {
+		//请求路径
+		String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/idCardAuth";
+		//私钥文件
+		String skprivateKeyFile = QianYunTongProperties.privateKeyPath;
+		//注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密
+		String appKey = QianYunTongProperties.appkey;//appkey
+		Map<String, String> headers = new HashMap<>();
+		headers.put("Content-Type", "application/json");
+		Map<String, Object> contentMap = new HashMap<String, Object>();
+		Date nowdate = new Date();
+		SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss");
+		
+		String timeStamp = date.format(nowdate);
+		String messageId = UUID.randomUUID().toString().replaceAll("-", "");
+		contentMap.put(SystemParameterNames.getAppKey(), appKey);
+		contentMap.put(SystemParameterNames.getMessage_id(), messageId);
+		contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName);
+		contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status);
+		Map<String, String> map = new HashMap<>();
+		map.put("realName", realName);
+		map.put("cardNo", cardNo);
+		contentMap.put("content", JSON.toJSONString(map));
+		log.info("【身份证实名认证】请求地址:" + url);
+		log.info("【身份证实名认证】请求参数:" + JSON.toJSONString(contentMap));
+		String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap);
+		log.info("【身份证实名认证】请求结果:" + result);
+		JSONObject jsonObject = JSON.parseObject(result);
+		String retCode = jsonObject.getString("retCode");
+		if (!"0".equals(retCode)) {
+			log.error("【身份证实名认证】请求失败:" + result);
+			throw new RuntimeException("【身份证实名认证】请求失败:" + result);
+		}
+		JSONObject object = jsonObject.getJSONObject("object");
+		return object.getBoolean("isok");
+	}
+	
 }
diff --git a/UserQYTTravel/guns-admin/src/main/resources/conf/param.properties b/UserQYTTravel/guns-admin/src/main/resources/conf/param.properties
new file mode 100644
index 0000000..e5b9a05
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/resources/conf/param.properties
@@ -0,0 +1,47 @@
+#是否开启调试true
+debug = false
+
+
+
+## 支付宝配置文件 ##
+
+# 商户收款支付宝账号
+seller_email = 273754359@qq.com
+# 商户私钥
+private_key = MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCulBj9Cru2fPKzRkmd7yyorBx1wqnLB3rpi06/qArTnrbUBYhzMtgq4G2IWZcVXV4cA8wgDpk0xTf4UysWRhTglG25QEM9WmAOOAG/FESlWqInSmqonG75VJy6+RuGTMRi/XsUu+Io7edDdgQ7RT2DyWjSyNabYBVw/CgxO3aVO0HPp5Cf9DeShQ/O0q5+g7il1VeWNrU+ZtrtMMylv0yUv+sQtEYTFvCZUCMhbWF1iJX/8xEKpkQc8JrG4gkbtadx4BQYkh45xuayKaQlcdbyooq35yttIuyCSLxaG4WqkpLiBvSrJm/ph2OAy88bdp0mfFc9YO/VatoKEnJI/iP1AgMBAAECggEBAKBcmbeWrGcszyOuZOEWWkd2EY56ic1dyaHNvUB/87IAEKEhk/19ruNz1ClzYjzVzyScuFyaDFFU99y7SNDk/zhsH34TcbBh2+ozuCb1Tzk0z86XpPHNAIM3HeECAi6TRbJIdU7OZyiBn/Vv6uMm7yKnWAqHQdrnn8pxVdojbQIWMBXPSsbAf2//io1JAzgrL3hTVCfnE3JjeSP3TLYw+qUmqO6FsPF5MyEJ5Hn5/HeoiddnEzb3XzL8vncQSRnFNSOseW7jGZ2hC91FklrKfQiY2Tbjqb/ndqmo3oZjstjsgzNandmy3SWXfr88SuEYaFAKlwEKES/nRz5QT9sOmwECgYEA2J1oosDOJvo8tyWZfovPCJXjIT0dQTGRWg5kf8Ga8ASulVTvVyJYG6SvCRaBqBvNp3pLB9h9jnNRqWJ0YKa+19xIQFfm28/Unw6su9zvGyB8niFM4H11e8Zsn0NmwE6cq+wsuCBimnsVYr2cUH6udsthzz8Eu1vcs41nkLLdkOkCgYEAzlIOnk6vpi2rIR62jHF4isLydyRsPlxGb0AX2xI3AD2ZDG64UHHxrA3Zyh0Go/HqAkm1mUdXqjjLQ8W7DXzDCYQ8bYrdO4np8EhXqDjf+6nGhkqdjlCG75bh1ARcJMyr23ZSL4cwmbDDs03wneNKitCYnPftBLPUVkuUITB7cy0CgYEAkocIPPAHg75KS+mXR07zoW8i0V0x6OPK2wxZV0JzuGCyaDmoHV0SFMD11kPvOPR1zRCgqJH9fNrtJpN+/dJNzl8oUL4lYBPaVC3tEreE1ujG44DLLCAx1KSI3cMOQo/q0zFTnsnpaW5RLRXuI1VOVvWFGFgcr1CYnqzMnckgr+ECgYBPWwJiY1Nt8EzM7Vo7RH2fqYHGz4yOo8E3kwhZ63SaNBcE0CU2U80nZyBoe6eNMUPXY3BkpysRvsx3obrjYiRGKcVwQKP8/XusPrbwbgfAbTl9d3+IOHLd/kOX36FtSgej3quXukC4LGPpOEYfBEgsgjTg0v8n+t7l3iX4agRhdQKBgAWG+UyW56k42mnyuuy6wWdXkBvCATizxS8Ik7okitj5cwzorLZgj00Fy7XoJKpIkU5E5Bj9oM3fXCVBP7CVeo83J7GuZxi8OpvIgTvcDrGHIoGq7hIBEVx95Gj/Wj+IGgwJzZ2V15sIiGAq5rxb6UgVM8FbyhnVGWuYVTmxIBu4
+
+# 支付宝公钥
+ali_public_key = MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoTG6SbUIGDlsyt91TFH//Krs/vgratnyIGrKfobSTEMGExyaY+sZOzBP1MphyUuYA5VwdFEiVxgUNRO/A+V6/dYw/awV31pdXV3Eb7L1iolg6/bb3+TqXPeXu/yO7aE4KMIW8tXtVO/9DJfFhPgOhxHBc443HuF/WGboGMP5ZTk4I+CQiTYpdf+g2hyVcydbJfyu+jYonAeUnxYqAj4h+WZB+WwccEfB/1r7QsoL87h4746+UqIko+m3/t9gfz9Kr4bMh4QMHQqhBW8/Pwd/PRQHMvyde0QybV0bgDoMUHx+9Iz+j7I1/av6FyCNvdPR47JlNwzSPG6WfneZZO41gQIDAQAB
+
+
+# 签约的appid
+app_id = 2019062865730093
+# 支付宝回调地址          
+#notify_url = http://139.9.153.38:80/api/payInfo/alipay/notify
+notify_url = http://139.9.153.38:8081/api/payInfo/alipay/notify
+
+
+
+## 支付宝配置文件 ##
+
+## 微信支付配置文件(1)-start 0398bce360f3f5d9fbcce40326929639
+# 微信开发平台(应用APPID)
+appID = wxda97571de885e1af
+
+# 公众号的商户号
+mchID = 1549045081
+#    APIv3密钥    4b005c98dc52356e817c42b36265a3f7
+# 应用对应的密钥(商户平台开发设置) 
+key = Px0Up9CvP7Xcxa7kaGVk0BEJcUJge6q1
+key_2 = Px0Up9CvP7Xcxa7kaGVk0BEJcUJge6q1
+# 商户号id
+GmchID = 1549045081
+# 小程序的APPID
+GappID = wx8bf5eb7ec15168bd
+# 小程序的appSecret
+appSecret = d3f530381bbcf2f01171d4d8a270108a
+
+# 微信回调地址
+#wx_notify_url = http://139.9.153.38:80/api/payInfo/wxpay/notify
+wx_notify_url = http://139.9.153.38:8081/api/payInfo/wxpay/notify
+

--
Gitblit v1.7.1