UserQYTTravel/guns-admin/pom.xml
@@ -70,18 +70,6 @@ </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!-- <scope>provided</scope>--> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> </dependency> @@ -125,6 +113,14 @@ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <dependency> @@ -241,6 +237,10 @@ <scope>system</scope> <systemPath>${pom.basedir}/lib/javabase64-1.3.1.jar</systemPath> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> </dependencies> UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/account/controller/ElectronicLedgerController.java
@@ -412,7 +412,7 @@ @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil uploadImg(MultipartFile multipartFile,HttpServletRequest request){ public ResultUtil uploadImg(MultipartFile file, HttpServletRequest request) { try { // MediaResp mediaResp = MediaExample.uploadImage(multipartFile); // String pictureName = OssUploadUtil.ossUpload(request, multipartFile); @@ -420,7 +420,7 @@ // userService.insertImg(mediaId,pictureName); // return ResultUtil.success(mediaId); return ResultUtil.success(); }catch (Exception e){ } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -131,7 +131,7 @@ private SystemPriceMapper systemPriceMapper; @Resource private RedisTemplate redisTemplate; private RedisTemplate<String, Object> redisTemplate; /** UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java
@@ -26,6 +26,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.InputStream; import java.util.Date; @@ -39,30 +40,29 @@ @RestController @RequestMapping("") public class UserInfoController { @Autowired private IUserInfoService userInfoService; @Autowired private IVerifiedService verifiedService; @Autowired private ISmsrecordService smsrecordService; @Autowired private RedisTemplate redisTemplate; @Resource private RedisTemplate<String, Object> redisTemplate; @Autowired private WeChatUtil weChatUtil; @Autowired private IDriverService driverService; @Autowired private HttpServletRequest request; /** * 获取短信验证码 * @param phone UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineSiteServiceImpl.java
@@ -39,23 +39,23 @@ @Resource private LineShiftMapper lineShiftMapper; @Autowired private IOrderTaxiService orderTaxiService; @Autowired private IOrderPrivateCarService orderPrivateCarService; @Autowired private IOrderCrossCityService orderCrossCityService; @Autowired private RedisTemplate redisTemplate; @Resource private RedisTemplate<String, Object> redisTemplate; /** * 根据线路id获取排班数据 * * @param lineId * @param day * @return UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -131,28 +131,28 @@ @Autowired private DateUtil dateUtil; @Autowired private GDMapGeocodingUtil gdMapGeocodingUtil; @Autowired private ChinaMobileUtil chinaMobileUtil; @Autowired private GDFalconUtil gdFalconUtil; @Autowired private RedisTemplate redisTemplate; @Resource private RedisTemplate<String, Object> redisTemplate; @Autowired private ICancleOrderService cancleOrderService; @Autowired private IOrderCancelService orderCancelService; @Autowired private RestTemplate internalRestTemplate; @Autowired private IUserActivityRedenvelopeService userActivityRedenvelopeService; UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -91,28 +91,28 @@ @Autowired private ICompanyService companyService; @Autowired private IIncomeService incomeService; @Autowired private IOrderCancelService orderCancelService; @Autowired private IOrderLogisticsSpreadService orderLogisticsSpreadService; @Autowired private RedisTemplate redisTemplate; @Resource private RedisTemplate<String, Object> redisTemplate; @Resource private RegionMapper regionMapper; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; @Autowired private PayMoneyUtil payMoneyUtil; @Resource private OrderPrivateCarMapper orderPrivateCarMapper; UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -124,28 +124,28 @@ @Autowired private IUserCouponRecordService userCouponRecordService; @Autowired private IUserRedPacketRecordService userRedPacketRecordService; @Autowired private ICompanyService companyService; @Autowired private IUserActivityRedenvelopeService userActivityRedenvelopeService; @Autowired private RedisTemplate redisTemplate; @Resource private RedisTemplate<String, Object> redisTemplate; @Autowired private GDFalconUtil gdFalconUtil; @Autowired private GDMapGeocodingUtil gdMapGeocodingUtil; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; @Autowired private IOrderPositionService orderPositionService; UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/UserMgrController.java
@@ -342,7 +342,6 @@ @RequestMapping(method = RequestMethod.POST, path = "/upload") @ResponseBody public String upload(@RequestPart("file") MultipartFile picture) { String pictureName = UUID.randomUUID().toString() + "." + ToolUtil.getFileSuffix(picture.getOriginalFilename()); try { String fileSavePath = gunsProperties.getFileUploadPath(); UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderPosition.java
@@ -1,148 +1,48 @@ package com.stylefeng.guns.modular.system.model; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; import java.util.Date; /** * 订单轨迹 */ @TableName("t_order_position") @Data @Document(collection = "order_position") public class OrderPosition { /** * 主键 * 订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车) */ @TableId(value = "id", type = IdType.AUTO) @TableField("id") private Integer id; /** * 订单类型 */ @TableField("orderType") private Integer orderType; /** * 订单id */ @TableField("orderId") private Integer orderId; /** * 司机id */ @TableField("driverId") private Integer driverId; /** * 经度 */ @TableField("lon") private String lon; /** * 纬度 */ @TableField("lat") private String lat; /** * 方向角 */ @TableField("directionAngle") private String directionAngle; /** * 海拔 */ @TableField("altitude") private String altitude; /** * 添加时间 */ @TableField("insertTime") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date insertTime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getOrderType() { return orderType; } public void setOrderType(Integer orderType) { this.orderType = orderType; } public Integer getOrderId() { return orderId; } public void setOrderId(Integer orderId) { this.orderId = orderId; } public Integer getDriverId() { return driverId; } public void setDriverId(Integer driverId) { this.driverId = driverId; } public String getLon() { return lon; } public void setLon(String lon) { this.lon = lon; } public String getLat() { return lat; } public void setLat(String lat) { this.lat = lat; } public String getDirectionAngle() { return directionAngle; } public void setDirectionAngle(String directionAngle) { this.directionAngle = directionAngle; } public String getAltitude() { return altitude; } public void setAltitude(String altitude) { this.altitude = altitude; } public Date getInsertTime() { return insertTime; } public void setInsertTime(Date insertTime) { this.insertTime = insertTime; } @Override public String toString() { return "OrderPosition{" + "id=" + id + ", orderType=" + orderType + ", orderId=" + orderId + ", driverId=" + driverId + ", lon='" + lon + '\'' + ", lat='" + lat + '\'' + ", directionAngle='" + directionAngle + '\'' + ", altitude='" + altitude + '\'' + ", insertTime=" + insertTime + '}'; } } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -21,27 +21,26 @@ @Service public class DriverServiceImpl extends ServiceImpl<DriverMapper, Driver> implements IDriverService { @Resource private DriverMapper driverMapper; @Resource private DriverServiceMapper driverServiceMapper; @Autowired private RedisTemplate redisTemplate; @Resource private RedisTemplate<String, Object> redisTemplate; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; @Autowired private ICompanyCityService companyCityService; @Autowired private GeodesyUtil geodesyUtil; /** * 获取distance公里内空闲司机数量 * @param type 业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车) UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NettyServiceImpl.java
@@ -29,6 +29,9 @@ private IOrderCrossCityService orderCrossCityService; @Resource private RedisTemplate<String, Object> redisTemplate; /** * 获取下单推送完后没有司机接单的提醒 * @param uid @@ -38,7 +41,7 @@ @Override public ResultUtil<EndPushWarpper> queryEndPush(Integer orderId, Integer orderType, Integer uid) throws Exception { EndPushWarpper endPushWarpper = null; switch (orderType){ switch (orderType) { case 1: endPushWarpper = orderPrivateCarService.queryEndPush(uid); break; @@ -48,13 +51,10 @@ } return ResultUtil.success(endPushWarpper); } @Resource private RedisTemplate redisTemplate; /** * 获取服务中的订单数据 * * @param uid * @return * @throws Exception UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java
@@ -1,19 +1,16 @@ package com.stylefeng.guns.modular.system.service.impl; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.dao.OrderPositionMapper; import com.stylefeng.guns.modular.system.model.OrderPosition; import com.stylefeng.guns.modular.system.service.IOrderPositionService; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -22,77 +19,50 @@ @Service public class OrderPositionServiceImpl extends ServiceImpl<OrderPositionMapper, OrderPosition> implements IOrderPositionService { @Resource private OrderPositionMapper orderPositionMapper; @Value("${filePath}") private String filePath; /** * 获取轨迹数据 * @param orderId * @param orderType * @return * @throws Exception */ @Override public List<Map<String, Object>> queryTrack(Integer orderId, Integer orderType) throws Exception { // return orderPositionMapper.queryTrack(orderId, orderType); //将数据存储到文件中 File file = new File(filePath + orderId + "_" + orderType + ".txt"); if(!file.exists()){ return new ArrayList<>(); } //读取文件(字符流) BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8")); //循环取出数据 String str = null; StringBuffer sb = new StringBuffer(); while ((str = in.readLine()) != null) { sb.append(str); } List<OrderPosition> list = JSONArray.parseArray(sb.toString(), OrderPosition.class); List<Map<String, Object>> lonlat = new ArrayList<>(); for(OrderPosition orderPosition : list){ Map<String, Object> map = new HashMap<>(); map.put("lon", orderPosition.getLon()); map.put("lat", orderPosition.getLat()); lonlat.add(map); } @Resource private OrderPositionMapper orderPositionMapper; @Resource private MongoTemplate mongoTemplate; /** * 获取轨迹数据 * * @param orderId * @param orderType * @return * @throws Exception */ @Override public List<Map<String, Object>> queryTrack(Integer orderId, Integer orderType) throws Exception { List<OrderPosition> positions = queryPosition(orderId, orderType); List<Map<String, Object>> lonlat = new ArrayList<>(); for (OrderPosition orderPosition : positions) { Map<String, Object> map = new HashMap<>(); map.put("lon", orderPosition.getLon()); map.put("lat", orderPosition.getLat()); lonlat.add(map); } return lonlat; } /** * 获取坐标文件中的坐标数据 * @param orderId * @param orderType * @return * @throws Exception */ @Override public List<OrderPosition> queryPosition(Integer orderId, Integer orderType) throws Exception{ //将数据存储到文件中 File file = new File(filePath + orderId + "_" + orderType + ".txt"); if(!file.exists()){ return new ArrayList<>(); } //读取文件(字符流) BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8")); //循环取出数据 String str = null; StringBuffer sb = new StringBuffer(); while ((str = in.readLine()) != null) { sb.append(str); } List<OrderPosition> list = new ArrayList<>(); if(ToolUtil.isNotEmpty(sb.toString())){ list = JSONArray.parseArray(sb.toString(), OrderPosition.class); } System.err.println("坐标:" + sb); return list; } /** * 获取坐标文件中的坐标数据 * * @param orderId * @param orderType * @return * @throws Exception */ @Override public List<OrderPosition> queryPosition(Integer orderId, Integer orderType) throws Exception { Query query = new Query() .addCriteria(Criteria.where("orderId").is(orderId).and("orderType").is(orderType)) .with(new Sort(Sort.Direction.ASC, "insertTime")); List<OrderPosition> positions = mongoTemplate.find(query, OrderPosition.class); return positions; } } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java
@@ -17,6 +17,11 @@ import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.*; import com.stylefeng.guns.modular.system.util.qianyuntong.SMSUtil; import com.stylefeng.guns.modular.system.util.qianyuntong.UserUtil; import com.stylefeng.guns.modular.system.util.qianyuntong.model.LoginWeChatXiao; import com.stylefeng.guns.modular.system.util.qianyuntong.model.QYTUserInfo; import com.stylefeng.guns.modular.system.util.qianyuntong.model.RegisterViaMobile; import com.stylefeng.guns.modular.system.util.qianyuntong.model.RegisterViaMobileRequest; import com.stylefeng.guns.modular.system.warpper.LoginWarpper; import com.stylefeng.guns.modular.taxi.model.PaymentRecord; import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService; @@ -52,25 +57,25 @@ @Service public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService { @Resource private UserInfoMapper userInfoMapper; @Resource private UserActivityInviteMapper userActivityInviteMapper; @Autowired private RedisTemplate redisTemplate; @Resource private RedisTemplate<String, Object> redisTemplate; @Autowired private ALiSendSms aLiSendSms; @Autowired private WeChatUtil weChatUtil; @Autowired private IPaymentRecordService paymentRecordService; @Autowired private ICompanyCityService companyCityService; @@ -181,16 +186,16 @@ */ @Override public boolean checkCaptcha(String phone, String code) throws Exception { Object value = redisTemplate.opsForValue().get(phone); if("1234".equals(code)){ if ("1234".equals(code)) { return true; } System.out.println("phone:"+phone); System.out.println("code:"+code); System.out.println("code---"+String.valueOf(value)); if(null != value && code.equals(String.valueOf(value))){ Object value = redisTemplate.opsForValue().get(phone); System.out.println("phone:" + phone); System.out.println("code:" + code); System.out.println("code---" + String.valueOf(value)); if (null != value && code.equals(String.valueOf(value))) { return true; }else{ } else { return false; } } @@ -204,14 +209,14 @@ @Override public synchronized ResultUtil<LoginWarpper> captchaLogin(String phone, String code, String registIp, String registAreaCode,String loginType) throws Exception { boolean b = this.checkCaptcha(phone, code); if(!b){ if (!b) { return ResultUtil.error("验证码无效"); } UserInfo userInfo = userInfoMapper.queryByPhone(phone); if(null == userInfo){ if (null == userInfo) { ArrayList<UserBankAccount> userBankAccounts = new ArrayList<>(); userInfo = new UserInfo(); userInfo.setPhone(phone); userInfo.setPassWord(ShiroKit.md5("", salt)); @@ -233,27 +238,41 @@ this.insert(userInfo); this.addCoupon(userInfo);//添加优惠券 UserInfo finalUserInfo = userInfo; new Thread(new Runnable() { @Override public void run() { if(pushMinistryOfTransport){ if (pushMinistryOfTransport) { //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } if(userInfo.getState() == 2){ //调中台接口查询用户 List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone); if (null == infoByPhone || infoByPhone.isEmpty()) { RegisterViaMobileRequest request = new RegisterViaMobileRequest(); request.setMobile(phone); request.setPassword("123456"); request.setNickname(userInfo.getNickName()); request.setVerify_code(code); request.setVerify_code_type("1"); RegisterViaMobile register = UserUtil.registerViaMobile(request); if (!"0".equals(register.getStatus())) { return ResultUtil.error(register.getDesc()); } } if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(),loginType); String token = this.getToken(userInfo, "",loginType); this.singlePointLogin(userInfo.getId(), loginType); String token = this.getToken(userInfo, "", loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); @@ -261,7 +280,7 @@ loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); loginWarpper.setPhone(2); smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(loginWarpper); } @@ -272,19 +291,20 @@ */ @Override public ResultUtil<LoginWarpper> oneClickLogin(String accessToken, String registIp, String registAreaCode,String loginType,String androidOrIos) throws Exception { String response = GetMobile.getPhone(accessToken,androidOrIos); if(response==null){ String response = GetMobile.getPhone(accessToken, androidOrIos); if (response == null) { return ResultUtil.error("登录失败"); } System.out.println( response); System.out.println(response); JSONObject json = JSONObject.parseObject(response); if(!json.getBoolean("success")){ if (!json.getBoolean("success")) { return ResultUtil.error("登录失败"); } String phone = json.getJSONObject("data").getString("mobile"); UserInfo userInfo = userInfoMapper.queryByPhone(phone); if(null == userInfo){ if (null == userInfo) { userInfo = new UserInfo(); userInfo.setPhone(phone); userInfo.setPassWord(ShiroKit.md5("", salt)); @@ -294,7 +314,7 @@ userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); //用户所属企业 if(null != registAreaCode){ Company query = companyCityService.query(registAreaCode); @@ -311,22 +331,21 @@ new Thread(new Runnable() { @Override public void run() { if(pushMinistryOfTransport){ if (pushMinistryOfTransport) { //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } if(userInfo.getState() == 2){ if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(),loginType); String token = this.getToken(userInfo, "",loginType); this.singlePointLogin(userInfo.getId(), loginType); String token = this.getToken(userInfo, "", loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); @@ -334,7 +353,7 @@ loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); loginWarpper.setPhone(2); //smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(loginWarpper); } @@ -428,14 +447,20 @@ */ @Override public ResultUtil<LoginWarpper> userLogin(String phone, String password,String loginType) throws Exception { UserInfo userInfo = this.queryByPhone(phone); if(null == userInfo){ //调中台接口查询用户 List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone); if (null == infoByPhone || infoByPhone.isEmpty()) { return ResultUtil.error("账号无效"); } if(userInfo.getState() == 2){ UserInfo userInfo = this.queryByPhone(phone); if (null == userInfo) { return ResultUtil.error("账号无效"); } if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } if(!ShiroKit.md5(password, salt).equals(userInfo.getPassWord())){ if (!ShiroKit.md5(password, salt).equals(userInfo.getPassWord())) { return ResultUtil.error("密码错误"); } @@ -455,9 +480,9 @@ public ResultUtil<LoginWarpper> wxLogin(Integer type, String openid, String unionid, String jscode, String registIp, String registAreaCode, Integer sex, String nickName, String avatar,String loginType) throws Exception { UserInfo userInfo = null; String sessionKey=null; if(type == 2){//小程序 if(ToolUtil.isEmpty(jscode)){ String sessionKey = null; if (type == 2) {//小程序 if (ToolUtil.isEmpty(jscode)) { return ResultUtil.error("微信登录请求失败,请重试"); } Map<String, String> map = weChatUtil.code2Session(jscode); @@ -465,22 +490,19 @@ unionid = map.get("unionid"); sessionKey = map.get("sessionKey"); userInfo = userInfoMapper.queryByOpenid2(openid); }else{//APP } else {//APP userInfo = userInfoMapper.queryByOpenid(openid); } if(null == userInfo){ if (null == userInfo) { userInfo = new UserInfo(); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setRegistIp(registIp); userInfo.setSex(sex); userInfo.setNickName(ToolUtil.isNotEmpty(nickName) ? nickName : this.getDefaultName()); userInfo.setAvatar(avatar); if(type == 2){ if (type == 2) { userInfo.setAppletsOpenId(openid); }else{ } else { userInfo.setOpenId(openid); } userInfo.setUnionid(unionid); @@ -504,32 +526,54 @@ new Thread(new Runnable() { @Override public void run() { if(pushMinistryOfTransport){ if (pushMinistryOfTransport) { //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } if(userInfo.getState() == 2){ if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } if(type == 2){//小程序登录 if (type == 2) {//小程序登录 String value = (String) redisTemplate.opsForValue().get("appletOpenId"); JSONObject jsonObject = null; if(ToolUtil.isNotEmpty(value)){ if (ToolUtil.isNotEmpty(value)) { jsonObject = JSON.parseObject(value); }else{ } else { jsonObject = new JSONObject(); } jsonObject.put(userInfo.getId().toString(), userInfo.getAppletsOpenId()); redisTemplate.opsForValue().set("appletOpenId", jsonObject.toJSONString()); //调中台微信登录接口 LoginWeChatXiao loginWeChatXiao = UserUtil.loginWeChatXiao(jscode); if (null == loginWeChatXiao) { return ResultUtil.error("微信登录请求失败,请重试"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(), loginType); String token = loginWeChatXiao.getToken(); redisTemplate.opsForValue().set(token.substring(token.length() - 32), String.valueOf(userInfo.getId()), 180, TimeUnit.DAYS); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getPhone(), token.substring(token.length() - 32)); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getId(), token); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); return ResultUtil.success(loginWarpper); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(),loginType); String token = this.getToken(userInfo, "",loginType); this.singlePointLogin(userInfo.getId(), loginType); String token = this.getToken(userInfo, "", loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); @@ -580,9 +624,6 @@ userInfo.setPhone(phone1); userInfoMapper.updateById(userInfo); } }else{//APP userInfo = userInfoMapper.queryByOpenid(openid); } @@ -637,7 +678,7 @@ new Thread(new Runnable() { @Override public void run() { if(pushMinistryOfTransport){ if (pushMinistryOfTransport) { //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } @@ -645,23 +686,36 @@ }).start(); } } if(userInfo.getState() == 2){ if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } if(type == 2){//小程序登录 if (type == 2) {//小程序登录 String value = (String) redisTemplate.opsForValue().get("appletOpenId"); JSONObject jsonObject = null; if(ToolUtil.isNotEmpty(value)){ if (ToolUtil.isNotEmpty(value)) { jsonObject = JSON.parseObject(value); }else{ } else { jsonObject = new JSONObject(); } jsonObject.put(userInfo.getId().toString(), userInfo.getAppletsOpenId()); redisTemplate.opsForValue().set("appletOpenId", jsonObject.toJSONString()); //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(), loginType); String token = this.getToken(userInfo, "", loginType); redisTemplate.opsForValue().set(token.substring(token.length() - 32), String.valueOf(userInfo.getId()), 180, TimeUnit.DAYS); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getPhone(), token.substring(token.length() - 32)); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getId(), token); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); return ResultUtil.success(loginWarpper); } //调用单点登录的逻辑 @@ -784,12 +838,29 @@ @Override public ResultUtil bindingPhone(Integer uid, String phone, String code,String loginType) throws Exception { boolean b = this.checkCaptcha(phone, code); if(!b){ if (!b) { return ResultUtil.error("验证码无效"); } UserInfo userInfo = this.selectById(uid); UserInfo userInfo1 = userInfoMapper.queryByPhone(phone); if(null != userInfo1){ if (null != userInfo1) { //调中台接口查询用户 List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone); if (null == infoByPhone || infoByPhone.isEmpty()) { RegisterViaMobileRequest request = new RegisterViaMobileRequest(); request.setMobile(phone); request.setPassword("123456"); request.setNickname(userInfo.getNickName()); request.setVerify_code(code); request.setVerify_code_type("1"); RegisterViaMobile register = UserUtil.registerViaMobile(request); if (!"0".equals(register.getStatus())) { return ResultUtil.error(register.getDesc()); } } userInfo1.setOpenId(userInfo.getOpenId()); userInfo1.setUnionid(userInfo.getUnionid()); userInfo1.setAppletsOpenId(userInfo.getAppletsOpenId()); @@ -797,14 +868,14 @@ userInfo1.setSex(userInfo.getSex()); userInfo1.setNickName(userInfo.getNickName()); this.updateById(userInfo1); if(ToolUtil.isNotEmpty(loginType) && loginType.equals("Applets")){//小程序登录后绑定手机号码 if (ToolUtil.isNotEmpty(loginType) && loginType.equals("Applets")) {//小程序登录后绑定手机号码 String value = (String) redisTemplate.opsForValue().get("appletOpenId"); JSONObject jsonObject = null; if(ToolUtil.isNotEmpty(value)){ if (ToolUtil.isNotEmpty(value)) { jsonObject = JSON.parseObject(value); jsonObject.remove(userInfo.getId().toString());//删除原有账号缓存的数据 }else{ } else { jsonObject = new JSONObject(); } jsonObject.put(userInfo1.getId().toString(), userInfo.getAppletsOpenId()); @@ -834,10 +905,10 @@ } userCouponRecordService.deleteById(ucr.getId()); } //获取新的token等数据 String token = this.getToken(userInfo1, "",loginType); String token = this.getToken(userInfo1, "", loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo1.getId()); loginWarpper.setToken(token); @@ -845,12 +916,27 @@ loginWarpper.setPhone(2); return ResultUtil.success(loginWarpper); } //调中台接口查询用户 List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone); if (null == infoByPhone || infoByPhone.isEmpty()) { RegisterViaMobileRequest request = new RegisterViaMobileRequest(); request.setMobile(phone); request.setPassword("123456"); request.setNickname(userInfo.getNickName()); request.setVerify_code(code); request.setVerify_code_type("1"); RegisterViaMobile register = UserUtil.registerViaMobile(request); if (!"0".equals(register.getStatus())) { return ResultUtil.error(register.getDesc()); } } userInfo.setPhone(phone); userInfo.setUpdateTime(new Date()); userInfo.setUpdateUser(userInfo.getId()); this.updateById(userInfo); smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(new LoginWarpper()); } @@ -996,6 +1082,8 @@ if(!b){ return ResultUtil.error("验证码无效"); } UserInfo userInfo = this.selectById(uid); UserInfo userInfo1 = userInfoMapper.queryByPhone(phone); if(null != userInfo1){ @@ -1004,7 +1092,6 @@ userInfo.setPhone(phone); this.updateById(userInfo); // smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(); } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserMerchantCouponServiceImpl.java
@@ -26,6 +26,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; @@ -52,27 +53,24 @@ @Autowired private IUserMerchantCouponService userMerchantCouponService; @Autowired private IMerchantCouponService merchantCouponService; @Autowired private IMerchantService merchantService; @Autowired private IUserInfoService userInfoService; @Autowired private RedisTemplate redisTemplate; @Resource private RedisTemplate<String, Object> redisTemplate; @Override public ResultUtil<UserMerchantCouponWapper> getUserMerchantCoupon(Integer uid, String code) throws Exception { Merchant merchant = merchantService.selectOne(new EntityWrapper<Merchant>().eq("userType", 1).eq("userId", uid).ne("state", 3)); if(merchant.getAuditStatus() == 1){ if (merchant.getAuditStatus() == 1) { return ResultUtil.error("账户正在审核中"); } if(merchant.getAuditStatus() == 3){ UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
@@ -1,5 +1,8 @@ package com.stylefeng.guns.modular.system.util; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.stylefeng.guns.core.util.ToolUtil; @@ -11,14 +14,10 @@ import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; @@ -29,178 +28,177 @@ */ @Component public class PushUtil { @Autowired private RestTemplate internalRestTemplate; @Autowired private RedisTemplate redisTemplate; @Autowired private IOrderTaxiService orderTaxiService; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; @Autowired private IOrderPrivateCarService orderPrivateCarService; @Autowired private IOrderCrossCityService orderCrossCityService; private Map<String, Timer> taskMap = new HashMap<>();//存储定时推送的定时器 /** * 推送订单状态 * @param type 1=用户,2=司机 * @param uid 对象id * @param orderId 订单id * @param orderType 订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车) * @param state 订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付) */ public void pushOrderState(Integer type, Integer uid, Integer orderId, Integer orderType, Integer state, Integer time){ JSONObject jsonObject = new JSONObject(); jsonObject.put("code", 200); jsonObject.put("msg", "SUCCESS"); jsonObject.put("method", "ORDER_STATUS"); Map<String, Object> map = new HashMap<>(); map.put("orderId", orderId); map.put("orderType", orderType); map.put("time", time); if(orderType==1 && state==100){ map.put("carpooling", 1); map.put("state", 2); }else{ map.put("state", state); } jsonObject.put("data", map); //调用推送 HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("msg", jsonObject.toJSONString()); params.add("id", String.valueOf(uid)); params.add("type", String.valueOf(type)); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ System.err.println(jsonObject1.getString("msg")); } } /** * 推单完成后,没有司机接单的推送提醒 * @param type * @param uid * @param orderId * @param orderType */ public void pushEndPush(Integer type, Integer uid, Integer orderId, Integer orderType){ JSONObject jsonObject = new JSONObject(); jsonObject.put("code", 200); jsonObject.put("msg", "SUCCESS"); jsonObject.put("method", "END_PUSH"); Map<String, Object> map = new HashMap<>(); map.put("orderId", orderId); map.put("orderType", orderType); jsonObject.put("data", map); //调用推送 HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("msg", jsonObject.toJSONString()); params.add("id", String.valueOf(uid)); params.add("type", String.valueOf(type)); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ System.err.println(jsonObject1.getString("msg")); } } /** * 推送司机位置给乘客端 */ public void pushDriverPosition(Integer orderId, Integer orderType){ Integer userId = null; switch (orderType){ case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); userId = orderPrivateCar.getUserId(); break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(orderId); userId = orderTaxi.getUserId(); break; case 3: OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId); userId = orderCrossCity.getUserId(); break; } JSONObject data = new JSONObject(); data.put("id", userId); data.put("type", 1); String str = (String) redisTemplate.opsForValue().get(orderId + "_" + orderType); if(ToolUtil.isEmpty(str)){ redisTemplate.opsForValue().set(orderId + "_" + orderType, data.toJSONString()); createTask(orderId, orderType); } } /** * 创建定时任务 * @param orderId */ public void createTask(Integer orderId, Integer orderType){ TimerTask task = new TimerTask() { @Override public void run() { try { PushUtil.this.pushPositon(orderId, orderType); } catch (Exception e) { e.printStackTrace(); } } }; Timer timer = new Timer(); timer.schedule(task, 1000, 10000);//1秒后开始10秒钟一次的重复执行 taskMap.put(orderId + "_" + orderType, timer); } /** * 推送处理方法 * @param orderId * @param orderType * @throws Exception */ public void pushPositon(Integer orderId, Integer orderType) throws Exception{ Integer driverId = null; String startLonLat = null; String endLonLat = null; Integer state = 0; Integer oldState = 0; Long startServiceTime = null; Double servedMileage = null; switch (orderType){ case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); private final String socket_uri = "http://172.21.35.142:6000"; @Autowired private IOrderTaxiService orderTaxiService; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; @Autowired private IOrderPrivateCarService orderPrivateCarService; @Autowired private IOrderCrossCityService orderCrossCityService; private Map<String, Timer> taskMap = new HashMap<>();//存储定时推送的定时器 @Resource private RedisTemplate<String, Object> redisTemplate; /** * 推送订单状态 * * @param type 1=用户,2=司机 * @param uid 对象id * @param orderId 订单id * @param orderType 订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车) * @param state 订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付) */ public void pushOrderState(Integer type, Integer uid, Integer orderId, Integer orderType, Integer state, Integer time) { JSONObject jsonObject = new JSONObject(); jsonObject.put("code", 200); jsonObject.put("msg", "SUCCESS"); jsonObject.put("method", "ORDER_STATUS"); Map<String, Object> map = new HashMap<>(); map.put("orderId", orderId); map.put("orderType", orderType); map.put("time", time); if (orderType == 1 && state == 100) { map.put("carpooling", 1); map.put("state", 2); } else { map.put("state", state); } jsonObject.put("data", map); //调用推送 HttpRequest post = HttpUtil.createPost(socket_uri + "/netty/sendMsgToClient"); post.header("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE); //将请求头部和参数合成一个请求 Map<String, Object> params = new HashMap<>(); params.put("msg", jsonObject.toJSONString()); params.put("id", uid); params.put("type", type); post.form(params); HttpResponse execute = post.execute(); if (200 != execute.getStatus()) { System.err.println("推送异常"); } else { JSONObject jsonObject1 = JSON.parseObject(execute.body(), JSONObject.class); if (jsonObject1.getIntValue("code") != 200) { System.err.println(jsonObject1.getString("msg")); } } } /** * 推单完成后,没有司机接单的推送提醒 * * @param type * @param uid * @param orderId * @param orderType */ public void pushEndPush(Integer type, Integer uid, Integer orderId, Integer orderType) { JSONObject jsonObject = new JSONObject(); jsonObject.put("code", 200); jsonObject.put("msg", "SUCCESS"); jsonObject.put("method", "END_PUSH"); Map<String, Object> map = new HashMap<>(); map.put("orderId", orderId); map.put("orderType", orderType); jsonObject.put("data", map); //调用推送 HttpRequest post = HttpUtil.createPost(socket_uri + "/netty/sendMsgToClient"); post.header("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE); //将请求头部和参数合成一个请求 Map<String, Object> params = new HashMap<>(); params.put("msg", jsonObject.toJSONString()); params.put("id", uid); params.put("type", type); post.form(params); HttpResponse execute = post.execute(); if (200 != execute.getStatus()) { System.err.println("推送异常"); } else { JSONObject jsonObject1 = JSON.parseObject(execute.body(), JSONObject.class); if (jsonObject1.getIntValue("code") != 200) { System.err.println(jsonObject1.getString("msg")); } } } /** * 推送司机位置给乘客端 */ public void pushDriverPosition(Integer orderId, Integer orderType) { Integer userId = null; switch (orderType) { case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); userId = orderPrivateCar.getUserId(); break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(orderId); userId = orderTaxi.getUserId(); break; case 3: OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId); userId = orderCrossCity.getUserId(); break; } JSONObject data = new JSONObject(); data.put("id", userId); data.put("type", 1); String str = (String) redisTemplate.opsForValue().get(orderId + "_" + orderType); if (ToolUtil.isEmpty(str)) { redisTemplate.opsForValue().set(orderId + "_" + orderType, data.toJSONString()); createTask(orderId, orderType); } } /** * 创建定时任务 * * @param orderId */ public void createTask(Integer orderId, Integer orderType) { TimerTask task = new TimerTask() { @Override public void run() { try { PushUtil.this.pushPositon(orderId, orderType); } catch (Exception e) { e.printStackTrace(); } } }; Timer timer = new Timer(); timer.schedule(task, 1000, 10000);//1秒后开始10秒钟一次的重复执行 taskMap.put(orderId + "_" + orderType, timer); } /** * 推送处理方法 * * @param orderId * @param orderType * @throws Exception */ public void pushPositon(Integer orderId, Integer orderType) throws Exception { Integer driverId = null; String startLonLat = null; String endLonLat = null; Integer state = 0; Integer oldState = 0; Long startServiceTime = null; Double servedMileage = null; switch (orderType) { case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId); if(null == orderPrivateCar){ return; } @@ -235,172 +233,183 @@ state = orderCrossCity.getState(); oldState = orderCrossCity.getOldState(); startServiceTime = null != orderCrossCity.getStartServiceTime() ? orderCrossCity.getStartServiceTime().getTime() : null; servedMileage = orderCrossCity.getMileage(); endLonLat = orderCrossCity.getEndLon() + "," + orderCrossCity.getEndLat(); break; } if(state == 7 || state == 8 || state == 9 || state == 10 || state == 12){//删除定时任务 this.removeTask(orderId, orderType); return; } //计算预计距离和剩余时间 String value = (String) redisTemplate.opsForValue().get("DRIVER" + String.valueOf(driverId)); if(null == value || "".equals(value)){ return; } JSONObject msg = new JSONObject(); msg.put("code", 200); msg.put("msg", "SUCCESS"); msg.put("method", "DRIVER_POSITION"); Map<String, String> map = new HashMap<>(); map.put("orderId", String.valueOf(orderId)); map.put("orderType", String.valueOf(orderType)); map.put("lon", (null != value ? value.split(",")[0] : "")); map.put("lat", (null != value ? value.split(",")[1] : "")); if((state == 2 || state == 3 || state == 4) || (oldState != null && (oldState == 2 || oldState == 3 || oldState == 4))){//前往预约地 // TODO: 2023/11/4 无法修改 Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, startLonLat, 1); String d = "0"; String t = "0"; if(null == distance){ System.err.println("查询距离出错了"); }else{ d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString(); t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + ""; } map.put("reservationMileage", d);//当前位置距离预约点的剩余里程 map.put("reservationTime", t);//当前位置距离预约点的剩余分钟 map.put("servedMileage", "0");//距离起点已经服务的里程 map.put("servedTime", "0");//距离起点已经服务的时间 map.put("laveMileage", "0");//距离终点剩余未服务的里程数 map.put("laveTime", "0");//距离终端剩余未服务的预计时间 } if((state == 5 || state == 6) || (oldState != null && (oldState == 5 || oldState == 6))){//服务中 map.put("reservationMileage", "0");//当前位置距离预约点的剩余里程 map.put("reservationTime", "0");//当前位置距离预约点的剩余分钟 map.put("servedMileage", String.valueOf(servedMileage / 1000));//距离起点已经服务的里程 Integer servedTime = Long.valueOf((new Date().getTime() - startServiceTime) / 60000).intValue(); map.put("servedTime", servedTime + "");//距离起点已经服务的时间 // TODO: 2023/11/4 无法修改 Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, endLonLat, 1); String d = "0"; String t = "0"; if(null == distance){ System.err.println("查询距离出错了"); }else{ d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString(); t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + ""; } map.put("laveMileage", d);//距离终点剩余未服务的里程数 map.put("laveTime", t);//距离终端剩余未服务的预计时间 } msg.put("data", map); //调用推送 HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 String value1 = (String) redisTemplate.opsForValue().get(orderId + "_" + orderType); if(ToolUtil.isEmpty(value1)){ this.removeTask(orderId, orderType); return; } JSONObject jsonObject = JSON.parseObject(value1); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("msg", msg.toJSONString()); params.add("id", jsonObject.getString("id")); params.add("type", jsonObject.getString("type")); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ System.err.println(jsonObject1.getString("msg")); } } /** * 推送强迫下线 * @param id * @param type */ public void pushOffline(Integer id, Integer type){ JSONObject msg = new JSONObject(); msg.put("code", 200); msg.put("msg", "SUCCESS"); msg.put("method", "OFFLINE"); msg.put("data", new Object()); //调用推送 HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("msg", msg.toJSONString()); params.add("id", id.toString()); params.add("type", type.toString()); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ System.err.println(jsonObject1.getString("msg")); } } /** * 摆渡抢单成功后推单 * @param type * @param uid * @param orderId * @param orderType * @param state */ public void pushFerryOrderState(Integer type, Integer uid, Integer orderId, Integer orderType, Integer state){ JSONObject jsonObject = new JSONObject(); jsonObject.put("code", 200); jsonObject.put("msg", "SUCCESS"); jsonObject.put("method", "FERRY"); Map<String, Object> map = new HashMap<>(); map.put("orderId", orderId); map.put("orderType", orderType); map.put("state", state); jsonObject.put("data", map); //调用推送 HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("msg", jsonObject.toJSONString()); params.add("id", String.valueOf(uid)); params.add("type", String.valueOf(type)); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ System.err.println(jsonObject1.getString("msg")); } } /** * 删除定时任务 * @param orderId */ public void removeTask(Integer orderId, Integer orderType){ Timer timer = taskMap.get(orderId + "_" + orderType); if (null != timer){ timer.cancel(); taskMap.remove(orderId + "_" + orderType); redisTemplate.delete(orderId + "_" + orderType); } } servedMileage = orderCrossCity.getMileage(); endLonLat = orderCrossCity.getEndLon() + "," + orderCrossCity.getEndLat(); break; } if (state == 7 || state == 8 || state == 9 || state == 10 || state == 12) {//删除定时任务 this.removeTask(orderId, orderType); return; } //计算预计距离和剩余时间 String value = (String) redisTemplate.opsForValue().get("DRIVER" + String.valueOf(driverId)); if (null == value || "".equals(value)) { return; } JSONObject msg = new JSONObject(); msg.put("code", 200); msg.put("msg", "SUCCESS"); msg.put("method", "DRIVER_POSITION"); Map<String, String> map = new HashMap<>(); map.put("orderId", String.valueOf(orderId)); map.put("orderType", String.valueOf(orderType)); map.put("lon", (null != value ? value.split(",")[0] : "")); map.put("lat", (null != value ? value.split(",")[1] : "")); if ((state == 2 || state == 3 || state == 4) || (oldState != null && (oldState == 2 || oldState == 3 || oldState == 4))) {//前往预约地 // TODO: 2023/11/4 无法修改 Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, startLonLat, 1); String d = "0"; String t = "0"; if (null == distance) { System.err.println("查询距离出错了"); } else { d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString(); t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + ""; } map.put("reservationMileage", d);//当前位置距离预约点的剩余里程 map.put("reservationTime", t);//当前位置距离预约点的剩余分钟 map.put("servedMileage", "0");//距离起点已经服务的里程 map.put("servedTime", "0");//距离起点已经服务的时间 map.put("laveMileage", "0");//距离终点剩余未服务的里程数 map.put("laveTime", "0");//距离终端剩余未服务的预计时间 } if ((state == 5 || state == 6) || (oldState != null && (oldState == 5 || oldState == 6))) {//服务中 map.put("reservationMileage", "0");//当前位置距离预约点的剩余里程 map.put("reservationTime", "0");//当前位置距离预约点的剩余分钟 map.put("servedMileage", String.valueOf(servedMileage / 1000));//距离起点已经服务的里程 Integer servedTime = Long.valueOf((new Date().getTime() - startServiceTime) / 60000).intValue(); map.put("servedTime", servedTime + "");//距离起点已经服务的时间 // TODO: 2023/11/4 无法修改 Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, endLonLat, 1); String d = "0"; String t = "0"; if (null == distance) { System.err.println("查询距离出错了"); } else { d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString(); t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + ""; } map.put("laveMileage", d);//距离终点剩余未服务的里程数 map.put("laveTime", t);//距离终端剩余未服务的预计时间 } msg.put("data", map); //将请求头部和参数合成一个请求 String value1 = (String) redisTemplate.opsForValue().get(orderId + "_" + orderType); if (ToolUtil.isEmpty(value1)) { this.removeTask(orderId, orderType); return; } JSONObject jsonObject = JSON.parseObject(value1); //调用推送 HttpRequest post = HttpUtil.createPost(socket_uri + "/netty/sendMsgToClient"); post.header("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE); //将请求头部和参数合成一个请求 Map<String, Object> params = new HashMap<>(); params.put("msg", msg.toJSONString()); params.put("id", jsonObject.getIntValue("id")); params.put("type", jsonObject.getIntValue("type")); post.form(params); HttpResponse execute = post.execute(); if (200 != execute.getStatus()) { System.err.println("推送异常"); } else { JSONObject jsonObject1 = JSON.parseObject(execute.body(), JSONObject.class); if (jsonObject1.getIntValue("code") != 200) { System.err.println(jsonObject1.getString("msg")); } } } /** * 删除定时任务 * * @param orderId */ public void removeTask(Integer orderId, Integer orderType) { Timer timer = taskMap.get(orderId + "_" + orderType); if (null != timer) { timer.cancel(); taskMap.remove(orderId + "_" + orderType); redisTemplate.delete(orderId + "_" + orderType); } } /** * 推送强迫下线 * * @param id * @param type */ public void pushOffline(Integer id, Integer type) { JSONObject msg = new JSONObject(); msg.put("code", 200); msg.put("msg", "SUCCESS"); msg.put("method", "OFFLINE"); msg.put("data", new Object()); //调用推送 HttpRequest post = HttpUtil.createPost(socket_uri + "/netty/sendMsgToClient"); post.header("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE); //将请求头部和参数合成一个请求 Map<String, Object> params = new HashMap<>(); params.put("msg", msg.toJSONString()); params.put("id", id); params.put("type", type); post.form(params); HttpResponse execute = post.execute(); if (200 != execute.getStatus()) { System.err.println("推送异常"); } else { JSONObject jsonObject1 = JSON.parseObject(execute.body(), JSONObject.class); if (jsonObject1.getIntValue("code") != 200) { System.err.println(jsonObject1.getString("msg")); } } } /** * 摆渡抢单成功后推单 * * @param type * @param uid * @param orderId * @param orderType * @param state */ public void pushFerryOrderState(Integer type, Integer uid, Integer orderId, Integer orderType, Integer state) { JSONObject jsonObject = new JSONObject(); jsonObject.put("code", 200); jsonObject.put("msg", "SUCCESS"); jsonObject.put("method", "FERRY"); Map<String, Object> map = new HashMap<>(); map.put("orderId", orderId); map.put("orderType", orderType); map.put("state", state); jsonObject.put("data", map); //调用推送 HttpRequest post = HttpUtil.createPost(socket_uri + "/netty/sendMsgToClient"); post.header("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE); //将请求头部和参数合成一个请求 Map<String, Object> params = new HashMap<>(); params.put("msg", jsonObject.toJSONString()); params.put("id", uid); params.put("type", type); post.form(params); HttpResponse execute = post.execute(); if (200 != execute.getStatus()) { System.err.println("推送异常"); } else { JSONObject jsonObject1 = JSON.parseObject(execute.body(), JSONObject.class); if (jsonObject1.getIntValue("code") != 200) { System.err.println(jsonObject1.getString("msg")); } } } } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EmployeeUtil.java
@@ -193,13 +193,13 @@ String retCode = jsonObject.getString("retCode"); if (!"0".equals(retCode)) { log.error("【根据员工ID获取人员信息】请求失败:" + result); throw new RuntimeException("【根据员工ID获取人员信息】请求失败:" + result); return null; } JSONObject object = jsonObject.getJSONObject("object"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【根据员工ID获取人员信息】失败:" + object.toJSONString()); throw new RuntimeException("【根据员工ID获取人员信息】失败:" + object.toJSONString()); return null; } StaffNodeInfo staffNodeInfo = object.getObject("data", StaffNodeInfo.class); return staffNodeInfo; UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EnterpriseUtil.java
@@ -58,13 +58,13 @@ String retCode = jsonObject.getString("retCode"); if (!"0".equals(retCode)) { log.error("【根据社会信用代码判断企业是否已存在】请求失败:" + result); throw new RuntimeException("【根据社会信用代码判断企业是否已存在】请求失败:" + result); return null; } JSONObject object = jsonObject.getJSONObject("object"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【根据社会信用代码判断企业是否已存在】失败:" + object.toJSONString()); throw new RuntimeException("【根据社会信用代码判断企业是否已存在】失败:" + object.toJSONString()); return null; } return jsonObject.getObject("object", CheckEnterExist.class); } @@ -104,13 +104,13 @@ String retCode = jsonObject.getString("retCode"); if (!"0".equals(retCode)) { log.error("【根据企业名称判断企业是否已存在】请求失败:" + result); throw new RuntimeException("【根据企业名称判断企业是否已存在】请求失败:" + result); return null; } JSONObject object = jsonObject.getJSONObject("object"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【根据企业名称判断企业是否已存在】失败:" + object.toJSONString()); throw new RuntimeException("【根据企业名称判断企业是否已存在】失败:" + object.toJSONString()); return null; } return jsonObject.getObject("object", CheckEnterExist.class); } @@ -150,13 +150,13 @@ String retCode = jsonObject.getString("retCode"); if (!"0".equals(retCode)) { log.error("【查询企业详情】请求失败:" + result); throw new RuntimeException("【查询企业详情】请求失败:" + result); return null; } JSONObject object = jsonObject.getJSONObject("object"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【查询企业详情】失败:" + object.toJSONString()); throw new RuntimeException("【查询企业详情】失败:" + object.toJSONString()); return null; } EnterpriseInfo enterpriseInfo = jsonObject.getObject("object", EnterpriseInfo.class); return enterpriseInfo; @@ -197,7 +197,7 @@ String status = jsonObject.getString("status"); if (!"0".equals(status)) { log.error("【修改企业基本信息】请求失败:" + result); return false; throw new RuntimeException("【修改企业基本信息】请求失败:" + result); } return true; } @@ -216,7 +216,6 @@ String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey String content = "";//业务参数 Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> map = new HashMap<String, Object>(); @@ -239,14 +238,62 @@ String retCode = jsonObject.getString("retCode"); if (!"0".equals(retCode)) { log.error("【创建企业】请求失败:" + result); return null; throw new RuntimeException("【创建企业】请求失败:" + result); } JSONObject object = jsonObject.getJSONObject("object"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【创建企业】请求失败:" + result); return null; log.error("【创建企业】请求失败:" + object.toJSONString()); throw new RuntimeException("【创建企业】请求失败:" + object.toJSONString()); } return object.getObject("data", CreateEnterprise.class); } /** * 删除企业信息 * * @param enterNum 企业编号 * @param operator 管理员手机号码 * @return */ public static boolean delEnterprise(String enterNum, String operator) { //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/delCompany"; //私钥文件 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> map = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUID.randomUUID().toString().replaceAll("-", ""); map.put(SystemParameterNames.getAppKey(), appKey); map.put(SystemParameterNames.getMessage_id(), messageId); map.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); map.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); map.put("content", "{\"enterNum\":\"" + enterNum + "\",\"operator\":\"" + operator + "\"}"); log.info("【删除企业信息】请求地址:" + url); log.info("【删除企业信息】请求参数:" + JSON.toJSONString(map)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, map); 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"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【删除企业信息】请求失败:" + object.toJSONString()); throw new RuntimeException("【删除企业信息】请求失败:" + object.toJSONString()); } return true; } } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongProperties.java
@@ -2,10 +2,23 @@ /** * 黔云通配置 * * @author zhibing.pu * @Date 2025/6/6 15:03 */ public interface QianYunTongProperties { /** * 小程序appId */ String appId = "wxcc3c9058e2b294db"; /** * */ String encryptedData = "645HaSm7meo0GLKQZZvagq3JkWZXYlOfvhf8YKqNjWklpzx3IjM2S/wkmlUOz/iPvDVYRgBD2+V1WCHT6fMbOjJnR/0W9bwVGOSSaoyYpZdPR5x8f/6OR1B3e3qfJWFKJf0Za4n9JJTwStCTuMHWRIE0IgYtj3zSb2WI1AzDyLeR7MMgW0q+red2ujtrKGR4pe0NoXB2qZKHj4whBuGUiw=="; /** * */ String iv = "Zz2ZL9Yu43pp38p5CcocJA=="; /** * appkey */ @@ -13,7 +26,7 @@ /** * 私钥地址 */ String privateKeyPath = "E:\\IDEA Workspace\\QianYunTong\\private_key_test.pem"; String privateKeyPath = "/root/server/app/key/private_key_test.pem"; /** * 消费者账号 */ @@ -28,4 +41,20 @@ * API地址 */ String apiUrl = "https://test-zhongtai.stqcloud.com:10070"; /** * HOS的基础路径(公共前缀) */ String endPoint = "119.4.112.68:27741"; /** * 账户的ID */ String account = "d8bef0a04db511f0b79d01a3e2b7587e"; /** * 向UAAS服务请求到的access_key */ String accessKey = "TYMFTFD5SIIT15DCCUD7"; /** * 向UAAS服务请求到的secret_key */ String secretKey = "AoI1dkH3yoAvXoaQlREO3ed9mwQJFluLTliS9T1z"; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java
@@ -29,12 +29,11 @@ /** * 根据手机号码获取人员信息 * * @param mobile 手机号码 * @param enterNum 企业编号 * @param mobile 手机号码 */ public static List<QYTUserInfo> getUserInfoByPhone(String mobile, String enterNum) { public static List<QYTUserInfo> getUserInfoByPhone(String mobile) { //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/getUserInfoByPhone"; String url = QianYunTongProperties.apiUrl + "/openapi/rest/2.0/queryUserinfoByMobilev2"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 @@ -51,27 +50,26 @@ contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", "{\"mobile\":\"" + mobile + "\",\"enterNum\":\"" + enterNum + "\"}"); log.info("【根据手机号和企业编号查询用户信息】请求地址:" + url); log.info("【根据手机号和企业编号查询用户信息】请求参数:" + JSON.toJSONString(contentMap)); contentMap.put("content", "{\"list\":[{\"mobile\":\"" + mobile + "\"}]}"); log.info("【根据手机号码获取人员信息】请求地址:" + url); log.info("【根据手机号码获取人员信息】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "GET", skprivateKeyFile, timeStamp, contentMap); log.info("【根据手机号和企业编号查询用户信息】请求结果:" + result); log.info("【根据手机号码获取人员信息】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String retCode = jsonObject.getString("retCode"); if (!"0".equals(retCode)) { log.error("【根据手机号和企业编号查询用户信息】请求失败:" + result); throw new RuntimeException("【根据手机号和企业编号查询用户信息】请求失败:" + result); log.error("【根据手机号码获取人员信息】请求失败:" + result); return null; } JSONObject object = jsonObject.getJSONObject("object"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【根据手机号和企业编号查询用户信息】失败:" + object.toJSONString()); throw new RuntimeException("【根据手机号和企业编号查询用户信息】失败:" + object.toJSONString()); log.error("【根据手机号码获取人员信息】失败:" + object.toJSONString()); return null; } JSONArray data = object.getJSONArray("data"); JSONArray data = object.getJSONObject("data").getJSONArray("list"); List<QYTUserInfo> list = new ArrayList<>(); for (int i = 0; i < data.size(); i++) { data.getJSONObject(i).getString("enter_code"); QYTUserInfo userInfo = data.getObject(i, QYTUserInfo.class); list.add(userInfo); } @@ -237,7 +235,9 @@ body.put("type", "loginWeChatXiao"); body.put("action", "request"); body.put("code", code); body.put("appId", ""); body.put("appId", QianYunTongProperties.appId); body.put("encryptedData", QianYunTongProperties.encryptedData); body.put("iv", QianYunTongProperties.iv); post.body(body.toJSONString()); HttpResponse execute = post.execute(); if (200 != execute.getStatus()) { UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTUserInfo.java
@@ -10,35 +10,24 @@ @Data public class QYTUserInfo { /** * 员工名称 */ private String empName; /** * 企业编号 */ private String enterNum; /** * 节点路径 */ private String nodePath; /** * 员工昵称 */ private String nickName; /** * 员工编号 */ private String empId; /** * 手机号码 */ private String mphone; private String mobile; /** * 员工在企业内部的编号 * 用户昵称 */ private String loginNo; private String nickname; /** * 部门ID * 小头像url */ private String deptId; private String photoUrl; /** * 大头像url */ private String photoUrlBig; /** * 企业名称 */ private String enterName; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -108,28 +108,28 @@ @Autowired private IUserRedPacketRecordService userRedPacketRecordService; @Autowired private GDMapGeocodingUtil gdMapGeocodingUtil; @Autowired private ICompanyCityService companyCityService; @Autowired private PushUtil pushUtil; @Autowired private RedisTemplate redisTemplate; @Resource private RedisTemplate<String, Object> redisTemplate; @Autowired private RestTemplate internalRestTemplate; @Autowired private IUserActivityRedenvelopeService userActivityRedenvelopeService; @Autowired private IDriverOrdersService driverOrdersService; @Autowired private IIncomeService incomeService; @@ -2085,66 +2085,49 @@ orderIds.add(orderTaxi.getId());//添加记录,防止调用接口重复提醒无人接单 String vehicle = (String) redisTemplate.opsForValue().get("VEHICLE"); List<Integer> integers = new ArrayList<>(); if(ToolUtil.isNotEmpty(vehicle)){ if (ToolUtil.isNotEmpty(vehicle)) { integers = JSON.parseArray(vehicle).toJavaList(Integer.class); } Company query = companyCityService.query(String.valueOf(orderTaxi.getStartLon()), String.valueOf(orderTaxi.getStartLat()));//获取起点所属分公司 List<PushOrder> querys = pushOrderService.querys(null, 2, query.getId());//获取需要推送的次数 boolean b = false; for(int i = 1; i <= querys.size(); i++){ if(b){ for (int i = 1; i <= querys.size(); i++) { if (b) { break; } PushOrder pushOrder = pushOrderService.querys(i, 2, query.getId()).get(0); System.out.println("pushOrder:"+pushOrder); int i2 = pushOrder.getPushTime() / 10; if(i2==0){ i2=1; System.out.println("pushOrder:" + pushOrder); //获取空闲司机 List<Driver> list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机 if (list.size() > 0) { double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数 int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取) lastIndex = lastIndex == 0 ? list.size() : lastIndex; list = list.subList(0, lastIndex);//获取空闲司机中占比数据 for (Driver driver : list) {//开始进行推送 //查询是否在限制推单范围内 boolean bo = false; for (Integer integer : integers) { if (integer.compareTo(driver.getId()) == 0) { bo = true; break; } } if (bo) { continue; } pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime()); } } System.out.println(i2); for (int i1 = 0; i1 < i2 ; i1++) { Integer state = 0; //批量订单 if(type == 3){ OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderTaxi.getId()); if(null == orderPrivateCar || orderPrivateCar.getState() != 1){ b = true; break; } }else{ state = orderTaxiMapper.selectById(orderTaxi.getId()).getState(); if(state != 1){ b = true; break; } } //获取空闲司机 List<Driver> list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机 if(list.size() > 0){ double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数 int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取) lastIndex = lastIndex == 0 ? list.size() : lastIndex; list = list.subList(0, lastIndex);//获取空闲司机中占比数据 for(Driver driver : list){//开始进行推送 //查询是否在限制推单范围内 boolean bo = false; for(Integer integer : integers){ if(integer.compareTo(driver.getId()) == 0){ bo = true; break; } } if(bo){ continue; } pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime()); } } Thread.sleep( 10000);//设置等待时间 if(i == querys.size() && state == 1){ pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2); orderIds.remove(orderTaxi.getId()); } Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间 OrderTaxi orderTaxi1 = OrderTaxiServiceImpl.this.selectById(orderTaxi.getId()); Integer state = orderTaxi1.getState(); if (state != 1) { break; } if (i == querys.size() && state == 1) { pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2); orderIds.remove(orderTaxi.getId()); } } } catch (Exception e) { UserQYTTravel/guns-admin/src/main/resources/application.yml
@@ -15,7 +15,7 @@ name: user-server profiles: # active: dev active: local active: prod mvc: static-path-pattern: /static/** view: @@ -30,9 +30,13 @@ max-request-size: 100MB max-file-size: 100MB redis: url: 127.0.0.1 port: 6379 password: 123456 host: 172.21.35.151 port: 6512 password: SC_cache@20#25 database: 0 timeout: 1000 cluster: nodes: 172.21.35.151:6512,172.21.35.152:6512,172.21.35.153:6512,172.21.35.151:6513,172.21.35.152:6513,172.21.35.153:6513 mybatis-plus: typeAliasesPackage: com.stylefeng.guns.modular @@ -57,13 +61,20 @@ spring: profiles: local datasource: url: jdbc:mysql://127.0.0.1:3306/qyttravel?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8 username: root password: 123456 db-name: jyxtravel #用来搜集数据库的所有表 url: jdbc:mysql://172.21.35.140:8066/traffic_scdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai username: traffic_scusr password: QYT_sc@20#25 db-name: traffic_scdb #用来搜集数据库的所有表 filters: wall,mergeStat --- spring: data: mongodb: uri: mongodb://qyt_jtcx:qyt_jtcx2025@172.21.35.195:27017,172.21.35.196:27017/traveling_track --- @@ -94,11 +105,9 @@ --- filePath: C:/orderPostionFile/ #存储订单轨迹文件路径 #支付回调地址 #正式环境 callbackPath: https://zhentonggongsi.com:443/user callbackPath: https://traffic.qytzt.cn/user --- UserQYTTravel/guns-admin/src/main/resources/logback-spring.xml
File was deleted UserQYTTravel/guns-admin/src/main/resources/logback.xml
New file @@ -0,0 +1,222 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true --> <!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <configuration scan="true" scanPeriod="10 seconds"> <contextName>logback</contextName> <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 --> <property name="log.path" value="/data/app/logs/user"/> <!--0. 日志格式和颜色渲染 --> <!-- 彩色日志依赖的渲染类 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> <!-- 彩色日志格式 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!--1. 输出到控制台--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> <encoder> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!--2. 输出到文档--> <!-- 2.1 level为 DEBUG 日志,时间滚动输出 --> <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${log.path}/debug.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志归档 --> <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录debug级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.2 level为 INFO 日志,时间滚动输出 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${log.path}/info.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志归档路径以及格式 --> <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.3 level为 WARN 日志,时间滚动输出 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${log.path}/warn.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.4 level为 ERROR 日志,时间滚动输出 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${log.path}/error.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.5 所有 除了DEBUG级别的其它高于DEBUG的 日志,记录到一个文件 --> <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${log.path}/all.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/all-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档记录除了DEBUG级别的其它高于DEBUG的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> </appender> <!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。 addtivity:是否向上级logger传递打印信息。默认是true。 <logger name="org.springframework.web" level="info"/> <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> --> <!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 不能设置为INHERITED或者同义词NULL。默认是DEBUG 可以包含零个或多个元素,标识这个appender将会添加到这个logger。 --> <!-- 4 最终的策略: 基本策略(root级) + 根据profile在启动时, logger标签中定制化package日志级别(优先级高于上面的root级)--> <springProfile name="dev"> <root level="info"> <appender-ref ref="CONSOLE" /> <appender-ref ref="DEBUG_FILE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="WARN_FILE" /> <appender-ref ref="ERROR_FILE" /> <appender-ref ref="ALL_FILE" /> </root> <logger name="com.stylefeng.guns.modular.system.dao" level="debug"/> </springProfile> <springProfile name="test"> <root level="info"> <appender-ref ref="CONSOLE" /> <appender-ref ref="DEBUG_FILE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="WARN_FILE" /> <appender-ref ref="ERROR_FILE" /> <appender-ref ref="ALL_FILE" /> </root> </springProfile> <springProfile name="prod"> <root level="info"> <!-- 生产环境最好不配置console写文件 --> <appender-ref ref="DEBUG_FILE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="WARN_FILE" /> <appender-ref ref="ERROR_FILE" /> <appender-ref ref="ALL_FILE" /> </root> </springProfile> </configuration> UserQYTTravel/guns-admin/src/main/resources/redis.properties
File was deleted ZuulQYTTravel/pom.xml
@@ -14,7 +14,7 @@ <name>zuul</name> <description>Zuul project for Spring Boot</description> <packaging>war</packaging> <packaging>jar</packaging> <properties> <java.version>1.8</java.version> @@ -36,32 +36,6 @@ <groupId>com.spring4all</groupId> <artifactId>swagger-spring-boot-starter</artifactId> <version>1.7.0.RELEASE</version> </dependency> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!--<dependency>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-tomcat</artifactId>--> <!--<scope>provided</scope>--> <!--</dependency>--> <!--<dependency>--> <!--<groupId>javax.servlet</groupId>--> <!--<artifactId>javax.servlet-api</artifactId>--> <!--<version>3.1.0</version>--> <!--<scope>provided</scope>--> <!--</dependency>--> <!-- netty --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.27.Final</version> </dependency> <dependency> <groupId>com.alibaba</groupId> ZuulQYTTravel/src/main/java/com/sinata/zuul/ZuulApplication.java
@@ -1,7 +1,5 @@ package com.sinata.zuul; import com.sinata.zuul.util.applets.NettyServer0; import com.sinata.zuul.util.echo.NettyServer; import com.spring4all.swagger.EnableSwagger2Doc; import org.apache.http.client.HttpClient; import org.apache.http.config.SocketConfig; @@ -20,9 +18,6 @@ import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import springfox.documentation.swagger.web.SwaggerResource; import springfox.documentation.swagger.web.SwaggerResourcesProvider; @@ -39,10 +34,6 @@ public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); // NettyServer nettyServer = new NettyServer(); // nettyServer.bind(); // NettyServer0 nettyServer0 = new NettyServer0(); // nettyServer0.bind(); } @@ -62,31 +53,8 @@ restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); return restTemplate; } // /** // * 向Spring容器中定义RestTemplate对象 // * @return // */ // @Bean //必须new 一个RestTemplate并放入spring容器当中,否则启动时报错 // public RestTemplate restTemplate() { // PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); // connectionManager.setDefaultSocketConfig(SocketConfig.custom().setTcpNoDelay(true).build()); // connectionManager.setDefaultMaxPerRoute(100);//最大并发连接 // connectionManager.setMaxTotal(200); // 总的最大连接数 // HttpClient httpClient = HttpClientBuilder.create().setConnectionManager(connectionManager).build(); // HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); // httpRequestFactory.setConnectionRequestTimeout(30 * 1000); // httpRequestFactory.setConnectTimeout(30 * 3000); // httpRequestFactory.setReadTimeout(30 * 3000); // RestTemplate restTemplate = new RestTemplate(httpRequestFactory); // restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); // return restTemplate; // } /** * 配置Swagger */ ZuulQYTTravel/src/main/java/com/sinata/zuul/config/RedisConfig.java
File was deleted ZuulQYTTravel/src/main/java/com/sinata/zuul/controller/RedisController.java
File was deleted ZuulQYTTravel/src/main/java/com/sinata/zuul/util/GDMapGeocodingUtil.java
File was deleted ZuulQYTTravel/src/main/java/com/sinata/zuul/util/RedisUtil.java
File was deleted ZuulQYTTravel/src/main/java/com/sinata/zuul/util/applets/NettyWebSocketController.java
File was deleted ZuulQYTTravel/src/main/resources/redis.properties
File was deleted