package com.zy.acs.manager.manager.service.impl; 
 | 
  
 | 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 
 | 
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 
 | 
import com.zy.acs.framework.common.BaseRes; 
 | 
import com.zy.acs.framework.common.Cools; 
 | 
import com.zy.acs.framework.common.SnowflakeIdWorker; 
 | 
import com.zy.acs.framework.exception.CoolException; 
 | 
import com.zy.acs.manager.common.exception.BusinessException; 
 | 
import com.zy.acs.manager.manager.entity.FuncSta; 
 | 
import com.zy.acs.manager.manager.entity.Loc; 
 | 
import com.zy.acs.manager.manager.entity.Sta; 
 | 
import com.zy.acs.manager.manager.entity.Task; 
 | 
import com.zy.acs.manager.manager.enums.*; 
 | 
import com.zy.acs.manager.manager.mapper.TaskMapper; 
 | 
import com.zy.acs.manager.manager.service.CodeService; 
 | 
import com.zy.acs.manager.manager.service.FuncStaService; 
 | 
import com.zy.acs.manager.manager.service.LocService; 
 | 
import com.zy.acs.manager.manager.service.TaskService; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.util.*; 
 | 
  
 | 
@Slf4j 
 | 
@Service("taskService") 
 | 
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService { 
 | 
  
 | 
    @Autowired 
 | 
    private CodeService codeService; 
 | 
    @Autowired 
 | 
    private LocService locService; 
 | 
    @Autowired 
 | 
    private FuncStaService funcStaService; 
 | 
    @Autowired 
 | 
    private SnowflakeIdWorker snowflakeIdWorker; 
 | 
  
 | 
    @Override 
 | 
    public synchronized String generateSeqNum() { 
 | 
        return String.valueOf(snowflakeIdWorker.nextId()).substring(13, 19); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Task pick(TaskStsType taskStsType) { 
 | 
        List<Task> list = this.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, taskStsType.val()).orderByDesc(Task::getPriority)); 
 | 
        return !Cools.isEmpty(list)?list.get(0):null; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Task selectByUuid(String uuid) { 
 | 
        return this.getOne(new LambdaQueryWrapper<Task>().eq(Task::getUuid, uuid)); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<Task> selectBySts(TaskStsType taskStsType) { 
 | 
        LambdaQueryWrapper<Task> wrapper = new LambdaQueryWrapper<>(); 
 | 
        wrapper.eq(Task::getTaskSts, taskStsType.val()); 
 | 
        return this.list(wrapper); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<Task> selectInSts(Long agvId, TaskStsType... taskStsTypes) { 
 | 
        LambdaQueryWrapper<Task> wrapper = new LambdaQueryWrapper<>(); 
 | 
        List<Long> params = new ArrayList<>(); 
 | 
        for (TaskStsType type : taskStsTypes) { 
 | 
            params.add(type.val()); 
 | 
        } 
 | 
        wrapper.in(Task::getTaskSts, params); 
 | 
        if (null != agvId) { 
 | 
            wrapper.eq(Task::getAgvId, agvId); 
 | 
        } 
 | 
        return this.list(wrapper); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<Map<String, Object>> selectStatByLastSevenDays() { 
 | 
        return this.baseMapper.selectStatByLastSevenDays(); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public Boolean complete(Long taskId, Long userId) { 
 | 
        Task task = this.getById(taskId); 
 | 
        if (null == task) { 
 | 
            return Boolean.FALSE; 
 | 
        } 
 | 
        this.maintainLocSts(task, Boolean.TRUE); 
 | 
  
 | 
        task.setTaskSts(TaskStsType.COMPLETE.val()); 
 | 
        task.setUpdateTime(new Date()); 
 | 
        task.setUpdateBy(userId); 
 | 
        if (!this.updateById(task)) { 
 | 
            throw new CoolException(BaseRes.ERROR); 
 | 
        } 
 | 
        return Boolean.TRUE; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public Boolean cancel(Long taskId, Long userId) { 
 | 
        Task task = this.getById(taskId); 
 | 
        if (null == task) { 
 | 
            return Boolean.FALSE; 
 | 
        } 
 | 
        this.maintainLocSts(task, Boolean.FALSE); 
 | 
  
 | 
        task.setTaskSts(TaskStsType.CANCEL.val()); 
 | 
        task.setUpdateTime(new Date()); 
 | 
        task.setUpdateBy(userId); 
 | 
        if (!this.updateById(task)) { 
 | 
            throw new CoolException(BaseRes.ERROR); 
 | 
        } 
 | 
        return Boolean.TRUE; 
 | 
    } 
 | 
  
 | 
    @Transactional 
 | 
    public void maintainLocSts(Task task, Boolean complete) { 
 | 
        Loc oriLoc = null; Loc destLoc = null; 
 | 
        Sta oriSta = null; Sta destSta = null; 
 | 
        Date now = new Date(); 
 | 
        TaskTypeType typeType = TaskTypeType.get(task.getTaskTypeEl()); 
 | 
        switch (Objects.requireNonNull(typeType)) { 
 | 
            case LOC_TO_LOC: 
 | 
                oriLoc = locService.getById(task.getOriLoc()); 
 | 
                destLoc = locService.getById(task.getDestLoc()); 
 | 
  
 | 
                oriLoc.setLocSts(complete?LocStsType.IDLE.val():LocStsType.STOCK.val()); 
 | 
                oriLoc.setUpdateTime(now); 
 | 
                if (!locService.updateById(oriLoc)) { 
 | 
                    throw new BusinessException("Loc [" + task.getOriLoc$() + "] 库位修改状态失败 !!!"); 
 | 
                } 
 | 
  
 | 
                destLoc.setLocSts(complete?LocStsType.STOCK.val():LocStsType.IDLE.val()); 
 | 
                destLoc.setUpdateTime(now); 
 | 
                if (!locService.updateById(destLoc)) { 
 | 
                    throw new BusinessException("Loc [" + task.getDestLoc$() + "] 库位修改状态失败 !!!"); 
 | 
                } 
 | 
                break; 
 | 
            case LOC_TO_STA: 
 | 
                oriLoc = locService.getById(task.getOriLoc()); 
 | 
                oriLoc.setLocSts(complete?LocStsType.IDLE.val():LocStsType.STOCK.val()); 
 | 
                oriLoc.setUpdateTime(now); 
 | 
                if (!locService.updateById(oriLoc)) { 
 | 
                    throw new BusinessException("Loc [" + task.getOriLoc$() + "] 库位修改状态失败 !!!"); 
 | 
                } 
 | 
                break; 
 | 
            case STA_TO_LOC: 
 | 
                destLoc = locService.getById(task.getDestLoc()); 
 | 
                destLoc.setLocSts(complete?LocStsType.STOCK.val():LocStsType.IDLE.val()); 
 | 
                destLoc.setUpdateTime(now); 
 | 
                if (!locService.updateById(destLoc)) { 
 | 
                    throw new BusinessException("Loc [" + task.getDestLoc$() + "] 库位修改状态失败 !!!"); 
 | 
                } 
 | 
                break; 
 | 
            case STA_TO_STA: 
 | 
                break; 
 | 
            case TO_CHARGE: 
 | 
            case TO_STANDBY: 
 | 
                FuncSta funcSta = funcStaService.getByCodeAndType(task.getDestCode(), FuncStaType.query(typeType).toString()); 
 | 
                if (!complete) { 
 | 
                    funcSta.setState(FuncStaStateType.IDLE.toString()); 
 | 
                    funcSta.setUpdateTime(now); 
 | 
                    if (!funcStaService.updateById(funcSta)) { 
 | 
                        throw new BusinessException("FuncSta [" + funcSta.getName() + "] 更新状态失败 !!!"); 
 | 
                    } 
 | 
                } 
 | 
                break; 
 | 
            default: 
 | 
                break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |