no message
							parent
							
								
									4bfc48abe0
								
							
						
					
					
						commit
						75d5824fb5
					
				| 
						 | 
				
			
			@ -30,8 +30,8 @@ import java.util.List;
 | 
			
		|||
 **/
 | 
			
		||||
public interface PickRepository extends JpaRepository<Pick, Long>, JpaSpecificationExecutor<Pick> {
 | 
			
		||||
 | 
			
		||||
    @Query(value = " FROM Pick p WHERE p.status in :status and p.isCall=:isCall order by p.createTime,p.lineNo  ")
 | 
			
		||||
    List<Pick> findByPickStatus(List<String> status,Boolean isCall);
 | 
			
		||||
    @Query(value = " FROM Pick p WHERE p.status in :status and p.isCall=:isCall and (:orderType is null or p.orderType = :orderType) order by p.createTime,p.lineNo  ")
 | 
			
		||||
    List<Pick> findByPickStatus(List<String> status,Boolean isCall,String orderType);
 | 
			
		||||
 | 
			
		||||
    @Query(value = " FROM Pick p WHERE p.gdCode=:gdNo and p.cpCodeOrDpCode=:completeCode and p.station=:station ")
 | 
			
		||||
    Pick findByPick(String gdNo, String completeCode, String station);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,7 @@ public interface PickService {
 | 
			
		|||
     * @param id ID
 | 
			
		||||
     * @return PickDto
 | 
			
		||||
     */
 | 
			
		||||
    PickDto findById(Long id);
 | 
			
		||||
    Pick findById(Long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建
 | 
			
		||||
| 
						 | 
				
			
			@ -102,8 +102,9 @@ public interface PickService {
 | 
			
		|||
     *  根据状态查询、是否叫料出库单
 | 
			
		||||
     * @param statuses 状态集合
 | 
			
		||||
     * @param isCall 是否叫料
 | 
			
		||||
     * @param orderType 订单类型
 | 
			
		||||
     */
 | 
			
		||||
    List<Pick> findByPickStatus(List<String> statuses, boolean isCall);
 | 
			
		||||
    List<Pick> findByPickStatus(List<String> statuses, boolean isCall,String orderType);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 刷新出库单拣货状态
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -306,7 +306,7 @@ public class KMReServiceImpl implements KMReService {
 | 
			
		|||
        missionDataMap3.put("sequence", 3);//序号
 | 
			
		||||
        missionDataMap3.put("position", agvTask.getEndSlotCode());//终点
 | 
			
		||||
        missionDataMap3.put("type", "NODE_POINT");//
 | 
			
		||||
        missionDataMap3.put("actionType", "ROLLER_RECEIVE");//
 | 
			
		||||
        missionDataMap3.put("actionType", "ROLLER_SEND");//
 | 
			
		||||
        missionDataMap3.put("binCode", "");//容器
 | 
			
		||||
        missionDataMap3.put("rollerLevel", 1);//
 | 
			
		||||
        missionDataMap3.put("deviceCode", agvTask.getEndSlotCode());//终点
 | 
			
		||||
| 
						 | 
				
			
			@ -482,7 +482,7 @@ public class KMReServiceImpl implements KMReService {
 | 
			
		|||
                handleCpOffLine(endPoint, stock);//成品下线完成
 | 
			
		||||
                break;
 | 
			
		||||
            case BizStatus.Fx_Off_Line:
 | 
			
		||||
                handleFxOffLine(agvTask);//返修下线完成
 | 
			
		||||
                handleFxOffLine(agvTask);//返修
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -159,8 +159,10 @@ public class MesServiceImpl implements MesService {
 | 
			
		|||
                moveCpOffLine(transTask);//送满货架
 | 
			
		||||
                break;
 | 
			
		||||
            case BizStatus.Fx_Off_Line:
 | 
			
		||||
                moveFxOffLine(transTask);//滚筒
 | 
			
		||||
                moveFxOffLine(transTask);//返修呼叫空托盘、返修下线
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                throw new BadRequestException("任务类型错误!");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -338,22 +340,34 @@ public class MesServiceImpl implements MesService {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    private void moveFxOffLine(TransTask transTask) {
 | 
			
		||||
        if (!gtLineMap.containsKey(transTask.getPointCode())) {
 | 
			
		||||
            throw new BadRequestException(transTask.getPointCode() + "点位不是下线点,请核实!");
 | 
			
		||||
        }
 | 
			
		||||
        List<String> points = gtLineMap.getData(transTask.getPointCode());
 | 
			
		||||
 | 
			
		||||
        //验证终点是否有任务
 | 
			
		||||
        if (!agvTaskService.findByEndSlotCode(points.get(1), BizStatus.Fx_Off_Line, "ROLLER_MOVE")) {
 | 
			
		||||
            // 直接在条件判断为false时抛出异常,表示该点位有任务
 | 
			
		||||
            throw new BadRequestException(points.get(1) + "点位有任务,请稍后再试!");
 | 
			
		||||
        //返修上线起点
 | 
			
		||||
        String srcPointCode = transTask.getPointCode();
 | 
			
		||||
        //终点
 | 
			
		||||
        String dstPointCode;
 | 
			
		||||
        //验证点位是否为上线点
 | 
			
		||||
        if (gtLineMap.isOnlinePoint(srcPointCode)) {
 | 
			
		||||
            if ("BYDGT002".equals(srcPointCode)) {
 | 
			
		||||
                dstPointCode = "BYDGT006";
 | 
			
		||||
            } else {
 | 
			
		||||
                dstPointCode = gtLineMap.getKeyByValue(srcPointCode);
 | 
			
		||||
            }
 | 
			
		||||
        } else if (gtLineMap.isOfflinePoint(srcPointCode)) {
 | 
			
		||||
            dstPointCode = gtLineMap.getValueByKey(srcPointCode);
 | 
			
		||||
        } else {
 | 
			
		||||
            throw new BadRequestException(srcPointCode + "点位不存在,请核实");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //生成任务
 | 
			
		||||
        AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Fx_Off_Line, null, transTask.getPointCode(), points.get(1), "ROLLER_MOVE");
 | 
			
		||||
        agvTaskService.update(agvTask);
 | 
			
		||||
 | 
			
		||||
        //下发任务
 | 
			
		||||
        // 验证终点是否有任务
 | 
			
		||||
        if (!agvTaskService.findByEndSlotCode(dstPointCode, BizStatus.Fx_Off_Line, "ROLLER_MOVE")) {
 | 
			
		||||
            throw new BadRequestException(dstPointCode + "点位有任务,请稍后再试!");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 生成任务
 | 
			
		||||
        AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Fx_Off_Line, null, srcPointCode, dstPointCode, "ROLLER_MOVE");
 | 
			
		||||
 | 
			
		||||
        // 下发任务
 | 
			
		||||
        kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskGtJson(agvTask));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,10 +71,8 @@ public class PickServiceImpl implements PickService {
 | 
			
		|||
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional
 | 
			
		||||
    public PickDto findById(Long id) {
 | 
			
		||||
        Pick pick = pickRepository.findById(id).orElseGet(Pick::new);
 | 
			
		||||
        ValidationUtil.isNull(pick.getId(), "Pick", "id", id);
 | 
			
		||||
        return pickMapper.toDto(pick);
 | 
			
		||||
    public Pick findById(Long id) {
 | 
			
		||||
        return pickRepository.findById(id).orElseGet(Pick::new);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
| 
						 | 
				
			
			@ -123,8 +121,8 @@ public class PickServiceImpl implements PickService {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<Pick> findByPickStatus(List<String> statuses, boolean isCall) {
 | 
			
		||||
        return pickRepository.findByPickStatus(statuses, isCall);
 | 
			
		||||
    public List<Pick> findByPickStatus(List<String> statuses, boolean isCall,String orderType) {
 | 
			
		||||
        return pickRepository.findByPickStatus(statuses, isCall, orderType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -190,15 +190,19 @@ public class TaskServiceImpl implements TaskService {
 | 
			
		|||
        for (PickDetail pickDetail : pickDetails) {
 | 
			
		||||
            msgList.add(this.allocate(pickDetail.getId(), pickDetail.getOrderQty(), endPoint));
 | 
			
		||||
        }
 | 
			
		||||
        //绑定点位
 | 
			
		||||
        pick.setPoint(endPoint);
 | 
			
		||||
        pickService.update(pick);
 | 
			
		||||
 | 
			
		||||
        /* 更新出库单状态*/
 | 
			
		||||
        pickService.refreshPickStatus(pick);
 | 
			
		||||
 | 
			
		||||
        //占用点位
 | 
			
		||||
        pointService.usedPoint(endPoint);
 | 
			
		||||
        if (BizStatus.ALLOCATE.equals(pick.getStatus()) || BizStatus.ASSIGN.equals(pick.getStatus())) {
 | 
			
		||||
            //绑定点位
 | 
			
		||||
            pick.setPoint(endPoint);
 | 
			
		||||
            pickService.update(pick);
 | 
			
		||||
 | 
			
		||||
            //占用点位
 | 
			
		||||
            pointService.usedPoint(endPoint);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //保存日志
 | 
			
		||||
        logService.saveLogInfo(pick.getCode(), pick.getCode(), "/pick/allocatePick", msgList.toString(), "出库单分配", 200, "info");
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +215,7 @@ public class TaskServiceImpl implements TaskService {
 | 
			
		|||
        List<Task> taskList = this.findByPickNotAllTask(pick.getId());
 | 
			
		||||
        for (Task task : taskList) {
 | 
			
		||||
            /*生成搬运任务*/
 | 
			
		||||
            List<AgvTask> agvTaskList = agvTaskService.findRepeat(task.getSrcStockCode(),task.getSrcPointCode(),task.getDstPointCode());
 | 
			
		||||
            List<AgvTask> agvTaskList = agvTaskService.findRepeat(task.getSrcStockCode(), task.getSrcPointCode(), task.getDstPointCode());
 | 
			
		||||
            if (agvTaskList.isEmpty()) {
 | 
			
		||||
                //创建任务
 | 
			
		||||
                agvTask = agvTaskService.createAgvTask(BizStatus.PICK, task.getSrcStock(), task.getSrcPoint().getCode(), task.getDstPoint().getCode(), "FORKLIFT_MOVE");
 | 
			
		||||
| 
						 | 
				
			
			@ -259,13 +263,12 @@ public class TaskServiceImpl implements TaskService {
 | 
			
		|||
        Point endPoint = pointList.get(0);
 | 
			
		||||
 | 
			
		||||
        //有任务则直接返回
 | 
			
		||||
        List<AgvTask> agvTaskList = agvTaskService.findRepeat(stock.getCode(),srcPoint.getCode(),endPoint.getCode());
 | 
			
		||||
        List<AgvTask> agvTaskList = agvTaskService.findRepeat(stock.getCode(), srcPoint.getCode(), endPoint.getCode());
 | 
			
		||||
        if (!agvTaskList.isEmpty()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //创建任务
 | 
			
		||||
        agvTaskService.createAgvTask(BizStatus.CALL_RETURN, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,7 @@ import com.youchain.businessdata.service.AgvTaskService;
 | 
			
		|||
import com.youchain.businessdata.service.KMReService;
 | 
			
		||||
import com.youchain.businessdata.service.PickService;
 | 
			
		||||
import com.youchain.businessdata.service.TaskService;
 | 
			
		||||
import com.youchain.businessdata.service.dto.PickDto;
 | 
			
		||||
import com.youchain.exception.BadRequestException;
 | 
			
		||||
import com.youchain.utils.*;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
| 
						 | 
				
			
			@ -37,13 +38,29 @@ public class pickTask {
 | 
			
		|||
    public KMReService kmReService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 轮询打开和分配中的出库单,分配库存
 | 
			
		||||
     * 轮询打开和分配中的成品出库单,分配库存
 | 
			
		||||
     */
 | 
			
		||||
    public void allocatePick() {
 | 
			
		||||
    public void allocateCpPick() {
 | 
			
		||||
        List<String> statuses = Arrays.asList(BizStatus.OPEN, BizStatus.ASSIGN);
 | 
			
		||||
        List<Pick> pickList = pickService.findByPickStatus(statuses, false);
 | 
			
		||||
        List<Pick> pickList = pickService.findByPickStatus(statuses, false,BaseStatus.GD_TYPE_CT);
 | 
			
		||||
        if (pickList.isEmpty()) {
 | 
			
		||||
            throw new BadRequestException("无待分配的出库单,分配失败!");
 | 
			
		||||
            throw new BadRequestException("无待分配的成品出库单,分配失败!");
 | 
			
		||||
        }
 | 
			
		||||
        for (Pick pick : pickList) {
 | 
			
		||||
            taskService.allocatePick(pick);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /***
 | 
			
		||||
     * 轮询打开和分配中的单品品出库单,分配库存
 | 
			
		||||
     */
 | 
			
		||||
    public void allocateDpPick() {
 | 
			
		||||
        List<String> statuses = Arrays.asList(BizStatus.OPEN, BizStatus.ASSIGN);
 | 
			
		||||
        List<Pick> pickList = pickService.findByPickStatus(statuses, false, BaseStatus.GD_TYPE_DP);
 | 
			
		||||
        if (pickList.isEmpty()) {
 | 
			
		||||
            throw new BadRequestException("无待分配的单品出库单,分配失败!");
 | 
			
		||||
        }
 | 
			
		||||
        for (Pick pick : pickList) {
 | 
			
		||||
            taskService.allocatePick(pick);
 | 
			
		||||
| 
						 | 
				
			
			@ -54,12 +71,11 @@ public class pickTask {
 | 
			
		|||
 | 
			
		||||
    /**
 | 
			
		||||
     * 轮询已分配的出库单,生成备料任务
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public void pickAgvTask() {
 | 
			
		||||
        /*查询分配完成的出库单*/
 | 
			
		||||
        List<String> statuses = Arrays.asList(BizStatus.ALLOCATE);
 | 
			
		||||
        List<Pick> pickList = pickService.findByPickStatus(statuses, false);
 | 
			
		||||
        List<Pick> pickList = pickService.findByPickStatus(statuses, false,null);
 | 
			
		||||
        if (pickList.isEmpty()) {
 | 
			
		||||
            throw new BadRequestException("无已分配的出库单,下发任务失败!");
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +91,7 @@ public class pickTask {
 | 
			
		|||
    public void callJlTask() {
 | 
			
		||||
        /*查询拣货完成完成的出库单*/
 | 
			
		||||
        List<String> statuses = Arrays.asList(BizStatus.PICK_ALL);
 | 
			
		||||
        List<Pick> pickList = pickService.findByPickStatus(statuses, true);
 | 
			
		||||
        List<Pick> pickList = pickService.findByPickStatus(statuses, true,null);
 | 
			
		||||
        if (pickList.isEmpty()) {
 | 
			
		||||
            throw new BadRequestException("无拣货完成的出库单或出库单未叫料,叫料失败!");
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -144,7 +144,6 @@ public interface BizStatus {
 | 
			
		|||
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务类型-叫料反空
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    String CALL_RETURN = "CALL_RETURN";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,35 +2,84 @@ package com.youchain.utils;
 | 
			
		|||
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.concurrent.ConcurrentHashMap;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 滚筒任务路线
 | 
			
		||||
 * 下线点 BYDGTO06、BYDGT007、BVDGTO01、BXDGT003、BYDGT005
 | 
			
		||||
 * 上线点 BYDGTO02、BYDGTO04、BYDGTO08
 | 
			
		||||
 * 下线:下线点 BYDGTO06、BYDGT007、BVDGTO01、BXDGT003、BYDGT005
 | 
			
		||||
 * 上线:上线点 BYDGTO02、BYDGTO04、BYDGTO08
 | 
			
		||||
 */
 | 
			
		||||
@Component
 | 
			
		||||
public class GtLineMap {
 | 
			
		||||
    public static final Map<String, List<String>> dataMap;
 | 
			
		||||
    /**
 | 
			
		||||
     * 关联关系映射
 | 
			
		||||
     */
 | 
			
		||||
    public static final Map<String, String> dataMap;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 上线点集合
 | 
			
		||||
     */
 | 
			
		||||
    private static final Set<String> ONLINE_POINTS;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 下线点集合
 | 
			
		||||
     */
 | 
			
		||||
    private static final Set<String> OFFLINE_POINTS;
 | 
			
		||||
 | 
			
		||||
    static {
 | 
			
		||||
        dataMap = new ConcurrentHashMap<>();
 | 
			
		||||
        // 初始化Map
 | 
			
		||||
        dataMap.put("BYDGT006", Arrays.asList("FX001", "BYDGT002"));
 | 
			
		||||
        dataMap.put("BYDGT007", Arrays.asList("FX001", "BYDGT002"));
 | 
			
		||||
        dataMap.put("BYDGT001", Arrays.asList("FX001", "BYDGT002"));
 | 
			
		||||
        dataMap.put("BYDGT003", Arrays.asList("FX001", "BYDGT004"));
 | 
			
		||||
        dataMap.put("BYDGT005", Arrays.asList("FX001", "BYDGT008"));
 | 
			
		||||
        dataMap.put("BYDGT006", "BYDGT002");
 | 
			
		||||
        dataMap.put("BYDGT007", "BYDGT002");
 | 
			
		||||
        dataMap.put("BYDGT001", "BYDGT002");
 | 
			
		||||
        dataMap.put("BYDGT003", "BYDGT004");
 | 
			
		||||
        dataMap.put("BYDGT005", "BYDGT008");
 | 
			
		||||
 | 
			
		||||
        // 初始化上线点
 | 
			
		||||
        ONLINE_POINTS = new HashSet<>(Arrays.asList(
 | 
			
		||||
                "BYDGT002", "BYDGT004", "BYDGT008"
 | 
			
		||||
        ));
 | 
			
		||||
 | 
			
		||||
        // 初始化下线点
 | 
			
		||||
        OFFLINE_POINTS = new HashSet<>(Arrays.asList(
 | 
			
		||||
                "BYDGT001", "BYDGT003", "BYDGT005", "BYDGT006", "BYDGT007"
 | 
			
		||||
        ));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<String> getData(String key) {
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过key获取value
 | 
			
		||||
     */
 | 
			
		||||
    public String getValueByKey(String key) {
 | 
			
		||||
        return dataMap.get(key);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean containsKey(String key) {
 | 
			
		||||
        return dataMap.containsKey(key);
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过value获取key
 | 
			
		||||
     */
 | 
			
		||||
    public String getKeyByValue(String value) {
 | 
			
		||||
        return dataMap.entrySet().stream()
 | 
			
		||||
                .filter(entry -> value.equals(entry.getValue()))
 | 
			
		||||
                .map(Map.Entry::getKey)
 | 
			
		||||
                .findFirst()
 | 
			
		||||
                .orElse(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 判断是否为上线点
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isOnlinePoint(String point) {
 | 
			
		||||
        return ONLINE_POINTS.contains(point);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 判断是否为下线点
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isOfflinePoint(String point) {
 | 
			
		||||
        return OFFLINE_POINTS.contains(point);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue