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 java.math.BigDecimal; import java.util.*; 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 deleteWrapper = new UpdateWrapper<>(memberRides); memberRidesMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } memberRidesMapper.deleteBatchIds(ids); } @Override public void updateById(MemberRides memberRides) { memberRidesMapper.updateById(memberRides); } @Override public void updateByIdInBatch(List 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 wrapper = new QueryWrapper<>(memberRides); return memberRidesMapper.selectOne(wrapper.last(" limit 1")); } @Override public List findList(MemberRides memberRides) { QueryWrapper wrapper = new QueryWrapper<>(memberRides); return memberRidesMapper.selectList(wrapper); } /** * * @param pageWrap 分页对象 * @return */ @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = initQueryParamByModel(pageWrap.getModel()); IPage 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 wrapper = new QueryWrapper<>(memberRides); return memberRidesMapper.selectCount(wrapper); } @Override public MemberRides findJoinById(String id) { MPJLambdaWrapper 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 findBikeLog(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper 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 bikeLogDTOIPage = memberRidesJoinMapper.selectJoinPage(page, BikeLogDTO.class, queryWrapper); initBikeLogObj(bikeLogDTOIPage.getRecords()); return PageData.from(bikeLogDTOIPage); } public static List findBikeLogList( MemberRidesJoinMapper mrJoinMapper,MemberRidesQuery pageWrap) { MPJLambdaWrapper queryWrapper = initQueryParamByModel(pageWrap); List list = mrJoinMapper.selectJoinList( BikeLogDTO.class, queryWrapper); initBikeLogObj(list); return list; } public static void initBikeLogObj(List list){ if (!CollectionUtils.isEmpty(list)){ list.forEach(s->{ if (Objects.nonNull(s.getBackDate())){ s.setRideTime(DateUtil.betweenMin(s.getRentDate(),s.getBackDate())); } }); } } public static MPJLambdaWrapper initQueryParamByModel(MemberRidesQuery model) { MPJLambdaWrapper 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() .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 wrapper = new QueryWrapper<>(); wrapper.lambda() .in(SystemDictData::getLabel, Arrays.asList(Constants.FORCE_BACK_SITE,Constants.FORCE_BACK_LOCK,Constants.FREE_RENT_TIME)); List systemDictData = systemDictDataMapper.selectList(wrapper); Map 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(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); } @Override public MemberRidesDetailResponse openLock(String code,String memberId) { if(StringUtils.isBlank(code) || code.split("/").length != 2){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该站点编号不存在,请尝试更换车辆!"); } //判断当前是否已支付押金 Goodsorder goodsorder = goodsorderService.findOneByWrapper(new QueryWrapper() .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().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() .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(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(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); } return memberRidesDetailResponse; } 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 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 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(StringUtils.isBlank(locks.getCode()) ||StringUtils.isBlank(locks.getSiteId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"锁头信息上报参数错误!"); } //判断检查处理站点锁头信息 Locks model = dealLockAndSite(locks); //车辆记录 Bikes bikes = dealBikesByParam(model); //状态,0闭合, 1打开,2运行中, 3异常 if(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(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 wrapper = new QueryWrapper<>(); List 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 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() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()) .eq(MemberRides::getIsdeleted,Constants.ZERO); List memberRides = memberRidesMapper.selectList(wrapper); if (!CollectionUtils.isEmpty(memberRides)){ memberRides.forEach(s->{ Integer between = DateUtil.between(s.getCreateDate(), new Date()); // 大于阈值 if (between > 2){ 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 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 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 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 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(sites.getLockNum()+1); sitesMapper.updateById(sites1); } }else{ UpdateWrapper updateWrapper = new UpdateWrapper(); 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()) ||StringUtils.isBlank(bikes.getBackLockId())||StringUtils.isBlank(bikes.getBackSiteId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"还车上报参数错误!"); } QueryWrapper wrapper = new QueryWrapper<>(); List 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 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 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); } }