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