jiangping
2023-10-13 c1a2d61c91cc28dec10d03f8735a4cf28add3b79
server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
@@ -25,9 +25,12 @@
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;
@@ -38,9 +41,8 @@
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 用户骑行记录表Service实现
@@ -78,6 +80,10 @@
    @Autowired
    private GoodsorderService goodsorderService;
    @Autowired
    private SystemDictDataMapper systemDictDataMapper;
    @Override
    public String create(MemberRides memberRides) {
@@ -168,7 +174,7 @@
        MPJLambdaWrapper<MemberRides> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.leftJoin(BaseParam.class,BaseParam::getId,MemberRides::getParamId);
        queryWrapper.eq(MemberRides::getMemberId, id);
        queryWrapper.eq(MemberRides::getId, id);
        queryWrapper.selectAll(MemberRides.class);
        queryWrapper.selectAs(BaseParam::getName,MemberRidesDTO::getBikeType) ;
        queryWrapper.last("limit 1");
@@ -211,13 +217,17 @@
        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)
        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);
        return queryWrapper;
    }
@@ -243,7 +253,7 @@
    @Override
    public  void updateDuration(MemberRides memberRides){
        LoginUserInfo user =(LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(StringUtils.isBlank(memberRides.getMemberId())
        if(StringUtils.isBlank(memberRides.getId())
                ||StringUtils.isBlank(memberRides.getBackReason())
                || memberRides.getDuration() == null){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -304,10 +314,9 @@
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public   void forceBack(MemberRides memberRides){
    public void forceBack(MemberRides memberRides){
        LoginUserInfo user =(LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
         if(StringUtils.isBlank(memberRides.getMemberId())
                ||StringUtils.isBlank(memberRides.getBackReason())){
         if(StringUtils.isBlank(memberRides.getBackReason())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        MemberRides model = findJoinById(memberRides.getId());
@@ -317,6 +326,12 @@
        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()
                .eq(SystemDictData::getLabel, Arrays.asList(Constants.FORCE_BACK_SITE,Constants.FORCE_BACK_LOCK));
        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());
@@ -326,6 +341,9 @@
        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());
        //计算骑行计费时长
        update.setDuration(DateUtil.betweenMin(model.getRentDate(), update.getBackDate()));
        memberRidesMapper.updateById(update);
@@ -334,6 +352,20 @@
        //修改后
        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());
@@ -509,6 +541,9 @@
     */
    @Override
    public  int mqttLockInfoEvent(Locks locks){
        if(StringUtils.isBlank(locks.getId()) ||StringUtils.isBlank(locks.getSiteId())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"锁头信息上报参数错误!");
        }
        //判断检查处理站点锁头信息
        Locks model = dealLockAndSite(locks);
        //车辆记录
@@ -525,7 +560,6 @@
            if(memberRides == null){
                return 0;
            }
            //(更新请求开锁中的锁头关联的骑行记录)
            memberRidesMapper.updateById( memberRides);
        }
@@ -611,9 +645,63 @@
        return  model;
    }
    /**
     * 还车订阅消息业务处理
     * @param bikes
     * @return
     */
    @Override
    public  int mqttCloseBikeEvent(MemberRides bikes){
        //免费骑行时长查询,数据字典配置
        if(StringUtils.isBlank(bikes.getBikeCode()) ||StringUtils.isBlank(bikes.getRentLockId())){
          throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"还车上报参数错误!");
        }
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(MemberRides::getBikeCode, bikes.getBikeCode());
        wrapper.lambda().eq(MemberRides::getStatus, Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey());
        wrapper.lambda().eq(MemberRides::getIsdeleted, Constants.ZERO);
        //根据车辆编码查询骑行中的骑行记录信息,如果有进行还车操作
        MemberRides memberRides = memberRidesMapper.selectOne(wrapper.last("last 1"));
        if(memberRides!=null){
            //进行
            dealMemberRidesBack(memberRides,bikes);
        }
        return  0;
    }
    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;
        update.setDuration(duration>0?duration:0);
        update.setBackType(Constants.ONE);
        update.setBackInfo("用户正常还车");
        Bikes bikes = new Bikes();
        bikes.setSiteId(memberRides.getBackSiteId());
        bikes.setLockId(memberRides.getBackLockId());
//        bikes.setCode(memberRides.getBikeCode());
        bikes = bikesMapper.selectById(new QueryWrapper<>(bikes).last("limit 1"));
        if(bikes != null ) {
            UpdateWrapper<Bikes> updateWrapper = new UpdateWrapper<>();
            updateWrapper.lambda().set(Bikes::getId, bikes.getId());
            updateWrapper.lambda().set(Bikes::getEditDate,new Date());
            updateWrapper.lambda().set(Bikes::getLastBackDate,new Date());
            //更新自行车最后还车时间
            bikesMapper.updateById(bikes);
        }
        //更新还车记录为已还车
        memberRidesMapper.updateById(update);
    }
}