rk
6 天以前 84ae873e1c19ca7d2ffc5c98248285706dae818b
server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
@@ -11,6 +11,8 @@
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;
@@ -30,6 +32,7 @@
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;
@@ -100,6 +103,12 @@
    @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();
@@ -177,6 +186,12 @@
                    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);
                    }
                }
            }
        }
@@ -385,6 +400,22 @@
                    .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){
                //发送钉钉通知
@@ -477,6 +508,13 @@
            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){
@@ -526,6 +564,12 @@
        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);
        }
    }
@@ -626,6 +670,12 @@
                        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);
                        }
                    }
                }
            }