#
vincentlu
2 天以前 d58a5160d46bd0f83fdd73e9e49061b33e1d241b
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/MissionServiceImpl.java
@@ -2,15 +2,19 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.exception.CoolException;
import com.zy.acs.manager.common.exception.BusinessException;
import com.zy.acs.manager.core.service.MapService;
import com.zy.acs.manager.manager.controller.result.MissionVo;
import com.zy.acs.manager.manager.entity.*;
import com.zy.acs.manager.manager.enums.SegmentStateType;
import com.zy.acs.manager.manager.enums.*;
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;
/**
@@ -29,6 +33,10 @@
    private AgvDetailService agvDetailService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private BusService busService;
    @Autowired
    private SqlSession sqlSession;
    @Override
    public List<MissionVo> getList(Long agvId, String groupNo) {
@@ -61,12 +69,18 @@
        Long recentCode = agvDetail.getRecentCode();
        String currCode = null;
        if (null != recentCode) {
            currCode = codeService.getById(recentCode).getData();
            Code cacheById = codeService.getCacheById(recentCode);
            if (cacheById != null) {
                currCode = cacheById.getData();
            } else {
                throw new CoolException(segment.getAgvId() + "小车还在删除的点位中");
            }
        }
        // action -------------------------------
        List<Action> actionList = actionService.list(new LambdaQueryWrapper<Action>()
                .eq(Action::getGroupId, groupNo).orderByDesc(Action::getPriority));
                .eq(Action::getGroupId, groupNo).ne(Action::getActionSts, ActionStsType.EXPIRED.val()).orderByDesc(Action::getPriority));
        if (Cools.isEmpty(actionList)) {
            return null;
        }
@@ -95,7 +109,7 @@
            return null;
        }
        List<Action> actionList = actionService.list(new LambdaQueryWrapper<Action>()
                .eq(Action::getGroupId, groupNo).orderByDesc(Action::getPriority));
                .eq(Action::getGroupId, groupNo).ne(Action::getActionSts, ActionStsType.EXPIRED.val()).orderByDesc(Action::getPriority));
        if (Cools.isEmpty(actionList)) {
            return null;
        }
@@ -113,11 +127,129 @@
    }
    @Override
    @Transactional
    public Boolean resend(List<Action> actionList) {
        if (Cools.isEmpty(actionList)) {
            return Boolean.FALSE;
        }
        Date now = new Date();
        List<Long> actionIds = actionList.stream().map(Action::getId).collect(Collectors.toList());
        Action firstAction = actionService.getById(actionIds.get(0));
        if (firstAction == null) {
            return Boolean.FALSE;
        }
        String actionGroupId = firstAction.getGroupId();
        actionService.updateStsByGroupId(actionGroupId, ActionStsType.EXPIRED.val());
        // if firstAction is not turn, insert a new turn action
        Action prependTurn = null;
        if (!firstAction.getActionType().equals(ActionTypeType.TurnCorner.val())) {
            String codeData = firstAction.getCode();
            Code code = codeService.getCacheByData(codeData);
            AgvDetail agvDetail = agvDetailService.selectMajorByAgvId(firstAction.getAgvId());
            Double lastDirection = MapService.mapToNearest(agvDetail.getAgvAngle());
            List<Action> fullActionList = actionService.list(new LambdaQueryWrapper<Action>()
                            .eq(Action::getGroupId, actionGroupId)
                            .select(Action::getId, Action::getActionType, Action::getPriority)
                            .orderByDesc(Action::getPriority)
            );
            int idx = -1;
            for (int k = 0; k < fullActionList.size(); k++) {
                if (fullActionList.get(k).getId().equals(firstAction.getId())) {
                    idx = k;
                    break;
                }
            }
            if (idx > 0) {
                Long turnActionId = null;
                // find out turn action
                for (int k = idx - 1; k >= 0; k--) {
                    Action a = fullActionList.get(k);
                    if (a.getActionType().equals(ActionTypeType.TurnCorner.val())) {
                        turnActionId = a.getId();
                        break;
                    }
                }
                if (null != turnActionId) {
                    Action turn = actionService.getById(turnActionId);
                    Double direction = Double.parseDouble(turn.getParams());
                    // new turn action
                    prependTurn = new Action(
                            null,    // 编号
                            firstAction.getBusId(),    // 总线
                            firstAction.getTaskId(),    // 任务
                            null,    // 动作号
                            null,    // 优先级
                            ActionTypeType.TurnCorner.desc,    // 名称
                            (double) MapService.calcSpinDirection(code, lastDirection, direction).val,    // 属性值
                            code.getData(),    // 地面码
                            String.valueOf(direction),   // 动作参数
                            ActionTypeType.TurnCorner.val(),    // 动作类型
                            ActionStsType.PREPARE.val(),    // 动作进度
                            firstAction.getAgvId(),    // AGV
                            now    // 工作时间
                    );
                }
            }
        }
        List<Action> newActionList = new ArrayList<>();
        if (prependTurn != null) {
            prependTurn.setGroupId(actionGroupId);
            prependTurn.setCreateTime(now);
            prependTurn.setUpdateTime(now);
            newActionList.add(prependTurn);
        }
        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.setId(null);
            action.setPriority(i);
            if (!actionService.save(action)) {
                throw new BusinessException(action.getName() + " Action Save 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;
    }