| | |
| | | import com.doumee.core.constants.ResponseStatus; |
| | | import com.doumee.core.dingding.DingDingNotice; |
| | | import com.doumee.core.exception.BusinessException; |
| | | import com.doumee.core.track.RideActiveCache; |
| | | import com.doumee.core.track.RideActiveInfo; |
| | | import com.doumee.core.utils.DateUtil; |
| | | import com.doumee.core.utils.PositionUtil; |
| | | import com.doumee.core.utils.StringTools; |
| | |
| | | import com.doumee.dao.business.web.response.UserResponse; |
| | | import com.doumee.jtt808.web.endpoint.MessageManager; |
| | | import com.doumee.service.business.GoodsorderService; |
| | | import com.doumee.service.business.MemberRidesTrackService; |
| | | import com.doumee.service.business.PricingRuleService; |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | |
| | | @Autowired |
| | | PricingRuleService pricingRuleService; |
| | | /** 电车活跃订单缓存:开锁写 / 还车删 / 位置上报读,免高频查 member_rides */ |
| | | @Autowired |
| | | private RideActiveCache rideActiveCache; |
| | | /** 骑行轨迹落库(位置上报命中活跃订单时写) */ |
| | | @Autowired |
| | | private MemberRidesTrackService memberRidesTrackService; |
| | | public APIResult<T0201_0500> bikeControl(@RequestBody T8500 request) { |
| | | Mono<APIResult<T0201_0500>> result = messageManager.requestR(request, T0201_0500.class); |
| | | APIResult<T0201_0500> data = result.block(); |
| | |
| | | rides.setDuration( rideTime > freeRentTime ? rideTime : 0 ); |
| | | rides.setEditDate(rides.getBackDate()); |
| | | memberRidesJoinMapper.updateById(rides);//更新骑行状态为已还车 |
| | | // 电车还车→已还车:删除活跃订单缓存,后续上报不再写该订单轨迹 |
| | | try { |
| | | rideActiveCache.remove(rides.getBikeCode()); |
| | | } catch (Exception e) { |
| | | log.warn("删除活跃订单缓存失败 bikeCode={}", rides.getBikeCode(), e); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | .set( Bikes::getHeartDate,date) |
| | | .eq(Bikes::getId,bikes.getId())); |
| | | |
| | | // 电车位置上报:查活跃订单缓存,命中则写一条轨迹(坐标有效才写);整体容错不阻断位置更新主流程 |
| | | if(bike.getLatitude() != null && bike.getLongitude() != null){ |
| | | try { |
| | | RideActiveInfo active = rideActiveCache.get(bikes.getCode()); |
| | | if(active != null){ |
| | | // 命中活跃订单:落库轨迹点(经纬度为转换后的高德 GCJ02,reportTime 为设备上报时间) |
| | | memberRidesTrackService.record(bikes.getId(), bikes.getCode(), |
| | | active.getRidesId(), active.getOrderId(), |
| | | bike.getLongitude(), bike.getLatitude(), |
| | | DateUtil.getDateFromLocalDateTime(m.getDeviceTime())); |
| | | } |
| | | } catch (Exception e) { |
| | | log.warn("轨迹写入失败 bikeCode={}", bikes.getCode(), e); |
| | | } |
| | | } |
| | | |
| | | if(bikes.getVoltage().compareTo(lowVoltage)>=Constants.ZERO |
| | | && bike.getVoltage().compareTo(lowVoltage)<Constants.ZERO){ |
| | | //发送钉钉通知 |
| | |
| | | memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()); |
| | | memberRides.setCloseStatus(Constants.ZERO); |
| | | memberRidesJoinMapper.insert(memberRides); |
| | | // 电车开锁成功→骑行中:写入「车辆→活跃订单」缓存,供后续位置上报 O(1) 取订单写轨迹 |
| | | // 容错:缓存写入失败不得阻断开锁主流程 |
| | | try { |
| | | rideActiveCache.set(memberRides.getBikeCode(), memberRides.getId(), memberRides.getOrdreId()); |
| | | } catch (Exception e) { |
| | | log.warn("写入活跃订单缓存失败 bikeCode={}", memberRides.getBikeCode(), e); |
| | | } |
| | | BeanUtils.copyProperties(memberRides, memberRidesDetailResponse); |
| | | return memberRidesDetailResponse; |
| | | }catch (BusinessException biz){ |
| | |
| | | memberRides.setEditDate(memberRides.getBackDate()); |
| | | memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()); |
| | | memberRidesJoinMapper.updateById(memberRides); |
| | | // 临停恢复骑行:刷新缓存(临停期间未删,此处重置 TTL 防临界过期) |
| | | try { |
| | | rideActiveCache.set(memberRides.getBikeCode(), memberRides.getId(), memberRides.getOrdreId()); |
| | | } catch (Exception e) { |
| | | log.warn("刷新活跃订单缓存失败 bikeCode={}", memberRides.getBikeCode(), e); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | rides.setDuration( rideTime > freeRentTime ? rideTime : 0 ); |
| | | rides.setEditDate(rides.getBackDate()); |
| | | memberRidesJoinMapper.updateById(rides);//更新骑行状态为已还车 |
| | | // 电车还车→已还车(临停超时自动还车):删除活跃订单缓存 |
| | | try { |
| | | rideActiveCache.remove(rides.getBikeCode()); |
| | | } catch (Exception e) { |
| | | log.warn("删除活跃订单缓存失败 bikeCode={}", rides.getBikeCode(), e); |
| | | } |
| | | } |
| | | } |
| | | } |