/// <summary> /// 控制出库任务的生成,包括产品出库,空筐出库 /// </summary> /// <param name="asrsCtl"></param> /// <param name="reStr"></param> /// <returns></returns> private bool AsrsCheckoutLoop(AsrsControl.AsrsCtlModel asrsCtl, SysCfg.EnumAsrsTaskType taskType, ref string reStr) { try { CtlDBAccess.BLL.ControlTaskBll ctlTaskBll = new CtlDBAccess.BLL.ControlTaskBll(); // SysCfg.EnumAsrsTaskType taskType = SysCfg.EnumAsrsTaskType.产品出库; // 1产品出库 List <AsrsPortalModel> ports = asrsCtl.GetOutPortsOfBindedtask(taskType); string houseName = asrsCtl.HouseName; AsrsModel.EnumCellStatus targetStoreStatus = EnumCellStatus.满位; if (taskType == SysCfg.EnumAsrsTaskType.空筐出库) { targetStoreStatus = EnumCellStatus.空料框; } foreach (AsrsPortalModel port in ports) { if (taskType == SysCfg.EnumAsrsTaskType.空筐出库) { if (port.Db2Vals[0] != 2 || port.Db2Vals[2] != 1) //禁止出库 { continue; } } else //禁止出库 { if (port.Db2Vals[0] != 2 || port.Db2Vals[1] != 1) { continue; } } //查询是否有待执行或者执行中的任务 string str = string.Format("DeviceID='{0}' and EndDevice='{1}' and TaskType={2} and (TaskStatus='待执行' or TaskStatus='执行中')", asrsCtl.StackDevice.NodeID, port.NodeID, (int)taskType); List <CtlDBAccess.Model.ControlTaskModel> taskList = ctlTaskBll.GetModelList(str); if (taskList != null && taskList.Count() > 0) { continue; } //遍历所有库位,判断材料类别,按照先入先出规则,匹配出库的货位。 Dictionary <string, AsrsModel.GSMemTempModel> asrsStatDic = new Dictionary <string, AsrsModel.GSMemTempModel>(); if (!asrsResManage.GetAllGsModel(ref asrsStatDic, ref reStr)) { Console.WriteLine(string.Format("{0} 获取货位状态失败", houseName)); return(false); } List <AsrsModel.GSMemTempModel> validCells = new List <AsrsModel.GSMemTempModel>(); int r = 1, c = 1, L = 1; //先查询所有可出库货位 for (r = 1; r < asrsCtl.AsrsRow + 1; r++) { for (c = 1; c < asrsCtl.AsrsCol + 1; c++) { for (L = 1; L < asrsCtl.AsrsLayer + 1; L++) { string strKey = string.Format("{0}:{1}-{2}-{3}", houseName, r, c, L); AsrsModel.GSMemTempModel cellStat = null; if (!asrsStatDic.Keys.Contains(strKey)) { continue; } cellStat = asrsStatDic[strKey]; if ((!cellStat.GSEnabled) || (cellStat.GSTaskStatus == AsrsModel.EnumGSTaskStatus.锁定.ToString()) || (cellStat.GSStatus != targetStoreStatus.ToString())) { // reStr = string.Format("货位{0}-{1}-{2}禁用,无法生成出库任务", cell.Row, cell.Col, cell.Layer); continue; } AsrsModel.CellCoordModel cell = new AsrsModel.CellCoordModel(r, c, L); validCells.Add(cellStat); } } } //再按照先入先出原则生成出库任务 if (validCells.Count() > 0) { //排序,按照先入先出 AsrsModel.GSMemTempModel firstGS = validCells[0]; if (validCells.Count() > 1) { for (int i = 1; i < validCells.Count(); i++) { AsrsModel.GSMemTempModel tempGS = validCells[i]; if (tempGS.InHouseDate < firstGS.InHouseDate) { firstGS = tempGS; } } } //生成出库任务 string[] strCellArray = firstGS.GSPos.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); int row = int.Parse(strCellArray[0]); int col = int.Parse(strCellArray[1]); int layer = int.Parse(strCellArray[2]); AsrsModel.CellCoordModel cell = new AsrsModel.CellCoordModel(row, col, layer); List <string> storGoods = new List <string>(); if (!asrsResManage.GetStockDetail(houseName, cell, ref storGoods)) { return(false); } string palletIDStr = ""; for (int i = 0; i < storGoods.Count(); i++) { if (storGoods.Count() > 1 && (i == storGoods.Count() - 1)) { palletIDStr = palletIDStr + storGoods[i]; } else { palletIDStr = palletIDStr + storGoods[i] + ","; } } return(asrsCtl.CreateStackerTask(port, taskType, cell, palletIDStr, ref reStr)); //if (asrsCtl.GenerateOutputTask(cell, port.BindedTaskOutput, true, port.PortSeq, ref reStr, new List<short> { palletCata })) //{ // port.Db1ValsToSnd[0] = 2; //} //else //{ // Console.WriteLine("生成任务{0}失败,{1}", port.BindedTaskOutput.ToString(), reStr); //} } } return(true); } catch (Exception ex) { reStr = ex.ToString(); return(false); } }