package com.zy.asrs.wcs.core.utils; 
 | 
  
 | 
import com.alibaba.fastjson.JSON; 
 | 
import com.zy.asrs.framework.common.SpringUtils; 
 | 
import com.zy.asrs.wcs.core.domain.dto.RedisMapDto; 
 | 
import com.zy.asrs.wcs.core.model.MapNode; 
 | 
import com.zy.asrs.wcs.core.model.NavigateNode; 
 | 
import com.zy.asrs.wcs.core.model.enums.NavigationMapType; 
 | 
import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Component; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.Date; 
 | 
import java.util.List; 
 | 
  
 | 
@Component 
 | 
public class NavigateMapUtils { 
 | 
  
 | 
    @Autowired 
 | 
    private NavigateMapData navigateMapData; 
 | 
  
 | 
    /** 
 | 
     * 写入路径节点数据到redis地图中 
 | 
     * lock为true 禁用库位,lock为false恢复库位 
 | 
     */ 
 | 
    public synchronized boolean writeNavigateNodeToRedisMap(Integer lev, Integer shuttleNo, List<NavigateNode> nodes, boolean lock) { 
 | 
        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class); 
 | 
        try { 
 | 
            if (nodes.isEmpty()) { 
 | 
                return true; 
 | 
            } 
 | 
  
 | 
            navigateMapData.setLev(lev); 
 | 
            Object o = redisUtil.get(DeviceRedisConstant.MAP + lev); 
 | 
            if (o == null) { 
 | 
                return false; 
 | 
            } 
 | 
  
 | 
            //获取小车节点 
 | 
            List<int[]> shuttlePoints = Utils.getShuttlePoints(shuttleNo, lev); 
 | 
  
 | 
            RedisMapDto redisMap = JSON.parseObject(o.toString(), RedisMapDto.class); 
 | 
            ArrayList arrayList = JSON.parseObject(redisMap.getData(), ArrayList.class); 
 | 
            //带小车地图 
 | 
            List<List<MapNode>> listsHasShuttle = navigateMapData.filterMap(NavigationMapType.NONE.id, arrayList, lev, null, shuttlePoints);//获取带小车地图数据 
 | 
            List<List<MapNode>> lists = navigateMapData.filterMap(NavigationMapType.NONE.id, arrayList, lev, null, null);//获取全部地图数据 
 | 
  
 | 
            //检测路径是否被锁定 
 | 
            if (lock) { 
 | 
                for (NavigateNode node : nodes) { 
 | 
                    List<MapNode> listX = listsHasShuttle.get(node.getX()); 
 | 
                    MapNode mapNode = listX.get(node.getY()); 
 | 
                    if (mapNode.getValue() == -999) { 
 | 
                        return false;//路径被锁定过,禁止再次锁定 
 | 
                    } 
 | 
                    if (mapNode.getValue() == 66) { 
 | 
                        return false;//路径存在小车,禁止锁定 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
  
 | 
            //尝试锁定/解锁路径 
 | 
            navigateMapData.setLev(nodes.get(0).getZ()); 
 | 
            List<List<MapNode>> realMap = navigateMapData.getJsonData(-1, null, null);//获取完整地图(包括入库出库) 
 | 
            for (NavigateNode node : nodes) { 
 | 
                if (node.getZ() != lev) { 
 | 
                    continue; 
 | 
                } 
 | 
  
 | 
                List<MapNode> listX = lists.get(node.getX()); 
 | 
                MapNode mapNode = listX.get(node.getY()); 
 | 
                if (lock) { 
 | 
                    mapNode.setValue(-999);//禁用库位 
 | 
                } else { 
 | 
                    //获取原始节点数据 
 | 
                    List<MapNode> rows = realMap.get(node.getX()); 
 | 
                    MapNode col = rows.get(node.getY()); 
 | 
                    mapNode.setValue(col.getValue());//恢复库位 
 | 
                } 
 | 
  
 | 
                listX.set(node.getY(), mapNode); 
 | 
                lists.set(node.getX(), listX); 
 | 
            } 
 | 
            redisMap.setData(JSON.toJSONString(lists)); 
 | 
            redisMap.setUpdateTime(new Date()); 
 | 
            //将数据库地图数据存入redis 
 | 
            redisUtil.set(DeviceRedisConstant.MAP + lev, JSON.toJSONString(redisMap)); 
 | 
            return true; 
 | 
        } catch (Exception e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
} 
 |