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.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.LocksMapper; import com.doumee.dao.business.MemberRidesMapper; 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.service.business.DeviceService; import com.doumee.service.business.GoodsorderService; import com.doumee.service.business.MemberRidesService; 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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.Date; import java.util.List; import java.util.Objects; /** * 用户骑行记录表Service实现 * @author 江蹄蹄 * @date 2023/09/27 18:06 */ @Service public class MemberRidesServiceImpl implements MemberRidesService { @Autowired private MemberRidesMapper memberRidesMapper; @Autowired private ActionLogMapper actionLogMapper; @Autowired private MemberRidesJoinMapper memberRidesJoinMapper; @Autowired private DeviceService deviceService; @Autowired private LocksMapper locksMapper; @Autowired private GoodsorderService goodsorderService; @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); queryWrapper.eq(MemberRides::getMemberId, id); queryWrapper.selectAll(MemberRides.class); queryWrapper.selectAs(BaseParam::getName,MemberRidesDTO::getBikeType) ; 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()); 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()); queryWrapper.ge(model.getRentDateStart()!=null, MemberRides::getRentDate,model.getRentDateStart()); queryWrapper.le(model.getRentDateEnd()!=null, MemberRides::getRentDate,model.getRentDateEnd()); queryWrapper.eq(model.getCloseStatus()!=null,MemberRides::getCloseStatus, model.getCloseStatus()); queryWrapper.eq(model.getGoodsorderId()!=null,MemberRides::getOrdreId, model.getGoodsorderId()); queryWrapper.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::getBackDate,MemberRidesDTO::getBackDate); return queryWrapper; } @Override public String 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.getBikeCode(); } /** * 骑行时长修改 * @param memberRides */ @Override public void updateDuration(MemberRides memberRides){ LoginUserInfo user =(LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(StringUtils.isBlank(memberRides.getMemberId()) ||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.ONE){ 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(update.getBackDate()); log.setCreator(user.getId()); log.setBeforeContent(beforeContent); log.setAfterContent(after); log.setUserId(user.getId()); log.setUserType(Constants.ONE); log.setParam(JSONObject.toJSONString(memberRides )); log.setType(Constants.ActionLogObjType.memberrides); log.setResult(Constants.ZERO); log.setObjId(model.getId()); log.setObjType(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.getMemberId()) ||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(),"对不起,只能针对未还车辆进行强制还车操作!" ); } 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.setDuration(DateUtil.betweenMin(model.getRentDate(), update.getBackDate())); memberRidesMapper.updateById(update); //修改前 String beforeContent = JSONObject.toJSONString(model); //修改后 String after = JSONObject.toJSONString(update); ActionLog log = new ActionLog(); log.setId(Constants.getUUID()); log.setIsdeleted(Constants.ZERO); log.setCreateDate(update.getBackDate()); log.setCreator(user.getId()); log.setBeforeContent(beforeContent); log.setAfterContent(after); log.setUserId(user.getId()); log.setUserType(Constants.ONE); log.setParam(JSONObject.toJSONString(memberRides )); log.setType(Constants.ActionLogObjType.memberrides); log.setResult(Constants.ZERO); log.setObjId(model.getId()); log.setObjType(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){ //判断当前是否已支付押金 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(),"存在骑行中车辆,无法扫码"); }; Locks locks = locksMapper.selectOne(new QueryWrapper().eq("code",code).eq("isdeleted", Constants.ZERO).last("limit 1")); Boolean flag = deviceService.openLock(locks); if(!flag){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"开锁失败"); } //存储骑行记录 MemberRides memberRides = new MemberRides(); memberRides.setIsdeleted(Constants.ZERO); memberRides.setMemberId(memberId); memberRides.setCreateDate(new Date()); memberRides.setRentSiteId(locks.getSiteId()); memberRides.setRentLockId(locks.getId()); memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()); memberRidesMapper.insert(memberRides); MemberRidesDetailResponse memberRidesDetailResponse = new MemberRidesDetailResponse(); BeanUtils.copyProperties(memberRides,memberRidesDetailResponse); return memberRidesDetailResponse; } @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; } }