package com.zy.acs.manager.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.exception.CoolException; import com.zy.acs.manager.manager.entity.Segment; import com.zy.acs.manager.manager.entity.Travel; import com.zy.acs.manager.manager.enums.SegmentStateType; import com.zy.acs.manager.manager.enums.TravelStateType; import com.zy.acs.manager.manager.mapper.TravelMapper; import com.zy.acs.manager.manager.service.SegmentService; import com.zy.acs.manager.manager.service.TravelService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.Objects; @Slf4j @Service("travelService") public class TravelServiceImpl extends ServiceImpl implements TravelService { @Autowired private SegmentService segmentService; @Override public void checkFinish(Long travelId) { Travel travel = this.getById(travelId); if (TravelStateType.FINISH.toString().equals(travel.getState())) { return; } List segmentList = segmentService.list(new LambdaQueryWrapper().eq(Segment::getTravelId, travelId)); boolean finish = true; for (Segment segment : segmentList) { if (!SegmentStateType.FINISH.toString().equals(segment.getState())) { finish = false; break; } } if (finish) { travel.setState(TravelStateType.FINISH.toString()); travel.setUpdateTime(new Date()); if (!this.updateById(travel)) { throw new CoolException("Travel failed to update"); } } } @Override public void finishAll(Long agvId) { List travelList = this.list(new LambdaQueryWrapper() .eq(Travel::getAgvId, agvId).eq(Travel::getState, TravelStateType.RUNNING.toString())); for (Travel travel : travelList) { travel.setState(TravelStateType.FINISH.toString()); travel.setUpdateTime(new Date()); if (!this.updateById(travel)) { log.error("failed to finish travel all"); } } } @Override public Travel findRunningTravel(Long agvId) { return this.getOne(new LambdaQueryWrapper() .eq(Travel::getAgvId, agvId) .eq(Travel::getState, TravelStateType.RUNNING.toString()) .orderByDesc(Travel::getCreateTime) .last("limit 1") ); } @Override public Travel findRollerWaitingTravel(Long agvId, Long code) { return this.getOne(new LambdaQueryWrapper() .eq(Travel::getAgvId, agvId) .eq(Travel::getState, TravelStateType.RUNNING.toString()) .eq(Travel::getRollerWaiting, 1) .eq(Travel::getRollerWaitingCode, code) .orderByDesc(Travel::getCreateTime) .last("limit 1") ); } @Override public Boolean hasRollerWaiting(Long agvId) { if (null == agvId) { return false; } return 0 < this.count(new LambdaQueryWrapper() .eq(Travel::getAgvId, agvId) .eq(Travel::getState, TravelStateType.RUNNING.toString()) .eq(Travel::getRollerWaiting, 1) ); } @Override public Boolean markRollerWaiting(Long travelId, Long codeId) { if (Cools.isEmpty(travelId, codeId)) { return false; } Travel travel = this.getById(travelId); if (travel == null) { return false; } if (!TravelStateType.RUNNING.toString().equals(travel.getState())) { return false; } if (travel.getRollerWaiting() == 1 && Objects.equals(travel.getRollerWaitingCode(), codeId)) { return true; } travel.setRollerWaiting(1); travel.setRollerWaitingCode(codeId); if (!this.updateById(travel)) { log.error("travel [{}] failed to mark roller waiting (code={})", travelId, codeId); return false; } return true; } @Override public Boolean clearRollerWaiting(Long travelId) { if (null == travelId) { return false; } Travel travel = this.getById(travelId); if (travel == null) { return false; } // if (!TravelStateType.RUNNING.toString().equals(travel.getState())) { // return false; // } if (travel.getRollerWaiting() == 0 && Cools.isEmpty(travel.getRollerWaitingCode())) { return true; } if (!this.update( new LambdaUpdateWrapper() .eq(Travel::getId, travelId) .set(Travel::getRollerWaiting, 0) .set(Travel::getRollerWaitingCode, null) )) { log.error("travel [{}] failed to clear roller waiting", travelId); return false; } return true; } }