|  |  | 
 |  |  | 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; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public ConcurrentMap<String,Integer> cacheOpenLock = new ConcurrentReferenceHashMap<>(); | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public MemberRidesDetailResponse openLock(String code,String memberId) { | 
 |  |  |         if(StringUtils.isBlank(code) ||  code.split("/").length != 2){ | 
 |  |  |             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该站点编号不存在,请尝试更换车辆!"); | 
 |  |  |         if(Constants.formatIntegerNum(cacheOpenLock.get(code)) == 1){ | 
 |  |  |             throw new BusinessException(ResponseStatus.NOT_ALLOWED.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)) { | 
 |  |  |         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); | 
 |  |  |                 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); | 
 |  |  |                 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); | 
 |  |  |         } | 
 |  |  |         return memberRidesDetailResponse; | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private boolean isValidePricingType(Locks locks,MemberRides memberRides ) { | 
 |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional(rollbackFor = {BusinessException.class,Exception.class}) | 
 |  |  |     public  int mqttLockInfoEvent(Locks locks){ | 
 |  |  |         if( locks.getCode() !=null ||StringUtils.isBlank(locks.getSiteId())){ | 
 |  |  |         if( locks.getCode() ==null ||StringUtils.isBlank(locks.getSiteId())){ | 
 |  |  |             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"锁头信息上报参数错误!"); | 
 |  |  |         } | 
 |  |  |         //判断检查处理站点锁头信息 | 
 |  |  | 
 |  |  |         //车辆记录 | 
 |  |  |         Bikes bikes = dealBikesByParam(model); | 
 |  |  |         //状态,0闭合, 1打开,2运行中, 3异常 | 
 |  |  |         if(locks.getStatus() == Constants.LockStatus.open){ | 
 |  |  |         if(Constants.formatIntegerNum(locks.getStatus()) == Constants.LockStatus.open){ | 
 |  |  |             //如果是开锁业务,判断是否有开锁中的信息 | 
 |  |  |             MemberRides memberRides = new MemberRides(); | 
 |  |  |             memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()); | 
 |  |  | 
 |  |  |             update.setId(memberRides.getId()); | 
 |  |  |             //(更新请求开锁中的锁头关联的骑行记录) | 
 |  |  |             memberRidesMapper.updateById( update); | 
 |  |  |         }else   if(locks.getStatus() == Constants.LockStatus.closed ){ | 
 |  |  |         }else   if(Constants.formatIntegerNum(locks.getStatus())  == Constants.LockStatus.closed ){ | 
 |  |  |             //如果是关锁业务,判断触发还车 | 
 |  |  |             if(StringUtils.isNotBlank(locks.getBikeCode())){ | 
 |  |  |                 MemberRides mbikes = new MemberRides(); | 
 |  |  | 
 |  |  |  | 
 |  |  |     @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() | 
 |  |  | 
 |  |  |         List<MemberRides> memberRides = memberRidesMapper.selectList(wrapper); | 
 |  |  |         if (!CollectionUtils.isEmpty(memberRides)){ | 
 |  |  |             memberRides.forEach(s->{ | 
 |  |  |                 Integer between = DateUtil.between(s.getCreateDate(), new Date()); | 
 |  |  |                 Integer between = DateUtil.betweenSeconds(s.getCreateDate(), new Date()); | 
 |  |  |                 // 大于阈值 | 
 |  |  |                 if (between > 2){ | 
 |  |  |                 if (between >= 20){ | 
 |  |  |                     s.setStatus(Constants.MEMBER_RIDES_STATUS.LOCKING_DEFEAT.getKey()); | 
 |  |  |                     s.setEditDate(new Date()); | 
 |  |  |                     memberRidesMapper.updateById(s); | 
 |  |  | 
 |  |  |             if(Objects.nonNull(sites)){ | 
 |  |  |                 Sites sites1 = new Sites(); | 
 |  |  |                 sites1.setId(sites.getId()); | 
 |  |  |                 sites1.setLockNum(sites.getLockNum()+1); | 
 |  |  |                 sites1.setLockNum(Constants.formatIntegerNum(sites.getLockNum())+1); | 
 |  |  |                 sitesMapper.updateById(sites1); | 
 |  |  |             } | 
 |  |  |         }else{ |