package com.doumee.service.business.impl; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 
 | 
import com.baomidou.mybatisplus.core.metadata.IPage; 
 | 
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 
 | 
import com.doumee.biz.system.SystemDictDataBiz; 
 | 
import com.doumee.core.constants.Constants; 
 | 
import com.doumee.core.constants.ResponseStatus; 
 | 
import com.doumee.core.exception.BusinessException; 
 | 
import com.doumee.core.model.LoginUserInfo; 
 | 
import com.doumee.core.model.PageData; 
 | 
import com.doumee.core.model.PageWrap; 
 | 
import com.doumee.core.utils.DateUtil; 
 | 
import com.doumee.core.utils.Utils; 
 | 
import com.doumee.dao.business.ActionLogMapper; 
 | 
import com.doumee.dao.business.BikesMapper; 
 | 
import com.doumee.dao.business.LocksMapper; 
 | 
import com.doumee.dao.business.MemberRidesMapper; 
 | 
import com.doumee.dao.business.*; 
 | 
import com.doumee.dao.business.join.MemberRidesJoinMapper; 
 | 
import com.doumee.dao.business.model.*; 
 | 
import com.doumee.dao.business.web.request.MemberRidesQuery; 
 | 
import com.doumee.dao.business.web.response.BikeLogDTO; 
 | 
import com.doumee.dao.business.web.response.MemberRidesDTO; 
 | 
import com.doumee.dao.business.web.response.MemberRidesDetailResponse; 
 | 
import com.doumee.dao.system.SystemDictDataMapper; 
 | 
import com.doumee.dao.system.model.SystemDictData; 
 | 
import com.doumee.service.business.DeviceService; 
 | 
import com.doumee.service.business.GoodsorderService; 
 | 
import com.doumee.service.business.MemberRidesService; 
 | 
import com.doumee.service.system.SystemDictDataService; 
 | 
import com.github.yulichang.wrapper.MPJLambdaWrapper; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.apache.shiro.SecurityUtils; 
 | 
import org.springframework.beans.BeanUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.context.annotation.Lazy; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
import org.springframework.util.CollectionUtils; 
 | 
import org.springframework.util.ConcurrentReferenceHashMap; 
 | 
  
 | 
import java.math.BigDecimal; 
 | 
import java.util.*; 
 | 
import java.util.concurrent.ConcurrentMap; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
/** 
 | 
 * 用户骑行记录表Service实现 
 | 
 * @author 江蹄蹄 
 | 
 * @date 2023/09/27 18:06 
 | 
 */ 
 | 
@Service 
 | 
public class MemberRidesServiceImpl implements MemberRidesService { 
 | 
  
 | 
    @Autowired 
 | 
    private MemberRidesMapper memberRidesMapper; 
 | 
    @Autowired 
 | 
    private HolidaysMapper holidaysMapper; 
 | 
    @Autowired 
 | 
    private PricingParamMapper pricingParamMapper; 
 | 
    @Autowired 
 | 
    private PricingDetailMapper pricingDetailMapper; 
 | 
    @Autowired 
 | 
    private ActionLogMapper actionLogMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private MemberRidesJoinMapper memberRidesJoinMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private DeviceService deviceService; 
 | 
  
 | 
    @Autowired 
 | 
    private LocksMapper locksMapper; 
 | 
    @Autowired 
 | 
    private SitesMapper sitesMapper; 
 | 
    @Autowired 
 | 
    private BaseParamMapper baseParamMapper; 
 | 
    @Autowired 
 | 
    private BikesMapper bikesMapper; 
 | 
    @Autowired 
 | 
    private SystemDictDataBiz systemDictDataBiz; 
 | 
    @Autowired 
 | 
    @Lazy 
 | 
    private GoodsorderService goodsorderService; 
 | 
  
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    private SystemDictDataMapper systemDictDataMapper; 
 | 
  
 | 
    @Override 
 | 
    public String create(MemberRides memberRides) { 
 | 
        memberRidesMapper.insert(memberRides); 
 | 
        return memberRides.getId(); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void deleteById(String id) { 
 | 
        memberRidesMapper.deleteById(id); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void delete(MemberRides memberRides) { 
 | 
        UpdateWrapper<MemberRides> deleteWrapper = new UpdateWrapper<>(memberRides); 
 | 
        memberRidesMapper.delete(deleteWrapper); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void deleteByIdInBatch(List<String> ids) { 
 | 
        if (CollectionUtils.isEmpty(ids)) { 
 | 
            return; 
 | 
        } 
 | 
        memberRidesMapper.deleteBatchIds(ids); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void updateById(MemberRides memberRides) { 
 | 
        memberRidesMapper.updateById(memberRides); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void updateByIdInBatch(List<MemberRides> memberRidess) { 
 | 
        if (CollectionUtils.isEmpty(memberRidess)) { 
 | 
            return; 
 | 
        } 
 | 
        for (MemberRides memberRides: memberRidess) { 
 | 
            this.updateById(memberRides); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public MemberRides findById(String id) { 
 | 
        return memberRidesMapper.selectById(id); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public MemberRides findOne(MemberRides memberRides) { 
 | 
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>(memberRides); 
 | 
        return memberRidesMapper.selectOne(wrapper.last(" limit 1")); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<MemberRides> findList(MemberRides memberRides) { 
 | 
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>(memberRides); 
 | 
        return memberRidesMapper.selectList(wrapper); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 
 | 
     * @param pageWrap 分页对象 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public PageData<MemberRidesDTO> findPage(PageWrap<MemberRidesQuery> pageWrap) { 
 | 
        IPage<MemberRides> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); 
 | 
        MPJLambdaWrapper<MemberRides> queryWrapper = initQueryParamByModel(pageWrap.getModel()); 
 | 
        IPage<MemberRidesDTO> memberRidesDTOIPage = memberRidesJoinMapper.selectJoinPage(page, MemberRidesDTO.class, queryWrapper); 
 | 
        if (!CollectionUtils.isEmpty(memberRidesDTOIPage.getRecords())){ 
 | 
            memberRidesDTOIPage.getRecords().forEach(s->{ 
 | 
                if (Objects.nonNull(s.getBackDate())){ 
 | 
                    s.setRideTime(DateUtil.betweenMin(s.getRentDate(),s.getBackDate())); 
 | 
                } 
 | 
            }); 
 | 
        } 
 | 
        return PageData.from(memberRidesDTOIPage); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public long count(MemberRides memberRides) { 
 | 
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>(memberRides); 
 | 
        return memberRidesMapper.selectCount(wrapper); 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public MemberRides findJoinById(String id) { 
 | 
  
 | 
        MPJLambdaWrapper<MemberRides> queryWrapper = new MPJLambdaWrapper<>(); 
 | 
        queryWrapper.leftJoin(BaseParam.class,BaseParam::getId,MemberRides::getParamId) 
 | 
                    .leftJoin(Member.class,Member::getId,MemberRides::getMemberId); 
 | 
        queryWrapper.eq(MemberRides::getId, id); 
 | 
        queryWrapper.selectAll(MemberRides.class); 
 | 
        queryWrapper.selectAs(BaseParam::getName,MemberRidesDTO::getBikeType); 
 | 
        queryWrapper.selectAs(Member::getOpenid,MemberRides::getMemberOpenid); 
 | 
        queryWrapper.last("limit 1"); 
 | 
  
 | 
        return memberRidesJoinMapper.selectJoinOne(MemberRides.class, queryWrapper); 
 | 
    } 
 | 
    @Override 
 | 
    public PageData<BikeLogDTO> findBikeLog(PageWrap<MemberRidesQuery> pageWrap) { 
 | 
        IPage<MemberRides> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); 
 | 
        MPJLambdaWrapper<MemberRides> queryWrapper = initQueryParamByModel(pageWrap.getModel()); 
 | 
        MemberRidesQuery model = pageWrap.getModel(); 
 | 
        //已还车 
 | 
        if (Objects.nonNull(model.getHasBack()) && model.getHasBack()){ 
 | 
            queryWrapper.eq(MemberRides::getStatus,Constants.TWO); 
 | 
        } 
 | 
        //未归还的 
 | 
        if (Objects.nonNull(model.getHasBack()) && !model.getHasBack()){ 
 | 
            queryWrapper.eq(MemberRides::getStatus,Constants.ONE); 
 | 
        } 
 | 
        IPage<BikeLogDTO> bikeLogDTOIPage = memberRidesJoinMapper.selectJoinPage(page, BikeLogDTO.class, queryWrapper); 
 | 
        initBikeLogObj(bikeLogDTOIPage.getRecords()); 
 | 
        return PageData.from(bikeLogDTOIPage); 
 | 
    } 
 | 
    public static List<BikeLogDTO> findBikeLogList( MemberRidesJoinMapper mrJoinMapper,MemberRidesQuery pageWrap) { 
 | 
        MPJLambdaWrapper<MemberRides> queryWrapper = initQueryParamByModel(pageWrap); 
 | 
        List<BikeLogDTO> list = mrJoinMapper.selectJoinList( BikeLogDTO.class, queryWrapper); 
 | 
        initBikeLogObj(list); 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    public static void initBikeLogObj(List<BikeLogDTO> list){ 
 | 
        if (!CollectionUtils.isEmpty(list)){ 
 | 
            list.forEach(s->{ 
 | 
                if (Objects.nonNull(s.getBackDate())){ 
 | 
                    s.setRideTime(DateUtil.betweenMin(s.getRentDate(),s.getBackDate())); 
 | 
                } 
 | 
            }); 
 | 
        } 
 | 
    } 
 | 
    public  static MPJLambdaWrapper<MemberRides> initQueryParamByModel(MemberRidesQuery model) { 
 | 
        MPJLambdaWrapper<MemberRides> queryWrapper = new MPJLambdaWrapper<>(); 
 | 
        Utils.MP.blankToNull(model); 
 | 
        queryWrapper.orderByDesc(MemberRides::getCreateDate); 
 | 
        queryWrapper.leftJoin(Member.class,Member::getId,MemberRides::getMemberId) 
 | 
                .leftJoin(BaseParam.class,BaseParam::getId,MemberRides::getParamId) 
 | 
                .like(StringUtils.isNotBlank(model.getOpenid()),Member::getOpenid,model.getOpenid()) 
 | 
                .like(StringUtils.isNotBlank(model.getBikeCode()),MemberRides::getBikeCode,model.getBikeCode()); 
 | 
        if (Objects.nonNull(model.getStartDate())) { 
 | 
            queryWrapper.ge(MemberRides::getRentDate, Utils.Date.getStart(model.getStartDate())); 
 | 
        } 
 | 
        if (Objects.nonNull(model.getEndDate())) { 
 | 
            queryWrapper.le(MemberRides::getRentDate, Utils.Date.getEnd(model.getEndDate())); 
 | 
        } 
 | 
        queryWrapper.eq(model.getCloseStatus()!=null,MemberRides::getCloseStatus, model.getCloseStatus()); 
 | 
        queryWrapper.eq(model.getStatus()!=null,MemberRides::getStatus, model.getStatus()); 
 | 
        queryWrapper.eq(model.getGoodsorderId()!=null,MemberRides::getOrdreId, model.getGoodsorderId()); 
 | 
//        queryWrapper.eq(MemberRides::getBackType, Constants.ZERO); 
 | 
        queryWrapper.in(MemberRides::getStatus, 
 | 
                Arrays.asList(Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey(),Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey())); 
 | 
        queryWrapper 
 | 
                .selectAs(MemberRides::getId,MemberRidesDTO::getId) 
 | 
                .selectAs(Member::getOpenid,MemberRidesDTO::getOpenid) 
 | 
                .selectAs(MemberRides::getBikeCode,MemberRidesDTO::getBikeCode) 
 | 
                .selectAs(MemberRides::getCloseStatus,MemberRidesDTO::getCloseStatus) 
 | 
                .selectAs(MemberRides::getStatus,MemberRidesDTO::getStatus) 
 | 
                .selectAs(BaseParam::getName,MemberRidesDTO::getBikeType) 
 | 
                .selectAs(MemberRides::getDuration,MemberRidesDTO::getDuration) 
 | 
                .selectAs(MemberRides::getRentDate,MemberRidesDTO::getRentDate) 
 | 
                .selectAs(MemberRides::getRentLockId,MemberRidesDTO::getRentLockId) 
 | 
                .selectAs(MemberRides::getRentSiteId,MemberRidesDTO::getRentSiteId) 
 | 
                .selectAs(MemberRides::getBackDate,MemberRidesDTO::getBackDate) 
 | 
                .selectAs(MemberRides::getBackSiteId,MemberRidesDTO::getBackSiteId) 
 | 
                .selectAs(MemberRides::getBackLockId,MemberRidesDTO::getBackLockId); 
 | 
        return queryWrapper; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public MemberRides getOnlineBike(String memberId){ 
 | 
        MemberRides memberRides = memberRidesMapper.selectOne(new QueryWrapper<MemberRides>() 
 | 
                .eq("isdeleted", Constants.ZERO) 
 | 
                .eq("member_id",memberId) 
 | 
                .eq("status",Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()) 
 | 
                .last(" limit 1 ") 
 | 
        ); 
 | 
        if(Objects.isNull(memberRides)){ 
 | 
            return null; 
 | 
        } 
 | 
        return memberRides; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 骑行时长修改 
 | 
     * @param memberRides 
 | 
     */ 
 | 
    @Override 
 | 
    public  void updateDuration(MemberRides memberRides){ 
 | 
        LoginUserInfo user =(LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        if(StringUtils.isBlank(memberRides.getId()) 
 | 
                ||StringUtils.isBlank(memberRides.getBackReason()) 
 | 
                || memberRides.getDuration() == null){ 
 | 
            throw  new BusinessException(ResponseStatus.BAD_REQUEST); 
 | 
        } 
 | 
        MemberRides model = findJoinById(memberRides.getId()); 
 | 
        if(model ==null){ 
 | 
            throw  new BusinessException( ResponseStatus.DATA_EMPTY ); 
 | 
        } 
 | 
        if(Constants.formatIntegerNum(model.getStatus()) != Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()|| 
 | 
        Constants.formatIntegerNum(model.getCloseStatus()) != Constants.ZERO){ 
 | 
            throw  new BusinessException( ResponseStatus.NOT_ALLOWED.getCode(),"对不起,只能针对已还车且未结算的数据进行操作!" ); 
 | 
        } 
 | 
        if(Constants.formatIntegerNum(memberRides.getDuration()) == Constants.formatIntegerNum(model.getDuration())){ 
 | 
            throw  new BusinessException( ResponseStatus.BAD_REQUEST.getCode(),"对不起,时长未发生改变,无需修改!" ); 
 | 
        } 
 | 
        int actTime =  DateUtil.betweenMin(model.getRentDate(), model.getBackDate()); 
 | 
        if(memberRides.getDuration() > actTime){ 
 | 
            throw  new BusinessException( ResponseStatus.BAD_REQUEST.getCode(),"对不起,计费时长不能超过实际借出时长!" ); 
 | 
        } 
 | 
        MemberRides update = new MemberRides(); 
 | 
        update.setId(model.getId()); 
 | 
        update.setDuration(memberRides.getDuration()); 
 | 
        update.setEditDate(new Date()); 
 | 
        update.setEditor(user.getId()); 
 | 
        memberRidesMapper.updateById(update); 
 | 
        //修改前 
 | 
        String beforeContent = JSONObject.toJSONString(model); 
 | 
        //修改后 
 | 
        String after = JSONObject.toJSONString(update); 
 | 
  
 | 
        ActionLog log = new ActionLog(); 
 | 
        log.setId(Constants.getUUID()); 
 | 
        log.setActInfo(memberRides.getBackInfo()); 
 | 
        log.setActReason(memberRides.getBackReason()); 
 | 
        log.setIsdeleted(Constants.ZERO); 
 | 
        log.setCreateDate(new Date()); 
 | 
        log.setCreator(user.getId()); 
 | 
        log.setBeforeContent(beforeContent); 
 | 
        log.setAfterContent(after); 
 | 
        log.setUserId(user.getId()); 
 | 
        log.setUserType(Constants.ONE); 
 | 
        log.setParam(JSONObject.toJSONString(memberRides )); 
 | 
        log.setObjType(Constants.ActionLogObjType.memberrides); 
 | 
        log.setResult(Constants.ZERO); 
 | 
        log.setObjId(model.getId()); 
 | 
        log.setType(Constants.ACTIONLOG_TYPE.UPDATE_DURATION.getKey()); 
 | 
        log.setContent(Constants.ACTIONLOG_TYPE.UPDATE_DURATION.getInfo()); 
 | 
        log.setTitle(Constants.ACTIONLOG_TYPE.UPDATE_DURATION.getName()); 
 | 
        //记录操作日志 
 | 
        actionLogMapper.insert(log); 
 | 
  
 | 
  
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 强制还车 
 | 
     * @param memberRides 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class,Exception.class}) 
 | 
    public void forceBack(MemberRides memberRides){ 
 | 
        LoginUserInfo user =(LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
         if(StringUtils.isBlank(memberRides.getBackReason())){ 
 | 
            throw  new BusinessException(ResponseStatus.BAD_REQUEST); 
 | 
        } 
 | 
        MemberRides model = findJoinById(memberRides.getId()); 
 | 
        if(model ==null){ 
 | 
            throw  new BusinessException( ResponseStatus.DATA_EMPTY ); 
 | 
        } 
 | 
        if(Constants.formatIntegerNum(model.getStatus()) != Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey() ){ 
 | 
            throw  new BusinessException( ResponseStatus.NOT_ALLOWED.getCode(),"对不起,只能针对未还车辆进行强制还车操作!" ); 
 | 
        } 
 | 
        QueryWrapper<SystemDictData> wrapper = new QueryWrapper<>(); 
 | 
        wrapper.lambda() 
 | 
                .in(SystemDictData::getLabel, Arrays.asList(Constants.FORCE_BACK_SITE,Constants.FORCE_BACK_LOCK,Constants.FREE_RENT_TIME)); 
 | 
        List<SystemDictData> systemDictData = systemDictDataMapper.selectList(wrapper); 
 | 
        Map<String, SystemDictData> collect = systemDictData.stream().collect(Collectors.toMap(s -> s.getLabel(), s -> s)); 
 | 
  
 | 
        MemberRides update = new MemberRides(); 
 | 
        update.setId(model.getId()); 
 | 
        update.setEditDate(new Date()); 
 | 
        update.setEditor(user.getId()); 
 | 
        update.setBackInfo(memberRides.getBackInfo()); 
 | 
        update.setBackDate(new Date()); 
 | 
        update.setBackReason(memberRides.getBackReason()); 
 | 
        update.setBackUserid(user.getId()); 
 | 
        update.setBackType(Constants.ONE); 
 | 
        update.setStatus(Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()); 
 | 
        update.setBackSiteId(collect.get(Constants.FORCE_BACK_SITE).getCode()); 
 | 
        update.setBackLockId(Constants.formatIntegerFromStr(collect.get(Constants.FORCE_BACK_LOCK).getCode())); 
 | 
        Integer freeRentTime = Integer.valueOf(collect.get(Constants.FREE_RENT_TIME).getCode()); 
 | 
        Integer rideTime = DateUtil.betweenMin(model.getRentDate(), update.getBackDate()); 
 | 
        //计算骑行计费时长 
 | 
        update.setDuration( rideTime > freeRentTime  ? rideTime : 0 ); 
 | 
        //update.setDuration( freeRentTime > 0 ? rideTime - freeRentTime : rideTime); 
 | 
        memberRidesMapper.updateById(update); 
 | 
        //修改前 
 | 
        String beforeContent = JSONObject.toJSONString(model); 
 | 
        //修改后 
 | 
        String after = JSONObject.toJSONString(update); 
 | 
  
 | 
        //插入虚拟锁头和站点上------- 
 | 
        Bikes bike = new Bikes(); 
 | 
        bike.setIsdeleted(Constants.ZERO); 
 | 
        bike.setCode(model.getBikeCode()); 
 | 
        bike.setSiteId(update.getBackSiteId()); 
 | 
        bike.setLockId(update.getBackLockId()); 
 | 
        if(bikesMapper.selectCount(new QueryWrapper<>(bike)) == 0){ 
 | 
            bike.setId(Constants.getUUID()); 
 | 
            bike.setParamId(model.getParamId()); 
 | 
            bike.setLastBackDate(model.getRentDate()); 
 | 
            bike.setStatus(Constants.ZERO); 
 | 
            bike.setInfo("强制还车绑定"); 
 | 
            bikesMapper.insert(bike); 
 | 
        } 
 | 
  
 | 
        ActionLog log = new ActionLog(); 
 | 
        log.setId(Constants.getUUID()); 
 | 
        log.setIsdeleted(Constants.ZERO); 
 | 
        log.setCreateDate(new Date()); 
 | 
        log.setCreator(user.getId()); 
 | 
        log.setBeforeContent(beforeContent); 
 | 
        log.setAfterContent(after); 
 | 
        log.setUserId(user.getId()); 
 | 
        log.setUserType(Constants.ONE); 
 | 
        log.setParam(JSONObject.toJSONString(memberRides )); 
 | 
        log.setObjType(Constants.ActionLogObjType.memberrides); 
 | 
        log.setResult(Constants.ZERO); 
 | 
        log.setObjId(model.getId()); 
 | 
        log.setType(Constants.ACTIONLOG_TYPE.FORCE_BACK.getKey()); 
 | 
        log.setContent(Constants.ACTIONLOG_TYPE.FORCE_BACK.getInfo()); 
 | 
        log.setTitle(Constants.ACTIONLOG_TYPE.FORCE_BACK.getName()); 
 | 
        log.setActInfo(memberRides.getBackInfo()); 
 | 
        log.setActReason(memberRides.getBackReason()); 
 | 
        //记录操作日志 
 | 
        actionLogMapper.insert(log); 
 | 
  
 | 
    } 
 | 
  
 | 
    public ConcurrentMap<String,Integer> cacheOpenLock = new ConcurrentReferenceHashMap<>(); 
 | 
  
 | 
    @Override 
 | 
    public MemberRidesDetailResponse openLock(String code,String memberId) { 
 | 
        if(Constants.formatIntegerNum(cacheOpenLock.get(code)) == 1){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,该车辆已被锁定借用,请尝试更换其他车辆!"); 
 | 
        } 
 | 
        cacheOpenLock.put(code, 1); 
 | 
        try { 
 | 
            if(StringUtils.isBlank(code) ||  code.split("/").length != 2){ 
 | 
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该站点编号不存在,请尝试更换车辆!"); 
 | 
            } 
 | 
            //判断当前是否已支付押金 
 | 
            Goodsorder goodsorder = goodsorderService.findOneByWrapper(new QueryWrapper<Goodsorder>() 
 | 
                    .eq("isdeleted", Constants.ZERO) 
 | 
                    .eq("status", Constants.goodsorderStatus.pay) 
 | 
                    .eq("member_id", memberId) 
 | 
                    .orderByDesc("create_date") 
 | 
                    .last("limit 1")); 
 | 
            if (Objects.isNull(goodsorder)) { 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "未支付押金,无法进行该操作!"); 
 | 
            } 
 | 
            //判断当前押金订单是否为今日押金 
 | 
            if (!DateUtil.DateToStr(goodsorder.getPayDate(), "yyyy-MM-dd").equals(DateUtil.getDate(new Date(), "yyyy-MM-dd"))) { 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "非今日押金订单,请结算后重新支付!"); 
 | 
            } 
 | 
            //判断是否处于营业时间 
 | 
            goodsorderService.checkBusiness(); 
 | 
            //查询是否处于骑行中 
 | 
            if (memberRidesMapper.selectCount(new QueryWrapper<MemberRides>().eq("member_id", memberId).in("status", 0, 1)) > Constants.ZERO) { 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "存在骑行中车辆,无法扫码"); 
 | 
            } 
 | 
            String[] codes = code.split("/"); 
 | 
            Locks locks = locksMapper.selectOne(new QueryWrapper<Locks>() 
 | 
                    .lambda().eq(Locks::getCode, codes[1]) 
 | 
                    .eq(Locks::getSiteId, codes[0]) 
 | 
                    .eq(Locks::getIsdeleted, Constants.ZERO) 
 | 
                    .last("limit 1")); 
 | 
            if (Objects.isNull(locks)) { 
 | 
//            locks =new Locks(); 
 | 
//            locks.setCode(codes[1]); 
 | 
//            locks.setSiteId(codes[0]); 
 | 
//            deviceService.getLockInfo(locks); 
 | 
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "扫码无效,该站点锁头暂不支持借出业务哦!"); 
 | 
            } 
 | 
            //查询锁头是否存在车辆 以及是否正常 
 | 
            if (Constants.formatIntegerNum(locks.getStatus())!=Constants.ZERO) { 
 | 
                locks =new Locks(); 
 | 
                locks.setCode(Constants.formatIntegerFromStr(codes[1])); 
 | 
                locks.setSiteId(codes[0]); 
 | 
                deviceService.getLockInfo(locks); 
 | 
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "当前车辆暂时无法使用,请稍后重试或更换其它车辆~"); 
 | 
            } 
 | 
            if (StringUtils.isBlank(locks.getBikeCode())) { 
 | 
                locks =new Locks(); 
 | 
                locks.setCode(Constants.formatIntegerFromStr(codes[1])); 
 | 
                locks.setSiteId(codes[0]); 
 | 
                deviceService.getLockInfo(locks); 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "当前车辆暂时无法使用,请稍后重试或更换其它车辆!"); 
 | 
            } 
 | 
            MemberRides memberRides = new MemberRides(); 
 | 
            //根据车型查询计价方案 
 | 
            isValidePricingType(locks,memberRides) ; 
 | 
            MqttLog flag = deviceService.openLock(locks); 
 | 
            MemberRidesDetailResponse memberRidesDetailResponse = new MemberRidesDetailResponse(); 
 | 
            if (flag.getResult() == 0) { 
 | 
                //存储骑行记录 
 | 
                memberRides.setId(Constants.getUUID()); 
 | 
                memberRides.setIsdeleted(Constants.ZERO); 
 | 
                memberRides.setMemberId(memberId); 
 | 
                memberRides.setCreateDate(new Date()); 
 | 
                memberRides.setRentSiteId(locks.getSiteId()); 
 | 
                memberRides.setRentLockId(locks.getCode()); 
 | 
                memberRides.setOrdreId(goodsorder.getId()); 
 | 
                memberRides.setRentDate(new Date()); 
 | 
                memberRides.setBalance(new BigDecimal(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.RENT_DEPOSIT).getCode())); 
 | 
                memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()); 
 | 
                memberRides.setCloseStatus(Constants.ZERO); 
 | 
  
 | 
                memberRidesMapper.insert(memberRides); 
 | 
                BeanUtils.copyProperties(memberRides, memberRidesDetailResponse); 
 | 
            }else{ 
 | 
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "当前车辆暂时无法使用,请稍后重试或更换其它车辆~"); 
 | 
            } 
 | 
            return memberRidesDetailResponse; 
 | 
        }catch (BusinessException biz){ 
 | 
            throw  biz; 
 | 
        }catch (Exception biz){ 
 | 
            throw  new BusinessException(ResponseStatus.SERVER_ERROR); 
 | 
        }finally { 
 | 
            cacheOpenLock.remove(code); 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    private boolean isValidePricingType(Locks locks,MemberRides memberRides ) { 
 | 
        Bikes bike= new Bikes(); 
 | 
        bike.setLockId(locks.getCode()); 
 | 
        bike.setSiteId(locks.getSiteId()); 
 | 
        //查询车辆信息 
 | 
        bike = bikesMapper.selectOne(new QueryWrapper<>(bike).last("limit 1")); 
 | 
        if(bike == null && StringUtils.isBlank(bike.getParamId())){ 
 | 
            //如果车辆类型是空 
 | 
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), " 该车型暂时不能借车操作哦,请更换其他车型重试!"); 
 | 
        } 
 | 
        Date date =new Date(); 
 | 
        QueryWrapper<PricingParam> param = new QueryWrapper<>(); 
 | 
        param.lambda().eq(PricingParam::getStatus,Constants.ZERO); 
 | 
        param.lambda().eq(PricingParam::getIsdeleted,Constants.ZERO); 
 | 
        param.lambda().le(PricingParam::getStartDate,date); 
 | 
        param.lambda().ge(PricingParam::getEndDate,date); 
 | 
        param.lambda().last(" limit 1" ) ; 
 | 
        param.lambda().orderByAsc(PricingParam::getSortnum); 
 | 
        //查询优先级最高(排序码最小的)可用配价方案 
 | 
        PricingParam pp = pricingParamMapper.selectOne(param); 
 | 
        if(pp == null){ 
 | 
            //如果车辆未设置配价方案,提示开锁失败! 
 | 
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), " 该车型暂时不能借车操作哦,请更换其他车型重试哦!"); 
 | 
        } 
 | 
        QueryWrapper<PricingDetail> detail = new QueryWrapper<>(); 
 | 
        detail.lambda().eq(PricingDetail::getBikeTypeId,bike.getParamId()); 
 | 
        detail.lambda().eq(PricingDetail::getPricePramId,pp.getId()); 
 | 
        detail.lambda().eq(PricingDetail::getIsdeleted,Constants.ZERO); 
 | 
        detail.lambda().last(" limit 1" ) ; 
 | 
        //查询优先级最高(排序码最小的)可用配价方案 
 | 
        PricingDetail pricingDetail = pricingDetailMapper.selectOne(detail); 
 | 
        if(pricingDetail == null){ 
 | 
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), " 该车型暂时不能借车操作哦,请更换其他车型重试哦~"); 
 | 
        } 
 | 
        String nowDate = DateUtil.getDateLong(date); 
 | 
        Holidays holidays = new Holidays(); 
 | 
        holidays.setHoliday(nowDate); 
 | 
        holidays.setIsdeleted(Constants.ZERO); 
 | 
        memberRides.setBikeCode(bike.getCode()); 
 | 
        memberRides.setParamId(bike.getParamId()); 
 | 
        bike.setLastRentDate(new Date()); 
 | 
        bike.setStatus(Constants.ONE); 
 | 
        bikesMapper.updateById(bike); 
 | 
        //检查是否节假日 
 | 
        if(holidaysMapper.selectCount(new QueryWrapper<>(holidays)) >0){ 
 | 
            //如果是节假日 
 | 
            memberRides.setBasePrice(pricingDetail.getHolidayBasePrice()); 
 | 
            memberRides.setBaseTime(pricingDetail.getHolidayBaseTime()); 
 | 
            memberRides.setUnitPrice(pricingDetail.getHolidayUnitPrice()); 
 | 
            memberRides.setUnitTime(pricingDetail.getHolidayUnitTime()); 
 | 
            memberRides.setIsHoliday(Constants.ONE); 
 | 
        }else{ 
 | 
            //如果是工作日 
 | 
            memberRides.setBasePrice(pricingDetail.getBasePrice()); 
 | 
            memberRides.setBaseTime(pricingDetail.getBaseTime()); 
 | 
            memberRides.setUnitPrice(pricingDetail.getUnitPrice()); 
 | 
            memberRides.setUnitTime(pricingDetail.getUnitTime()); 
 | 
            memberRides.setIsHoliday(Constants.ZERO); 
 | 
        } 
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public MemberRidesDetailResponse refreshLock(String id){ 
 | 
        MemberRides memberRides = memberRidesMapper.selectById(id); 
 | 
        if(Objects.isNull(memberRides)){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY); 
 | 
        } 
 | 
        MemberRidesDetailResponse memberRidesDetailResponse = new MemberRidesDetailResponse(); 
 | 
        BeanUtils.copyProperties(memberRides,memberRidesDetailResponse); 
 | 
        return memberRidesDetailResponse; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 锁头信息上报 
 | 
     * @param locks 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class,Exception.class}) 
 | 
    public  int mqttLockInfoEvent(Locks locks){ 
 | 
        if( locks.getCode() ==null ||StringUtils.isBlank(locks.getSiteId())){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"锁头信息上报参数错误!"); 
 | 
        } 
 | 
        //判断检查处理站点锁头信息 
 | 
        Locks model = dealLockAndSite(locks); 
 | 
        //车辆记录 
 | 
        Bikes bikes = dealBikesByParam(model); 
 | 
        //状态,0闭合, 1打开,2运行中, 3异常 
 | 
        if(Constants.formatIntegerNum(locks.getStatus()) == Constants.LockStatus.open){ 
 | 
            //如果是开锁业务,判断是否有开锁中的信息 
 | 
            MemberRides memberRides = new MemberRides(); 
 | 
            memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()); 
 | 
            memberRides.setRentLockId(model.getCode()); 
 | 
            memberRides.setRentSiteId(model.getSiteId()); 
 | 
            memberRides.setIsdeleted(Constants.ZERO); 
 | 
            memberRides = findOne(memberRides); 
 | 
            if(memberRides == null){ 
 | 
                return 0; 
 | 
            } 
 | 
            MemberRides  update = new MemberRides(); 
 | 
            update.setStatus(Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()); 
 | 
            update.setEditDate(new Date()); 
 | 
            update.setId(memberRides.getId()); 
 | 
            //(更新请求开锁中的锁头关联的骑行记录) 
 | 
            memberRidesMapper.updateById( update); 
 | 
        }else   if(Constants.formatIntegerNum(locks.getStatus())  == Constants.LockStatus.closed ){ 
 | 
            //如果是关锁业务,判断触发还车 
 | 
            if(StringUtils.isNotBlank(locks.getBikeCode())){ 
 | 
                MemberRides mbikes = new MemberRides(); 
 | 
                mbikes.setBackLockId(locks.getCode()); 
 | 
                mbikes.setBackSiteId(locks.getSiteId()); 
 | 
                mbikes.setBikeCode(locks.getBikeCode()); 
 | 
                mqttCloseBikeEventDo(mbikes); 
 | 
               /* if(StringUtils.isBlank(locks.getBikeCode()) ||StringUtils.isBlank(locks.getCode()) 
 | 
                        ||StringUtils.isBlank(bikes.getSiteId())){ 
 | 
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"还车上报参数错误!"); 
 | 
                } 
 | 
                QueryWrapper<MemberRides> wrapper = new QueryWrapper<>(); 
 | 
                List<Integer> statusList = new ArrayList<>(); 
 | 
                statusList.add(Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()); 
 | 
                statusList.add(Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()); 
 | 
                wrapper.lambda().eq(MemberRides::getBikeCode, locks.getBikeCode()); 
 | 
                wrapper.lambda().in(MemberRides::getStatus, statusList); 
 | 
                wrapper.lambda().eq(MemberRides::getIsdeleted, Constants.ZERO); 
 | 
                //根据车辆编码查询骑行中的骑行记录信息,如果有进行还车操作 
 | 
                List<MemberRides> list = memberRidesMapper.selectList(wrapper); 
 | 
//        MemberRides memberRides = memberRidesMapper.selectOne(wrapper.last("limit  1")); 
 | 
                if(list!=null){ 
 | 
                    //进行 
 | 
                    for(MemberRides memberRides : list){ 
 | 
                        dealMemberRidesBack(memberRides,bikes); 
 | 
                    } 
 | 
                }*/ 
 | 
            } 
 | 
        } 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public void autoRefreshLockStatus() { 
 | 
//        memberRidesMapper.update(null,new UpdateWrapper<MemberRides>().lambda() 
 | 
//                        .eq(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()) 
 | 
//                .apply(""  ) 
 | 
//                .set(MemberRides::getStatus, Constants.MEMBER_RIDES_STATUS.LOCKING_DEFEAT.getKey())) 
 | 
  
 | 
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>(); 
 | 
        wrapper.lambda() 
 | 
                .eq(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()) 
 | 
                .eq(MemberRides::getIsdeleted,Constants.ZERO); 
 | 
        List<MemberRides> memberRides = memberRidesMapper.selectList(wrapper); 
 | 
        if (!CollectionUtils.isEmpty(memberRides)){ 
 | 
            memberRides.forEach(s->{ 
 | 
                Integer between = DateUtil.betweenSeconds(s.getCreateDate(), new Date()); 
 | 
                // 大于阈值 
 | 
                if (between >= 20){ 
 | 
                    s.setStatus(Constants.MEMBER_RIDES_STATUS.LOCKING_DEFEAT.getKey()); 
 | 
                    s.setEditDate(new Date()); 
 | 
                    memberRidesMapper.updateById(s); 
 | 
                } 
 | 
            }); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private Bikes dealBikesByParam(Locks model) { 
 | 
        if(StringUtils.isNotBlank(model.getBikeCode())){ 
 | 
            UpdateWrapper<Bikes> updateWrapper = new UpdateWrapper<>(); 
 | 
            updateWrapper.lambda().set(Bikes::getCode, null ); 
 | 
            updateWrapper.lambda().set(Bikes::getParamId, null ); 
 | 
            updateWrapper.lambda().set(Bikes::getEditDate, new Date() ); 
 | 
            updateWrapper.lambda().eq(Bikes::getCode, model.getBikeCode() ); 
 | 
            //清空原来的自行车绑定关系 
 | 
            bikesMapper.update(null, updateWrapper); 
 | 
        } 
 | 
  
 | 
        QueryWrapper<Bikes> wrapper = new QueryWrapper<>(); 
 | 
        wrapper.lambda().eq(Bikes::getLockId, model.getCode()); 
 | 
        wrapper.lambda().eq(Bikes::getSiteId, model.getSiteId()); 
 | 
        Bikes bikes = bikesMapper.selectOne(wrapper.last("limit 1")); 
 | 
        if(bikes != null ) { 
 | 
            if ( !StringUtils.equals(model.getBikeCode(), bikes.getCode())){ 
 | 
                //如果绑定车辆信息发生编号,更换绑定关系 
 | 
                String type =getBileTypeByCode(model.getBikeCode()); 
 | 
                UpdateWrapper<Bikes> updateWrapper = new UpdateWrapper<>(); 
 | 
                updateWrapper.lambda().eq(Bikes::getId, bikes.getId()); 
 | 
                updateWrapper.lambda().set(Bikes::getCode,model.getBikeCode()); 
 | 
                updateWrapper.lambda().set(Bikes::getParamId,type); 
 | 
                //更新自行站点锁头绑定自行车信息 
 | 
                bikesMapper.update(null,updateWrapper); 
 | 
                bikes.setCode(model.getBikeCode()); 
 | 
                bikes.setParamId(model.getBikeType()); 
 | 
            } 
 | 
        }else{ 
 | 
            bikes = new Bikes(); 
 | 
            bikes.setId(Constants.getUUID()); 
 | 
            bikes.setIsdeleted(Constants.ZERO); 
 | 
            bikes.setCreateDate(new Date()); 
 | 
            bikes.setEditDate(bikes.getCreateDate()); 
 | 
            bikes.setSiteId(model.getSiteId()); 
 | 
            bikes.setLockId(model.getCode()); 
 | 
            bikes.setCode(model.getBikeCode()); 
 | 
            bikes.setParamId(getBileTypeByCode(model.getBikeCode())); 
 | 
            bikesMapper.insert(bikes); 
 | 
        } 
 | 
        return  bikes; 
 | 
  
 | 
    } 
 | 
  
 | 
    /** 
 | 
     -----------根据车辆code分析车辆类型,待确认方案------------------- 
 | 
     * 
 | 
     */ 
 | 
    private String getBileTypeByCode(String bikeCode) { 
 | 
//      int temp=1+(int)(Math.random()*(8)); 
 | 
        if(StringUtils.isBlank(bikeCode)){ 
 | 
            return  null; 
 | 
        } 
 | 
        String type = bikeCode.substring(0,1); 
 | 
        if(!Constants.BIKE_TYPE.contains(type)){ 
 | 
            return null; 
 | 
        } 
 | 
        BaseParam param = new BaseParam(); 
 | 
        param.setIsdeleted(Constants.ZERO); 
 | 
        param.setType(Constants.THREE); 
 | 
        param.setSortnum(Integer.parseInt(type)); 
 | 
        param = baseParamMapper.selectOne(new QueryWrapper<>(param).lambda().last("limit 1" )); 
 | 
        if(param == null){ 
 | 
            return  type; 
 | 
        } 
 | 
        return param.getId(); 
 | 
    } 
 | 
  
 | 
    private Locks dealLockAndSite(Locks locks) { 
 | 
        Locks model = new Locks(); 
 | 
        model.setSiteId(locks.getSiteId()); 
 | 
        model.setCode(locks.getCode()); 
 | 
        model = locksMapper.selectOne(new QueryWrapper<>(model).last("limit 1")); 
 | 
        Date date =new Date(); 
 | 
        //检查站点信息,不存在则新增 
 | 
        Sites sites = sitesMapper.selectById(locks.getSiteId()); 
 | 
  
 | 
        if(sites == null){ 
 | 
            sites = new Sites(); 
 | 
            sites.setIsdeleted(Constants.ZERO); 
 | 
            sites.setCode(locks.getSiteId()); 
 | 
            sites.setId(locks.getSiteId()); 
 | 
            sites.setCreateDate(date); 
 | 
            sites.setEditDate(date); 
 | 
            sites.setStatus(Constants.ZERO); 
 | 
            sites.setEditDate(date); 
 | 
            sites.setLockNum(1); 
 | 
            sites.setLastLinkDate(date); 
 | 
            //新增锁头 
 | 
            sitesMapper.insert(sites); 
 | 
        } 
 | 
        if(StringUtils.isNotBlank(locks.getBikeCode())){ 
 | 
            UpdateWrapper<Locks> updateWrapper = new UpdateWrapper<>(); 
 | 
            updateWrapper.lambda().set(Locks::getBikeCode, null ); 
 | 
            updateWrapper.lambda().set(Locks::getEditDate, new Date() ); 
 | 
            updateWrapper.lambda().eq(Locks::getBikeCode, locks.getBikeCode() ); 
 | 
            //清空原来的自行车绑定关系 
 | 
            locksMapper.update(null, updateWrapper); 
 | 
        } 
 | 
  
 | 
        if(model == null){ 
 | 
            //如果锁头不存在,判断存储 
 | 
            model = new Locks(); 
 | 
            model.setId(Constants.getUUID()); 
 | 
            model.setSiteId(locks.getSiteId()); 
 | 
            model.setIsdeleted(Constants.ZERO); 
 | 
            model.setCode(locks.getCode()); 
 | 
            model.setSiteId(locks.getSiteId()); 
 | 
            model.setBikeCode(locks.getBikeCode()); 
 | 
            model.setCreateDate(date); 
 | 
            model.setStatus(locks.getStatus()); 
 | 
            locksMapper.insert(model); 
 | 
            //更新 站点锁头数量 
 | 
            if(Objects.nonNull(sites)){ 
 | 
                Sites sites1 = new Sites(); 
 | 
                sites1.setId(sites.getId()); 
 | 
                sites1.setLockNum(Constants.formatIntegerNum(sites.getLockNum())+1); 
 | 
                sitesMapper.updateById(sites1); 
 | 
            } 
 | 
        }else{ 
 | 
            UpdateWrapper<Locks> updateWrapper = new UpdateWrapper<Locks>(); 
 | 
            updateWrapper.lambda().eq(Locks::getCode, locks.getCode() ); 
 | 
            updateWrapper.lambda().eq(Locks::getSiteId, locks.getSiteId() ); 
 | 
            updateWrapper.lambda().set(Locks::getBikeCode, locks.getBikeCode() ); 
 | 
            updateWrapper.lambda().set(Locks::getStatus, locks.getStatus() ); 
 | 
            updateWrapper.lambda().set(Locks::getEditDate, new Date() ); 
 | 
            updateWrapper.lambda().set(Locks::getIsdeleted, Constants.ZERO); 
 | 
            locksMapper.update(null,updateWrapper); 
 | 
            model.setStatus(locks.getStatus()); 
 | 
            model.setBikeCode(locks.getBikeCode()); 
 | 
        } 
 | 
        model.setSites(sites); 
 | 
        return  model; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 还车订阅消息业务处理 
 | 
     * @param bikes 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class,Exception.class}) 
 | 
    public  int mqttCloseBikeEvent(MemberRides bikes){ 
 | 
        Locks locks  = new Locks(); 
 | 
        locks.setSiteId(bikes.getBackSiteId()); 
 | 
        locks.setCode(bikes.getBackLockId()); 
 | 
        locks.setBikeCode(bikes.getBikeCode()); 
 | 
        locks.setInfo(bikes.getBackCommondId()); 
 | 
        locks.setStatus(bikes.getStatus()); 
 | 
        //处理锁头数据 
 | 
         mqttLockInfoEvent(locks); 
 | 
         mqttCloseBikeEventDo(bikes); 
 | 
        return  0; 
 | 
    } 
 | 
  
 | 
    private void mqttCloseBikeEventDo(MemberRides bikes) { 
 | 
        if(StringUtils.isBlank(bikes.getBikeCode()) || bikes.getBackLockId() == null ||StringUtils.isBlank(bikes.getBackSiteId())){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"还车上报参数错误!"); 
 | 
        } 
 | 
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>(); 
 | 
        List<Integer> statusList = new ArrayList<>(); 
 | 
        statusList.add(Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()); 
 | 
        statusList.add(Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()); 
 | 
        wrapper.lambda().eq(MemberRides::getBikeCode, bikes.getBikeCode()); 
 | 
        wrapper.lambda().in(MemberRides::getStatus, statusList); 
 | 
        wrapper.lambda().eq(MemberRides::getIsdeleted, Constants.ZERO); 
 | 
        //根据车辆编码查询骑行中的骑行记录信息,如果有进行还车操作 
 | 
        List<MemberRides> list = memberRidesMapper.selectList(wrapper); 
 | 
//        MemberRides memberRides = memberRidesMapper.selectOne(wrapper.last("limit  1")); 
 | 
        if(list!=null){ 
 | 
            //进行 
 | 
            for(MemberRides memberRides : list){ 
 | 
                dealMemberRidesBack(memberRides,bikes); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void dealMemberRidesBack(MemberRides memberRides,MemberRides param) { 
 | 
        int freeTime = 0; 
 | 
        try { 
 | 
            freeTime = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode()); 
 | 
        }catch (Exception e){ 
 | 
        } 
 | 
        Date date = new Date(); 
 | 
        MemberRides update = new MemberRides(); 
 | 
        update.setEditDate(date); 
 | 
        update.setStatus(Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()); 
 | 
        update.setBackDate(date); 
 | 
        update.setBackLockId(param.getBackLockId()); 
 | 
        update.setBackSiteId(param.getBackSiteId()); 
 | 
        update.setBackCommondId(param.getBackCommondId()); 
 | 
//        int duration =DateUtil.betweenMin(memberRides.getRentDate(),date)-freeTime; 
 | 
        int min = DateUtil.betweenMin(memberRides.getRentDate(),date);//实际骑行时间 
 | 
        int duration = min>freeTime?min:0; 
 | 
        update.setDuration(duration>0?duration:0); 
 | 
        update.setBackType(Constants.ONE); 
 | 
        update.setBackInfo("用户正常还车"); 
 | 
        update.setId(memberRides.getId()); 
 | 
  
 | 
        Bikes bikes = new Bikes(); 
 | 
        bikes.setSiteId(memberRides.getBackSiteId()); 
 | 
        bikes.setLockId(memberRides.getBackLockId()); 
 | 
//        bikes.setCode(memberRides.getBikeCode()); 
 | 
        bikes = bikesMapper.selectOne(new QueryWrapper<>(bikes).last("limit 1")); 
 | 
        if(bikes != null ) { 
 | 
            UpdateWrapper<Bikes> updateWrapper = new UpdateWrapper<>(); 
 | 
            updateWrapper.lambda().eq(Bikes::getId, bikes.getId()); 
 | 
            updateWrapper.lambda().set(Bikes::getEditDate,new Date()); 
 | 
            updateWrapper.lambda().set(Bikes::getLastBackDate,new Date()); 
 | 
            //更新自行车最后还车时间 
 | 
            bikesMapper.update(null,updateWrapper); 
 | 
        } 
 | 
        //更新还车记录为已还车 
 | 
        memberRidesMapper.updateById(update); 
 | 
    } 
 | 
} 
 |