zhang
2025-05-20 1313906bb1eb983d3beece810035e7fc28d6a92f
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/MissionServiceImpl.java
@@ -2,16 +2,20 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.common.exception.BusinessException;
import com.zy.acs.manager.manager.controller.result.MissionVo;
import com.zy.acs.manager.manager.entity.Segment;
import com.zy.acs.manager.manager.entity.*;
import com.zy.acs.manager.manager.enums.ActionStsType;
import com.zy.acs.manager.manager.enums.BusStsType;
import com.zy.acs.manager.manager.enums.SegmentStateType;
import com.zy.acs.manager.manager.service.MissionService;
import com.zy.acs.manager.manager.service.SegmentService;
import com.zy.acs.manager.manager.enums.TaskStsType;
import com.zy.acs.manager.manager.service.*;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -22,13 +26,25 @@
    @Autowired
    private SegmentService segmentService;
    @Autowired
    private ActionService actionService;
    @Autowired
    private CodeService codeService;
    @Autowired
    private AgvDetailService agvDetailService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private BusService busService;
    @Autowired
    private SqlSession sqlSession;
    @Override
    public List<MissionVo> getList(Long agvId, String groupNo) {
        List<MissionVo> result = new ArrayList<>();
        List<String> runningGroupNos = segmentService.getGroupNo(SegmentStateType.RUNNING, agvId, groupNo);
        for (String runningGroupNo : runningGroupNos) {
            MissionVo vo = generate(runningGroupNo);
            MissionVo vo = generateVo(runningGroupNo);
            if (null != vo) {
                result.add(vo);
            }
@@ -37,12 +53,32 @@
        return result;
    }
    public MissionVo generate(String groupNo) {
    @Override
    public MissionVo generateVo(String groupNo) {
        if (Cools.isEmpty(groupNo)) {
            return null;
        }
        // segment -------------------------------
        List<Segment> list = segmentService.list(new LambdaQueryWrapper<Segment>().eq(Segment::getGroupId, groupNo).orderByAsc(Segment::getSerial));
        if (Cools.isEmpty(list)) {
            return null;
        }
        Segment segment = list.get(0);
        // agv -------------------------------
        AgvDetail agvDetail = agvDetailService.selectByAgvId(segment.getAgvId());
        Long recentCode = agvDetail.getRecentCode();
        String currCode = null;
        if (null != recentCode) {
            currCode = codeService.getCacheById(recentCode).getData();
        }
        // action -------------------------------
        List<Action> actionList = actionService.list(new LambdaQueryWrapper<Action>()
                .eq(Action::getGroupId, groupNo).ne(Action::getActionSts, ActionStsType.EXPIRED.val()).orderByDesc(Action::getPriority));
        if (Cools.isEmpty(actionList)) {
            return null;
        }
        MissionVo vo = new MissionVo();
        vo.setGroupNo(groupNo);
@@ -52,7 +88,112 @@
        vo.setTaskNos(list.stream().map(Segment::getTaskId$).collect(Collectors.toList()));
        vo.setBackpack(segment.getBackpack());
        vo.setDestCode(segment.getEndNode$());
        vo.setCurrCode(currCode);
        vo.setProgress(calcProgress(currCode, actionList));
        return vo;
    }
    @Override
    public MissionVo generateVoMoreInfo(String groupNo) {
        MissionVo vo = generateVo(groupNo);
        if (null == vo) {
            return vo;
        }
        List<Segment> list = segmentService.list(new LambdaQueryWrapper<Segment>().eq(Segment::getGroupId, groupNo).orderByAsc(Segment::getSerial));
        if (Cools.isEmpty(list)) {
            return null;
        }
        List<Action> actionList = actionService.list(new LambdaQueryWrapper<Action>()
                .eq(Action::getGroupId, groupNo).ne(Action::getActionSts, ActionStsType.EXPIRED.val()).orderByDesc(Action::getPriority));
        if (Cools.isEmpty(actionList)) {
            return null;
        }
        Segment segment = list.get(0);
        Action action = actionList.get(0);
        Task task = taskService.getById(segment.getTaskId());
//        vo.setSendTime(action.getStartTime());
        vo.setBusNo(task.getBusId$());
        vo.setActionCount(actionList.size());
        vo.setTaskIds(list.stream().map(Segment::getTaskId).collect(Collectors.toList()));
        vo.setCodeList(actionList.stream().map(Action::getCode).distinct().collect(Collectors.toList()));
        vo.setActionIds(actionList.stream().map(Action::getId).collect(Collectors.toList()));
        return vo;
    }
    @Override
    @Transactional
    public Boolean resend(List<Action> actionList) {
        if (Cools.isEmpty(actionList)) {
            return Boolean.FALSE;
        }
        List<Long> actionIds = actionList.stream().map(Action::getId).collect(Collectors.toList());
        String actionGroupId = actionService.getById(actionIds.get(0)).getGroupId();
        actionService.updateStsByGroupId(actionGroupId, ActionStsType.EXPIRED.val());
        List<Action> newActionList = new ArrayList<>();
        Date now = new Date();
        for (Long actionId : actionIds) {
            sqlSession.clearCache();
            Action action = actionService.getById(actionId);
            action.setActionSts(ActionStsType.PREPARE.val());
            action.setIoTime(now);
            action.setUpdateTime(now);
            newActionList.add(action);
        }
        int i = newActionList.size();
        for (Action action : newActionList) {
            action.setPriority(i);
            if (!actionService.save(action)) {
                throw new BusinessException(action.getName() + " Action Update Fail!");
            }
            i -= 1;
        }
        Set<Long> busIds = new HashSet<>();
        List<Long> taskIds = actionService.selectTaskIdsByGroupId(actionGroupId);
        for (Long taskId : taskIds) {
            Task task = taskService.getById(taskId);
            if (null != task) {
                task.setTaskSts(TaskStsType.ASSIGN.val());
                task.setUpdateTime(now);
                task.setIoTime(now);
                if (!taskService.updateById(task)) {
                    throw new BusinessException(task.getUuid() + " Task Update Fail!");
                }
                busIds.add(task.getBusId());
            }
        }
        for (Long busId : busIds) {
            Bus bus = busService.getById(busId);
            if (null != bus) {
                bus.setBusSts(BusStsType.PROGRESS.val());
                bus.setUpdateTime(now);
                if (!busService.updateById(bus)) {
                    throw new BusinessException(bus.getUuid() + " Bus Update Fail!");
                }
            }
        }
        return Boolean.TRUE;
    }
    public Double calcProgress(String currCode, List<Action> actionList) {
        double progress = 0D;
        if (Cools.isEmpty(actionList, currCode)) {
            return progress;
        }
        List<String> codeList = actionList.stream().map(Action::getCode).distinct().collect(Collectors.toList());
        int totalCodes = codeList.size();
        int currentIndex = codeList.indexOf(currCode);
        if (currentIndex >= 0) {
            progress = (currentIndex + 1) * 100.0 / totalCodes;
        }
        return progress;
    }
}